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] ...
##
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
}