added scheduling (!) see readme. backupninja-0.4.0
authorElijah Saxon <elijah@riseup.net>
Sun, 26 Dec 2004 11:19:06 +0000 (11:19 +0000)
committerElijah Saxon <elijah@riseup.net>
Sun, 26 Dec 2004 11:19:06 +0000 (11:19 +0000)
README
backupninja
changelog
etc/cron.d/backupninja

diff --git a/README b/README
index 5a5a2a828004a1e31f80de7ea948cfee67fa0e06..e361ba74773da467b8834bac812d94a200a5f615 100644 (file)
--- a/README
+++ b/README
@@ -28,6 +28,7 @@ The following options are available:
 -f <file>  Use <file> for the main configuration instead of
            /etc/backupninja.conf
  
+
 CONFIGURATION FILES
 ===================
 
@@ -77,6 +78,42 @@ For example:
    pear = no thanks \
    i will not have a pear.
 
+
+SCHEDULING
+==========
+
+By default, each configuration file is processed everyday at 01:00 (1
+AM). This can be changed by specifying the 'when' option in a config
+file.
+
+For example:
+
+  when = sundays at 02:00
+  when = 30th at 22
+  when = 30 at 22:00
+  when = everyday at 01            <-- the default
+  when = Tuesday at 05:00
+
+A configuration file will be processed at the time(s) specified by the
+"when" option. If multiple "when" options are present, then they all
+apply. If two configurations files are scheduled to run in the same
+hour, then we fall back on the alphabetical ordering specified above.
+If two configurations files are scheduled close to one another in
+time, it is possible to have multiple copies of backupninja running if
+the first instance is not finished before the next one starts.
+
+These values for 'when' are equivalent:
+
+  when = tuesday at 05:30
+  when = TUESDAYS at 05
+
+These values for 'when' are invalid:
+  
+  when = tuesday at 2am
+  when = tuesday at 2
+  when = tues at 02
+
+
 REAL WORLD USAGE
 ================
 
@@ -101,6 +138,7 @@ the backup server must have root on the production server, and (3)
 rdiff-backup is more space efficient and featureful than using rsync +
 hard links. 
 
+
 SSH KEYS
 ========
 
@@ -117,6 +155,7 @@ user 'backup' on desthost without specifying a password.
 Note: when prompted for a password by ssh-keygen, just leave it
 blank by hitting return.
 
+
 INSTALLATION
 ============
    
index 921cb96754d3e76673b51ab080d2281bd359b9c4..c8764ab651d3ea3402d1a4192ee47d5070ab28fc 100755 (executable)
@@ -133,6 +133,77 @@ function getconf() {
        eval $1='$ret'
 }
 
+#
+# enforces very strict permissions on configuration file $file.
+#
+
+function check_perms() {
+       local file=$1
+       local perms=`ls -ld $file`
+       perms=${perms:4:6}
+       if [ "$perms" != "------" ]; then
+               fatal "Configuration files must not be group or world readable! Dying on file $file"
+       fi
+       if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then
+               fatal "Configuration files must be owned by root! Dying on file $file"
+       fi
+}
+
+# simple lowercase function
+function tolower() {
+       echo "$1" | tr [:upper:] [:lower:]
+}
+
+# simple to integer function
+function toint() {
+       echo "$1" | tr [:alpha:] -d 
+}
+
+#
+# function isnow(): returns 1 if the time/day passed as $1 matches
+# the current time/day.
+#
+# format is <day> at <time>:
+#   sunday at 16
+#   8th at 01
+#   everyday at 22
+#
+
+# we grab the current time once, since processing
+# all the configs might take more than an hour.
+nowtime=`date +%H`
+nowday=`date +%d`
+nowdayofweek=`date +%A`
+nowdayofweek=`tolower "$nowdayofweek"`
+
+function isnow() {
+       local when="$1"
+       set -- $when
+       whendayofweek=$1; at=$2; whentime=$3;
+       whenday=`toint "$whendayofweek"`
+       whendayofweek=`tolower "$whendayofweek"`
+       whentime=`echo "$whentime" | sed 's/:[0-9][0-9]$//'`
+
+       if [ "$whendayofweek" == "everyday" ]; then
+               whendayofweek=$nowdayofweek
+       fi
+
+       if [ "$whenday" == "" ]; then
+               if [ "$whendayofweek" != "$nowdayofweek" ]; then
+                       whendayofweek=${whendayofweek%s}
+                       if [ "$whendayofweek" != "$nowdayofweek" ]; then
+                               return 0
+                       fi
+               fi
+       elif [ "$whenday" != "$nowday" ]; then
+               return 0
+       fi
+
+       [ "$at" == "at" ] || return 0
+       [ "$whentime" == "$nowtime" ] || return 0
+
+       return 1
+}
 
 #####################################################
 ## MAIN
@@ -195,6 +266,8 @@ getconf reportemail
 getconf reportsuccess yes
 getconf reportwarning yes
 getconf loglevel 3
+getconf when "Everyday at 01:00"
+defaultwhen=$when
 getconf logfile /var/log/backupninja.log
 getconf SLAPCAT /usr/sbin/slapcat
 getconf RDIFFBACKUP /usr/bin/rdiff-backup
@@ -213,17 +286,12 @@ debug 1 "====== starting at "`date`" ======"
 # by default, don't make files which are world or group readable.
 umask 077
 
+errors=0
+
 for file in $configdirectory/*; do
        [ -f $file ] || continue;
 
-       perms=`ls -ld $file`
-       perms=${perms:4:6}
-       if [ "$perms" != "------" ]; then
-               fatal "Configuration files must not be group or world readable! Dying on file $file"
-       fi
-       if [ `ls -ld $file | awk '{print $3}'` != "root" ]; then
-               fatal "Configuration files must be owned by root! Dying on file $file"
-       fi
+       check_perms $file
        suffix="${file##*.}"
        base=`basename $file`
        if [ "${base:0:1}" == "0" ]; then
@@ -235,7 +303,28 @@ for file in $configdirectory/*; do
 
        if [ -e "$scriptdir/$suffix" ]; then
                setfile $file
+
+               # skip over this config if "when" option
+               # is not set to the current time.
+               getconf when "$defaultwhen"
+               IFS=$'\t\n'
+               for w in $when; do
+                       IFS=$' \t\n'
+                       isnow "$w"
+                       ret=$?
+                       IFS=$'\t\n'
+                       if [ $ret == 0 ]; then
+                               debug 0 "skipping $file because it is not $w"
+                               continue
+                       else
+                               debug 0 "running $file because it is $w"
+                               continue
+                       fi              
+               done
+               IFS=$' \t\n'
+
                echo_debug_msg=1
+               # call the handler:
                ret=`( . $scriptdir/$suffix $file )`
                retcode="$?"
                warnings=`echo $ret | grep -e "^Warning: " | wc -l`
index a2a8a880189482b6582fccfc85d895f36a73be5b..0111e7c8396b3ed0a461c9f1369aebbdc72851ce 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
-version 0.3.5 -- Dec 16 2004
-    added reportsuccess and reportwarning config options
+version 0.4 -- Dec 26 2004
+       added "when" option, so that all configs can specify when
+      they are to be run.
+       added reportsuccess and reportwarning config options
+       added .sys handler (hardware, packages, partitions).
 
 version 0.3.4 -- Dec 8 2004
        fixed numerical variable quoting compatibility with older wc    
index e7dde82d75334e772fa7a538842e9a4338186b3d..0e9fd589b0e23cbed7acc85ca4010bcb055c6444 100644 (file)
@@ -1,2 +1,2 @@
-# cron job for backupninja (once a day)
-00 01 * * * root if [ -x /usr/sbin/backupninja -a -f /etc/backupninja.conf ]; then /usr/sbin/backupninja; fi
+# cron job for backupninja (every hour, on the hour)
+00 * * * * root if [ -x /usr/sbin/backupninja -a -f /etc/backupninja.conf ]; then /usr/sbin/backupninja; fi