Restore, List Archives, Content

This commit is contained in:
Hartmut Bauer committed 2025-04-13 02:36:47 +02:00
1 parent ab61e0e916
commit 328936748e
7 files changed
+123 -66

No files matched your search

+72 -25
View File
@@ -1,6 +1,15 @@
HOST_NAME=$(hostname -s)
DAY=$(date +%u) # MO == 1
NAS_MOUNT_POINT="$(realpath $HERE/../../..)" # Server/bin/backup
NAS_ROOT="$NAS_MOUNT_POINT/backups"
LOG_FILE_PATH="$NAS_MOUNT_POINT/Server/log/backup"
log_file_name="$LOG_FILE_PATH/$HOST_NAME-$(date '+%Y-%m-%d_%H%M')"
LOG_FILE="${log_file_name}.log"
RESTORE_PATH="$NAS_MOUNT_POINT/Server/restore"
BACKUP_MASTER_CHECK="/var/docker/vol/proxy"
NAS_HOSTNAME=synology
@@ -117,6 +126,19 @@ dump_postgresql() {
# ----- helper functions -----
# Für Backup und Export muss das Script mit root-Rechten
# ausgeführt werden.
#
check_root() {
if [ "$(id -u)" -ne 0 ]; then
log $ERROR "$ERR script must be run as superuser."
echo "****"
echo "***** script must be run as superuser! *****"
echo "****"
exit 100
fi
}
start_docker() {
log $DEBUG "$DBG start_docker()"
log $DEBUG "$DBG > \$DOCKER up -d"
@@ -430,8 +452,8 @@ backup_daily() {
is_error $?
mail_log $INFO ">>>>>>>>>> end of auto backup"
send_mail_log "Daily Backup"
fix_acls
send_mail_log "Daily Backup"
# ggf. weekly backup starten (z.ZT. nur auf NAS)
if [ $HAS_WEEKLY -a $WEEKLY_DAY -eq $DAY ]; then
@@ -449,8 +471,8 @@ backup_weekly() {
is_error $?
mail_log $INFO ">>>>>>>>>> end of auto backup"
send_mail_log "Weekly Backup"
fix_acls
send_mail_log "Weekly Backup"
}
# ----- integrity -----
@@ -475,21 +497,50 @@ test_integrity() {
# Restore aus Archiv
#
# Wird nach pwd ausgegeben!
# Wird nach $RESTORE_PATH ausgegeben und mit root-Rechten
# auf der NAS ausgeführt.
#
# $1 - Archiv, ggf. mit Pfad
# $1 - Archiv, mit Pfad ab $NAS_ROOT
# $2 ff. - zurückzusichernde Dateien/Verzeichnisse
#
# returns 0 for success, 1 otherwise
#
restore() {
log $DEBUG "$DBG restore( $@ )"
local archive=$1
shift 1
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -xzv $@"
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -xzv $@ >/dev/null 2>>$LOG_FILE
shift
echo "--- Restore ---"
echo "--- archive: $archive"
echo "--- files: $@"
echo "--- to: $RESTORE_PATH"
echo
echo "Restore runs on NAS, see e-mail"
echo
run_script_remote $NAS_IP "$NAS_SCRIPT --rx $archive $@"
}
# Restore
#
# Beim Restore einzelner Dateien wird nur die ownership der Datei
# restored, nicht die des Pfades zur Datei!
#
do_restore() {
if [ "$HOST_NAME" != "$NAS_HOSTNAME" ]; then
restore $@
exit
fi
local archive=$1
shift
mail_log $INFO ">>>>>>>>>> restore $VER for $HOST_NAME <<<<<<<<<<"
mail_log $INFO ">>> restore from: $archive"
mail_log $INFO ">>> files : $@"
mail_log $INFO ">>> restore to : $RESTORE_PATH"
mail_log $INFO ">>> log file : $LOG_FILE"
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$NAS_ROOT/${archive/#\//}\" | tar -xzv --directory $RESTORE_PATH $@"
gpg --batch --decrypt --passphrase $PASSPHRASE "$NAS_ROOT/${archive/#\//}" 2>>$LOG_FILE | tar -xzv --directory $RESTORE_PATH $@ >>$LOG_FILE 2>&1
check_pipe_rc ${PIPESTATUS[@]}
return $?
is_error $?
mail_log $INFO ">>>>>>>>>> end of restore"
send_mail_log "Restore"
}
# ----- archive content ------
@@ -511,41 +562,37 @@ create_list() {
# Liste der Archives auf stdout ausgeben
#
# Zeigt alle Archive incl. Verzeichnis (ohne $1) an
# Zeigt alle Archive incl. Verzeichnis (ohne $NAS_ROOT) an
#
# z.B.
# $1 = /volume1/nfs/backups
# $NAS_ROOT = /volume1/nfs/backups
# ...
# /daily/synology/backup.3/volume1-nfs-Server.tgz.gpg
# /weekly/synology/volume1-media-books.tgz.gpg
#
# $1 - Verzeichnis unter dem alle Backups liegen
#
# returns 0 for success, 1 otherwise
#
list_archives() {
log $DEBUG "$DBG list_archives( $@ )"
log $DEBUG "$DBG list_archives()"
local target=$1
local targ=${target//\//\\\/} # slashes escapen
log $DEBUG "$DBG > find \"$target\" -type f -name \"*.$EXT\" | grep \"${HOST_NAME}/\" | sed -E \"s/^$targ//\""
find "$target" -type f -name "*.$EXT" 2>>$LOG_FILE | grep "${HOST_NAME}/" 2>>$LOG_FILE | sed -E "s/^$targ//" 2>>$LOG_FILE
local targ=${NAS_ROOT//\//\\\/} # slashes escapen
log $DEBUG "$DBG > find \"$NAS_ROOT\" -type f -name \"*.$EXT\" | sed -E \"s/^$targ//\""
find "$NAS_ROOT" -type f -name "*.$EXT" 2>>$LOG_FILE | sed -E "s/^$targ//" 2>>$LOG_FILE
check_pipe_rc ${PIPESTATUS[@]}
return $?
}
# Inhalt des Archivs $2 auf stdout ausgeben
# Inhalt des Archivs $1 auf stdout ausgeben
#
# $1 - Verzeichnis unter dem alle Backups liegen
# $2 - Archiv-Datei mit Pfad ab $1
# $1 - Archiv-Datei mit Pfad ab $NAS_ROOT
#
# returns 0 for success, 1 otherwise
#
list_archive_content() {
log $DEBUG "$DBG list_archive_content( $@ )"
local root=$1
local archive=$2
log $DEBUG "$DBG > cat \"$root/${archive/#\//}.$LIST_EXT\""
cat "$root/${archive/#\//}.$LIST_EXT" 2>>$LOG_FILE
local archive=$1
log $DEBUG "$DBG > cat \"$NAS_ROOT/${archive/#\//}.$LIST_EXT\""
cat "$NAS_ROOT/${archive/#\//}.$LIST_EXT" 2>>$LOG_FILE
}
# ----- export -----