tar+gpg works, first steps with logging

This commit is contained in:
Hartmut Bauer committed 2025-03-17 00:17:14 +01:00
1 parent b9e6da7645
commit 52759ec1e3
1 file changed
+183 -42
+183 -42
View File
@@ -5,9 +5,27 @@ BACKUP_DIR=vol
SOURCE=nextcloud SOURCE=nextcloud
TARGET_DIR=/var/docker/tmp TARGET_DIR=/var/docker/tmp
PASSPHRASE=1234567890 PASSPHRASE=1234567890
EXT=tgz.gpg
RESTORE=vol/nextcloud/data/data/nextcloud.log 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 ... # Ist $1 in der Liste der restlichen args $2, $3 ...
# #
# zB. if is_in "foo" "foo" "bar" "foo bar" ; then ... # zB. if is_in "foo" "foo" "bar" "foo bar" ; then ...
@@ -21,7 +39,7 @@ function is_in {
return 1 return 1
} }
# alle Verzechnisnamen in einem Verzeichnis holen # Alle Verzechnisnamen in einem Verzeichnis holen.
# #
# $1 - Verzeichnis in dem gesucht wird als absoluter Pfad # $1 - Verzeichnis in dem gesucht wird als absoluter Pfad
# $2 ff. - auszuschliessende Verzeichnisse (kann leer bleiben) # $2 ff. - auszuschliessende Verzeichnisse (kann leer bleiben)
@@ -30,7 +48,7 @@ function iterate_dirs_in() {
local dirname local dirname
local root=$1 local root=$1
shift 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) dirname=$(basename $dir)
if ! is_in "$dirname" "$@"; then if ! is_in "$dirname" "$@"; then
echo "$dirname" echo "$dirname"
@@ -38,58 +56,181 @@ function iterate_dirs_in() {
done 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) # $1 - dir to check
# $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)
# #
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 root=$1
local source=$2 local target=$2
local target=$3 local prefix=$(backup_file_prefix $root)
local tar_file
local dir local dir
shift 3 shift 2
cd "$root"
for dir in $(iterate_dirs_in "$root/$source" "$@"); do for dir in $(iterate_dirs_in "$root" "$@"); do
sudo tar -c -z --numeric-owner --one-file-system "$source/$dir" | sudo gpg --batch -c --passphrase $PASSPHRASE -o "$target/$dir.tgz.gpg" tar_file="$target/$prefix-$dir.$EXT"
backup_dir "$root" "$tar_file" "$dir"
list "$tar_file" "$dir"
test_integrity "$tar_file"
done done
} }
#for dir in $(find "$RUN_DIR/$BACKUP_DIR" -maxdepth 1 -type d \! -wholename "$RUN_DIR/$BACKUP_DIR"); do # Einzelnes Verzeichnis sichern.
# testfn "$dir -> $(basename $dir)" #
#done # $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 "-----------------------" # Inhalt des Archivs in eine Textdatei ausgeben.
date #
echo "-----------------------" # $1 - Archiv
backup_dir "$RUN_DIR" "$BACKUP_DIR" "$TARGET_DIR" #
echo "-----------------------" function list() {
date local archive=$1
echo "-----------------------" 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 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 TARGET_DIR=/var/docker/tmp/two
echo "#" echo "#"