diff --git a/filter_plugins/get_service_name.py b/filter_plugins/get_service_name.py index 83b51811..5ec565c4 100644 --- a/filter_plugins/get_service_name.py +++ b/filter_plugins/get_service_name.py @@ -17,7 +17,7 @@ def get_service_name(systemctl_id, software_name, suffix="service"): base = sid[:-1] # drop the trailing '@' return f"{base}.{sw}@.{sfx}" else: - return f"{sid}{sw}.{sfx}" + return f"{sid}.{sw}.{sfx}" class FilterModule(object): diff --git a/group_vars/all/07_services.yml b/group_vars/all/07_services.yml index 680f5b5c..09894ebd 100644 --- a/group_vars/all/07_services.yml +++ b/group_vars/all/07_services.yml @@ -5,12 +5,12 @@ SYS_SERVICE_SUFFIX: ".{{ SOFTWARE_NAME | lower }}.service" ## Names -SYS_SERVICE_CLEANUP_BACKUPS_OLD: "sys-ctl-cln-backups{{ SYS_SERVICE_SUFFIX }}" -SYS_SERVICE_CLEANUP_BACKUPS_FAILED: "sys-ctl-cln-faild-bkps{{ SYS_SERVICE_SUFFIX }}" -SYS_SERVICE_OPTIMIZE_DRIVE: "svc-opt-ssd-hdd{{ SYS_SERVICE_SUFFIX }}" -SYS_SERVICE_BACKUP_RMT_2_LOC: "svc-bkp-rmt-2-loc{{ SYS_SERVICE_SUFFIX }}" -SYS_SERVICE_REPAIR_DOCKER_HARD: "sys-ctl-rpr-docker-hard{{ SYS_SERVICE_SUFFIX }}" -SYS_SERVICE_UPDATE_DOCKER: "update-docker{{ SYS_SERVICE_SUFFIX }}" +SYS_SERVICE_CLEANUP_BACKUPS_OLD: "{{ 'sys-ctl-cln-backups' | get_service_name(SOFTWARE_NAME) }}" +SYS_SERVICE_CLEANUP_BACKUPS_FAILED: "{{ 'sys-ctl-cln-faild-bkps' | get_service_name(SOFTWARE_NAME) }}" +SYS_SERVICE_OPTIMIZE_DRIVE: "{{ 'svc-opt-ssd-hdd' | get_service_name(SOFTWARE_NAME) }}" +SYS_SERVICE_BACKUP_RMT_2_LOC: "{{ 'svc-bkp-rmt-2-loc' | get_service_name(SOFTWARE_NAME) }}" +SYS_SERVICE_REPAIR_DOCKER_HARD: "{{ 'sys-ctl-rpr-docker-hard' | get_service_name(SOFTWARE_NAME) }}" +SYS_SERVICE_UPDATE_DOCKER: "{{ 'update-docker' | get_service_name(SOFTWARE_NAME) }}" ## On Failure SYS_SERVICE_ON_FAILURE_COMPOSE: "sys-ctl-alm-compose.{{ SOFTWARE_NAME }}@%i.service" diff --git a/roles/svc-bkp-loc-2-usb/handlers/main.yml b/roles/svc-bkp-loc-2-usb/handlers/main.yml index c684a3e8..2c782056 100644 --- a/roles/svc-bkp-loc-2-usb/handlers/main.yml +++ b/roles/svc-bkp-loc-2-usb/handlers/main.yml @@ -1,5 +1,6 @@ + - name: "reload svc-bkp-loc-2-usb service" systemd: - name: svc-bkp-loc-2-usb{{ SYS_SERVICE_SUFFIX }} + name: "{{ 'svc-bkp-loc-2-usb' | get_service_name(SOFTWARE_NAME) }}" state: reloaded daemon_reload: yes diff --git a/roles/svc-bkp-rmt-2-loc/Administration.md b/roles/svc-bkp-rmt-2-loc/Administration.md index ccf18538..f7d88d58 100644 --- a/roles/svc-bkp-rmt-2-loc/Administration.md +++ b/roles/svc-bkp-rmt-2-loc/Administration.md @@ -9,17 +9,17 @@ To track what the service is doing, execute one of the following commands: #### Using systemctl ```bash -watch -n2 "systemctl status sys-bkp-rmt-2-loc{{ SYS_SERVICE_SUFFIX }}" +watch -n2 "systemctl status {{ 'sys-bkp-rmt-2-loc' | get_service_name(SOFTWARE_NAME) }}" ``` #### Using journalctl ```bash -journalctl -fu sys-bkp-rmt-2-loc{{ SYS_SERVICE_SUFFIX }} +journalctl -fu {{ 'sys-bkp-rmt-2-loc' | get_service_name(SOFTWARE_NAME) }} ``` ### Viewing History ```bash -sudo journalctl -u sys-bkp-rmt-2-loc{{ SYS_SERVICE_SUFFIX }} +sudo journalctl -u {{ 'sys-bkp-rmt-2-loc' | get_service_name(SOFTWARE_NAME) }} ``` \ No newline at end of file diff --git a/roles/svc-net-wireguard-core/Administration.md b/roles/svc-net-wireguard-core/Administration.md index 515b0cc4..80d9bc2f 100644 --- a/roles/svc-net-wireguard-core/Administration.md +++ b/roles/svc-net-wireguard-core/Administration.md @@ -17,12 +17,12 @@ ### Activate Configuration ```bash cp /path/to/wg0.conf /etc/wireguard/wg0.conf - systemctl enable wg-quick@wg0{{ SYS_SERVICE_SUFFIX }} --now + systemctl enable wg-quick@wg0.service --now ``` ### Check status ```bash - systemctl status wg-quick@wg0{{ SYS_SERVICE_SUFFIX }} + systemctl status wg-quick@wg0.service ``` ## Other Resources diff --git a/roles/svc-net-wireguard-core/handlers/main.yml b/roles/svc-net-wireguard-core/handlers/main.yml index a14c43e3..8dfccf37 100644 --- a/roles/svc-net-wireguard-core/handlers/main.yml +++ b/roles/svc-net-wireguard-core/handlers/main.yml @@ -1,6 +1,6 @@ - name: "restart wireguard" systemd: - name: wg-quick@wg0{{ SYS_SERVICE_SUFFIX }} + name: wg-quick@wg0.service state: restarted enabled: yes daemon_reload: yes diff --git a/roles/svc-net-wireguard-plain/README.md b/roles/svc-net-wireguard-plain/README.md index f57cdebc..9b51b2a1 100644 --- a/roles/svc-net-wireguard-plain/README.md +++ b/roles/svc-net-wireguard-plain/README.md @@ -7,7 +7,7 @@ This role manages WireGuard on a client system. It sets up essential services an ## Overview Optimized for client configurations, this role: -- Deploys a systemd service (`set-mtu{{ SYS_SERVICE_SUFFIX }}`) and its associated script to set the MTU on specified network interfaces. +- Deploys a systemd service and its associated script to set the MTU on specified network interfaces. - Uses a Jinja2 template to generate the `set-mtu.sh` script. - Ensures that the MTU is configured correctly before starting WireGuard with [wg-quick](https://www.wireguard.com/quickstart/). diff --git a/roles/svc-net-wireguard-plain/templates/systemctl.service.j2 b/roles/svc-net-wireguard-plain/templates/systemctl.service.j2 index dba37377..33cb906f 100644 --- a/roles/svc-net-wireguard-plain/templates/systemctl.service.j2 +++ b/roles/svc-net-wireguard-plain/templates/systemctl.service.j2 @@ -1,10 +1,10 @@ [Unit] Description=set MTU -Before=wg-quick@wg0{{ SYS_SERVICE_SUFFIX }} +Before=wg-quick@wg0.service [Service] Type=oneshot ExecStart=bash {{ systemctl_id | get_service_script_path('sh') }} [Install] -RequiredBy=wg-quick@wg0{{ SYS_SERVICE_SUFFIX }} \ No newline at end of file +RequiredBy=wg-quick@wg0.service \ No newline at end of file diff --git a/roles/sys-ctl-bkp-docker-2-loc/templates/systemctl.service.j2 b/roles/sys-ctl-bkp-docker-2-loc/templates/systemctl.service.j2 index 40c3cc66..0539d749 100644 --- a/roles/sys-ctl-bkp-docker-2-loc/templates/systemctl.service.j2 +++ b/roles/sys-ctl-bkp-docker-2-loc/templates/systemctl.service.j2 @@ -6,4 +6,4 @@ OnFailure={{ SYS_SERVICE_ON_FAILURE_COMPOSE }} {{ SYS_SERVICE_CLEANUP_BACKUPS_FA Type=oneshot ExecStartPre=/bin/sh -c '/usr/bin/python {{ PATH_SYSTEM_LOCK_SCRIPT }} {{ SYS_SERVICE_GROUP_MANIPULATION | join(' ') }} --ignore {{ SYS_SERVICE_GROUP_BACKUPS | reject('equalto', role_name ~ '-everything') | join(' ') }} --timeout "{{ SYS_TIMEOUT_BACKUP_SERVICES }}"' ExecStart=/bin/sh -c '{{ BKP_DOCKER_2_LOC_EXEC }}' -ExecStartPost=/bin/sh -c '/bin/systemctl start sys-ctl-rpr-docker-soft{{ SYS_SERVICE_SUFFIX }} &' \ No newline at end of file +ExecStartPost=/bin/sh -c '/bin/systemctl start {{ 'sys-ctl-rpr-docker-soft' | get_service_name(SOFTWARE_NAME) }} &' \ No newline at end of file diff --git a/roles/sys-ctl-cln-certs/README.md b/roles/sys-ctl-cln-certs/README.md index 86cc5db7..bf537fcb 100644 --- a/roles/sys-ctl-cln-certs/README.md +++ b/roles/sys-ctl-cln-certs/README.md @@ -7,7 +7,7 @@ This Ansible role automates the detection, revocation and deletion of unused Let ## Overview - Installs the `certreap` cleanup tool using the `pkgmgr-install` role -- Deploys and configures a `sys-ctl-cln-certs{{ SYS_SERVICE_SUFFIX }}` systemd unit +- Deploys and configures a systemd unit - (Optionally) Sets up a recurring cleanup via a systemd timer using the `sys-timer` role - Integrates with `sys-ctl-alm-compose` to send failure notifications - Ensures idempotent execution with a `run_once_sys_ctl_cln_certs` flag @@ -18,7 +18,7 @@ This Ansible role automates the detection, revocation and deletion of unused Let Uses `pkgmgr-install` to install the `certreap` binary. - **Systemd Service Configuration** - Deploys `sys-ctl-cln-certs{{ SYS_SERVICE_SUFFIX }}` and reloads/restarts it on changes. + Deploys service and reloads/restarts it on changes. - **Systemd Timer Scheduling** Optionally wires in a timer via the `sys-timer` role, controlled by the `on_calendar_cleanup_certs` variable. @@ -27,7 +27,7 @@ This Ansible role automates the detection, revocation and deletion of unused Let Prevents multiple runs in one play by setting a `run_once_sys_ctl_cln_certs` fact. - **Failure Notification** - Triggers `sys-ctl-alm-compose.infinito@sys-ctl-cln-certs{{ SYS_SERVICE_SUFFIX }}` on failure. + Triggers service on failure. ## Further Resources diff --git a/roles/update-docker/tasks/01_core.yml b/roles/update-docker/tasks/01_core.yml index 38db75a8..e9164a7c 100644 --- a/roles/update-docker/tasks/01_core.yml +++ b/roles/update-docker/tasks/01_core.yml @@ -3,9 +3,9 @@ name: sys-lock when: run_once_sys_lock is not defined -- name: "start sys-ctl-bkp-docker-2-loc-everything{{ SYS_SERVICE_SUFFIX }}" +- name: "start {{ 'sys-ctl-bkp-docker-2-loc-everything' | get_service_name(SOFTWARE_NAME) }}" systemd: - name: sys-ctl-bkp-docker-2-loc-everything{{ SYS_SERVICE_SUFFIX }} + name: "{{ 'sys-ctl-bkp-docker-2-loc-everything' | get_service_name(SOFTWARE_NAME) }}" state: started when: - MODE_BACKUP | bool diff --git a/tests/unit/filter_plugins/test_get_service_name.py b/tests/unit/filter_plugins/test_get_service_name.py new file mode 100644 index 00000000..df89aa4b --- /dev/null +++ b/tests/unit/filter_plugins/test_get_service_name.py @@ -0,0 +1,39 @@ +import unittest +from filter_plugins import get_service_name + +class TestGetServiceName(unittest.TestCase): + def test_normal_service(self): + # Expect a dot between id and software name + self.assertEqual( + get_service_name.get_service_name("sys-ctl-cln-backups", "nginx"), + "sys-ctl-cln-backups.nginx.service" + ) + + def test_normal_service_custom_suffix(self): + self.assertEqual( + get_service_name.get_service_name("sys-ctl-cln-backups", "nginx", "timer"), + "sys-ctl-cln-backups.nginx.timer" + ) + + def test_with_at_suffix(self): + # If systemctl_id ends with '@', @ is moved behind software name + self.assertEqual( + get_service_name.get_service_name("sys-ctl-bkp@", "postgres"), + "sys-ctl-bkp.postgres@.service" + ) + + def test_with_at_and_custom_suffix(self): + self.assertEqual( + get_service_name.get_service_name("sys-ctl-bkp@", "postgres", "timer"), + "sys-ctl-bkp.postgres@.timer" + ) + + def test_case_is_lowered(self): + self.assertEqual( + get_service_name.get_service_name("Sys-CTL-BKP@", "Postgres", "SeRviCe"), + "sys-ctl-bkp.postgres@.service" + ) + + +if __name__ == "__main__": + unittest.main()