diff --git a/test.sh b/test.sh index 2f0e6cd..ed08755 100755 --- a/test.sh +++ b/test.sh @@ -5,9 +5,27 @@ BACKUP_DIR=vol SOURCE=nextcloud TARGET_DIR=/var/docker/tmp PASSPHRASE=1234567890 +EXT=tgz.gpg RESTORE=vol/nextcloud/data/data/nextcloud.log +# Log-Datei schreiben. +# +# Die Ausgabe geht auch auf STDOUT, dadurch kann die vollständige Ausgabe, +# einschließlich Status- und Fehlermeldungen der Programme in ein erweitertes +# Log für die Fehlersuche umgeleitet werden. +# +# $1 - Typ, z.B. INFO, WARN, ERROR, etc. +# $2 ff. - die Meldung, die ins Log geschreiben wird +# +log() { + local type=$1 + if [ "$type" == "ERROR" ]; then ERROR=0; fi + shift 1 + echo "$(date '+%d.%m.%Y %H:%M:%S') - $type $@" | sudo tee -a $LOG_FILE + +} + # Ist $1 in der Liste der restlichen args $2, $3 ... # # zB. if is_in "foo" "foo" "bar" "foo bar" ; then ... @@ -21,7 +39,7 @@ function is_in { return 1 } -# alle Verzechnisnamen in einem Verzeichnis holen +# Alle Verzechnisnamen in einem Verzeichnis holen. # # $1 - Verzeichnis in dem gesucht wird als absoluter Pfad # $2 ff. - auszuschliessende Verzeichnisse (kann leer bleiben) @@ -30,7 +48,7 @@ function iterate_dirs_in() { local dirname local root=$1 shift 1 - for dir in $(find "$root" -maxdepth 1 -type d \! -wholename "$root"); do + for dir in $(sudo find "$root" -maxdepth 1 -type d \! -wholename "$root"); do dirname=$(basename $dir) if ! is_in "$dirname" "$@"; then echo "$dirname" @@ -38,58 +56,181 @@ function iterate_dirs_in() { done } -# Verzeichnise in .tgz.gpg-Dateien sichern +# create directory if it not exists # -# $1 - Verzeichnis unterhalb dessen gesichert werden soll, das also nicht Teil des gespeicherten Pfads wird (z.B /var/docker) -# $2 - Verzeichnis, das gesichert wird: alle Verzeichnisse darunter werden einzeln als .tgz.gpg-Datei gesichert (z.B vol -> apache.tgz.gpg, etc.) -# $3 - Zielverzeichnis für .tgz.gpg-Dateien -# $4 ff. - Verzeichnisse, die nicht gesichert werden sollen (kann leer bleiben) +# $1 - dir to check # -function backup_dir() { +function check_directory() { + local dir=$1 + if [ -d "$1" ]; then + return 0 + else + mkdir -p "$1" && return 0 + sudo mkdir -p "$1" && return 0 + log ERROR "### could not create directory $1!" + # no chance to recover + exit 1 + fi +} + +# Slashes "/" im Pfadnamen durch Dashes "-" ersetzen, so dass der String als Dateiname verwendet werden kann. +# +# $1 - path +function backup_file_prefix() { + echo "$1" | sed -E 's/^\///' | sed -E 's/\//-/g' +} + +# Verzeichnise in .tgz.gpg-Dateien sichern. +# +# $1 - Verzeichnis, das gesichert wird: alle Verzeichnisse darunter werden einzeln als .tgz.gpg-Datei gesichert +# $2 - Zielverzeichnis für .tgz.gpg-Dateien +# $3 ff. - Verzeichnisse, die nicht gesichert werden sollen (kann leer bleiben) +# +function backup_all_dirs() { local root=$1 - local source=$2 - local target=$3 + local target=$2 + local prefix=$(backup_file_prefix $root) + local tar_file local dir - shift 3 - cd "$root" - for dir in $(iterate_dirs_in "$root/$source" "$@"); do - sudo tar -c -z --numeric-owner --one-file-system "$source/$dir" | sudo gpg --batch -c --passphrase $PASSPHRASE -o "$target/$dir.tgz.gpg" + shift 2 + + for dir in $(iterate_dirs_in "$root" "$@"); do + tar_file="$target/$prefix-$dir.$EXT" + backup_dir "$root" "$tar_file" "$dir" + list "$tar_file" "$dir" + test_integrity "$tar_file" done } -#for dir in $(find "$RUN_DIR/$BACKUP_DIR" -maxdepth 1 -type d \! -wholename "$RUN_DIR/$BACKUP_DIR"); do -# testfn "$dir -> $(basename $dir)" -#done +# Einzelnes Verzeichnis sichern. +# +# $1 - Pfad um Verzeichnis, das gesichert werden soll +# $2 - Zielpfad und -name für das Archiv +# $2 - zu sicherndes Verzeichnis +# +function backup_dir() { + local root=$1 + local archive=$2 + local dir=$3 + log INFO "--- Backup $root/$dir -> $archive" + sudo tar -c -z --numeric-owner --one-file-system --exclude "@eaDir" -C "$root" "$dir" | sudo gpg --batch -c --passphrase $PASSPHRASE -o "$archive" + local rc=$? + if [ "$rc" == "0" ] ; then + log INFO "*** success" + else + log ERROR "### see full log" + fi +} -echo "-----------------------" -date -echo "-----------------------" -backup_dir "$RUN_DIR" "$BACKUP_DIR" "$TARGET_DIR" -echo "-----------------------" -date -echo "-----------------------" +# Inhalt des Archivs in eine Textdatei ausgeben. +# +# $1 - Archiv +# +function list() { + local archive=$1 + log INFO "--- List $archive" + sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -tzv | sudo tee $archive.txt >/dev/null + local rc=$? + if [ "$rc" == "0" ] ; then + log INFO "*** success" + else + log ERROR "### see full log" + fi +} + +# Integrität des Archivs testen, indem es entschlüsselt, entpackt +# und der Inhalt auf /dev/null ausgegeben wird. +# +# $1 - Archiv +# +function test_integrity() { + local archive=$1 + log INFO "--- Check integrity of $archive" + sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -xzO >/dev/null + local rc=$? + if [ "$rc" == "0" ] ; then + log INFO "*** success" + else + log ERROR "### see full log" + fi +} + +# Restore aus Archiv +# +# Wird nach pwd ausgegeben! +# +# $1 - Archiv, ggf. mit Pfad +# $2 ff. - zurückzusichernde Dateien/Verzeichnisse +# +function restore() { + local archive=$1 + shift 1 + sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -xzv $@ >/dev/null + local rc=$? + if [ "$rc" == "0" ] ; then + log INFO "*** success" + else + log ERROR "### see full log" + fi +} + + +# *** NAS Test *** +function nas_test() { + LOG_FILE="/volume1/nfs/Server/tmp/backup.log" + + log INFO "*** *** Begin NAS backup (data, media/books, media/music)" + TARGET_DIR="/volume1/nfs/backups/tmp/backup.$(date +%u)" + EXCLUDE_DIRS=("@eaDir" "Temporary Items" "lost+found") + check_directory $TARGET_DIR + # data + backup_all_dirs "/volume1/data" "$TARGET_DIR" "${EXCLUDE_DIRS[@]}" + + + TARGET_DIR2="/volume1/nfs/backups/tmp/media" + EXCLUDE_DIRS2=("@eaDir" "Temporary Items" "lost+found" serien tmp video "video.archive") + check_directory $TARGET_DIR2 + # media/books media/music + backup_all_dirs "/volume1/media" "$TARGET_DIR2" "${EXCLUDE_DIRS2[@]}" + + log INFO "*** End of NAS backuip" +} + + +# *** NATHAN Test *** +function nathan_test() { + LOG_FILE=/var/docker/tmp/backup.log + + log INFO "*** *** Begin nathan server backup" + TARGET_DIR=/var/docker/tmp/backup.$(date +%u) + check_directory $TARGET_DIR + + backup_all_dirs "/var" "$TARGET_DIR" docker + backup_all_dirs "/var/docker" "$TARGET_DIR" vol tmp + backup_all_dirs "/var/docker/vol" "$TARGET_DIR" + + log INFO "*** End of nathan server backup" +} + +function test1() { + LOG_FILE=./t1.log + log INFO "error test" +} + +#nas_test +#nathan_test + +test1 + +if [ ! -z $ERROR ]; then + log ERROR "*** *** Errors occured during the progem run, see full log for details." +else + log INFO "*** *** Program ended successfully." +fi exit -date +%H:%M:%S.%N -echo "--- tar -c ------------------------------------------------" -cd $RUN_DIR - -sudo tar -c -z --numeric-owner --one-file-system -f "$TARGET_DIR/$SOURCE.tar.gz" "$BACKUP_DIR/$SOURCE" -date +%H:%M:%S.%N - -echo "--- tar -t ------------------------------------------------" - -cd $TARGET_DIR - -sudo tar -t -f "$TARGET_DIR/$SOURCE.tar.gz" | sudo tee tar_list.txt >/dev/null -date +%H:%M:%S.%N - -echo "--- tar -x ------------------------------------------------" - -sudo tar -xv -f "$TARGET_DIR/$SOURCE.tar.gz" $RESTORE >/dev/null -date +%H:%M:%S.%N TARGET_DIR=/var/docker/tmp/two echo "#"