X-Git-Url: https://piware.de/gitweb/?p=bin.git;a=blobdiff_plain;f=backup;h=db4faaa5a5d10b9bbd17609497ace3f9ada02455;hp=f1ecfd437098fbbda47165f0daf3c8e20f93fd13;hb=aa2ac45de12d32728735496784ebf7751bfbcf92;hpb=bb7c28698e7d66ed14d3d3d5897df9cde5e2ff78 diff --git a/backup b/backup index f1ecfd4..db4faaa 100755 --- a/backup +++ b/backup @@ -1,4 +1,4 @@ -#!/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 @@ -7,34 +7,40 @@ # Author: Martin Pitt # 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 +#notify-send "$mode backup started" || : +rsnapshot -c ~/.rsnapshotrc $mode +#notify-send "$mode backup finished" || :