4 conf=`basename $config | sed 's/\.conf$//'`
5 [ "$dolog" = "1" ] && echo "`date` - $@" >> $logdir/${conf}.log
9 echo usage: $0 configfile
14 echo configfile $1 is not a file
20 host=`grep ^host $config | cut -d ' ' -f 2`
21 aliases="`grep ^aliases $config | cut -d ' ' -f 2-`"
22 user=`grep ^user $config | cut -d ' ' -f 2`
23 homedirs="` grep ^homedirs $config | cut -d ' ' -f 2-`"
24 extradirs="`grep ^extradirs $config | cut -d ' ' -f 2-`"
25 replicas=`grep ^replicas $config | cut -d ' ' -f 2`
26 oldest=`grep ^oldest $config | cut -d ' ' -f 2`
27 data=`grep ^data $config | cut -d ' ' -f 2`
28 bandwidth=`grep ^bandwidth $config | cut -d ' ' -f 2`
29 bwconn="`grep ^bandwidth $config | cut -d ' ' -f 3-`"
30 compression=`grep ^compression $config | cut -d ' ' -f 2`
31 compconn="`grep ^compression $config | cut -d ' ' -f 3-`"
32 cipher=`grep ^cipher $config | cut -d ' ' -f 2`
33 ciconn=`grep ^cipher $config | cut -d ' ' -f 3-`
34 logdir=`grep ^logdir $config | cut -d ' ' -f 2`
37 if [ ! -z "$logdir" ]; then
39 [ -d $logdir ] && dolog=1
43 for conn in $host $aliases; do
44 ping -c1 $conn > /dev/null 2>&1
46 if [ "$ret" = "0" ]; then
51 if [ -z "$remote" ]; then
52 log "host $host ($aliases) unreachable ..."
55 log "host $host (via $remote) is online ..."
58 if [ ! -z "`ssh $user@$remote 'cat ~/.backup | grep ^off'`" ]; then
59 log "backup rejected by client ..."
64 if [ ! -z "$compression" ]; then
66 for cpair in "$compconn"; do
67 ch=`echo $cpair | cut -d ':' -f 1`
68 if [[ "$remote" == "$ch"* ]]; then
69 cl=`echo $cpair | cut -d ':' -f 2`
70 [[ "$cl" == [0-9] ]] && comp=$cl
74 rcomp="-z --compress-level $comp"
75 log using compression level $comp ...
78 if [ ! -z "$bandwidth" ]; then
80 for bwpair in "$bwconn"; do
81 ch=`echo $bwpair | cut -d ':' -f 1`
82 if [[ "$remote" == "$ch"* ]]; then
83 bwl=`echo $cpair | cut -d ':' -f 2`
84 [ ! -z "$bwl" ] && bw=$bwl
89 log applying bandwidth of $bw ...
92 if [ ! -z "$cipher" ]; then
94 for cipair in "$ciconn"; do
95 ch=`echo $cipair | cut -d ':' -f 1`
96 if [[ "$remote" == "$ch"* ]]; then
97 cl=`echo $cipair | cut -d ':' -f 2`
98 [ ! -z "$cl" ] && ciph=$cl
102 if [ ! -z "$ciph" ]; then
103 log using cipher $ciph ...
106 if [ ! -d $data ]; then
107 log no data directory ...
110 log backing up to $data ...
113 backupdir=$data/${user}_at_${host}
114 cbd=$backupdir/$today
118 for pb in $backupdir/[0-9]*; do
119 [ ! -d $pb ] && continue
121 if [ ! -f $backupdir/.$bdd ]; then
122 if [ "$pb" != "$cbd" ]; then
125 log continuing $pb as $cbd ...
134 if [ ! -d $cbd ]; then
135 if [ ! -z "$lpb" ]; then
137 log starting backup $today from $lpb ...
140 log starting backup $today from scratch ...
144 if [ ! -f $backupdir/.$today ]; then
146 for dir in $homedirs; do
147 rsrc="$rsrc :/home/$user/$dir"
149 rsrc="`echo $rsrc | sed 's/^\ //'`"
150 for dir in $extradirs; do
153 [ ! -z "$homedirs" ] && \
154 log backing up home directories $homedirs ...
155 [ ! -z "$extradirs" ] && \
156 log backing up directories $extradirs ...
158 if [ -z "$ciph" ]; then
159 rsync=(rsync -aR $rcomp --delete $rbw $user@$remote$rsrc $cbd)
161 rsync=(rsync -aR -e "ssh -c $ciph" $rcomp --delete)
162 rsync+=($rbw $user@$remote$rsrc $cbd)
164 res=`"${rsync[@]}" 2>&1`
167 if [ "$ret" != "0" ]; then
168 log backup terminated before completion ...
174 touch $backupdir/.$today
175 log "backup $today completed :)"
177 log backup $bdd found completed ...
180 [ -z "$replicas" ] && replicas=3
181 [ -z "$oldest" ] && oldest=0
183 cob=`echo $ob | wc -w`
184 if [ $cob -gt $replicas ]; then
185 ((numdel=cob-replicas))
186 todel="`echo $ob | cut -d ' ' -f 1-${numdel}`"
187 for dirdel in $todel; do
188 past=`basename $dirdel`
189 ns=`date --date="$today" +%s`
190 ps=`date --date="$past" +%s`
191 ((delta=(ns-ps)/86400))
192 if [ $delta -gt $oldest ]; then
193 log "deleting $dirdel ($delta days old) ..."
194 bdd=`basename $dirdel`
198 log "keeping $dirdel ($delta days old) ..."