From: Mark Wooding Date: Mon, 18 Mar 2013 20:12:00 +0000 (+0000) Subject: rsync-backup.in: Factor out the machinery for running a backup command. X-Git-Tag: 1.0.0~6 X-Git-Url: https://git.distorted.org.uk/~mdw/rsync-backup/commitdiff_plain/3aa4fd301e1d65302ffe245e3318bb31601fc590 rsync-backup.in: Factor out the machinery for running a backup command. In particular, we want the piece which messes with log files and checks whether the command worked. --- diff --git a/rsync-backup.in b/rsync-backup.in index 0ee1150..3802efb 100644 --- a/rsync-backup.in +++ b/rsync-backup.in @@ -723,6 +723,61 @@ do_backup () { esac } +run_backup_cmd () { + fs=$1 date=$2 cmd=$3; shift 3 + ## try_backup FS DATE COMMAND ARGS ... + ## + ## Run COMMAND ARGS to back up filesystem FS on the current host, + ## maintaining a log, and checking whether it worked. The caller has + ## usually worked out the DATE in order to set up the filesystem, and we + ## need it to name the log file properly. + + ## Find a name for the log file. In unusual circumstances, we may have + ## deleted old logs from today, so just checking for an unused sequence + ## number is insufficient. Instead, check all of the logfiles for today, + ## and use a sequence number that's larger than any of them. + case $dryrun in + t) + log=/dev/null + ;; + nil) + seq=1 + for i in "$logdir/$host/$fs.$date#"*; do + tail=${i##*#} + case "$tail" in [!1-9]* | *[!0-9]*) continue ;; esac + if [ -f "$i" -a $tail -ge $seq ]; then seq=$(( tail + 1 )); fi + done + log="$logdir/$host/$fs.$date#$seq" + ;; + esac + + ## Run the backup command. + case $dryrun in nil) mkdir -p $logdir/$host ;; esac + if ! "$cmd" "$@" 9>$log 1>&9; then + echo >&2 + echo >&2 "$quis: backup of $host:$fs FAILED!" + bkprc=1 + fi + + ## Count up the logfiles. + nlog=0 + for i in "$logdir/$host/$fs".*; do + if [ ! -f "$i" ]; then continue; fi + nlog=$(( nlog + 1 )) + done + + ## If there are too many, go through and delete some early ones. + if [ $dryrun = nil ] && [ $nlog -gt $MAXLOG ]; then + n=$(( nlog - MAXLOG )) + for i in "$logdir/$host/$fs".*; do + if [ ! -f "$i" ]; then continue; fi + rm -f "$i" + n=$(( n - 1 )) + if [ $n -eq 0 ]; then break; fi + done + fi +} + backup () { ## backup FS[:ARG] ... ## @@ -776,50 +831,8 @@ backup () { continue fi - ## Find a name for the log file. In unusual circumstances, we may have - ## deleted old logs from today, so just checking for an unused sequence - ## number is insufficient. Instead, check all of the logfiles for today, - ## and use a sequence number that's larger than any of them. - case $dryrun in - t) - log=/dev/null - ;; - nil) - seq=1 - for i in "$logdir/$host/$fs.$date#"*; do - tail=${i##*#} - case "$tail" in [!1-9]* | *[!0-9]*) continue ;; esac - if [ -f "$i" -a $tail -ge $seq ]; then seq=$(( tail + 1 )); fi - done - log="$logdir/$host/$fs.$date#$seq" - ;; - esac - ## Do the backup of this filesystem. - case $dryrun in nil) mkdir -p $logdir/$host ;; esac - if ! do_backup $date $fs $fsarg 9>$log 1>&9; then - echo >&2 - echo >&2 "$quis: backup of $host:$fs FAILED!" - bkprc=1 - fi - - ## Count up the logfiles. - nlog=0 - for i in "$logdir/$host/$fs".*; do - if [ ! -f "$i" ]; then continue; fi - nlog=$(( nlog + 1 )) - done - - ## If there are too many, go through and delete some early ones. - if [ $dryrun = nil ] && [ $nlog -gt $MAXLOG ]; then - n=$(( nlog - MAXLOG )) - for i in "$logdir/$host/$fs".*; do - if [ ! -f "$i" ]; then continue; fi - rm -f "$i" - n=$(( n - 1 )) - if [ $n -eq 0 ]; then break; fi - done - fi + run_backup_cmd $fs $date do_backup $date $fs $fsarg done }