enabled old backup removal
[outofuni/backup.git] / bin / backup
1 #!/bin/bash
2
3 function log {
4         conf=`basename $config | sed 's/\.conf$//'`
5         [ "$dolog" = "1" ] && echo "`date` - $@" >> $logdir/${conf}.log
6 }
7
8 if [ -z "$1" ]; then
9         echo usage: $0 configfile
10         exit -1
11 fi
12
13 if [ ! -f $1 ]; then
14         echo configfile $1 is not a file
15         exit -2
16 fi
17
18 config=$1
19
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 logdir=`grep ^logdir $config | cut -d ' ' -f 2`
33
34 dolog=0
35 if [ ! -z "$logdir" ]; then
36         mkdir -p $logdir
37         [ -d $logdir ] && dolog=1
38 fi
39
40 hit=0
41 for conn in $host $aliases; do
42         ping -c1 $conn > /dev/null 2>&1
43         ret=$?
44         if [ "$ret" = "0" ]; then
45                 remote=$conn
46                 break
47         fi
48 done
49 if [ -z "$remote" ]; then
50         log "host $host ($aliases) unreachable ..."
51         exit -3
52 else
53         log "host $host (via $remote) is online ..."
54 fi
55
56 comp=6
57 if [ ! -z "$compression" ]; then
58         comp=$compression
59         for cpair in "$compconn"; do
60                 ch=`echo $cpair | cut -d ':' -f 1`
61                 if [[ "$remote" == "$ch"* ]]; then
62                         cl=`echo $cpair | cut -d ':' -f 2`
63                         [[ "$cl" == [0-9] ]] && comp=$cl
64                 fi
65         done
66 fi
67 rcomp="-z --compress-level $comp"
68 log using compression level $comp ...
69
70 bw=0
71 if [ ! -z "$bandwidth" ]; then
72         bw=$bandwidth
73         for bwpair in "$bwconn"; do
74                 ch=`echo $bwpair | cut -d ':' -f 1`
75                 if [[ "$remote" == "$ch"* ]]; then
76                         bwl=`echo $cpair | cut -d ':' -f 2`
77                         [ ! -z "$bwl" ]] && bw=$bwl
78                 fi
79         done
80 fi
81 rbw="--bandwidth=$bw"
82 log applying bandwidth of $bw ...
83
84 if [ ! -d $data ]; then
85         log no data directory ...
86         exit -4
87 fi
88 log backing up to $data ...
89
90 today=`date -I`
91 backupdir=$data/${user}_at_${host}
92
93 cbd=$backupdir/$today
94 mkdir -p $cbd
95
96 rsync="rsync -azR --delete --bwlimit=$bandwidth"
97
98 ob=""
99 lpb=""
100 for pb in $backupdir/[0-9]*; do
101         bdd=`basename $pb`
102         if [ ! -f $backupdir/.$bdd ]; then
103                 if [ "$pb" != "$cbd" ]; then
104                         rm -rf $cbd
105                         mv $pb $cbd
106                         log continuing $pb as $cbd ...
107                 else
108                         if [ ! -z "$lpb" ]; then
109                                 rm -rf $cbd
110                                 cp -r $lpb $cbd
111                                 log "starting backup $today from $lpb ..."
112                         else
113                                 log starting backup from scratch ...
114                         fi
115                 fi
116         fi
117         lpb=$pb
118         ob="$ob $pb"
119 done
120
121 if [ ! -f $backupdir/.$today ]; then
122         rsrc=""
123         for dir in $homedirs; do
124                 rsrc="$rsrc :/home/$user/$dir"
125         done
126         rsrc="`echo $rsrc | sed 's/^\ //'`"
127         for dir in $extradirs; do
128                 rsrc="$rsrc :$dir"
129         done
130         [ ! -z "$homedirs" ] && \
131                 log backing up home directories $homedirs ...
132         [ ! -z "$extradirs" ] && \
133                 log backing up directories $extradirs ...
134         $rsync $user@$remote$rsrc $cbd
135         ret=$?
136         if [ "$ret" != "0" ]; then
137                 log backup terminated before completion ...
138                 exit -50
139         fi
140         
141         touch $backupdir/.$today
142         log "backup $today completed :)"
143 else
144         log backup $bdd found completed ...
145 fi
146
147 [ -z "$replicas" ] && replicas=3
148 [ -z "$oldest" ] && oldest=0
149
150 cob=`echo $ob | wc -w`
151 if [ $cob -gt $replicas ]; then
152         ((numdel=cob-replicas))
153         todel="`echo $ob | cut -d ' ' -f 1-${numdel}`"
154         for dirdel in $todel; do
155                 past=`basename $dirdel`
156                 ns=`date --date="$today" +%s`
157                 ps=`date --date="$past" +%s`
158                 ((delta=(ns-ps)/86400))
159                 if [ $delta -gt $oldest ]; then
160                         log "deleting $dirdel ($delta days old) ..."
161                         bdd=`basename $dirdel`
162                         rm -r $dirdel
163                         rm $backupdir/.$bdd
164                 else
165                         log "keeping $dirdel ($delta days old) ..."
166                 fi
167         done
168 fi
169
170 exit 0