#!/bin/bash function join { local d=$1; shift; local p=$1; shift; echo -n "$p$1"; shift; printf "%s" "${@/#/$d$p}"; } lockfile-create -p -r 2 $0 || (echo "Another backup is running, aborting" & exit 1) ### Program arguments ### # Backup target directory BACKUP_TARGET=$1 # Backup local directory BACKUP_DIRECTORY=$2 # Exclusions BACKUP_EXCLUSIONS=$(join " " "--exclude=" $3) echo "Exclusions: $BACKUP_EXCLUSIONS" # Script executed before starting the backup BEFORE_SCRIPT=$4 # Script executed after finishing the backup AFTER_SCRIPT=$5 # Backup root path, change it to create a new backup BACKUP_ROOT=$6 # Backup archive path, change it for each backup BACKUP_ARCHIVE=$7 ### Backup automatic properties ### BACKUP_ROOT_PATH="$(cat /etc/hostname)" BACKUP_BASE_PATH="$BACKUP_ROOT_PATH/$BACKUP_ROOT" BACKUP_CONTENTS_PATH="$BACKUP_BASE_PATH/_backup/" BACKUP_ARCHIVE_PATH="$BACKUP_BASE_PATH/$BACKUP_ARCHIVE" echo "Starting backup" ### Before Script ### eval "$BEFORE_SCRIPT" ### Create local model of the remote's backup directory tree and send it ### mkdir -p "$BACKUP_CONTENTS_PATH" rsync --timeout=30 -avzhP --relative "$BACKUP_CONTENTS_PATH" "$BACKUP_TARGET" ### Backup home directory except some unwanted files ### rsync --timeout=30 -avzhP --delete --inplace $BACKUP_EXCLUSIONS --backup-dir="../$BACKUP_ARCHIVE_PATH" "$BACKUP_DIRECTORY" "$BACKUP_TARGET/$BACKUP_CONTENTS_PATH" ### Remove local model of the backup directory tree ### rm -R "$BACKUP_ROOT_PATH" ### After Script ### eval "$AFTER_SCRIPT" # Remove lock echo "Backup finished. Removing lock..." lockfile-remove $0