51054eab829e642a14d5ec63686fad7aafcb1f40
[matthijs/upstream/backupninja.git] / handlers / wget
1 #
2 # backupninja handler to do incremental backups using
3 # wget and hardlinks, based on rsync handler
4 #
5 # feedback: rhatto at riseup.net | gpl
6 #
7 # Config file options
8 # -------------------
9 #
10 #   [general]
11 #   log = wget log file
12 #   partition = partition where the backup lives
13 #   fscheck = set to 1 if fsck should run on $partition after the backup is made
14 #   read_only = set to 1 if $partition is mounted read-only
15 #   mountpoint = backup partition mountpoint or backup main folder
16 #   backupdir = folder relative do $mountpoint where the backup should be stored
17 #   days = number of backup increments (min = 5)
18 #   lockfile = lockfile to be kept during backup execution
19 #   nicelevel = wget command nice level
20 #   enable_mv_timestamp_bug = set to "yes" if your system isnt handling timestamps correctly
21 #   tmp = temp folder
22 #
23 #   [source]
24 #   wget = wget program
25 #   wget_options = wget command options
26 #   url = remote data url
27 #   bandwidthlimit = set a badnwidth limit in kbps (remote source only)
28 #
29 #   [destination]
30 #   folder = local folder
31 #
32 # You can also specify some system comands if you don't want the default system values:
33 #
34 #   [system]
35 #   rm = rm command
36 #   cp = cp command
37 #   touch = touch command
38 #   mv = mv command
39 #   fsck = fsck command
40 #
41 # TODO: Daily, weekly and monthly snapshot rotation (like the one present on maildir handler).
42 #
43
44 # config file evaluation
45
46 setsection system
47 getconf rm rm
48 getconf cp cp
49 getconf touch touch
50 getconf mv mv
51 getconf fsck fsck
52
53 setsection general
54 getconf log /var/log/backup/wget.log
55 getconf partition
56 getconf fscheck
57 getconf read_only
58 getconf mountpoint
59 getconf backupdir
60 getconf rotate
61 getconf days
62 getconf lockfile
63 getconf nicelevel 0
64 getconf enable_mv_timestamp_bug no
65 getconf tmp /tmp
66
67 setsection source
68 getconf wget wget
69 getconf wget_options
70 getconf url
71 getconf bandwidthlimit
72
73 setsection destination
74 getconf folder
75
76 # function definitions
77
78 function rotate {
79
80   if [[ "$2" < 4 ]]; then
81     error "Rotate: minimum of 4 rotations"
82     exit 1
83   fi
84
85   if [ -d $1.$2 ]; then
86     $nice $mv /$1.$2 /$1.tmp
87   fi
88
89   for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do
90     if [ -d $1.$n ]; then
91       dest=`echo "$n + 1" | bc`
92       $nice $mv /$1.$n /$1.$dest
93       $touch /$1.$dest
94     fi
95   done
96
97   if [ -d $1.tmp ]; then
98     $nice $mv /$1.tmp /$1.0
99   fi
100
101   if [ -d $1.1 ]; then
102     $nice $cp -alf /$1.1/. /$1.0
103   fi
104
105 }
106
107 function move_files {
108
109  ref=$tmp/makesnapshot-mymv-$$;
110  $touch -r $1 $ref;
111  $mv $1 $2;
112  $touch -r $ref $2;
113  $rm $ref;
114
115 }
116
117 backupdir="$mountpoint/$backupdir"
118
119 # does $backupdir exists?
120
121 if [ ! -d "$backupdir" ]; then 
122   error "Backupdir $backupdir does not exist"
123   exit 1
124 fi
125
126 # setup number of increments
127
128 if [ -z "$days" ]; then
129   keep="4"
130 else
131   keep="`echo $days - 1 | bc -l`"
132 fi
133
134 # lockfile setup
135
136 if [ ! -z "$lockfile" ]; then
137   $touch $lockfile || warning "Could not create lockfile $lockfile"
138 fi
139
140 # nicelevel setup
141
142 if [ ! -z "$nicelevel" ]; then 
143   nice="nice -n $nicelevel"
144 else 
145   nice=""
146 fi
147
148 # set mv procedure
149
150 if [ $enable_mv_timestamp_bug == "yes" ]; then
151   mv=move_files
152 fi
153
154 # set excludes
155
156 for path in $exclude; do
157   EXCLUDES="$EXCLUDES --exclude=$path"
158 done
159
160 echo "Starting backup at `date`" >> $log
161
162 # mount backup destination folder as read-write
163
164 if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then
165   if [ -d "$mountpoint" ]; then
166     mount -o remount,rw $mountpoint
167     if (($?)); then
168       error "Could not mount $mountpoint"
169       exit 1
170     fi
171   fi
172 fi
173
174 # the backup procedure
175
176 if [ ! -d "$backupdir/$folder/$folder.0" ]; then
177   mkdir -p $backupdir/$folder/$folder.0
178 fi
179
180 info "Rotating $backupdir/$folder/$folder..."
181 echo "Rotating $backupdir/$folder/$folder..." >> $log
182 rotate $backupdir/$folder/$folder $keep
183 info "Wget'ing $SECTION on $backupdir/$folder/$folder.0..."
184
185 if [ ! -z "$badnwidth" ]; then
186   limit_rate="--limit-rate=$badnwidth""k"
187 fi
188
189 cd $backupdir/$folder/$folder.0
190 wget $wget_options $limit-rate -r -c -N -e robots=off $url
191 cd -
192
193 $touch $backupdir/$folder/$folder.0
194
195 # remount backup destination as read-only
196
197 if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then
198   mount -o remount,ro $mountpoint
199 fi
200
201 # check partition for errors
202
203 if [ "$fscheck" == "1" ] || [ "$fscheck" == "yes" ]; then
204   umount $mountpoint
205   if (($?)); then
206     warning "Could not umount $mountpoint to run fsck"
207   else
208     $nice $fsck -v -y $partition >> $log
209     mount $mountpoint
210   fi
211 fi
212
213 # removes the lockfile
214
215 if [ ! -z "$lockfile" ]; then
216   $rm $lockfile || warning "Could not remove lockfile $lockfile"
217 fi
218
219 echo "Finnishing backup at `date`" >> $log
220