""" Bring-your-own-service (BYOS) support. CustomService wraps a user-defined service from an INI [custom-*] section. It is instantiated dynamically and registered via register_custom_service(), not through the auto-discovery mechanism in the registry. """ from decnet.services.base import BaseService class CustomService(BaseService): """A user-defined service that runs an arbitrary Docker image.""" def __init__(self, name: str, image: str, exec_cmd: str, ports: list[int] | None = None): self.name = name self.default_image = image self.ports = ports or [] self._exec_cmd = exec_cmd def compose_fragment( self, decky_name: str, log_target: str | None = None, service_cfg: dict | None = None, ) -> dict: slug = self.name.replace("_", "-") fragment: dict = { "image": self.default_image, "container_name": f"{decky_name}-{slug}", "restart": "unless-stopped", "environment": {"NODE_NAME": decky_name}, } if self._exec_cmd: fragment["command"] = self._exec_cmd.split() if log_target: fragment["environment"]["LOG_TARGET"] = log_target return fragment def dockerfile_context(self): return None