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