#!/bin/bash
#
# usage: snaprsync <setting>... <positionals>
-# <setting> is ---<name>=<value>
+# <setting> is --<name>=<value>
# <positionals> are assigned to unused mandatory values in order
# mandatory:
# rhost device mountpoint localarea
retcdir=/etc/chiark-backup
rvardir=/var/lib/chiark-backup
bwlimit=
+ subdir=.
set -e
value=${1#--*=}
case "$name" in
rhost|device|mountpoint|localarea);;
- localprevious|rsharedir|retcdir|rvardir|bwlimit);;
+ localprevious|snapkind|rsharedir|retcdir|rvardir|bwlimit);;
+ subdir);;
*) badusage "unknown setting $name";;
esac
eval "$name=\$value"
datefmt='%Y-%m-%d %H:%M:%S Z'
rsync="rsync ${bwlimit:+--bwlimit} $bwlimit"
export RSYNC_RSH='ssh -o compression=no'
+sshpfx='PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin; export PATH; '
-ssh $rhost "date -u '+$rhost $datefmt start'"
-ssh $rhost id
-ssh $rhost ls -d $rsharedir
-ssh $rhost ls -d $rvardir
+ssh $rhost "$sshpfx date -u '+$rhost $datefmt start'"
+ssh $rhost "$sshpfx id"
+ssh $rhost "$sshpfx ls -d $rsharedir"
+ssh $rhost "$sshpfx ls -d $rvardir"
test -d $localarea || x mkdir $localarea
ournode=`uname -n`
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"
+x ssh $rhost "$sshpfx $rsharedir/snap-drop"
+ssh $rhost "
+ $sshpfx
+ set -e
+ cd $rvardir
+ echo '$retcdir/snap/$snapkind drop $rvardir' >snap-drop.new
+ mv snap-drop.new snap-drop
+"
+x ssh $rhost "$sshpfx $retcdir/snap/$snapkind snap $rvardir $device $mountpoint"
ssh $rhost <$td/sentinel 4<&- "
+ $sshpfx
set -e
date -u '+$rhost $datefmt main'
exec 3<&0 0</dev/null
umask 077
exec 3>$rsumsfile
cd snap-mount
- $summer . | sort -t' ' -k2 >&3
- test x\"\${PIPESTATUS[*]}\" = 'x0 0'
+ $summer . >&3
date -u '+$rhost $datefmt sumsdone'
cd ..
" &
xspawned rsum
x $rsync -aHSxz --numeric-ids --delete \
${localprevious:+--link-dest} $localprevious \
- $rhost:$rvardir/snap-mount/. $localarea/.
+ $rhost:$rvardir/snap-mount/$subdir $localarea/.
date -u "+ $datefmt rsyncdone"
exec 3>$localarea,lsums
(cd $localarea && \
- $summer . | sort -t' ' -k2 >&3 && \
- test x"${PIPESTATUS[*]}" = 'x0 0') &
+ $summer . >&3) &
xspawned lsum
exec 3>&-
xwait rsum
exec 4<&-
date -u "+ $datefmt sumsdone"
-x ssh $rhost "$rsharedir/snap-drop"
+x ssh $rhost "$sshpfx $rsharedir/snap-drop"
if [ "x${localprevious}" != x ]; then
cp "$localprevious,rsums" "$localarea,rsums"
date -u "+ $datefmt checking"
set +e
-x diff -u "$localarea,rsums" "$localarea,lsums" >"$localarea,sumsdiff"
+diff -u "$localarea,rsums" "$localarea,lsums" >"$localarea,sumsdiff"
diffrc=$?
set -e
test $diffrc = 0 || test $diffrc = 1