diff options
Diffstat (limited to 'backupninja/pull')
-rwxr-xr-x | backupninja/pull | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/backupninja/pull b/backupninja/pull new file mode 100755 index 00000000..a5333055 --- /dev/null +++ b/backupninja/pull @@ -0,0 +1,93 @@ +# +# backupninja handler to do incremental pull backups using +# rsync and hardlinks; this script grabs folders from a remote +# server and stores incrementally in a local folder. its based on +# +# http://www.mikerubel.org/computers/rsync_snapshots/ +# +# feedback: rhatto at riseup.net | gpl +# + +setsection general +getconf log /var/log/backupninja-pull.log +getconf backupdir +getconf rotate +getconf days + +setsection source +getconf user +getconf server +getconf include +getconf exclude +getconf ssh +getconf rsync + +function rotate { + + # please use an absolute path + + if [[ "$2" < 4 ]]; then + error "Rotate: minimum of 4 rotations" + exit 1 + fi + + if [ -d $1.$2 ]; then + 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` + mv $1.$n $1.$dest + touch $1.$dest + fi + done + + if [ -d $1.tmp ]; then + mv $1.tmp $1.0 + fi + + if [ -d $1.1 ]; then + cp -alf $1.1/. $1.0 + fi + +} + +backupdir="/$backupdir" + +if [ ! -d "$backupdir" ]; then + error "Backupdir $backupdir does not exist" + exit 1 +fi + +if [ -z "$days" ]; then + keep="4" +else + keep="`echo $days - 1 | bc -l`" +fi + +for path in $exclude; do + EXCLUDES="$EXCLUDES --exclude=$path" +done + +echo "Starting backup at `date`" >> $log + +for SECTION in $include; do + + section="`basename $SECTION`" + + if [ ! -d "$backupdir/$SECTION/$section.0" ]; then + mkdir -p $backupdir/$SECTION/$section.0 + fi + + info "Rotating $backupdir/$SECTION/$SECTION..." + echo "Rotating $backupdir/$SECTION/$SECTION..." >> $log + rotate $backupdir/$SECTION/$section $keep + info "Syncing $SECTION on $backupdir/$SECTION/$section.0..." + + $rsync "$ssh $user@$server:/$SECTION/ $backupdir/$SECTION/$section.0 >> $log + touch $backupdir/$SECTION/$section.0 + +done + +echo "Finnishing backup at `date`" >> $log |