added scheduling (!) see readme.

This commit is contained in:
Elijah Saxon 2004-12-26 11:19:06 +00:00
parent 8fbbbbe8d7
commit a7bf628e61
4 changed files with 143 additions and 12 deletions

39
README
View File

@ -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
============

View File

@ -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`

View File

@ -1,5 +1,8 @@
version 0.3.5 -- Dec 16 2004
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

View 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