#!/bin/bash function join { local d=$1; shift; local p=$1; shift; echo -n "$p$1"; shift; printf "%s" "${@/#/$d$p}"; } if ! lockfile-create -p -r 2 $0; then echo "Another backup is running, aborting" exit 1 fi ### 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/" echo "Starting backup. Target: $BACKUP_BASE_PATH. Archive: $BACKUP_ARCHIVE" ### 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 --backup-dir=../$BACKUP_ARCHIVE $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