Skip to content

Commit 486fb47

Browse files
committed
Add ensure_service helper and use across all deployers
1 parent 4c76b7b commit 486fb47

10 files changed

Lines changed: 109 additions & 351 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
@@ -24,7 +24,6 @@
2424
activate_remote_units,
2525
blocked_service_startup,
2626
configure_remote_units,
27-
get_resource,
2827
has_systemd,
2928
is_in_container,
3029
)
@@ -207,13 +206,7 @@ def activate(self):
207206
],
208207
)
209208

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

218211

219212
class MtastsDeployer(Deployer):
@@ -224,11 +217,8 @@ def configure(self):
224217
self.remove_file("/etc/systemd/system/mta-sts-daemon.service")
225218

226219
def activate(self):
227-
systemd.service(
228-
name="Stop MTA-STS daemon",
229-
service="mta-sts-daemon.service",
230-
# daemon_reload is tracked via self.remove_file() in configure()
231-
daemon_reload=self.daemon_reload,
220+
self.ensure_service(
221+
"mta-sts-daemon.service",
232222
running=False,
233223
enabled=False,
234224
)
@@ -383,29 +373,18 @@ def configure(self):
383373
self.put_file("iroh-relay.toml", "/etc/iroh-relay.toml")
384374

385375
def activate(self):
386-
systemd.service(
387-
name="Start and enable iroh-relay",
388-
service="iroh-relay.service",
389-
running=True,
376+
self.ensure_service(
377+
"iroh-relay.service",
390378
enabled=self.enable_iroh_relay,
391-
restarted=self.need_restart,
392379
)
393-
self.need_restart = False
394380

395381

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

400386
def activate(self):
401-
systemd.service(
402-
name="Start and enable journald",
403-
service="systemd-journald.service",
404-
running=True,
405-
enabled=True,
406-
restarted=self.need_restart,
407-
)
408-
self.need_restart = False
387+
self.ensure_service("systemd-journald.service")
409388

410389

411390
class ChatmailVenvDeployer(Deployer):
@@ -495,12 +474,7 @@ def install(self):
495474
)
496475

497476
def activate(self):
498-
systemd.service(
499-
name="Start and enable fcgiwrap",
500-
service="fcgiwrap.service",
501-
running=True,
502-
enabled=True,
503-
)
477+
self.ensure_service("fcgiwrap.service")
504478

505479

506480
class GithashDeployer(Deployer):

cmdeploy/src/cmdeploy/dovecot/deployer.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import io
22
import urllib.request
33

4-
from chatmaild.config import Config
54
from pyinfra import host
65
from pyinfra.facts.deb import DebPackages
76
from pyinfra.facts.server import Arch, Command, Sysctl
8-
from pyinfra.operations import apt, files, server, systemd
7+
from pyinfra.operations import apt, files, server
98

109
from cmdeploy.basedeploy import (
1110
Deployer,
@@ -60,19 +59,17 @@ def install(self):
6059
self.need_restart = True
6160
files.put(
6261
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-
),
62+
src=io.StringIO("Package: dovecot-*\nPin: version *\nPin-Priority: -1\n"),
6863
dest="/etc/apt/preferences.d/pin-dovecot",
6964
user="root",
7065
group="root",
7166
mode="644",
7267
)
7368

7469
def configure(self):
75-
self.daemon_reload |= configure_remote_units(self.config.mail_domain, self.units)
70+
self.daemon_reload |= configure_remote_units(
71+
self.config.mail_domain, self.units
72+
)
7673
self.put_template(
7774
"dovecot/dovecot.conf.j2",
7875
"/etc/dovecot/dovecot.conf",
@@ -112,26 +109,19 @@ def activate(self):
112109
if not self.disable_mail and not self.need_restart:
113110
stale = host.get_fact(
114111
Command,
115-
'pid=$(systemctl show -p MainPID --value dovecot.service 2>/dev/null);'
112+
"pid=$(systemctl show -p MainPID --value dovecot.service 2>/dev/null);"
116113
' [ "${pid:-0}" != "0" ] && readlink "/proc/$pid/exe" 2>/dev/null | grep -q "(deleted)"'
117114
" && echo STALE || true",
118115
)
119116
if stale == "STALE":
120117
self.need_restart = True
121118

122-
restart = False if self.disable_mail else self.need_restart
123-
124-
systemd.service(
125-
name="Disable dovecot for now"
126-
if self.disable_mail
127-
else "Start and enable Dovecot",
128-
service="dovecot.service",
129-
running=False if self.disable_mail else True,
130-
enabled=False if self.disable_mail else True,
131-
restarted=restart,
132-
daemon_reload=self.daemon_reload,
119+
active = not self.disable_mail
120+
self.ensure_service(
121+
"dovecot.service",
122+
running=active,
123+
enabled=active,
133124
)
134-
self.need_restart = False
135125

136126

137127
def _pick_url(primary, fallback):

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

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

4545
def activate(self):
46-
systemd.service(
47-
name="Start and enable mtail",
48-
service="mtail.service",
49-
running=bool(self.mtail_address),
50-
enabled=bool(self.mtail_address),
51-
restarted=self.need_restart,
52-
)
53-
self.need_restart = False
46+
active = bool(self.mtail_address)
47+
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,
@@ -45,14 +45,7 @@ def configure(self):
4545
_configure_nginx(self, self.config)
4646

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

5750

5851
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

@@ -86,12 +86,4 @@ def configure(self):
8686
)
8787

8888
def activate(self):
89-
systemd.service(
90-
name="Start and enable OpenDKIM",
91-
service="opendkim.service",
92-
running=True,
93-
enabled=True,
94-
daemon_reload=self.daemon_reload,
95-
restarted=self.need_restart,
96-
)
97-
self.need_restart = False
89+
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

@@ -68,16 +68,9 @@ def configure(self):
6868
)
6969

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

0 commit comments

Comments
 (0)