diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d2be4e..a70473b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ CHANGELOG README: FreeBSD execution needs mailer (not found), sudo missing, bash needed, sed missing (see if StripQuotes mandatory) ! XX Dec 2015: obackup v2.0 released +- Better SQL and file backup task separation (rotate copies and warnings are defined for sql and/or file) - Added reverse backup, now backups can be local, pushed or pulled to or from a remote system - Better fallback for SendAlert even if disk full - Added an alert email sent on warnings while backup script is running diff --git a/dev/debug_obackup.sh b/dev/debug_obackup.sh index 04fbf85..cb49cd9 100755 --- a/dev/debug_obackup.sh +++ b/dev/debug_obackup.sh @@ -6,10 +6,10 @@ PROGRAM="obackup" AUTHOR="(L) 2013-2015 by Orsiris de Jong" CONTACT="http://www.netpower.fr/obackup - ozy@netpower.fr" PROGRAM_VERSION=2.0-pre -PROGRAM_BUILD=2015111502 +PROGRAM_BUILD=2015111603 IS_STABLE=no -FUNC_BUILD=2015111102 +FUNC_BUILD=2015111601 ## BEGIN Generic functions for osync & obackup written in 2013-2015 by Orsiris de Jong - http://www.netpower.fr - ozy@netpower.fr ## type -p does not work on platforms other than linux (bash). If if does not work, always assume output is not a zero exitcode @@ -552,8 +552,9 @@ function RunLocalCommand { if [ $_DRYRUN -ne 0 ]; then Logger "Dryrun: Local command [$command] not run." "NOTICE" - return 1 + return 0 fi + Logger "Running command [$command] on local host." "NOTICE" eval "$command" > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & WaitForTaskCompletion $! 0 $hard_max_time $FUNCNAME @@ -584,8 +585,9 @@ function RunRemoteCommand { CheckConnectivityRemoteHost if [ $_DRYRUN -ne 0 ]; then Logger "Dryrun: Local command [$command] not run." "NOTICE" - return 1 + return 0 fi + Logger "Running command [$command] on remote host." "NOTICE" cmd=$SSH_CMD' "$command" > "'$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID'" 2>&1' Logger "cmd: $cmd" "DEBUG" @@ -990,7 +992,7 @@ function CheckCurrentConfig { fi # Check all variables that should contain a numerical value >= 0 - declare -a num_vars=(BACKUP_SIZE_MINIMUM BANDWIDTH SQL_WARN_MIN_SPACE FILE_WARN_MIN_SPACE SOFT_MAX_EXEC_TIME_DB_TASK HARD_MAX_EXEC_TIME_DB_TASK COMPRESSION_LEVEL SOFT_MAX_EXEC_TIME_FILE_TASK HARD_MAX_EXEC_TIME_FILE_TASK SOFT_MAX_EXEC_TIME_TOTAL HARD_MAX_EXEC_TIME_TOTAL ROTATE_COPIES MAX_EXEC_TIME_PER_CMD_BEFORE MAX_EXEC_TIME_PER_CMD_AFTER) + declare -a num_vars=(BACKUP_SIZE_MINIMUM BANDWIDTH SQL_WARN_MIN_SPACE FILE_WARN_MIN_SPACE SOFT_MAX_EXEC_TIME_DB_TASK HARD_MAX_EXEC_TIME_DB_TASK COMPRESSION_LEVEL SOFT_MAX_EXEC_TIME_FILE_TASK HARD_MAX_EXEC_TIME_FILE_TASK SOFT_MAX_EXEC_TIME_TOTAL HARD_MAX_EXEC_TIME_TOTAL ROTATE_SQL_COPIES ROTATE_FILE_COPIES MAX_EXEC_TIME_PER_CMD_BEFORE MAX_EXEC_TIME_PER_CMD_AFTER) for i in ${num_vars[@]}; do test="if [ $(IsNumeric \"\$$i\") -eq 0 ]; then Logger \"Bogus $i value defined in config file.\" \"CRITICAL\"; exit 1; fi" eval "$test" @@ -1346,20 +1348,20 @@ function CreateStorageDirectories { __CheckArguments 0 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG if [ "$BACKUP_TYPE" == "local" ] || [ "$BACKUP_TYPE" == "pull" ]; then - if [ "SQL_BACKUP" != "no" ]; then + if [ "$SQL_BACKUP" != "no" ]; then _CreateStorageDirsLocal "$SQL_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_SQL=0 fi fi - if [ "FILE_BACKUP" != "no" ]; then + if [ "$FILE_BACKUP" != "no" ]; then _CreateStorageDirsLocal "$FILE_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_FILES=0 fi fi elif [ "$BACKUP_TYPE" == "push" ]; then - if [ "SQL_BACKUP" != "no" ]; then + if [ "$SQL_BACKUP" != "no" ]; then _CreateStorageDirsRemote "$SQL_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_SQL=0 @@ -1816,16 +1818,17 @@ function RsyncExcludeFrom { function _RotateBackupsLocal { local backup_path="${1}" - __CheckArguments 1 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG + local rotate_copies="${2}" + __CheckArguments 2 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG OLD_IFS=$IFS IFS=$'\t\n' for backup in $(ls -I "*.$PROGRAM.*" "$backup_path") do - copy=$ROTATE_COPIES + copy=$rotate_copies while [ $copy -gt 1 ] do - if [ $copy -eq $ROTATE_COPIES ]; then + if [ $copy -eq $rotate_copies ]; then cmd="$COMMAND_SUDO rm -rf \"$backup_path/$backup.$PROGRAM.$copy\"" Logger "cmd: $cmd" "DEBUG" eval "$cmd" & @@ -1882,8 +1885,9 @@ function _RotateBackupsLocal { function _RotateBackupsRemote { local backup_path="${1}" - __CheckArguments 1 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG -$SSH_CMD PROGRAM=$PROGRAM REMOTE_OPERATION=$REMOTE_OPERATION _DEBUG=$_DEBUG COMMAND_SUDO=$COMMAND_SUDO ROTATE_COPIES=$ROTATE_COPIES backup_path="$backup_path" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & + local rotate_copies="${2}" + __CheckArguments 2 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG +$SSH_CMD PROGRAM=$PROGRAM REMOTE_OPERATION=$REMOTE_OPERATION _DEBUG=$_DEBUG COMMAND_SUDO=$COMMAND_SUDO rotate_copies=$rotate_copies backup_path="$backup_path" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & function _RemoteLogger { local value="${1}" # What to log @@ -1929,10 +1933,10 @@ function _RotateBackupsRemoteSSH { IFS=$'\t\n' for backup in $(ls -I "*.$PROGRAM.*" "$backup_path") do - copy=$ROTATE_COPIES + copy=$rotate_copies while [ $copy -gt 1 ] do - if [ $copy -eq $ROTATE_COPIES ]; then + if [ $copy -eq $rotate_copies ]; then cmd="$COMMAND_SUDO rm -rf \"$backup_path/$backup.$PROGRAM.$copy\"" RemoteLogger "cmd: $cmd" "DEBUG" eval "$cmd" @@ -2000,14 +2004,15 @@ ENDSSH function RotateBackups { local backup_path="${1}" - __CheckArguments 1 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG + local rotate_copies="${2}" + __CheckArguments 2 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG Logger "Rotating backups." "NOTICE" if [ "$BACKUP_TYPE" == "local" ] || [ "$BACKUP_TYPE" == "pull" ]; then - _RotateBackupsLocal "$backup_path" + _RotateBackupsLocal "$backup_path" "$rotate_copies" elif [ "$BACKUP_TYPE" == "push" ]; then - _RotateBackupsRemote "$backup_path" + _RotateBackupsRemote "$backup_path" "$rotate_copies" fi } @@ -2099,14 +2104,14 @@ function Main { # Actual backup process if [ "$SQL_BACKUP" != "no" ] && [ $CAN_BACKUP_SQL -eq 1 ]; then if [ $_DRYRUN -ne 1 ] && [ "$ROTATE_SQL_BACKUPS" == "yes" ]; then - RotateBackups "$SQL_STORAGE" + RotateBackups "$SQL_STORAGE" "$ROTATE_SQL_COPIES" fi BackupDatabases fi if [ "$FILE_BACKUP" != "no" ] && [ $CAN_BACKUP_FILES -eq 1 ]; then if [ $_DRYRUN -ne 1 ] && [ "$ROTATE_FILE_BACKUPS" == "yes" ]; then - RotateBackups "$FILE_STORAGE" + RotateBackups "$FILE_STORAGE" "$ROTATE_FILE_COPIES" fi ## Add Rsync exclude patterns RsyncExcludePattern diff --git a/dev/n_obackup.sh b/dev/n_obackup.sh index 3e49489..f7f3388 100755 --- a/dev/n_obackup.sh +++ b/dev/n_obackup.sh @@ -6,7 +6,7 @@ PROGRAM="obackup" AUTHOR="(L) 2013-2015 by Orsiris de Jong" CONTACT="http://www.netpower.fr/obackup - ozy@netpower.fr" PROGRAM_VERSION=2.0-pre -PROGRAM_BUILD=2015111502 +PROGRAM_BUILD=2015111603 IS_STABLE=no source "/home/git/common/ofunctions.sh" @@ -106,7 +106,7 @@ function CheckCurrentConfig { fi # Check all variables that should contain a numerical value >= 0 - declare -a num_vars=(BACKUP_SIZE_MINIMUM BANDWIDTH SQL_WARN_MIN_SPACE FILE_WARN_MIN_SPACE SOFT_MAX_EXEC_TIME_DB_TASK HARD_MAX_EXEC_TIME_DB_TASK COMPRESSION_LEVEL SOFT_MAX_EXEC_TIME_FILE_TASK HARD_MAX_EXEC_TIME_FILE_TASK SOFT_MAX_EXEC_TIME_TOTAL HARD_MAX_EXEC_TIME_TOTAL ROTATE_COPIES MAX_EXEC_TIME_PER_CMD_BEFORE MAX_EXEC_TIME_PER_CMD_AFTER) + declare -a num_vars=(BACKUP_SIZE_MINIMUM BANDWIDTH SQL_WARN_MIN_SPACE FILE_WARN_MIN_SPACE SOFT_MAX_EXEC_TIME_DB_TASK HARD_MAX_EXEC_TIME_DB_TASK COMPRESSION_LEVEL SOFT_MAX_EXEC_TIME_FILE_TASK HARD_MAX_EXEC_TIME_FILE_TASK SOFT_MAX_EXEC_TIME_TOTAL HARD_MAX_EXEC_TIME_TOTAL ROTATE_SQL_COPIES ROTATE_FILE_COPIES MAX_EXEC_TIME_PER_CMD_BEFORE MAX_EXEC_TIME_PER_CMD_AFTER) for i in ${num_vars[@]}; do test="if [ $(IsNumeric \"\$$i\") -eq 0 ]; then Logger \"Bogus $i value defined in config file.\" \"CRITICAL\"; exit 1; fi" eval "$test" @@ -462,20 +462,20 @@ function CreateStorageDirectories { __CheckArguments 0 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG if [ "$BACKUP_TYPE" == "local" ] || [ "$BACKUP_TYPE" == "pull" ]; then - if [ "SQL_BACKUP" != "no" ]; then + if [ "$SQL_BACKUP" != "no" ]; then _CreateStorageDirsLocal "$SQL_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_SQL=0 fi fi - if [ "FILE_BACKUP" != "no" ]; then + if [ "$FILE_BACKUP" != "no" ]; then _CreateStorageDirsLocal "$FILE_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_FILES=0 fi fi elif [ "$BACKUP_TYPE" == "push" ]; then - if [ "SQL_BACKUP" != "no" ]; then + if [ "$SQL_BACKUP" != "no" ]; then _CreateStorageDirsRemote "$SQL_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_SQL=0 @@ -932,16 +932,17 @@ function RsyncExcludeFrom { function _RotateBackupsLocal { local backup_path="${1}" - __CheckArguments 1 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG + local rotate_copies="${2}" + __CheckArguments 2 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG OLD_IFS=$IFS IFS=$'\t\n' for backup in $(ls -I "*.$PROGRAM.*" "$backup_path") do - copy=$ROTATE_COPIES + copy=$rotate_copies while [ $copy -gt 1 ] do - if [ $copy -eq $ROTATE_COPIES ]; then + if [ $copy -eq $rotate_copies ]; then cmd="$COMMAND_SUDO rm -rf \"$backup_path/$backup.$PROGRAM.$copy\"" Logger "cmd: $cmd" "DEBUG" eval "$cmd" & @@ -998,8 +999,9 @@ function _RotateBackupsLocal { function _RotateBackupsRemote { local backup_path="${1}" - __CheckArguments 1 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG -$SSH_CMD PROGRAM=$PROGRAM REMOTE_OPERATION=$REMOTE_OPERATION _DEBUG=$_DEBUG COMMAND_SUDO=$COMMAND_SUDO ROTATE_COPIES=$ROTATE_COPIES backup_path="$backup_path" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & + local rotate_copies="${2}" + __CheckArguments 2 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG +$SSH_CMD PROGRAM=$PROGRAM REMOTE_OPERATION=$REMOTE_OPERATION _DEBUG=$_DEBUG COMMAND_SUDO=$COMMAND_SUDO rotate_copies=$rotate_copies backup_path="$backup_path" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & function _RemoteLogger { local value="${1}" # What to log @@ -1045,10 +1047,10 @@ function _RotateBackupsRemoteSSH { IFS=$'\t\n' for backup in $(ls -I "*.$PROGRAM.*" "$backup_path") do - copy=$ROTATE_COPIES + copy=$rotate_copies while [ $copy -gt 1 ] do - if [ $copy -eq $ROTATE_COPIES ]; then + if [ $copy -eq $rotate_copies ]; then cmd="$COMMAND_SUDO rm -rf \"$backup_path/$backup.$PROGRAM.$copy\"" RemoteLogger "cmd: $cmd" "DEBUG" eval "$cmd" @@ -1116,14 +1118,15 @@ ENDSSH function RotateBackups { local backup_path="${1}" - __CheckArguments 1 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG + local rotate_copies="${2}" + __CheckArguments 2 $# $FUNCNAME "$@" #__WITH_PARANOIA_DEBUG Logger "Rotating backups." "NOTICE" if [ "$BACKUP_TYPE" == "local" ] || [ "$BACKUP_TYPE" == "pull" ]; then - _RotateBackupsLocal "$backup_path" + _RotateBackupsLocal "$backup_path" "$rotate_copies" elif [ "$BACKUP_TYPE" == "push" ]; then - _RotateBackupsRemote "$backup_path" + _RotateBackupsRemote "$backup_path" "$rotate_copies" fi } @@ -1215,14 +1218,14 @@ function Main { # Actual backup process if [ "$SQL_BACKUP" != "no" ] && [ $CAN_BACKUP_SQL -eq 1 ]; then if [ $_DRYRUN -ne 1 ] && [ "$ROTATE_SQL_BACKUPS" == "yes" ]; then - RotateBackups "$SQL_STORAGE" + RotateBackups "$SQL_STORAGE" "$ROTATE_SQL_COPIES" fi BackupDatabases fi if [ "$FILE_BACKUP" != "no" ] && [ $CAN_BACKUP_FILES -eq 1 ]; then if [ $_DRYRUN -ne 1 ] && [ "$ROTATE_FILE_BACKUPS" == "yes" ]; then - RotateBackups "$FILE_STORAGE" + RotateBackups "$FILE_STORAGE" "$ROTATE_FILE_COPIES" fi ## Add Rsync exclude patterns RsyncExcludePattern diff --git a/dev/ofunctions.sh b/dev/ofunctions.sh index b8d624b..e786212 100644 --- a/dev/ofunctions.sh +++ b/dev/ofunctions.sh @@ -1,4 +1,4 @@ -FUNC_BUILD=2015111102 +FUNC_BUILD=2015111601 ## BEGIN Generic functions for osync & obackup written in 2013-2015 by Orsiris de Jong - http://www.netpower.fr - ozy@netpower.fr ## type -p does not work on platforms other than linux (bash). If if does not work, always assume output is not a zero exitcode @@ -541,8 +541,9 @@ function RunLocalCommand { if [ $_DRYRUN -ne 0 ]; then Logger "Dryrun: Local command [$command] not run." "NOTICE" - return 1 + return 0 fi + Logger "Running command [$command] on local host." "NOTICE" eval "$command" > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & WaitForTaskCompletion $! 0 $hard_max_time $FUNCNAME @@ -573,8 +574,9 @@ function RunRemoteCommand { CheckConnectivityRemoteHost if [ $_DRYRUN -ne 0 ]; then Logger "Dryrun: Local command [$command] not run." "NOTICE" - return 1 + return 0 fi + Logger "Running command [$command] on remote host." "NOTICE" cmd=$SSH_CMD' "$command" > "'$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID'" 2>&1' Logger "cmd: $cmd" "DEBUG" diff --git a/host_backup.conf b/host_backup.conf index b628ac8..49ae410 100755 --- a/host_backup.conf +++ b/host_backup.conf @@ -1,6 +1,6 @@ ###### Local / Remote backup script for files & databases ###### (L) 2013-2015 by Ozy de Jong (www.netpower.fr) -###### obackup v2.x config file rev 2015111501 +###### obackup v2.x config file rev 2015111601 ###### GENERAL BACKUP OPTIONS @@ -167,8 +167,9 @@ HARD_MAX_EXEC_TIME_TOTAL=36000 ## Backup Rotation. You may rotate backups if you don't use snapshots on your backup server. ROTATE_SQL_BACKUPS=no +ROTATE_SQL_COPIES=7 ROTATE_FILE_BACKUPS=no -ROTATE_COPIES=7 +ROTATE_FILE_COPIES=7 ###### EXECUTION HOOKS diff --git a/obackup.sh b/obackup.sh index 1aa4710..0b8e23a 100755 --- a/obackup.sh +++ b/obackup.sh @@ -6,10 +6,10 @@ PROGRAM="obackup" AUTHOR="(L) 2013-2015 by Orsiris de Jong" CONTACT="http://www.netpower.fr/obackup - ozy@netpower.fr" PROGRAM_VERSION=2.0-pre -PROGRAM_BUILD=2015111502 +PROGRAM_BUILD=2015111603 IS_STABLE=no -FUNC_BUILD=2015111102 +FUNC_BUILD=2015111601 ## BEGIN Generic functions for osync & obackup written in 2013-2015 by Orsiris de Jong - http://www.netpower.fr - ozy@netpower.fr ## type -p does not work on platforms other than linux (bash). If if does not work, always assume output is not a zero exitcode @@ -530,8 +530,9 @@ function RunLocalCommand { if [ $_DRYRUN -ne 0 ]; then Logger "Dryrun: Local command [$command] not run." "NOTICE" - return 1 + return 0 fi + Logger "Running command [$command] on local host." "NOTICE" eval "$command" > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & WaitForTaskCompletion $! 0 $hard_max_time $FUNCNAME @@ -561,8 +562,9 @@ function RunRemoteCommand { CheckConnectivityRemoteHost if [ $_DRYRUN -ne 0 ]; then Logger "Dryrun: Local command [$command] not run." "NOTICE" - return 1 + return 0 fi + Logger "Running command [$command] on remote host." "NOTICE" cmd=$SSH_CMD' "$command" > "'$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID'" 2>&1' Logger "cmd: $cmd" "DEBUG" @@ -887,7 +889,7 @@ function CheckCurrentConfig { fi # Check all variables that should contain a numerical value >= 0 - declare -a num_vars=(BACKUP_SIZE_MINIMUM BANDWIDTH SQL_WARN_MIN_SPACE FILE_WARN_MIN_SPACE SOFT_MAX_EXEC_TIME_DB_TASK HARD_MAX_EXEC_TIME_DB_TASK COMPRESSION_LEVEL SOFT_MAX_EXEC_TIME_FILE_TASK HARD_MAX_EXEC_TIME_FILE_TASK SOFT_MAX_EXEC_TIME_TOTAL HARD_MAX_EXEC_TIME_TOTAL ROTATE_COPIES MAX_EXEC_TIME_PER_CMD_BEFORE MAX_EXEC_TIME_PER_CMD_AFTER) + declare -a num_vars=(BACKUP_SIZE_MINIMUM BANDWIDTH SQL_WARN_MIN_SPACE FILE_WARN_MIN_SPACE SOFT_MAX_EXEC_TIME_DB_TASK HARD_MAX_EXEC_TIME_DB_TASK COMPRESSION_LEVEL SOFT_MAX_EXEC_TIME_FILE_TASK HARD_MAX_EXEC_TIME_FILE_TASK SOFT_MAX_EXEC_TIME_TOTAL HARD_MAX_EXEC_TIME_TOTAL ROTATE_SQL_COPIES ROTATE_FILE_COPIES MAX_EXEC_TIME_PER_CMD_BEFORE MAX_EXEC_TIME_PER_CMD_AFTER) for i in ${num_vars[@]}; do test="if [ $(IsNumeric \"\$$i\") -eq 0 ]; then Logger \"Bogus $i value defined in config file.\" \"CRITICAL\"; exit 1; fi" eval "$test" @@ -1231,20 +1233,20 @@ function _CreateStorageDirsRemote { function CreateStorageDirectories { if [ "$BACKUP_TYPE" == "local" ] || [ "$BACKUP_TYPE" == "pull" ]; then - if [ "SQL_BACKUP" != "no" ]; then + if [ "$SQL_BACKUP" != "no" ]; then _CreateStorageDirsLocal "$SQL_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_SQL=0 fi fi - if [ "FILE_BACKUP" != "no" ]; then + if [ "$FILE_BACKUP" != "no" ]; then _CreateStorageDirsLocal "$FILE_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_FILES=0 fi fi elif [ "$BACKUP_TYPE" == "push" ]; then - if [ "SQL_BACKUP" != "no" ]; then + if [ "$SQL_BACKUP" != "no" ]; then _CreateStorageDirsRemote "$SQL_STORAGE" if [ $? != 0 ]; then CAN_BACKUP_SQL=0 @@ -1687,15 +1689,16 @@ function RsyncExcludeFrom { function _RotateBackupsLocal { local backup_path="${1}" + local rotate_copies="${2}" OLD_IFS=$IFS IFS=$'\t\n' for backup in $(ls -I "*.$PROGRAM.*" "$backup_path") do - copy=$ROTATE_COPIES + copy=$rotate_copies while [ $copy -gt 1 ] do - if [ $copy -eq $ROTATE_COPIES ]; then + if [ $copy -eq $rotate_copies ]; then cmd="$COMMAND_SUDO rm -rf \"$backup_path/$backup.$PROGRAM.$copy\"" Logger "cmd: $cmd" "DEBUG" eval "$cmd" & @@ -1752,7 +1755,8 @@ function _RotateBackupsLocal { function _RotateBackupsRemote { local backup_path="${1}" -$SSH_CMD PROGRAM=$PROGRAM REMOTE_OPERATION=$REMOTE_OPERATION _DEBUG=$_DEBUG COMMAND_SUDO=$COMMAND_SUDO ROTATE_COPIES=$ROTATE_COPIES backup_path="$backup_path" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & + local rotate_copies="${2}" +$SSH_CMD PROGRAM=$PROGRAM REMOTE_OPERATION=$REMOTE_OPERATION _DEBUG=$_DEBUG COMMAND_SUDO=$COMMAND_SUDO rotate_copies=$rotate_copies backup_path="$backup_path" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.$FUNCNAME.$SCRIPT_PID" 2>&1 & function _RemoteLogger { local value="${1}" # What to log @@ -1793,10 +1797,10 @@ function _RotateBackupsRemoteSSH { IFS=$'\t\n' for backup in $(ls -I "*.$PROGRAM.*" "$backup_path") do - copy=$ROTATE_COPIES + copy=$rotate_copies while [ $copy -gt 1 ] do - if [ $copy -eq $ROTATE_COPIES ]; then + if [ $copy -eq $rotate_copies ]; then cmd="$COMMAND_SUDO rm -rf \"$backup_path/$backup.$PROGRAM.$copy\"" RemoteLogger "cmd: $cmd" "DEBUG" eval "$cmd" @@ -1864,13 +1868,14 @@ ENDSSH function RotateBackups { local backup_path="${1}" + local rotate_copies="${2}" Logger "Rotating backups." "NOTICE" if [ "$BACKUP_TYPE" == "local" ] || [ "$BACKUP_TYPE" == "pull" ]; then - _RotateBackupsLocal "$backup_path" + _RotateBackupsLocal "$backup_path" "$rotate_copies" elif [ "$BACKUP_TYPE" == "push" ]; then - _RotateBackupsRemote "$backup_path" + _RotateBackupsRemote "$backup_path" "$rotate_copies" fi } @@ -1960,14 +1965,14 @@ function Main { # Actual backup process if [ "$SQL_BACKUP" != "no" ] && [ $CAN_BACKUP_SQL -eq 1 ]; then if [ $_DRYRUN -ne 1 ] && [ "$ROTATE_SQL_BACKUPS" == "yes" ]; then - RotateBackups "$SQL_STORAGE" + RotateBackups "$SQL_STORAGE" "$ROTATE_SQL_COPIES" fi BackupDatabases fi if [ "$FILE_BACKUP" != "no" ] && [ $CAN_BACKUP_FILES -eq 1 ]; then if [ $_DRYRUN -ne 1 ] && [ "$ROTATE_FILE_BACKUPS" == "yes" ]; then - RotateBackups "$FILE_STORAGE" + RotateBackups "$FILE_STORAGE" "$ROTATE_FILE_COPIES" fi ## Add Rsync exclude patterns RsyncExcludePattern