__systemd_unit: add support for masking units

This commit is contained in:
Adam Dej 2018-07-11 13:00:41 +02:00
parent 37b37f6e66
commit 43982f821f
3 changed files with 33 additions and 8 deletions

View file

@ -33,16 +33,24 @@ if [ "${state}" = "absent" ]; then
fi fi
unit_status=$(cat "${__object}/explorer/unit-status") unit_status=$(cat "${__object}/explorer/unit-status")
desired_enablement_state=$(cat "${__object}/parameter/enablement-state")
if [ "${current_enablement_state}" = "masked" ] && \
[ "${desired_enablement_state}" != "masked" ]; then
echo "systemctl unmask ${name}"
fi
if [ -f "${__object}/parameter/restart" ]; then if [ -f "${__object}/parameter/restart" ]; then
if grep -q "^__file/etc/systemd/system/${name}" "${__messages_in}" || \ if [ "${desired_enablement_state}" = "masked" ]; then
if [ "${unit_status}" = "active" ]; then
echo "systemctl stop ${name}"
fi
elif grep -q "^__file/etc/systemd/system/${name}" "${__messages_in}" || \
[ "${unit_status}" != "active" ]; then [ "${unit_status}" != "active" ]; then
echo "systemctl restart ${name} || true" echo "systemctl restart ${name} || true"
fi fi
fi fi
desired_enablement_state=$(cat "${__object}/parameter/enablement-state")
if [ "${current_enablement_state}" = "${desired_enablement_state}" ]; then if [ "${current_enablement_state}" = "${desired_enablement_state}" ]; then
exit 0 exit 0
fi fi
@ -58,6 +66,9 @@ case "${desired_enablement_state}" in
disabled) disabled)
echo "systemctl disable ${name}" echo "systemctl disable ${name}"
;; ;;
masked)
echo "systemctl mask ${name}"
;;
*) *)
echo "Unsupported unit status: ${desired_enablement_state}" >&2 echo "Unsupported unit status: ${desired_enablement_state}" >&2
exit 1 exit 1

View file

@ -23,12 +23,14 @@ OPTIONAL PARAMETERS
------------------- -------------------
enablement-state enablement-state
'enabled' or 'disabled', where: 'enabled', 'disabled' or 'masked', where:
enabled enabled
enables the unit enables the unit
disabled disabled
disables the unit disables the unit
masked
masks the unit
source source
Path to the config file. If source is '-' (dash), take what was written to Path to the config file. If source is '-' (dash), take what was written to
@ -38,15 +40,17 @@ state
'present' or 'absent', defaults to 'present' where: 'present' or 'absent', defaults to 'present' where:
present present
the unit is installed the unit (or its mask) is installed
absent absent
the unit is stopped, disabled and uninstalled The unit is stopped, disabled and uninstalled. If the unit was masked,
the mask is removed.
BOOLEAN PARAMETERS BOOLEAN PARAMETERS
------------------ ------------------
restart restart
Restart the unit on unit file change or when the unit is inactive. Start the unit if it was inactive. Restart the unit if the unit file
changed. Stop the unit if new ``enablement-state`` is ``masked``.
MESSAGES MESSAGES
-------- --------

View file

@ -29,6 +29,7 @@ fi
name="${__object_id}" name="${__object_id}"
source=$(cat "${__object}/parameter/source") source=$(cat "${__object}/parameter/source")
state=$(cat "${__object}/parameter/state") state=$(cat "${__object}/parameter/state")
enablement_state=$(cat "${__object}/parameter/enablement-state")
# The unit must be disabled before removing its unit file. The unit file is # The unit must be disabled before removing its unit file. The unit file is
# therefore removed by gencode-remote of this type, not here. # therefore removed by gencode-remote of this type, not here.
@ -41,8 +42,17 @@ if [ "${source}" = "-" ]; then
source="${__object}/stdin" source="${__object}/stdin"
fi fi
unitfile_state="${state}"
if [ "${enablement_state}" = "masked" ]; then
# Masking creates a symlink from /etc/systemd/system/<unit> to /dev/null.
# This process fails with "Failed to execute operation: Invalid argument"
# if file /etc/systemd/system/<unit> already exists. We must therefore
# remove it.
unitfile_state="absent"
fi
__config_file "/etc/systemd/system/${name}" \ __config_file "/etc/systemd/system/${name}" \
--mode 644 \ --mode 644 \
--onchange "systemctl daemon-reload" \ --onchange "systemctl daemon-reload" \
--source "${source}" \ --source "${source}" \
--state "${state}" --state "${unitfile_state}"