--- /dev/null
+#!/usr/bin/python
+
+# call rsnapshot daily/weekly/monthly regularly
+# this should be called from cron very often (several times a day) to not miss
+# a cycle when the machine is powered down for extended times.
+#
+# 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')