This commit is contained in:
Hartmut Bauer committed 2025-04-05 12:33:52 +02:00
1 parent 050c3ccd9e
commit b079912dc7
8 files changed
+325 -104

No files matched your search

+187 -54
View File
@@ -1,3 +1,5 @@
VER="2.0.0-beta-4"
HOST_NAME=$(hostname)
DAY=$(date +%u)
@@ -5,12 +7,37 @@ PASSPHRASE=1234567890
EXT=tgz.gpg
LIST_EXT=txt
INFO=INFO
ERROR=ERROR
DEBUG=DEBUG
SUCCESS="*** success"
INF="---"
ERR="###"
DBG="==="
# docker compose ausführen
#
# $1 ff. - compose parameter, z.B. up -d
#
run_docker() {
/usr/bin/docker compose -f /var/docker/run/docker-compose.yml --ansi never $@
log $DEBUG "$DBG run_docker $@"
#DEBUG ohne docker stop/start
return 0
log $DEBUG "$DBG > /usr/bin/docker compose -f /var/docker/run/docker-compose.yml --ansi never $@"
/usr/bin/docker compose -f /var/docker/run/docker-compose.yml --ansi never $@ >>$LOG_FILE 2>&1
return $?
}
start_docker() {
log $DEBUG "$DBG start_docker"
return $(run_docker up -d)
}
stop_docker() {
log $DEBUG "$DBG stop_docker"
return $(run_docker down)
}
# check if function $1 exists
@@ -30,12 +57,82 @@ isFunction() { declare -Ff "$1" ; }
#
log() {
local type=$1
if [ "$type" == "ERROR" ]; then ERROR=0; fi
#if [ "$type" == "ERROR" ]; then ERROR=0; fi
shift 1
echo "$(date '+%d.%m.%Y %H:%M:%S') - $type $@" | sudo tee -a $LOG_FILE
echo "$(date '+%d.%m.%Y %H:%M:%S') - $type $@" | tee -a $LOG_FILE >/dev/null
}
mail_log() {
local type=$1
shift
if [ "$MAIL_LOG_FILE" ]; then
echo "$(date '+%d.%m.%Y %H:%M:%S') - $type $@" >> $MAIL_LOG_FILE
fi
log "$type" "$@"
}
# check if $1 is error (!=0) and write result to log
#
# $1 - return code to check
# $2 - if set don't log success
#
# returns 0 if error, 1 otherwise!
#
is_error() {
local rc=$1
local mlog=$2
if [ $rc -eq 0 ]; then
if [ "$mlog" ]; then
mail_log $INFO "$SUCCESS"
fi
return 1
else
mail_log $ERROR "$ERR an error occured see $LOG_FILE"
return 0
fi
}
# check return code of piped programs
#
# $1, ff. - return codes
#
check_pipe_rc() {
local result=0
local count=1
local result_str
for rc in $@; do
if [ $rc -ne 0 ] ; then
result=1
result_str="${result_str}#${count} "
fi
let "count += 1"
done
if [ $result -ne 0 ]; then
log $ERROR "$ERR in pipe $result_str"
fi
return $result
}
# Dateien vom Server zur NAS verschieben
#
# $1 - Verzeichnis auf Server
# $2 - Ziel-Verzeichnis auf der NAS
#
copy_to_nas() {
log $DEBUG "$DBG copy_to_nas $@"
local source="$1"
local target="$2"
delete_dir "$target"
if [ $(check_directory "$target") -gt 0 ]; then
log $ERROR "$ERR directory \"$target\" not found"
return 1
fi
log $DEBUG "$DBG > mv \"$source\"/* \"$target\""
mv "$source"/* "$target" >>$LOG_FILE 2>&1
return $?
}
# Ist $1 in der Liste der restlichen args $2, $3 ...
#
# zB. if is_in "foo" "foo" "bar" "foo bar" ; then ...
@@ -58,7 +155,7 @@ iterate_dirs_in() {
local dirname
local root=$1
shift 1
for dir in $(sudo find "$root" -maxdepth 1 -type d \! -wholename "$root"); do
for dir in $(find "$root" -maxdepth 1 -type d \! -wholename "$root"); do
dirname=$(basename $dir)
if ! is_in "$dirname" "$@"; then
echo "$dirname"
@@ -71,15 +168,15 @@ iterate_dirs_in() {
# $1 - dir to check
#
check_directory() {
log $DEBUG "$DBG 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
log $DEBUG "$DBG > mkdir -p \"$1\""
mkdir -p "$1" >>$LOG_FILE 2>&1 && return 0
log $ERROR "$ERR could not create directory $1!"
return 1
fi
}
@@ -90,9 +187,10 @@ check_directory() {
# $1 - zu löschendes Verzeichnis
#
delete_dir() {
log $DEBUG "$DBG delete_dir $@"
local dir=$1
sudo rm -rf $dir/* && return 0
log ERROR "### could not delete directory $1!"
log $DEBUG "$DBG > rm -rf \"$dir\"/*"
rm -rf "$dir"/* >>$LOG_FILE 2>&1 && return 0
# return error, so caller can decide what to do
return 1
}
@@ -104,13 +202,14 @@ backup_file_prefix() {
echo "$1" | sed -E 's/^\///' | sed -E 's/\//-/g'
}
# Verzeichnise in .tgz.gpg-Dateien sichern.
# Verzeichnise unter $1 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)
#
backup_all_dirs() {
log $DEBUG "$DBG backup_all_dirs $@"
local root=$1
local target=$2
shift 2
@@ -120,10 +219,19 @@ backup_all_dirs() {
for dir in $(iterate_dirs_in "$root" "$@"); do
tar_file="$target/$prefix-$dir.$EXT"
mail_log $INFO "$INF directory: $root/$dir"
backup_dir "$root" "$tar_file" "$dir"
is_error $? false && return 1
#mail_log $INFO "$INF list directory"
create_list "$tar_file" "$dir"
is_error $? false && return 1
#mail_log $INFO "$INF test integrity of $tar_file"
test_integrity "$tar_file"
is_error $? false && return 1
done
return 0
}
# Einzelnes Verzeichnis sichern.
@@ -133,17 +241,14 @@ backup_all_dirs() {
# $2 - zu sicherndes Verzeichnis
#
backup_dir() {
log $DEBUG "$DBG 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
log $DEBUG "$DBG > tar -c -z --numeric-owner --one-file-system --exclude \"@eaDir\" -C \"$root\" \"$dir\" | gpg --batch -c --passphrase xxxx -o \"$archive\""
tar -c -z --numeric-owner --one-file-system --exclude "@eaDir" -C "$root" "$dir" 2>>$LOG_FILE | gpg --batch -c --passphrase $PASSPHRASE -o "$archive" 2>>$LOG_FILE
check_pipe_rc ${PIPESTATUS[@]}
return $?
}
##
@@ -155,32 +260,64 @@ backup_dir() {
# entsprechend en backup_*-Funktionen aufgerufen
#
do_auto_backup() {
log $DEBUG "$DBG do_auto_backup $@"
local func=$1
local count=1
local rc
if ! $func§count 2>/dev/null ; then # Seiteneffekt: $func$count wird ausgeführt
echo "ERROR: keine Backup-Functions für $HOST_NAME."
if ! $func$count 2>/dev/null ; then # Seiteneffekt: $func$count wird ausgeführt
mail_log $ERROR "$ERR keine Backup-Function $func$count() für $HOST_NAME."
exit 1
fi
mail_log $INFO "$INF prepare backup"
before_backup
is_error $? && return 1
delete_dir "$BACKUP_TARGET"
mail_log $INFO "$INF check backup directory"
check_directory "$BACKUP_TARGET"
# ab hier std logging (Datei ist in $BACKUP_TARGET)
is_error $? && return 1
do
backup_all_dirs "$BACKUP_SOURCE" "$BACKUP_TARGET" "${BACKUP_EXCLUDE_DIRS[@]}"
let "count += 1"
until ! $func$count 2>/dev/null # Seiteneffekt: $func$count wird ausgeführt (für nächste Schleife)
do
mail_log $INFO "$INF backing up directories in $BACKUP_SOURCE"
backup_all_dirs "$BACKUP_SOURCE" "$BACKUP_TARGET" "${BACKUP_EXCLUDE_DIRS[@]}"
rc=$?
# error logging in backup_all_dirs
if [ $rc -gt 0 ]; then
return 1
fi
let "count += 1"
done
mail_log $INFO "$INF finishing backup"
after_backup
is_error $? && return 1
}
backup_daily() {
mail_log $INFO ">>>>>>>>>> daily auto backup $VER for $HOST_NAME <<<<<<<<<<"
do_auto_backup backup_daily
mail_log $INFO ">>>>>>>>>> end of auto backup"
# TODO mail log
}
backup_weekly() {
mail_log $INFO ">>>>>>>>>> weekly auto backup $VER for $HOST_NAME <<<<<<<<<<"
do_auto_backuo backup_weekly
mail_log $INFO ">>>>>>>>>> end of auto backup"
# TODO mail log
}
export_backups() {
# TODO
echo
# check host (only nathan|hamiller?)
# check USB drive
# del USB drive (?)
# rsync USB -> 1|2, video, serien
# mail log
}
# Inhalt des Archivs in eine Textdatei ausgeben.
@@ -188,15 +325,12 @@ backup_weekly() {
# $1 - Archiv
#
create_list() {
log $DEBUG "$DBG create_list $@"
local archive=$1
log INFO "--- List $archive"
sudo gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" | sudo tar -tzv | sudo tee "$archive.$LIST_EXT" >/dev/null
local rc=$?
if [ "$rc" == "0" ] ; then
log INFO "*** success"
else
log ERROR "### see full log"
fi
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -tzv | tee \"$archive.$LIST_EXT\""
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -tzv 2>>$LOG_FILE | tee "$archive.$LIST_EXT" >/dev/null 2>>$LOG_FILE
check_pipe_rc ${PIPESTATUS[@]}
return $?
}
# Integrität des Archivs testen, indem es entschlüsselt, entpackt
@@ -205,15 +339,12 @@ create_list() {
# $1 - Archiv
#
test_integrity() {
log $DEBUG "$DBG 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
log $DEBUG "$DBG > gpg --batch --decrypt --passphrase xxxx \"$archive\" | tar -xzO"
gpg --batch --decrypt --passphrase $PASSPHRASE "$archive" 2>>$LOG_FILE | tar -xzO >/dev/null 2>>$LOG_FILE
check_pipe_rc ${PIPESTATUS[@]}
return $?
}
# Restore aus Archiv
@@ -224,15 +355,13 @@ test_integrity() {
# $2 ff. - zurückzusichernde Dateien/Verzeichnisse
#
restore() {
log $DEBUG "$DBG 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
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
check_pipe_rc ${PIPESTATUS[@]}
return $?
}
# Liste der Archives auf stdout ausgeben
@@ -248,10 +377,13 @@ restore() {
# $1 - Verzeichnis unter dem alle Backups liegen
#
list_archives() {
log $DEBUG "$DBG list_archives $@"
local target=$1
local targ=${target//\//\\\/} # slashes escapen
echo "#$targ#"
sudo find "$target" -type f -name "*.$EXT" | grep "${HOST_NAME}/" | sed -E "s/^$targ//"
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
check_pipe_rc ${PIPESTATUS[@]}
return $?
}
# Inhalt des Archivs $2 auf stdout ausgeben
@@ -260,8 +392,9 @@ list_archives() {
# $2 - Archiv-Datei mit Pfad ab $1
#
list_archive_content() {
log $DEBUG "$DBG list_archive_content $@"
local root=$1
local archive=$2
sudo cat "$root/${archive/#\//}.$LIST_EXT"
log $DEBUG "$DBG > cat \"$root/${archive/#\//}.$LIST_EXT\""
cat "$root/${archive/#\//}.$LIST_EXT" 2>>$LOG_FILE
}