X-Git-Url: https://git.distorted.org.uk/~mdw/rsync-backup/blobdiff_plain/fdd73e22e2baa4d70eaa65a1cd647ccacf42565e..7131030ee7bfec03e059db8aa0f97a910f1baabb:/rsync-backup.in diff --git a/rsync-backup.in b/rsync-backup.in index 39b09d1..d7267ca 100644 --- a/rsync-backup.in +++ b/rsync-backup.in @@ -27,12 +27,7 @@ set -e thishost=$(hostname -s) quis=${0##*/} - -VERSION=@VERSION@ -mntbkpdir=@mntbkpdir@ -logdir=@logdir@ -fshashdir=@fshashdir@ -conf=@sysconfdir@/rsync-backup.conf +. @pkgdatadir@/lib.sh verbose=: dryrun=nil @@ -157,11 +152,34 @@ hostpath () { fi } +defhook () { + hook=$1 + ## Define a hook called HOOK. + + eval hk_$hook= +} + +addhook () { + hook=$1 cmd=$2 + ## Add command CMD to the hook HOOK. + + eval old=\$hk_$hook; new="$old $cmd" + eval hk_$hook=\$new +} + +runhook () { + hook=$1; shift 1 + ## Invoke HOOK, passing it the remaining arguments. + + eval cmds=\$hk_$hook + for cmd in $cmds; do + if ! $cmd "$@"; then return $?; fi + done +} + ###-------------------------------------------------------------------------- ### Database operations. -INDEXDB=@pkglocalstatedir@/index.db - insert_index () { host=$1 fs=$2 date=$3 vol=$4 @@ -230,7 +248,6 @@ unsnap_ro () { ## Snapshot using LVM. SNAPSIZE="-l10%ORIGIN" -SNAPDIR=@mntbkpdir@/snap snap_lvm () { vg=$1 lv=$2 @@ -372,53 +389,6 @@ unsnap_rfreezefs () { ###-------------------------------------------------------------------------- ### Expiry computations. -parsedate () { - date=$1 - ## Parse an ISO8601 DATE, and set YEAR, MONTH, DAY appropriately (and - ## without leading zeros). - - ## Extract the components of the date and trim leading zeros (which will - ## cause things to be interpreted as octal and fail). - year=${date%%-*} rest=${date#*-}; month=${rest%%-*} day=${rest#*-} - year=${year#0} month=${month#0} day=${day#0} -} - -julian () { - date=$1 - ## Convert an ISO8601 DATE to a Julian Day Number. - - parsedate $date - - ## The actual calculation: convert a (proleptic) Gregorian calendar date - ## into a Julian day number. This is taken from Wikipedia's page - ## http://en.wikipedia.org/wiki/Julian_day#Calculation but the commentary - ## is mine. The epoch is 4713BC-01-01 (proleptic) Julian, or 4714BC-11-24 - ## proleptic Gregorian. - - ## If the MONTH is January or February then set a = 1, otherwise set a = 0. - a=$(( (14 - $month)/12 )) - - ## Compute a year offset relative to 4799BC-03-01. This puts the leap day - ## as the very last day in a year, which is very convenient. The offset - ## here is sufficient to make all y values positive (within the range of - ## the JDN calendar), and is a multiple of 400, which is the Gregorian - ## cycle length. - y=$(( $year + 4800 - $a )) - - ## Compute the offset month number in that year. These months count from - ## zero, not one. - m=$(( $month + 12*$a - 3 )) - - ## Now for the main event. The (153 m + 2)/5 term is a surprising but - ## correct trick for obtaining the number of days in the first m months of - ## the (shifted) year). The magic offset 32045 is what you get when you - ## plug the proper JDN epoch (year = -4713, month = 11, day = 24) into the - ## above machinery. - jdn=$(( $day + (153*$m + 2)/5 + 365*$y + $y/4 - $y/100 + $y/400 - 32045 )) - - echo $jdn -} - expire () { ## Read dates on stdin; write to stdout `EXPIRE date' for dates which ## should be expired and `RETAIN date' for dates which should be retained. @@ -516,8 +486,6 @@ EOF ###-------------------------------------------------------------------------- ### Actually taking backups of filesystems. -STOREDIR=@mntbkpdir@/store -METADIR=@mntbkpdir@/meta MAXLOG=14 HASH=sha256 unset VOLUME @@ -573,19 +541,28 @@ expire_backups () { done } +## Backup hooks. +defhook setup +defhook precommit +defhook postcommit + backup_precommit_hook () { host=$1 fs=$2 date=$3 - ## Override this hook in the configuration file for special effects. + ## Compatibility: You can override this hook in the configuration file for + ## special effects; but it's better to use `addhook precommit'. : } +addhook precommit backup_precommit_hook backup_commit_hook () { host=$1 fs=$2 date=$3 - ## Override this hook in the configuration file for special effects. + ## Compatibility: You can override this hook in the configuration file for + ## special effects; but it's better to use `addhook commit'. : } +addhook commit backup_commit_hook do_backup () { date=$1 fs=$2 fsarg=$3 @@ -594,6 +571,14 @@ do_backup () { set -e attempt=0 + ## Run a hook beforehand. + set +e; runhook setup $host $fs $date; rc=$?; set -e + case $? in + 0) ;; + 99) log "BACKUP of $host:$fs SKIPPED by hook"; return 0 ;; + *) log "BACKUP of $host:$fs FAILED (hook returns $?)"; return $? ;; + esac + ## Report the start of this attempt. log "START BACKUP of $host:$fs" @@ -693,11 +678,11 @@ do_backup () { ## Commit this backup. case $dryrun in nil) - backup_precommit_hook $host $fs $date + runhook precommit $host $fs $date mv new $date mv new.fshash $date.fshash insert_index $host $fs $date $VOLUME - backup_commit_hook $host $fs $date + runhook commit $host $fs $date mkdir hack ln -s $date hack/last mv hack/last . @@ -839,9 +824,17 @@ backup () { ###-------------------------------------------------------------------------- ### Configuration functions. +defhook start +defhook end + +done_first_host_p=nil + host () { host=$1 like= userat= + case $done_first_host_p in + nil) runhook start; done_first_host_p=t ;; + esac case "${expire_policy+t},${default_policy+t}" in t,) default_policy=$expire_policy ;; esac @@ -865,23 +858,13 @@ retain () { ### Read the configuration and we're done. usage () { - echo "usage: $quis [-v] [-c CONF]" + echo "usage: $quis [-nv] [-c CONF]" } version () { echo "$quis version $VERSION" } -config () { - echo - cat <&8 "$@"; } while getopts "hVvc:n" opt; do @@ -899,6 +882,8 @@ case $# in 0) ;; *) usage >&2; exit 1 ;; esac exec 8>&1 . "$conf" + +runhook end $bkprc case "$bkprc" in 0) $verbose "All backups successful" ;; *) $verbose "Backups FAILED" ;;