From 2d0ccdb4a3570ae008db407df6274ceff49cf3c7 Mon Sep 17 00:00:00 2001 From: j4n Date: Wed, 21 Jan 2026 10:29:58 +0100 Subject: [PATCH] cmdeploy/{postfix,dovecot}/deployer.py: check config before restarting postfix: also fail on warnings --- cmdeploy/src/cmdeploy/dovecot/deployer.py | 11 ++++++++--- cmdeploy/src/cmdeploy/postfix/deployer.py | 10 +++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmdeploy/src/cmdeploy/dovecot/deployer.py b/cmdeploy/src/cmdeploy/dovecot/deployer.py index c7dc159d..3b3a2715 100644 --- a/cmdeploy/src/cmdeploy/dovecot/deployer.py +++ b/cmdeploy/src/cmdeploy/dovecot/deployer.py @@ -37,9 +37,7 @@ class DovecotDeployer(Deployer): restart = False if self.disable_mail else self.need_restart systemd.service( - name="disable dovecot for now" - if self.disable_mail - else "Start and enable Dovecot", + name="Disable dovecot for now" if self.disable_mail else "Start and enable Dovecot", service="dovecot.service", running=False if self.disable_mail else True, enabled=False if self.disable_mail else True, @@ -145,4 +143,11 @@ def _configure_dovecot(config: Config, debug: bool = False) -> (bool, bool): ) daemon_reload |= restart_conf.changed + # Validate dovecot configuration before restart + if need_restart: + server.shell( + name="Validate dovecot configuration", + commands=["doveconf -n >/dev/null"], + ) + return need_restart, daemon_reload diff --git a/cmdeploy/src/cmdeploy/postfix/deployer.py b/cmdeploy/src/cmdeploy/postfix/deployer.py index 035bfbb5..34cbffa4 100644 --- a/cmdeploy/src/cmdeploy/postfix/deployer.py +++ b/cmdeploy/src/cmdeploy/postfix/deployer.py @@ -1,4 +1,4 @@ -from pyinfra.operations import apt, files, systemd +from pyinfra.operations import apt, files, server, systemd from cmdeploy.basedeploy import Deployer, get_resource @@ -77,6 +77,14 @@ class PostfixDeployer(Deployer): dest="/etc/systemd/system/postfix@.service.d/10_restart.conf", ) self.daemon_reload = restart_conf.changed + + # Validate postfix configuration before restart + if need_restart: + server.shell( + name="Validate postfix configuration", + # Extract stderr and quit with error if non-zero + commands=["""bash -c 'w=$(postconf 2>&1 >/dev/null); [[ -z "$w" ]] || { echo "$w"; false; }'"""], + ) self.need_restart = need_restart def activate(self):