Neues Feature beim IML-Backup: Hooks
Nachdem vor 2 Wochen das Prune und Verify separat ausführbar und konfigurierbar wurden, gibt es nun ein weiteres Feature: Hooks.
Das Backup läuft wie folgt ab
- Initialisierung
- Start der Backups der lokalen Datenbanken (z.B. Mysql, Sqlite)
- Backup der definierten lokalen Verzeichnisse
- Prune (Ausdünnen und Löschen alter Backup-Daten)
- Verify
Die Hooks dienen zum Starten von eigenen Skripten … vor dem Start des Backups und danach sowie auch an mehreren Punkten während des Backups.
Es gibt initial diese Verzeichnisse, die du Skripte ablegen kannst, um sie zu definierten Zeitpunkten zu starten:
> tree -d hooks/ hooks/ |-- 10-before-backup | `-- always |-- 12-before-db-service | `-- always |-- 14-before-db-dump (UNUSED) | `-- always |-- 16-after-db-dump (UNUSED) | |-- always | |-- on-error | `-- on-ok |-- 18-after-db-service | |-- always | |-- on-error | `-- on-ok |-- 20-before-transfer | `-- always |-- 22-before-folder-transfer | `-- always |-- 24-after-folder-transfer | |-- always | |-- on-error | `-- on-ok |-- 26-after-prune | |-- always | |-- on-error | `-- on-ok |-- 28-after-verify | |-- always | |-- on-error | `-- on-ok `-- 30-post-backup |-- always |-- on-error `-- on-ok 34 directories
Als am ehesten einleuchtende Beispiele:
- Vor dem Start des Backups kann man Sachen lokal synchronisieren, die ebenfalls ins Backup einfliessen sollen.
- Nach dem Backup kann man beispielsweise Notifikationen ins Monitoring oder per E-mail auslösen.
Bei “nach einer Aktion” zu startenden Hooks kann man jeweils getrennte Sets von Skripten starten, sobald eine Aktion OK war … oder aber fehlerhaft … oder aber auch immer (unabhängig vom Status).
Und wie ist es implementiert? Schauen wir mal auf die Bash-Interna.
Es gibt zu den definierten Zeitpunkten im Skript einen Aufruf einer Hook-Funktion - mit dem Hook-Verzeichnis als Namen als Parameter 1 und für “nach einer Aktion” zu startende Hooks den Exitcode als optionalen 2. Parameter. Als willkürliches Beispiel:
_j_runHooks "24-after-folder-transfer" "$myrc"
Die Hookfunktion ruft bei Exitcode 0 die Skripte im “on-ok” Untrverzeichnis - und bei Exitcode > 0 jene vom “on-error”. Anschliessend (oder bei Aufruf ohne einen Exitcode) werden vom jeweiligen Hook die Skripte im Unterverzeichnis “always” verarbeitet.
Die Ausführung der Skripte erfolgt in alphabetischer Reihenfolge - mit der Benamung kann man also die Abfolge der Abarbeitung mehrerer Skripte beeinflussen.
Die Hookfunktion sieht so aus (genaugenommen erschreckend einfach):
... # ------------------------------------------------------------ # execute hook skripts in a given directory in alphabetic order # param string name of hook directory # param string optional: integer of existcode or "" for non-on-result hook # ------------------------------------------------------------ function _j_runHooks(){ local _hookbase="$1" local _exitcode="$2" local _hookdir="$( dirname $0 )/hooks/$_hookbase" if [ -z "$_exitcode" ]; then _hookdir="$_hookdir/always" elif [ "$_exitcode" = "0" ]; then _hookdir="$_hookdir/on-ok" else _hookdir="$_hookdir/on-error" fi for hookscript in $( ls -1a "$_hookdir" | grep -v "^." | sort ) do if [ -x "$_hookdir/$hookscript" ]; then h3 "HOOK: start $_hookdir/$hookscript ..." $_hookdir/$hookscript else h3 "HOOK: SKIP $_hookdir/$hookscript (not executable) ..." fi done # if an exitcode was given as param then run hooks without exitcode # (in subdir "always") if [ -n "$_exitcode" ]; then _j_runHooks "$_hookbase" fi echo } ...
weiterführende Links: