diff --git a/cdist/conf/type/__systemd_unit/explorer/enablement-state b/cdist/conf/type/__systemd_unit/explorer/enablement-state new file mode 100644 index 00000000..5a5a4462 --- /dev/null +++ b/cdist/conf/type/__systemd_unit/explorer/enablement-state @@ -0,0 +1,21 @@ +#!/bin/sh +# +# 2017 Ľubomír Kučera +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# + +systemctl is-enabled "${__object_id}" 2>/dev/null || true diff --git a/cdist/conf/type/__systemd_unit/explorer/systemctl-present b/cdist/conf/type/__systemd_unit/explorer/systemctl-present new file mode 100644 index 00000000..7218affc --- /dev/null +++ b/cdist/conf/type/__systemd_unit/explorer/systemctl-present @@ -0,0 +1,21 @@ +#!/bin/sh +# +# 2017 Ľubomír Kučera +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# + +command -v systemctl > /dev/null 2>&1 && echo 0 || echo 1 diff --git a/cdist/conf/type/__systemd_unit/gencode-remote b/cdist/conf/type/__systemd_unit/gencode-remote new file mode 100644 index 00000000..6ea3ddaa --- /dev/null +++ b/cdist/conf/type/__systemd_unit/gencode-remote @@ -0,0 +1,62 @@ +#!/bin/sh -e +# +# 2017 Ľubomír Kučera +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# + +systemctl_present=$(cat "${__object}/explorer/systemctl-present") + +if [ "${systemctl_present}" -ne 0 ]; then + echo "systemctl does not seem to be present on this system" >&2 + + exit 1 +fi + +name="${__object_id}" +state=$(cat "${__object}/parameter/state") +current_enablement_state=$(cat "${__object}/explorer/enablement-state") + +if [ "${state}" = "absent" ]; then + if [ ! -z "${current_enablement_state}" ]; then + echo "systemctl --now disable ${name}" + fi + + exit 0 +fi + +desired_enablement_state=$(cat "${__object}/parameter/enablement-state") + +if [ "${current_enablement_state}" = "${desired_enablement_state}" ]; then + exit 0 +fi + +case "${desired_enablement_state}" in + "") + # Do nothing + : + ;; + enabled) + echo "systemctl enable ${name}" + ;; + disabled) + echo "systemctl disable ${name}" + ;; + *) + echo "Unsupported unit status: ${desired_enablement_state}" >&2 + exit 1 + ;; +esac diff --git a/cdist/conf/type/__systemd_unit/man.rst b/cdist/conf/type/__systemd_unit/man.rst new file mode 100644 index 00000000..c624e91e --- /dev/null +++ b/cdist/conf/type/__systemd_unit/man.rst @@ -0,0 +1,84 @@ +cdist-type__systemd_unit(7) +=========================== + +NAME +---- + +cdist-type__systemd_unit - Install a systemd unit + +DESCRIPTION +----------- + +This type can install, enable and start a systemd unit. This is particularly +useful on systems which take advantage of systemd heavily (e.g., CoreOS). For +more information about systemd units, see SYSTEMD.UNIT(5). + +REQUIRED PARAMETERS +------------------- + +None. + +OPTIONAL PARAMETERS +------------------- + +enablement-state + 'enabled' or 'disabled', where: + + enabled + enables the unit + disabled + disables the unit + +source + Path to the config file. If source is '-' (dash), take what was written to + stdin as the config file content. + +state + 'present' or 'absent', defaults to 'present' where: + + present + the unit is installed, enabled and started + absent + the unit is stopped, disabled and uninstalled + +BOOLEAN PARAMETERS +------------------ + +restart + Restart the unit on change. + +MESSAGES +-------- + +None. + +EXAMPLES +-------- + +.. code-block:: sh + + # Installs, enables and starts foobar.service + __systemd_unit foobar.service \ + --source "${__manifest}/files/foobar.service" \ + --enablement-state enabled \ + --restart + + # Disables the unit + __systemd_unit foobar.service --enablement-state disabled + + # Stops, disables and uninstalls foobar.service + __systemd_unit foobar.service --state absent + + +AUTHORS +------- + +Ľubomír Kučera + +COPYING +------- + +Copyright \(C) 2017 Ľubomír Kučera. You can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. diff --git a/cdist/conf/type/__systemd_unit/manifest b/cdist/conf/type/__systemd_unit/manifest new file mode 100644 index 00000000..10dc4f0c --- /dev/null +++ b/cdist/conf/type/__systemd_unit/manifest @@ -0,0 +1,39 @@ +#!/bin/sh -e +# +# 2017 Ľubomír Kučera +# +# This file is part of cdist. +# +# cdist is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# cdist is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with cdist. If not, see . +# + +name="${__object_id}" +source=$(cat "${__object}/parameter/source") +state=$(cat "${__object}/parameter/state") + +onchange() { + echo -n "systemctl daemon-reload" + + if [ -f "${__object}/parameter/restart" ]; then + echo -n " && (systemctl restart ${name} || true)" + fi + + echo +} + +__config_file "/etc/systemd/system/${name}" \ + --mode 644 \ + --onchange "$(onchange)" \ + --source "${source}" \ + --state "${state}" diff --git a/cdist/conf/type/__systemd_unit/parameter/boolean b/cdist/conf/type/__systemd_unit/parameter/boolean new file mode 100644 index 00000000..eea5a271 --- /dev/null +++ b/cdist/conf/type/__systemd_unit/parameter/boolean @@ -0,0 +1 @@ +restart diff --git a/cdist/conf/type/__systemd_unit/parameter/default/enablement-state b/cdist/conf/type/__systemd_unit/parameter/default/enablement-state new file mode 100644 index 00000000..e69de29b diff --git a/cdist/conf/type/__systemd_unit/parameter/default/source b/cdist/conf/type/__systemd_unit/parameter/default/source new file mode 100644 index 00000000..e69de29b diff --git a/cdist/conf/type/__systemd_unit/parameter/default/state b/cdist/conf/type/__systemd_unit/parameter/default/state new file mode 100644 index 00000000..e7f6134f --- /dev/null +++ b/cdist/conf/type/__systemd_unit/parameter/default/state @@ -0,0 +1 @@ +present diff --git a/cdist/conf/type/__systemd_unit/parameter/optional b/cdist/conf/type/__systemd_unit/parameter/optional new file mode 100644 index 00000000..e7cc7acf --- /dev/null +++ b/cdist/conf/type/__systemd_unit/parameter/optional @@ -0,0 +1,3 @@ +enablement-state +source +state