From 63fb477e1f51d5da7c168a385736ee1071027c9b Mon Sep 17 00:00:00 2001 From: anti Date: Fri, 10 Apr 2026 01:09:15 -0400 Subject: [PATCH] feat: add smtp_relay service; add service_testing/ init - decnet/services/smtp_relay.py: open relay variant of smtp, same template with SMTP_OPEN_RELAY=1 baked into the environment - tests/service_testing/__init__.py: init so pytest discovers the subdirectory --- decnet/services/smtp_relay.py | 43 +++++++++++++++++++++++++++++++ tests/service_testing/__init__.py | 0 2 files changed, 43 insertions(+) create mode 100644 decnet/services/smtp_relay.py create mode 100644 tests/service_testing/__init__.py diff --git a/decnet/services/smtp_relay.py b/decnet/services/smtp_relay.py new file mode 100644 index 0000000..7656e19 --- /dev/null +++ b/decnet/services/smtp_relay.py @@ -0,0 +1,43 @@ +from pathlib import Path + +from decnet.services.base import BaseService + +# Reuses the same template as the smtp service — only difference is +# SMTP_OPEN_RELAY=1 in the environment, which enables the open relay persona. +_TEMPLATES_DIR = Path(__file__).parent.parent.parent / "templates" / "smtp" + + +class SMTPRelayService(BaseService): + """SMTP open relay bait — accepts any RCPT TO and delivers messages.""" + + name = "smtp_relay" + ports = [25, 587] + default_image = "build" + + def compose_fragment( + self, + decky_name: str, + log_target: str | None = None, + service_cfg: dict | None = None, + ) -> dict: + cfg = service_cfg or {} + fragment: dict = { + "build": {"context": str(_TEMPLATES_DIR)}, + "container_name": f"{decky_name}-smtp_relay", + "restart": "unless-stopped", + "cap_add": ["NET_BIND_SERVICE"], + "environment": { + "NODE_NAME": decky_name, + "SMTP_OPEN_RELAY": "1", + }, + } + if log_target: + fragment["environment"]["LOG_TARGET"] = log_target + if "banner" in cfg: + fragment["environment"]["SMTP_BANNER"] = cfg["banner"] + if "mta" in cfg: + fragment["environment"]["SMTP_MTA"] = cfg["mta"] + return fragment + + def dockerfile_context(self) -> Path: + return _TEMPLATES_DIR diff --git a/tests/service_testing/__init__.py b/tests/service_testing/__init__.py new file mode 100644 index 0000000..e69de29