X-Git-Url: https://git.distorted.org.uk/~mdw/rsync-backup/blobdiff_plain/1c9c923af8ab55f91a9875d135e7189395302334..refs/tags/1.0.0:/rsync-backup.in diff --git a/rsync-backup.in b/rsync-backup.in index ac9cfdc..39b09d1 100644 --- a/rsync-backup.in +++ b/rsync-backup.in @@ -78,6 +78,15 @@ maybe () { esac } +copy () { + prefix=$1 + ## Copy lines from stdin to stdout, adding PREFIX. + + while IFS= read -r line; do + printf "%s %s\n" "$prefix" "$line" + done +} + run () { tag=$1 cmd=$2; shift 2 ## Run CMD, logging its output in a pleasing manner. @@ -94,8 +103,8 @@ run () { { { { ( set +e "$cmd" "$@" 3>&- 4>&- 5>&- 9>&- echo $? >&5; ) | - while IFS= read line; do echo "| $line"; done >&4; } 2>&1 | - while IFS= read line; do echo "* $line"; done >&4; } 4>&1 | + copy "|" >&4; } 2>&1 | + copy "*" >&4; } 4>&1 | cat >&9; } 5>&1 &2 3>&- $lvhost \ + _hostrun >&2 3>&- $userat$lvhost \ "lvcreate --snapshot -n$lv.bkp $SNAPSIZE $vg/$lv" snaprc=$? set -e @@ -312,7 +321,7 @@ do_rfreezefs () { case $tok in "$tok_THAWED") ;; *) - _hostrun >&2 3>&- $lvhost "lvremove -f $vg/$lv.bkp" || : + _hostrun >&2 3>&- $userat$lvhost "lvremove -f $vg/$lv.bkp" || : echo >&2 "$quis: unexpected token $tok (rfreezefs $fsdir on $fshost)" exit 1 ;; @@ -339,7 +348,7 @@ do_rfreezefs () { esac ## Mount the snapshot on the volume host. - _hostrun >&2 $lvhost " + _hostrun >&2 $userat$lvhost " mkdir -p $SNAPDIR/$lv mount -oro /dev/$vg/$lv.bkp $SNAPDIR/$lv" } @@ -516,7 +525,7 @@ unset VOLUME bkprc=0 remote_fshash () { - _hostrun $host " + _hostrun $userat$host " umask 077 mkdir -p $fshashdir cd ${snapmnt#*:} @@ -714,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] ... ## @@ -767,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 } @@ -819,7 +841,7 @@ backup () { host () { host=$1 - like= + like= userat= case "${expire_policy+t},${default_policy+t}" in t,) default_policy=$expire_policy ;; esac @@ -831,6 +853,7 @@ snaptype () { snap=$1; shift; snapargs="$*"; retry=0; } rsyncargs () { rsyncargs="$*"; } like () { like="$*"; } retry () { retry="$*"; } +user () { userat="$*@"; } retain () { case $clear_policy in t) unset expire_policy; clear_policy=nil ;; esac @@ -876,6 +899,10 @@ case $# in 0) ;; *) usage >&2; exit 1 ;; esac exec 8>&1 . "$conf" +case "$bkprc" in + 0) $verbose "All backups successful" ;; + *) $verbose "Backups FAILED" ;; +esac ###----- That's all, folks --------------------------------------------------