3 # usage: snaprsync <setting>... <positionals>
4 # <setting> is ---<name>=<value>
5 # <positionals> are assigned to unused mandatory values in order
7 # rhost device mountpoint localarea
11 rsharedir=/usr/share/chiark-backup
12 retcdir=/etc/chiark-backup
13 rvardir=/var/lib/chiark-backup
18 badusage () { echo >&2 "snaprsync: bad usage: $1"; exit 12; }
19 x () { echo "+ $@"; "$@"; }
20 xspawned () { eval "${1}pid=$!; echo \"+[$!] ($1) &\";"; }
21 xwait () { eval "echo \"+[\$${1}pid] ($1)...\"; wait \$${1}pid;"; }
26 name=${1#--}; name=${name%%=*}
29 rhost|device|mountpoint|localarea);;
30 localprevious|rsharedir|retcdir|rvardir|bwlimit);;
31 *) badusage "unknown setting $name";;
36 -*) badusage "unknown option $1" ;;
42 for name in rhost device mountpoint localarea; do
44 if [ "x$value" != x ]; then continue; fi
45 if [ $# = 0 ]; then badusage "no value for setting $name"; fi
50 datefmt='%Y-%m-%d %H:%M:%S Z'
51 rsync="rsync ${bwlimit:+--bwlimit} $bwlimit"
52 export RSYNC_RSH='ssh -o compression=no'
53 sshpfx='PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin; export PATH; '
55 ssh $rhost "$sshpfx date -u '+$rhost $datefmt start'"
56 ssh $rhost "$sshpfx id"
57 ssh $rhost "$sshpfx ls -d $rsharedir"
58 ssh $rhost "$sshpfx ls -d $rvardir"
60 test -d $localarea || x mkdir $localarea
62 rsumsfile=for-$ournode.sums
63 summer='summer -ACDbtqf'
67 trap 'rm -rf $td; exit $rc' 0
70 mkfifo -m 600 $td/sentinel
73 x ssh $rhost "$sshpfx $rsharedir/snap-drop"
74 x ssh $rhost "$sshpfx $retcdir/snap/$snapkind snap $rvardir $device $mountpoint"
75 ssh $rhost <$td/sentinel 4<&- "
78 date -u '+$rhost $datefmt main'
80 (set +e; read x <&3; kill 0) &
85 $summer . | sort -t' ' -k2 >&3
86 test x\"\${PIPESTATUS[*]}\" = 'x0 0'
87 date -u '+$rhost $datefmt sumsdone'
91 x $rsync -aHSxz --numeric-ids --delete \
92 ${localprevious:+--link-dest} $localprevious \
93 $rhost:$rvardir/snap-mount/. $localarea/.
94 date -u "+ $datefmt rsyncdone"
96 exec 3>$localarea,lsums
98 $summer . | sort -t' ' -k2 >&3 && \
99 test x"${PIPESTATUS[*]}" = 'x0 0') &
105 date -u "+ $datefmt sumsdone"
106 x ssh $rhost "$sshpfx $rsharedir/snap-drop"
108 if [ "x${localprevious}" != x ]; then
109 cp "$localprevious,rsums" "$localarea,rsums"
112 $rhost:$rvardir/$rsumsfile \
116 date -u "+ $datefmt checking"
119 x diff -u "$localarea,rsums" "$localarea,lsums" >"$localarea,sumsdiff"
122 test $diffrc = 0 || test $diffrc = 1
124 date -u "+ $datefmt checked $diffrc"