Source code for systemd_pydantic.config.convenience
from pathlib import Path
from pydantic import Field, PrivateAttr, model_validator
from ..models import KillMode, RestartPolicy, TimeSpan
from .systemd import SystemdConfiguration
[docs]
class SystemdConvenienceConfiguration(SystemdConfiguration):
"""Systemd defaults and persisted state used by convenience commands."""
_pydantic_path: Path = PrivateAttr(default=Path("pydantic.json"))
restart: RestartPolicy = "no"
timeout_stop_sec: TimeSpan = "30s"
kill_mode: KillMode = "control-group"
kill_signal: str = "SIGTERM"
success_exit_status: list[int | str] = [0]
command_timeout: int = Field(default=60, ge=1)
@model_validator(mode="after")
def _set_convenience_defaults(self) -> "SystemdConvenienceConfiguration":
for unit in self.service.values():
service = unit.service
service.restart = service.restart or self.restart
service.timeout_stop_sec = service.timeout_stop_sec or self.timeout_stop_sec
service.kill_mode = service.kill_mode or self.kill_mode
service.kill_signal = service.kill_signal or self.kill_signal
service.success_exit_status = service.success_exit_status or self.success_exit_status
assert self.working_dir is not None
self._pydantic_path = self.working_dir / "pydantic.json"
return self
def _write_self(self) -> None:
assert self.working_dir is not None
self.working_dir.mkdir(parents=True, exist_ok=True)
self.write()
self._pydantic_path.write_text(self.model_dump_json(exclude_unset=True))
[docs]
def rmdir(self) -> None:
self._pydantic_path.unlink(missing_ok=True)
super().rmdir()
load_convenience_config = SystemdConvenienceConfiguration.load