aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README39
-rwxr-xr-xbackupninja105
-rw-r--r--changelog7
-rw-r--r--etc/cron.d/backupninja4
4 files changed, 143 insertions, 12 deletions
diff --git a/README b/README
index 5a5a2a8..e361ba7 100644
--- 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
============
diff --git a/backupninja b/backupninja
index 921cb96..c8764ab 100755
--- a/backupninja
+++ b/backupninja
@@ -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`
diff --git a/changelog b/changelog
index a2a8a88..0111e7c 100644
--- 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
diff --git a/etc/cron.d/backupninja b/etc/cron.d/backupninja
index e7dde82..0e9fd58 100644
--- a/etc/cron.d/backupninja
+++ b/etc/cron.d/backupninja
@@ -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