#!/bin/bash # # usage: snaprsync ... # is ---= # are assigned to unused mandatory values in order # mandatory: # rhost device mountpoint localarea # optional: localprevious= snapkind=lvm rsharedir=/usr/share/chiark-backup retcdir=/etc/chiark-backup rvardir=/var/lib/chiark-backup bwlimit= set -e badusage () { echo >&2 "snaprsync: bad usage: $1"; exit 12; } x () { echo "+ $@"; "$@"; } while true; do case "$1" in --?*=?*) name=${1#--}; name=${name%%=*} value=${1#--*=} case "$name" in rhost|device|mountpoint|localarea);; localprevious|rsharedir|retcdir|rvardir|bwlimit);; *) badusage "unknown setting $name";; esac eval "$name=\$value" ;; --) shift; break ;; -*) badusage "unknown option $1" ;; *) break ;; esac shift done for name in rhost device mountpoint localarea; do eval "value=\$$name" if [ "x$value" != x ]; then continue; fi if [ $# = 0 ]; then badusage "no value for setting $name"; fi eval "$name=$1" shift done datefmt='%Y-%m-%d %H:%M:%S Z' rsync="rsync ${bwlimit:+--bwlimit} $bwlimit" export RSYNC_RSH='ssh -o compression=no' ssh $rhost "date -u '+$rhost $datefmt start'" ssh $rhost id ssh $rhost ls -d $rsharedir ssh $rhost ls -d $rvardir test -d $localarea || x mkdir $localarea ournode=`uname -n` rsumsfile=for-$ournode.sums td=/dev/enoent rc=12 trap 'rm -rf $td; exit $rc' 0 td=`mktemp -td` mkfifo -m 600 $td/sentinel exec 4<>$td/sentinel x ssh $rhost "$rsharedir/snap-drop" x ssh $rhost "$retcdir/snap/$snapkind snap $rvardir $device $mountpoint" ssh $rhost <$td/sentinel 4<&- " set -e date -u '+$rhost $datefmt main' exec 3<&0 0$rsumsfile cd snap-mount summer -Ctqf . | sort -t' ' -k2 >&3 test x"${PIPESTATUS[*]}" = 'x0 0' date -u '+$rhost $datefmt sumsdone' cd .. " & rsumpid=$! x $rsync -aHSxz --numeric-ids --delete \ ${localprevious:+--link-dest} $localprevious \ $rhost:$rvardir/snap-mount/. $localarea/. wait $rsumpid x ssh $rhost "$rsharedir/snap-drop" if [ "x${localprevious}" != x ]; then cp "$localprevious,rsums" "$localarea,rsums" fi x $rsync -p \ $rhost:$rvardir/$rsumsfile \ "$localarea,rsums"