Skip to content

Commit dac6526

Browse files
committed
Add ensure_service helper and use across all deployers
1 parent 12c9371 commit dac6526

10 files changed

Lines changed: 110 additions & 349 deletions

File tree

cmdeploy/src/cmdeploy/basedeploy.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,23 @@ def configure(self):
163163
def activate(self):
164164
pass
165165

166+
def ensure_service(self, service, running=True, enabled=True):
167+
"""Activate (or deactivate) a systemd service."""
168+
if running:
169+
verb = "Start and enable"
170+
else:
171+
verb = "Stop"
172+
systemd.service(
173+
name=f"{verb} {service}",
174+
service=service,
175+
running=running,
176+
enabled=enabled,
177+
restarted=self.need_restart if running else False,
178+
daemon_reload=self.daemon_reload,
179+
)
180+
self.need_restart = False
181+
self.daemon_reload = False
182+
166183
def ensure_systemd_unit(self, src, **kwargs):
167184
"""Install (or remove) a systemd unit file under ``/etc/systemd/system/``."""
168185
dest_name = src.split("/")[-1].replace(".j2", "")

cmdeploy/src/cmdeploy/deployers.py

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
activate_remote_units,
2828
blocked_service_startup,
2929
configure_remote_units,
30-
get_resource,
3130
has_systemd,
3231
is_in_container,
3332
)
@@ -208,13 +207,7 @@ def activate(self):
208207
],
209208
)
210209

211-
systemd.service(
212-
name="Start and enable unbound",
213-
service="unbound.service",
214-
running=True,
215-
enabled=True,
216-
restarted=self.need_restart,
217-
)
210+
self.ensure_service("unbound.service")
218211

219212

220213
class MtastsDeployer(Deployer):
@@ -225,11 +218,8 @@ def configure(self):
225218
self.remove_file("/etc/systemd/system/mta-sts-daemon.service")
226219

227220
def activate(self):
228-
systemd.service(
229-
name="Stop MTA-STS daemon",
230-
service="mta-sts-daemon.service",
231-
# daemon_reload is tracked via self.remove_file() in configure()
232-
daemon_reload=self.daemon_reload,
221+
self.ensure_service(
222+
"mta-sts-daemon.service",
233223
running=False,
234224
enabled=False,
235225
)
@@ -381,29 +371,18 @@ def configure(self):
381371
self.put_file("iroh-relay.toml", "/etc/iroh-relay.toml")
382372

383373
def activate(self):
384-
systemd.service(
385-
name="Start and enable iroh-relay",
386-
service="iroh-relay.service",
387-
running=True,
374+
self.ensure_service(
375+
"iroh-relay.service",
388376
enabled=self.enable_iroh_relay,
389-
restarted=self.need_restart,
390377
)
391-
self.need_restart = False
392378

393379

394380
class JournaldDeployer(Deployer):
395381
def configure(self):
396382
self.put_file("journald.conf", "/etc/systemd/journald.conf")
397383

398384
def activate(self):
399-
systemd.service(
400-
name="Start and enable journald",
401-
service="systemd-journald.service",
402-
running=True,
403-
enabled=True,
404-
restarted=self.need_restart,
405-
)
406-
self.need_restart = False
385+
self.ensure_service("systemd-journald.service")
407386

408387

409388
class ChatmailVenvDeployer(Deployer):
@@ -492,12 +471,7 @@ def install(self):
492471
)
493472

494473
def activate(self):
495-
systemd.service(
496-
name="Start and enable fcgiwrap",
497-
service="fcgiwrap.service",
498-
running=True,
499-
enabled=True,
500-
)
474+
self.ensure_service("fcgiwrap.service")
501475

502476

503477
class GithashDeployer(Deployer):

cmdeploy/src/cmdeploy/dovecot/deployer.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pyinfra import host
66
from pyinfra.facts.deb import DebPackages
77
from pyinfra.facts.server import Arch, Command, Sysctl
8-
from pyinfra.operations import apt, files, server, systemd
8+
from pyinfra.operations import apt, files, server
99

1010
from cmdeploy.basedeploy import (
1111
Deployer,
@@ -60,19 +60,17 @@ def install(self):
6060
self.need_restart = True
6161
files.put(
6262
name="Pin dovecot packages to block Debian dist-upgrades",
63-
src=io.StringIO(
64-
"Package: dovecot-*\n"
65-
"Pin: version *\n"
66-
"Pin-Priority: -1\n"
67-
),
63+
src=io.StringIO("Package: dovecot-*\nPin: version *\nPin-Priority: -1\n"),
6864
dest="/etc/apt/preferences.d/pin-dovecot",
6965
user="root",
7066
group="root",
7167
mode="644",
7268
)
7369

7470
def configure(self):
75-
self.daemon_reload |= configure_remote_units(self.config.mail_domain, self.units)
71+
self.daemon_reload |= configure_remote_units(
72+
self.config.mail_domain, self.units
73+
)
7674
_configure_dovecot(self, self.config)
7775

7876
def activate(self):
@@ -89,19 +87,12 @@ def activate(self):
8987
if stale == "STALE":
9088
self.need_restart = True
9189

92-
restart = False if self.disable_mail else self.need_restart
93-
94-
systemd.service(
95-
name="Disable dovecot for now"
96-
if self.disable_mail
97-
else "Start and enable Dovecot",
98-
service="dovecot.service",
99-
running=False if self.disable_mail else True,
100-
enabled=False if self.disable_mail else True,
101-
restarted=restart,
102-
daemon_reload=self.daemon_reload,
90+
active = not self.disable_mail
91+
self.ensure_service(
92+
"dovecot.service",
93+
running=active,
94+
enabled=active,
10395
)
104-
self.need_restart = False
10596

10697

10798
def _pick_url(primary, fallback):

cmdeploy/src/cmdeploy/external/deployer.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,18 @@ def configure(self):
3939
)
4040

4141
def activate(self):
42-
systemd.service(
43-
name="Setup tls-cert-reload path watcher",
44-
service="tls-cert-reload.path",
42+
# No explicit reload needed here: dovecot/nginx read the cert
43+
# on startup, and the .path watcher handles live changes.
44+
self.ensure_service(
45+
"tls-cert-reload.path",
4546
running=self.enabled,
4647
enabled=self.enabled,
47-
restarted=self.need_restart,
48-
daemon_reload=self.daemon_reload,
4948
)
5049
if not self.enabled:
51-
systemd.service(
52-
name="Stop tls-cert-reload.service",
53-
service="tls-cert-reload.service",
50+
self.ensure_service(
51+
"tls-cert-reload.service",
5452
running=False,
5553
enabled=False,
56-
daemon_reload=self.daemon_reload,
5754
)
5855

5956

cmdeploy/src/cmdeploy/filtermail/deployer.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pyinfra import facts, host
2-
from pyinfra.operations import files, systemd
2+
from pyinfra.operations import files
33

44
from cmdeploy.basedeploy import Deployer
55

@@ -34,12 +34,4 @@ def configure(self):
3434

3535
def activate(self):
3636
for service in self.services:
37-
systemd.service(
38-
name=f"Start and enable {service}",
39-
service=f"{service}.service",
40-
running=True,
41-
enabled=True,
42-
restarted=self.need_restart,
43-
daemon_reload=self.daemon_reload,
44-
)
45-
self.need_restart = False
37+
self.ensure_service(f"{service}.service")

cmdeploy/src/cmdeploy/mtail/deployer.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pyinfra import facts, host
2-
from pyinfra.operations import apt, server, systemd
2+
from pyinfra.operations import apt, server
33

44
from cmdeploy.basedeploy import Deployer
55

@@ -42,11 +42,5 @@ def configure(self):
4242
self.put_file("mtail/delivered_mail.mtail", "/etc/mtail/delivered_mail.mtail")
4343

4444
def activate(self):
45-
systemd.service(
46-
name="Start and enable mtail",
47-
service="mtail.service",
48-
running=bool(self.mtail_address),
49-
enabled=bool(self.mtail_address),
50-
restarted=self.need_restart,
51-
)
52-
self.need_restart = False
45+
active = bool(self.mtail_address)
46+
self.ensure_service("mtail.service", running=active, enabled=active)

cmdeploy/src/cmdeploy/nginx/deployer.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from chatmaild.config import Config
2-
from pyinfra.operations import apt, files, systemd
2+
from pyinfra.operations import apt
33

44
from cmdeploy.basedeploy import (
55
Deployer,
@@ -44,14 +44,7 @@ def configure(self):
4444
_configure_nginx(self, self.config)
4545

4646
def activate(self):
47-
systemd.service(
48-
name="Start and enable nginx",
49-
service="nginx.service",
50-
running=True,
51-
enabled=True,
52-
restarted=self.need_restart,
53-
)
54-
self.need_restart = False
47+
self.ensure_service("nginx.service")
5548

5649

5750
def _configure_nginx(deployer, config: Config, debug: bool = False):

cmdeploy/src/cmdeploy/opendkim/deployer.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from pyinfra import host
66
from pyinfra.facts.files import File
7-
from pyinfra.operations import apt, files, server, systemd
7+
from pyinfra.operations import apt, files, server
88

99
from cmdeploy.basedeploy import Deployer
1010

@@ -85,12 +85,4 @@ def configure(self):
8585
)
8686

8787
def activate(self):
88-
systemd.service(
89-
name="Start and enable OpenDKIM",
90-
service="opendkim.service",
91-
running=True,
92-
enabled=True,
93-
daemon_reload=self.daemon_reload,
94-
restarted=self.need_restart,
95-
)
96-
self.need_restart = False
88+
self.ensure_service("opendkim.service")

cmdeploy/src/cmdeploy/postfix/deployer.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pyinfra.operations import apt, server, systemd
1+
from pyinfra.operations import apt, server
22

33
from cmdeploy.basedeploy import Deployer
44

@@ -67,16 +67,9 @@ def configure(self):
6767
)
6868

6969
def activate(self):
70-
restart = False if self.disable_mail else self.need_restart
71-
72-
systemd.service(
73-
name="disable postfix for now"
74-
if self.disable_mail
75-
else "Start and enable Postfix",
76-
service="postfix.service",
77-
running=False if self.disable_mail else True,
78-
enabled=False if self.disable_mail else True,
79-
restarted=restart,
80-
daemon_reload=self.daemon_reload,
70+
active = not self.disable_mail
71+
self.ensure_service(
72+
"postfix.service",
73+
running=active,
74+
enabled=active,
8175
)
82-
self.need_restart = False

0 commit comments

Comments
 (0)