Support home-based mailboxes during automated upgrades
This commit is contained in:
1 parent
8e6c9a058f
commit
56fbcdad74
8 files changed
+194
-9
No files matched your search
@@ -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#*:}
|
||||
|
||||
Reference in new issue
Block a user