chiark / gitweb /
wip snaprsync
[chiark-utils.git] / backup / snaprsync
1 #!/bin/bash
2 #
3 # usage: snaprsync <setting>... <positionals>
4 #  <setting> is ---<name>=<value>
5 #  <positionals> are assigned to unused mandatory values in order
6 # mandatory:
7 #   rhost device mountpoint localarea 
8 # optional:
9         localprevious=
10         snapkind=lvm
11         rsharedir=/usr/share/chiark-backup 
12         retcdir=/etc/chiark-backup
13         rvardir=/var/lib/chiark-backup
14
15 badusage () { echo >&2 "snaprsync: bad usage: $1"; exit 12; }
16 x () { echo "+ $@"; "$@"; }
17
18 while true; do
19         case "$1" in
20         --?*=?*)
21                 name=${1#--}; name=${name%%=*}
22                 value=${1#--*=}
23                 case "$name" in
24                 rhost|device|mountpoint|localarea);;
25                 localprevious|rsharedir|retcdir|rvardir);;
26                 *) badusage "unknown setting $name";;
27                 esac
28                 eval "$name=\$value"
29                 ;;
30         --)     shift; break ;;
31         -*)     badusage "unknown option $1" ;;
32         *)      break ;;
33         esac
34         shift
35 done
36
37 for name in rhost device mountpoint localarea; do
38         eval "value=\$$name"
39         if [ "x$value" != x ]; then continue; fi
40         if [ $# = 0 ]; then badusage "no value for setting $name"; fi
41         eval "$name=$1"
42         shift
43 done
44
45 datefmt='%Y-%m-%d %H:%M:%S Z'
46
47 ssh $rhost "date -u '+$rhost $datefmt'"
48 ssh $rhost id
49 ssh $rhost ls -d $rsharedir
50 ssh $rhost ls -d $rvardir
51
52 test -d $localarea || x mkdir $localarea
53 ournode=`uname -n`
54 rsumsfile=for-$ournode.sums
55
56 x ssh $rhost "$rsharedir/snap-drop"
57 x ssh $rhost "$retcdir/snap/$snapkind snap $rvardir $device $mountpoint"
58 ssh $rhost "
59   set -ex
60   cd $rvardir
61   umask 077
62   exec 3>$rsumsfile
63   cd snap-mount
64   summer -Cqf . >&3
65   date -u +'sums done $datefmt'
66   cd ..
67 " &
68 fixme kill this thing if we die
69 rsumpid=$!
70 RSYNC_RSH='ssh -o compression=no' \
71  x rsync -aHSxz --numeric-ids --delete \
72         ${localprevious:+--link-dest} $localprevious \
73         $rhost:$rvardir/snap-mount/. $localarea/.
74 wait $rsumpid
75 x ssh $rhost "$rsharedir/snap-drop"
76 RSYNC_RSH=ssh rsync -p 
77  fixme use localprevious,rsums as seed if available
78  $rhost:$rvardir/$rsumsfile $localarea,rsums