2 # backupninja handler to do incremental backups using
3 # wget and hardlinks, based on rsync handler
5 # feedback: rhatto at riseup.net | gpl
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
25 # wget_options = wget command options
26 # url = remote data url
27 # bandwidthlimit = set a badnwidth limit in kbps (remote source only)
30 # folder = local folder
32 # You can also specify some system comands if you don't want the default system values:
37 # touch = touch command
41 # TODO: Daily, weekly and monthly snapshot rotation (like the one present on maildir handler).
44 # config file evaluation
54 getconf log /var/log/backup/wget.log
64 getconf enable_mv_timestamp_bug no
71 getconf bandwidthlimit
73 setsection destination
76 # function definitions
80 if [[ "$2" < 4 ]]; then
81 error "Rotate: minimum of 4 rotations"
86 $nice $mv /$1.$2 /$1.tmp
89 for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do
91 dest=`echo "$n + 1" | bc`
92 $nice $mv /$1.$n /$1.$dest
97 if [ -d $1.tmp ]; then
98 $nice $mv /$1.tmp /$1.0
102 $nice $cp -alf /$1.1/. /$1.0
107 function move_files {
108 ref=$tmp/makesnapshot-mymv-$$;
115 backupdir="$mountpoint/$backupdir"
117 # does $backupdir exists?
119 if [ ! -d "$backupdir" ]; then
120 error "Backupdir $backupdir does not exist"
124 # setup number of increments
126 if [ -z "$days" ]; then
129 keep="`echo $days - 1 | bc -l`"
134 if [ ! -z "$lockfile" ]; then
135 $touch $lockfile || warning "Could not create lockfile $lockfile"
140 if [ ! -z "$nicelevel" ]; then
141 nice="nice -n $nicelevel"
148 if [ $enable_mv_timestamp_bug == "yes" ]; then
154 for path in $exclude; do
155 EXCLUDES="$EXCLUDES --exclude=$path"
158 echo "Starting backup at `date`" >> $log
160 # mount backup destination folder as read-write
162 if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then
163 if [ -d "$mountpoint" ]; then
164 mount -o remount,rw $mountpoint
166 error "Could not mount $mountpoint"
172 # the backup procedure
174 if [ ! -d "$backupdir/$folder/$folder.0" ]; then
175 mkdir -p $backupdir/$folder/$folder.0
178 info "Rotating $backupdir/$folder/$folder..."
179 echo "Rotating $backupdir/$folder/$folder..." >> $log
180 rotate $backupdir/$folder/$folder $keep
181 info "Wget'ing $SECTION on $backupdir/$folder/$folder.0..."
183 if [ ! -z "$badnwidth" ]; then
184 limit_rate="--limit-rate=$badnwidth""k"
187 cd $backupdir/$folder/$folder.0
188 wget $wget_options $limit-rate -r -c -N -e robots=off $url
191 $touch $backupdir/$folder/$folder.0
193 # remount backup destination as read-only
195 if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then
196 mount -o remount,ro $mountpoint
199 # check partition for errors
201 if [ "$fscheck" == "1" ] || [ "$fscheck" == "yes" ]; then
204 warning "Could not umount $mountpoint to run fsck"
206 $nice $fsck -v -y $partition >> $log
211 # removes the lockfile
213 if [ ! -z "$lockfile" ]; then
214 $rm $lockfile || warning "Could not remove lockfile $lockfile"
217 echo "Finnishing backup at `date`" >> $log