From 440cd71f9afa01857159a5881b513aa7694b8354 Mon Sep 17 00:00:00 2001 From: "martin@piware.de" <> Date: Sun, 8 Nov 2009 18:38:34 +0100 Subject: [PATCH] rewrite backup script in shell and with fixed weekly/monthly logic --- backup | 68 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/backup b/backup index f1ecfd4..0f16d58 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,38 @@ # 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 +rsnapshot -c ~/.rsnapshotrc $mode -- 2.39.5