aboutsummaryrefslogtreecommitdiff
path: root/backupninja/pull
diff options
context:
space:
mode:
Diffstat (limited to 'backupninja/pull')
-rwxr-xr-xbackupninja/pull93
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