Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe5d3487c2 | ||
|
|
a2d9b6a74e | ||
|
|
c89cfe66e9 |
No files matched your search
+92
-1
@@ -1,3 +1,94 @@
|
|||||||
#!/usr/bin/eval bash
|
#!/usr/bin/eval bash
|
||||||
|
|
||||||
# nothing to do
|
PROTON_TARGET="/Users/hb/mnt/nas/backups/div"
|
||||||
|
PROTON_TARGET_FILE="proton_mail_pass.$EXT"
|
||||||
|
PROTON_ROOT="/Users/hb/Downloads"
|
||||||
|
PROTON_BACKUP_DIR="Proton_Backup"
|
||||||
|
PROTON_BACKUP="$PROTON_ROOT/$PROTON_BACKUP_DIR"
|
||||||
|
PROTON_MAIL_EXPORT="$PROTON_ROOT/proton-mail-export-cli"
|
||||||
|
PROTON_PASS_EXPORT="$PROTON_ROOT/Proton Pass_export"
|
||||||
|
|
||||||
|
check_proton() {
|
||||||
|
if [ ! -d "$PROTON_MAIL_EXPORT" ]; then
|
||||||
|
mail_log $ERROR "$ERR there is no Proton Mail export."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# tr ist nötig, weil bei macOS führene blanks entfernt werden müssen
|
||||||
|
if [ "$(ls "$PROTON_PASS_EXPORT"*|wc -l|tr -d ' ')" != "1" ]; then
|
||||||
|
mail_log $ERROR "$ERR there is no Proton Pass export."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [ ! -d "$PROTON_TARGET" ]; then
|
||||||
|
mail_log $ERROR "$ERR could not find targe dir $PROTON_TARGET!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [ -f "$PROTON_TARGET/$PROTON_TARGET_FILE" ]; then
|
||||||
|
log $DEBUG "$DBG > rm -f \"$PROTON_TARGET/$PROTON_TARGET_FILE\""
|
||||||
|
rm -f "$PROTON_TARGET/$PROTON_TARGET_FILE" >>$LOG_FILE 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_proton_backup_dir() {
|
||||||
|
log $DEBUG "$DBG delete_proton_backup_dir()"
|
||||||
|
if [ -d "$PROTON_BACKUP" ]; then
|
||||||
|
log $DEBUG "$DBG > rm -rf \"$PROTON_BACKUP\""
|
||||||
|
rm -rf "$PROTON_BACKUP" >>$LOG_FILE 2>&1 && return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
create_proton_backup_dir() {
|
||||||
|
log $DEBUG "$DBG create_proton_backup_dir()"
|
||||||
|
delete_proton_backup_dir
|
||||||
|
|
||||||
|
log $DEBUG "$DBG > mkdir -p \"$PROTON_BACKUP\""
|
||||||
|
mkdir -p "$PROTON_BACKUP" >>$LOG_FILE 2>&1 && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
move_proton_exports() {
|
||||||
|
log $DEBUG "$DBG move_proton_exports()"
|
||||||
|
|
||||||
|
log $DEBUG "$DBG > mv \"$PROTON_MAIL_EXPORT\" \"$PROTON_BACKUP\""
|
||||||
|
mv "$PROTON_MAIL_EXPORT" "$PROTON_BACKUP" >>$LOG_FILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
|
log $DEBUG "$DBG > mv \"$PROTON_PASS_EXPORT\"* \"$PROTON_BACKUP\""
|
||||||
|
mv "$PROTON_PASS_EXPORT"* "$PROTON_BACKUP" >>$LOG_FILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
}
|
||||||
|
|
||||||
|
do_proton_backup() {
|
||||||
|
log $DEBUG "$DBG do_proton_backup()"
|
||||||
|
|
||||||
|
mail_log $INFO "$INF checking environment"
|
||||||
|
check_proton
|
||||||
|
is_error $? && return 1
|
||||||
|
|
||||||
|
mail_log $INFO "$INF create $PROTON_BACKUP"
|
||||||
|
create_proton_backup_dir
|
||||||
|
is_error $? && return 1
|
||||||
|
|
||||||
|
mail_log $INFO "$INF move Proton exports to source directory"
|
||||||
|
move_proton_exports
|
||||||
|
is_error $? && return 1
|
||||||
|
|
||||||
|
mail_log $INFO "$INF backing up Proton exports to $PROTON_TARGET/$PROTON_TARGET_FILE"
|
||||||
|
backup_directory "$PROTON_ROOT" "$PROTON_TARGET/$PROTON_TARGET_FILE" "$PROTON_BACKUP_DIR"
|
||||||
|
is_error $? && return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
proton_backup() {
|
||||||
|
mail_log $INFO ">>>>>>>>>> Proton backup $VER at $HOST_NAME <<<<<<<<<<"
|
||||||
|
do_proton_backup
|
||||||
|
|
||||||
|
mail_log $INFO "$INF deleting $PROTON_BACKUP"
|
||||||
|
delete_proton_backup_dir
|
||||||
|
is_error $?
|
||||||
|
|
||||||
|
mail_log $DEBUG "$DBG rm -f \"$PROTON_PASS_EXPORT\"*"
|
||||||
|
mail_log $DEBUG "$(rm -f "$PROTON_PASS_EXPORT"* 2>&1)"
|
||||||
|
|
||||||
|
mail_log $INFO ">>>>>>>>>> end of Proton backup"
|
||||||
|
send_mail_log "Proton Backup"
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Mail via GMX-Relay versenden (Podman-Image "smtp-relay")
|
# Mail via Proton-Relay versenden (Podman-Image "smtp-relay")
|
||||||
#
|
#
|
||||||
# Klappt nur direkt im Container, daher ggf. via ssh aufrufen (Annahme: remote user == local user)
|
# Klappt nur direkt im Container, daher ggf. via ssh aufrufen (Annahme: remote user == local user)
|
||||||
#
|
#
|
||||||
@@ -46,16 +46,25 @@ if [ -z "$TO" ] || [ -z "$SUBJECT" ]; then
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
PODMANCMD="$SUDO $PODMAN"
|
||||||
|
if [ ! -z "$REMOTE" ]; then
|
||||||
|
PODMANCMD="ssh $MAILSERVER_IP $PODMANCMD"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# der Mail-Container sollte laufen, falls nicht, dann ist wahrscheinlich der Backup
|
||||||
|
# noch nicht durch => 30 Minuten warten
|
||||||
|
$PODMANCMD ps | grep $MAILCONTAINER >/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
sleep 30m
|
||||||
|
fi
|
||||||
|
|
||||||
# Mail body aus Datei oder STDIN holen
|
# Mail body aus Datei oder STDIN holen
|
||||||
CONTENT=$(cat ${1:--})
|
CONTENT=$(cat ${1:--})
|
||||||
|
|
||||||
MAILCMD="$SUDO $PODMAN exec -i $MAILCONTAINER /usr/sbin/sendmail -i -t"
|
MAILCMD="$PODMANCMD exec -i $MAILCONTAINER /usr/sbin/sendmail -i -t"
|
||||||
if [ ! -z "$REMOTE" ]; then
|
|
||||||
MAILCMD="ssh $MAILSERVER_IP $MAILCMD"
|
|
||||||
fi
|
|
||||||
# construct mail header + content and pipe to sendmail
|
# construct mail header + content and pipe to sendmail
|
||||||
cat <<EOMB | $MAILCMD
|
cat <<EOMB | $MAILCMD
|
||||||
FROM: hb42@gmx.de
|
FROM: server@keinekekse.net
|
||||||
TO: ${TO}
|
TO: ${TO}
|
||||||
DATE: $(date -R)
|
DATE: $(date -R)
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
|
|||||||
+48
-12
@@ -152,6 +152,17 @@ check_root() {
|
|||||||
exit 100
|
exit 100
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
# Ausführung auf macOS begrenzen
|
||||||
|
#
|
||||||
|
check_mac() {
|
||||||
|
if [[ "$(uname)" != "Darwin" ]]; then
|
||||||
|
log $ERROR "$ERR script works only on MAC."
|
||||||
|
echo "****"
|
||||||
|
echo "***** script works only on MAC! *****"
|
||||||
|
echo "****"
|
||||||
|
exit 110
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
start_containers() {
|
start_containers() {
|
||||||
local let rc=0
|
local let rc=0
|
||||||
@@ -434,33 +445,58 @@ backup_all_dirs() {
|
|||||||
for dir in $(iterate_dirs_in "$root" "$@"); do
|
for dir in $(iterate_dirs_in "$root" "$@"); do
|
||||||
tar_file="$target/$prefix-$dir.$EXT"
|
tar_file="$target/$prefix-$dir.$EXT"
|
||||||
|
|
||||||
backup_dir "$root" "$tar_file" "$dir"
|
backup_directory "$root" "$tar_file" "$dir"
|
||||||
if [ $? -ne 0 ]; then return 1; fi
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
create_list "$tar_file" "$dir"
|
|
||||||
if [ $? -ne 0 ]; then return 1; fi
|
|
||||||
|
|
||||||
test_integrity "$tar_file"
|
|
||||||
if [ $? -ne 0 ]; then return 1; fi
|
|
||||||
done
|
done
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Einzelnes Verzeichnis sichern.
|
# Einzelnes Verzeichnis sichern und Backup prüfen
|
||||||
#
|
#
|
||||||
# $1 - Pfad um Verzeichnis, das gesichert werden soll
|
# $1 - Pfad zum Verzeichnis, das gesichert werden soll
|
||||||
# $2 - Zielpfad und -name für das Archiv
|
# $2 - Zielpfad und -name für das Archiv
|
||||||
# $2 - zu sicherndes Verzeichnis
|
# $2 - zu sicherndes Verzeichnis
|
||||||
#
|
#
|
||||||
# returns 0 for success, 1 otherwise
|
# returns 0 for success, 1 otherwise
|
||||||
#
|
#
|
||||||
backup_dir() {
|
|
||||||
log $DEBUG "$DBG backup_dir( $@ )"
|
backup_directory() {
|
||||||
|
log $DEBUG "$DBG backup_directory( $@ )"
|
||||||
|
local root=$1
|
||||||
|
local tar_file=$2
|
||||||
|
local dir=$3
|
||||||
|
|
||||||
|
tar_dir "$root" "$tar_file" "$dir"
|
||||||
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
|
create_list "$tar_file" "$dir"
|
||||||
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
|
test_integrity "$tar_file"
|
||||||
|
if [ $? -ne 0 ]; then return 1; fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Einzelnes Verzeichnis sichern.
|
||||||
|
#
|
||||||
|
# $1 - Pfad zum Verzeichnis, das gesichert werden soll
|
||||||
|
# $2 - Zielpfad und -name für das Archiv
|
||||||
|
# $2 - zu sicherndes Verzeichnis
|
||||||
|
#
|
||||||
|
# returns 0 for success, 1 otherwise
|
||||||
|
#
|
||||||
|
tar_dir() {
|
||||||
|
log $DEBUG "$DBG tar_dir( $@ )"
|
||||||
local root=$1
|
local root=$1
|
||||||
local archive=$2
|
local archive=$2
|
||||||
local dir=$3
|
local dir=$3
|
||||||
log $DEBUG "$DBG > tar -c -z --numeric-owner --one-file-system --sort=name --exclude \"@eaDir\" -C \"$root\" \"$dir\" | gpg --batch -c --passphrase xxxx -o \"$archive\""
|
local sort=--sort=name
|
||||||
tar -c -z --numeric-owner --one-file-system --sort=name --exclude "@eaDir" -C "$root" "$dir" 2>>$LOG_FILE | gpg --batch -c --passphrase $PASSPHRASE -o "$archive" 2>>$LOG_FILE
|
if [[ "$(uname)" == "Darwin" ]]; then
|
||||||
|
sort=""
|
||||||
|
fi
|
||||||
|
log $DEBUG "$DBG > tar -c -z --warning="no-file-ignored" --numeric-owner --one-file-system $sort --exclude \"@eaDir\" -C \"$root\" \"$dir\" | gpg --batch -c --passphrase xxxx -o \"$archive\""
|
||||||
|
tar -c -z--warning=no-file-ignored --numeric-owner --one-file-system $sort --exclude "@eaDir" -C "$root" "$dir" 2>>$LOG_FILE | gpg --batch -c --passphrase $PASSPHRASE -o "$archive" 2>>$LOG_FILE
|
||||||
check_pipe_rc ${PIPESTATUS[@]}
|
check_pipe_rc ${PIPESTATUS[@]}
|
||||||
return $?
|
return $?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,20 @@
|
|||||||
# entrypoint for all actions
|
# entrypoint for all actions
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# 2.3.4 19.12.2025 - fix tar param: --warning="no-file-ignored"
|
||||||
|
# 2.3.3 18.12.2025 - smtp-relay läuft durch, dadurch ändern sich ggf. Dateien im Container, was
|
||||||
|
# zu Fehlern beim tar führt. Deshalb wird das Verzeichnis
|
||||||
|
# /var/home/container/.local/share/containers vom Backup ausgenommen.
|
||||||
|
# Die Container-Overlays, die hier liegen können aus dem jeweiligen Image
|
||||||
|
# wiederhergestellt werden, es geht also nichts verloren.
|
||||||
|
# Außerdem kann tar über Sockets stolpern und unnötige Warnungen produzieren.
|
||||||
|
# Abhilfe schafft der Parameter --warning=no-file-ignored.
|
||||||
|
# Den mail delay im synology backup wieder entfernt.
|
||||||
|
# 2.3.2 18.09.2025 - synology backup: wait 60 min before mailing
|
||||||
|
# 2.3.1 16.08.2025 - 30 min delay for mail.sh
|
||||||
|
# 2.3.0 12.08.2025 - new function for backup & encryption of Proton exports
|
||||||
# 2.2.4 30.07.2025 - inc delay (again) for container startup-check (2m)
|
# 2.2.4 30.07.2025 - inc delay (again) for container startup-check (2m)
|
||||||
# 2.2.3 24.06.2025 - Export-Disk kann exfat- oder vfat-formatiert sein,
|
# 2.2.3 24.06.2025 - Export-Disk kann exfat- oder vfat-formatiert sein
|
||||||
# Export-Disk mit mehreren Partitonen erkennen
|
# Export-Disk mit mehreren Partitonen erkennen
|
||||||
# 2.2.2 19.06.2025 - inc delay for container startup check, fix error in log output
|
# 2.2.2 19.06.2025 - inc delay for container startup check, fix error in log output
|
||||||
# 2.2.1 16.06.2025 - delay container startup check
|
# 2.2.1 16.06.2025 - delay container startup check
|
||||||
@@ -22,7 +34,7 @@
|
|||||||
# 2.1.7 29.04.2025 - 1. Schritt zur Umstellung auf podman
|
# 2.1.7 29.04.2025 - 1. Schritt zur Umstellung auf podman
|
||||||
# 2.1.6 29.04.2025 - weekly backup Sa->SO
|
# 2.1.6 29.04.2025 - weekly backup Sa->SO
|
||||||
|
|
||||||
VER="2.2.4"
|
VER="2.3.4"
|
||||||
|
|
||||||
HERE=$(dirname "$0")
|
HERE=$(dirname "$0")
|
||||||
THIS_SCRIPT=$0
|
THIS_SCRIPT=$0
|
||||||
@@ -38,6 +50,7 @@ show_help() {
|
|||||||
echo " show contents of archive (path from $NAS_ROOT)"
|
echo " show contents of archive (path from $NAS_ROOT)"
|
||||||
echo ' -r, --restore <archive> <file(s)> '
|
echo ' -r, --restore <archive> <file(s)> '
|
||||||
echo " restore files from archive to $RESTORE_PATH"
|
echo " restore files from archive to $RESTORE_PATH"
|
||||||
|
echo " -p, --proton backup and encrypt Proton exports (MacBook only)"
|
||||||
echo " -h, -?. --help show this help"
|
echo " -h, -?. --help show this help"
|
||||||
echo " "
|
echo " "
|
||||||
echo " -d, -w, -e must be run as superuser."
|
echo " -d, -w, -e must be run as superuser."
|
||||||
@@ -133,6 +146,12 @@ while :; do
|
|||||||
do_restore $@
|
do_restore $@
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
|
-p|--proton)
|
||||||
|
MAIL_LOG_FILE="${log_file_name}.proton.log"
|
||||||
|
check_mac
|
||||||
|
proton_backup
|
||||||
|
break
|
||||||
|
;;
|
||||||
--) # End of all options.
|
--) # End of all options.
|
||||||
shift
|
shift
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ NAS_TARGET="$NAS_ROOT/daily/$HOST_NAME/backup.$DAY"
|
|||||||
|
|
||||||
backup_daily1() {
|
backup_daily1() {
|
||||||
BACKUP_SOURCE="/var"
|
BACKUP_SOURCE="/var"
|
||||||
BACKUP_EXCLUDE_DIRS=(containers)
|
BACKUP_EXCLUDE_DIRS=(containers home/container/.local/share/containers)
|
||||||
}
|
}
|
||||||
|
|
||||||
backup_daily2() {
|
backup_daily2() {
|
||||||
|
|||||||
+2
-1
@@ -25,6 +25,7 @@ before_backup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
after_backup() {
|
after_backup() {
|
||||||
# nothing to do
|
# wait for mail server backup
|
||||||
|
## sollte sich erledigt haben ## sleep 60m
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user