1 # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
2 # vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
4 # backupninja handler to do incremental backups using
5 # wget and hardlinks, based on rsync handler
7 # feedback: rhatto at riseup.net | gpl
14 # partition = partition where the backup lives
15 # fscheck = set to 1 if fsck should run on $partition after the backup is made
16 # read_only = set to 1 if $partition is mounted read-only
17 # mountpoint = backup partition mountpoint or backup main folder
18 # backupdir = folder relative do $mountpoint where the backup should be stored
19 # days = number of backup increments (min = 5)
20 # lockfile = lockfile to be kept during backup execution
21 # nicelevel = wget command nice level
22 # enable_mv_timestamp_bug = set to "yes" if your system isnt handling timestamps correctly
27 # wget_options = wget command options
28 # url = remote data url
29 # bandwidthlimit = set a badnwidth limit in kbps (remote source only)
32 # folder = local folder
34 # You can also specify some system comands if you don't want the default system values:
39 # touch = touch command
43 # TODO: Daily, weekly and monthly snapshot rotation (like the one present on maildir handler).
46 # config file evaluation
56 getconf log /var/log/backup/wget.log
66 getconf enable_mv_timestamp_bug no
73 getconf bandwidthlimit
75 setsection destination
78 # function definitions
82 if [[ "$2" < 4 ]]; then
83 error "Rotate: minimum of 4 rotations"
88 $nice $mv /$1.$2 /$1.tmp
91 for ((n=`echo "$2 - 1" | bc`; n >= 0; n--)); do
93 dest=`echo "$n + 1" | bc`
94 $nice $mv /$1.$n /$1.$dest
99 if [ -d $1.tmp ]; then
100 $nice $mv /$1.tmp /$1.0
104 $nice $cp -alf /$1.1/. /$1.0
109 function move_files {
110 ref=$tmp/makesnapshot-mymv-$$;
117 backupdir="$mountpoint/$backupdir"
119 # does $backupdir exists?
121 if [ ! -d "$backupdir" ]; then
122 error "Backupdir $backupdir does not exist"
126 # setup number of increments
128 if [ -z "$days" ]; then
131 keep="`echo $days - 1 | bc -l`"
136 if [ ! -z "$lockfile" ]; then
137 $touch $lockfile || warning "Could not create lockfile $lockfile"
142 if [ ! -z "$nicelevel" ]; then
143 nice="nice -n $nicelevel"
150 if [ $enable_mv_timestamp_bug == "yes" ]; then
156 for path in $exclude; do
157 EXCLUDES="$EXCLUDES --exclude=$path"
160 echo "Starting backup at `date`" >> $log
162 # mount backup destination folder as read-write
164 if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then
165 if [ -d "$mountpoint" ]; then
166 mount -o remount,rw $mountpoint
168 error "Could not mount $mountpoint"
174 # the backup procedure
176 if [ ! -d "$backupdir/$folder/$folder.0" ]; then
177 mkdir -p $backupdir/$folder/$folder.0
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..."
185 if [ ! -z "$badnwidth" ]; then
186 limit_rate="--limit-rate=$badnwidth""k"
189 cd $backupdir/$folder/$folder.0
190 wget $wget_options $limit-rate -r -c -N -e robots=off $url
193 $touch $backupdir/$folder/$folder.0
195 # remount backup destination as read-only
197 if [ "$read_only" == "1" ] || [ "$read_only" == "yes" ]; then
198 mount -o remount,ro $mountpoint
201 # check partition for errors
203 if [ "$fscheck" == "1" ] || [ "$fscheck" == "yes" ]; then
206 warning "Could not umount $mountpoint to run fsck"
208 $nice $fsck -v -y $partition >> $log
213 # removes the lockfile
215 if [ ! -z "$lockfile" ]; then
216 $rm $lockfile || warning "Could not remove lockfile $lockfile"
219 echo "Finnishing backup at `date`" >> $log