Support home-based mailboxes during automated upgrades

This commit is contained in:
admin committed 2026-09-10 14:31:32 +02:00
1 parent 8e6c9a058f
commit 56fbcdad74
8 files changed
+194 -9

No files matched your search

+52 -1
View File
@@ -15,6 +15,8 @@ UP_INSTALL_DEPS=false
UP_GITEA=''
UP_RCLONE=''
UP_CRON=''
UP_MAIL_DIR=''
UP_MAIL_HOMES=false
UP_STATE=''
UP_WORKER=false
while (( $# )); do
@@ -26,11 +28,14 @@ while (( $# )); do
--no-gitea) UP_GITEA=false; shift ;;
--rclone-config) UP_RCLONE=${2:?Missing rclone configuration}; shift 2 ;;
--cron-services) UP_CRON=${2:?Missing comma-separated systemd units}; shift 2 ;;
--mail-dir) UP_MAIL_DIR=${2:?Missing mailbox directory}; shift 2 ;;
--mail-homes-only) UP_MAIL_HOMES=true; shift ;;
--worker) UP_WORKER=true; UP_STATE=${2:?Missing state}; shift 2 ;;
--help) echo 'Usage: sudo bash update.sh [--foreground] [--config FILE] [--rclone-config FILE] [--enable-gitea | --no-gitea] [--cron-services UNIT,...] [--install-deps]'; exit 0 ;;
--help) echo 'Usage: sudo bash update.sh [--foreground] [--config FILE] [--rclone-config FILE] [--enable-gitea | --no-gitea] [--cron-services UNIT,...] [--mail-dir DIR | --mail-homes-only] [--install-deps]'; exit 0 ;;
*) die "Unknown argument: $1" ;;
esac
done
[[ -z $UP_MAIL_DIR || $UP_MAIL_HOMES == false ]] || die 'Choose --mail-dir OR --mail-homes-only'
[[ $EUID == 0 ]] || die 'Run with sudo bash'
need systemctl; need flock
# This lock excludes two coordinators, independently from ordinary backup jobs.
@@ -46,6 +51,51 @@ prompt() {
append_setting() { printf '%s=%q\n' "$1" "$2" >> "$UP_STATE/candidate.conf"; }
discover() { python3 "$LIB_DIR/update-discover.py" "$@"; }
# Do not infer mailbox coverage from an existing directory. In particular,
# creating an empty /var/vmail would make preflight pass without saving mail.
prepare_mail() {
local choice home
if [[ $ENABLE_MAIL != true ]]; then
[[ -z $UP_MAIL_DIR && $UP_MAIL_HOMES == false ]] || die 'Mail options require ENABLE_MAIL=true'
return 0
fi
if [[ -n $UP_MAIL_DIR ]]; then
MAIL_DIR=$UP_MAIL_DIR
ENABLE_MAIL_STORE=true
elif [[ $UP_MAIL_HOMES == true ]]; then
ENABLE_MAIL_STORE=false
elif [[ $ENABLE_MAIL_STORE == true && ! -d $MAIL_DIR ]]; then
echo "Konfiguriertes zentrales Mailverzeichnis fehlt: $MAIL_DIR"
printf 'Konfigurierte Mail-Homes: '; printf '%q ' "${MAIL_HOME_DIRS[@]}"; echo
echo 'Absoluten Pfad zur tatsaechlichen zentralen Mailablage angeben.'
echo 'Nur wenn ALLE Mailboxen in den konfigurierten Homes liegen: homes eingeben.'
echo 'Bei unbekannter Ablage abbrechen; kein leeres Ersatzverzeichnis anlegen.'
[[ -t 0 ]] || die 'Missing mail source: supply --mail-dir DIR or explicitly confirm coverage with --mail-homes-only'
read -r -p 'Mailverzeichnis / homes / Enter zum Abbrechen: ' choice
[[ -n $choice ]] || die 'Mail storage unresolved; installed package/config/timer unchanged'
if [[ $choice == homes ]]; then
printf 'Home-Excludes: '; printf '%q ' "${MAIL_HOME_EXCLUDES[@]}"; echo
prompt 'Alle Mailboxen liegen in diesen Homes, ohne ausgeschlossene Pfade oder weitere Mounts? [j/N]' || die 'Mail coverage not confirmed'
ENABLE_MAIL_STORE=false
else MAIL_DIR=$choice; fi
fi
if [[ $ENABLE_MAIL_STORE == true ]]; then
[[ $MAIL_DIR == /* ]] || die 'MAIL_DIR must be absolute'
check_source_path "$MAIL_DIR"
append_setting MAIL_DIR "$MAIL_DIR"
echo "Zentrales Mailverzeichnis: $MAIL_DIR"
else
[[ $ENABLE_MAIL_HOME_DIRS == true && ${#MAIL_HOME_DIRS[@]} -gt 0 ]] || die 'Homes-only mail requires enabled, nonempty MAIL_HOME_DIRS'
for home in "${MAIL_HOME_DIRS[@]}"; do
[[ $home == /* ]] || die 'MAIL_HOME_DIRS must be absolute'
check_source_path "$home"
done
printf 'Mail ausschliesslich in Homes (Excludes und Mountgrenzen gelten): '
printf '%q ' "${MAIL_HOME_DIRS[@]}"; echo
fi
append_setting ENABLE_MAIL_STORE "$ENABLE_MAIL_STORE"
}
if [[ $UP_WORKER == false ]]; then
systemctl is-active --quiet app-backup-upgrade.service && die 'Upgrade service is already running'
# Only install missing, small prerequisites when requested. Never upgrade PHP,
@@ -87,6 +137,7 @@ if [[ $UP_WORKER == false ]]; then
append_setting ENABLE_UPLOAD true
append_setting ENABLE_NEXTCLOUD_MAINTENANCE true
append_setting MAIL_BACKUP_MODE stop
prepare_mail
if [[ $ENABLE_WORDPRESS == true || $ENABLE_NEXTCLOUD == true ]]; then
for pair in "ENABLE_HTTPD_STOP:$HTTPD_SERVICE_NAME" "ENABLE_PHPFPM_STOP:$PHPFPM_SERVICE_NAME"; do
name=${pair%%:*}; unit=${pair#*:}