-#!/usr/bin/python
+#!/bin/sh -e
# call rsnapshot daily/weekly/monthly regularly
# this should be called from cron very often (several times a day) to not miss
# Author: Martin Pitt <martin@piware.de>
# License: Public Domain
-import os, time, os.path, pwd, subprocess
-
-user = pwd.getpwuid(os.getuid()).pw_name
-rsnapshot_basedir = '/var/backups/' + user
-rsnapshot_conffile = os.path.expanduser('~/.rsnapshotrc')
-verbose = True
-
-def days_mod(path):
- '''Return the number of days since the last modification of path.'''
-
- if os.path.exists(path):
- return (time.time() - os.stat(path).st_mtime)/86400.
- else:
- return time.time()/86400.
-
-def rsnapshot(mode):
- argv = ['rsnapshot']
- if verbose:
- argv.append('-v')
- argv += ['-c', rsnapshot_conffile, mode]
- if verbose:
- print argv
- subprocess.call(argv)
-
-# daily
-if days_mod(os.path.join(rsnapshot_basedir, 'daily.0')) >= 1:
- rsnapshot('daily')
-elif days_mod(os.path.join(rsnapshot_basedir, 'weekly.0')) >= 7:
- rsnapshot('weekly')
-elif days_mod(os.path.join(rsnapshot_basedir, 'monthly.0')) >= 30:
- rsnapshot('monthly')
+backupdir=`grep ^snapshot_root ~/.rsnapshotrc | awk '{print $2}'`
+
+now=`date +%s`
+
+get_age() {
+ if [ -e $backupdir/$1 ]; then
+ age=$(($now - `stat -c %Y $backupdir/$1`))
+ else
+ unset age
+ fi
+}
+
+# abort if last backup was less than a day ago
+get_age daily.0
+[ -n "$age" ] && [ $age -lt 86300 ] && exit 0
+
+print '------------1---------------'
+# monthly backup if last monthly is older than a month (if it doesn't exist,
+# check oldest weekly)
+get_age monthly.0
+[ -n "$age" ] || get_age weekly.3
+[ -n "$age" ] && [ $age -ge 2591900 ] && mode=monthly
+
+# weekly backup if last weekly is older than a week (if it doesn't exist,
+# check oldest daily)
+get_age weekly.0
+[ -n "$age" ] || get_age daily.6
+[ -n "$age" ] && [ $age -ge 604700 ] && mode=weekly
+
+# default to daily
+[ -n "$mode" ] || mode=daily
+
+# call rsnapshot
+echo mode: $mode
+rsnapshot -c ~/.rsnapshotrc $mode