rsync-backup.{in,8}: Introduce `hook' concept.
[rsync-backup] / rsync-backup.in
index 39b09d1..e232bc8 100644 (file)
@@ -157,6 +157,31 @@ 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.
 
@@ -573,19 +598,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 +628,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 +735,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 +881,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,7 +915,7 @@ retain () {
 ### Read the configuration and we're done.
 
 usage () {
-  echo "usage: $quis [-v] [-c CONF]"
+  echo "usage: $quis [-nv] [-c CONF]"
 }
 
 version () {
@@ -899,6 +949,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" ;;