chiark / gitweb /
rsync-backup.in: Factor out the machinery for running a backup command.
authorMark Wooding <mwooding@good.com>
Mon, 18 Mar 2013 20:12:00 +0000 (20:12 +0000)
committerMark Wooding <mwooding@good.com>
Mon, 15 Jul 2013 17:23:51 +0000 (18:23 +0100)
In particular, we want the piece which messes with log files and checks
whether the command worked.

rsync-backup.in

index 0ee11508955b44e62da6639b9482a182ba906d4e..3802efb11186ebb30c584f74944b2de4ec321399 100644 (file)
@@ -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
 }