sys-service: add systemd_directive filter and refactor service template

Introduced custom filter plugin to render optional systemd directives, refactored template to loop over directives, and adjusted default vars (TimeoutStartSec, RuntimeMaxSec handling).

Details: see ChatGPT conversation
https://chatgpt.com/share/68a5a730-6344-800f-b9a3-dc62d5902e9b
This commit is contained in:
Kevin Veen-Birkenbach 2025-08-20 12:45:19 +02:00
parent 8608d89653
commit 42d6c1799b
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
3 changed files with 32 additions and 15 deletions

View File

@ -0,0 +1,17 @@
def systemd_directive(value, key: str) -> str:
"""
Render a single systemd directive line if value is non-empty.
Example: {{ myval | systemd_directive('ExecStart') }}
"""
if value is None:
return ""
sval = str(value).strip()
if not sval:
return ""
return f"{key}={sval}"
class FilterModule(object):
def filters(self):
return {
"systemd_directive": systemd_directive,
}

View File

@ -1,15 +1,14 @@
[Unit]
Description={{ SOFTWARE_NAME }} - Service for role '{{ system_service_id }}'
{% if system_service_tpl_on_failure |length > 0 %}
OnFailure={{ system_service_tpl_on_failure }}
{% endif %}
{{- system_service_tpl_on_failure | systemd_directive('OnFailure') }}
[Service]
Type={{ system_service_tpl_type }}
{% if system_service_tpl_exec_start_pre |length > 0 %}
ExecStartPre={{ system_service_tpl_exec_start_pre }}
{% endif %}
ExecStart={{ system_service_tpl_exec_start }}
{% if system_service_tpl_runtime |length > 0 %}
RuntimeMaxSec={{ system_service_tpl_runtime }}
{% endif %}
{%- for key, val in [
('TimeoutStartSec', system_service_tpl_timeout_start_sec),
('ExecStartPre', system_service_tpl_exec_start_pre),
('ExecStart', system_service_tpl_exec_start),
('RuntimeMaxSec', system_service_tpl_runtime)
] -%}
{{- val | systemd_directive(key) }}
{%- endfor %}

View File

@ -17,8 +17,9 @@ system_service_script_inter: "/bin/{{ 'bash' if system_service_script_type ==
system_service_script_exec: "{{ system_service_script_inter }} {{ system_service_id | get_service_script_path( system_service_script_type ) }}"
# Service template
system_service_tpl_on_failure: "{{ SYS_SERVICE_ON_FAILURE_COMPOSE }}"
system_service_tpl_type: "oneshot"
system_service_tpl_exec_start: "{{ system_service_script_exec }}"
system_service_tpl_runtime: "{{ SYS_SERVICE_DEFAULT_RUNTIME }}"
system_service_tpl_exec_start_pre: ""
system_service_tpl_on_failure: "{{ SYS_SERVICE_ON_FAILURE_COMPOSE }}"
system_service_tpl_type: "oneshot"
system_service_tpl_exec_start: "{{ system_service_script_exec }}"
system_service_tpl_runtime: "{{ '' if system_service_tpl_type == 'oneshot' else SYS_SERVICE_DEFAULT_RUNTIME }}"
system_service_tpl_exec_start_pre: ""
system_service_tpl_timeout_start_sec: "60s"