[__systemd_service] new type to manage the state of systemd services

This commit is contained in:
matze 2020-01-06 10:42:12 +01:00
parent 51ba4a49d8
commit ef089d1c61
6 changed files with 256 additions and 0 deletions

View file

@ -0,0 +1,43 @@
#!/bin/sh -e
# explorer/state
#
# 2020 Matthias Stecher <matthiasstecher at gmx.de>
#
# 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 <http://www.gnu.org/licenses/>.
#
# Check if the service is running or stopped.
#
# The explorer must check before if the service exist, because 'systemctl is-active'
# will return "inactive" even if there is no service there:
# systemctl cat foo # does not exist
# systemctl is-active foo # is "inactive"
# get name of the service
if [ -f "$__object/parameter/name" ]; then
name="$(cat "$__object/parameter/name")"
else
name="$__object_id"
fi
# check if the service exist, else exit without output (also if systemd doesn't exist)
# do not exit here with an error code, will be done in the gencode-remote script
systemctl cat "$name" > /dev/null 2>&1 || exit 0
# print if the service is running or not
systemctl is-active -q "$name" && printf "running" || printf "stopped"

View file

@ -0,0 +1,98 @@
#!/bin/sh -e
# gencode-remote
#
# 2020 Matthias Stecher <matthiasstecher at gmx.de>
#
# 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 <http://www.gnu.org/licenses/>.
#
# Checks the given state of the service and set it to the given
# state. Optionally, it executes the action if service running.
# get name of the service
name="$__object/parameter/name"
if [ -f "$name" ]; then
name="$(cat "$name")"
else
name="$__object_id"
fi
# read current status and parameters
state="$(cat "$__object/explorer/state")"
should="$(cat "$__object/parameter/state")"
# if systemd/service does not exist
if [ -z "$state" ]; then
printf "systemd or service '%s' does not exist!\n" "$name" >&2
exit 1
fi
# save the action required
required_action=""
# check the state of the service that should be
if [ "$state" != "$should" ]; then
# select what to do to get the $should state
case "$should" in
running)
if [ "$state" = "stopped" ]; then required_action="start"; fi
;;
stopped)
if [ "$state" = "running" ]; then required_action="stop"; fi
;;
esac
fi
# check if the action can be achieved if given
if [ -f "$__object/parameter/action" ] \
&& [ -z "$required_action" ] && [ "$state" = "running" ]; then
# there must be an action
action="$(cat "$__object/parameter/action")"
# select the action to the required element
case "$action" in
restart)
required_action="restart"
;;
reload)
required_action="reload"
;;
*)
printf "action '%s' does not exist!" "$action" >&2
exit 2
esac
# Make a special check: only do this action if a dependency did something
# it is required that the dependencies write there action to $__messages_in
if [ -f "$__object/parameter/if-required" ]; then
# exit here if there are no changes from the dependencies affected (nothing to do)
if ! grep -q -f "$__object/require" "$__messages_in"; then exit 0; fi
fi
fi
# print the execution command if a action given
if [ -n "$required_action" ]; then
# also print it as message
echo "$required_action" >> "$__messages_out"
echo "systemctl $required_action '$name'"
fi

View file

@ -0,0 +1,110 @@
cdist-type__systemd-service(7)
==============================
NAME
----
cdist-type__systemd-service - Controls a systemd service state
DESCRIPTION
-----------
This type controls systemd services to define a state of the service,
or an action like reloading or restarting. It is useful to reload a
service after configuration applied or shutdown one service.
The activation or deactivation is out of scope. Look for the
:strong:`cdist-type__systemd_util`\ (7) type instead.
REQUIRED PARAMETERS
-------------------
None.
OPTIONAL PARAMETERS
-------------------
name
String which will used as name instead of the object id.
state
The state which the service should be in:
running
Service should run (default)
stoppend
Service should stopped
action
Executes an action on on the service. It will only execute it if the
service keeps the state **running**. There are following actions, where:
reload
Reloads the service
restart
Restarts the service
BOOLEAN PARAMETERS
-----------------
if-required
Only execute the action if minimum one required type outputs a message to
**$__messages_out**. Through this, the action should only executed if a
dependency did something. The action will not executed if no dependencies
given.
MESSAGES
--------
start
Started the service
stop
Stopped the service
restart
Restarted the service
reload
Reloaded the service
ABORTS
------
Aborts in following cases:
systemd or the service does not exist
EXAMPLES
--------
.. code-block:: sh
# service must run
__systemd_service nginx
# service must stopped
__systemd_service sshd \
--state stopped
# restart the service
__systemd_service apache2 \
--action restart
# makes sure the service exist with an alternative name
__systemd_service foo \
--name sshd
# reload the service for a modified configuration file
# only reloads the service if the file really changed
require="__config_file/etc/foo.conf" __systemd_service foo \
--action reload --if-required
AUTHORS
-------
Matthias Stecher <matthiasstecher at gmx.de>
COPYRIGHT
---------
Copyright \(C) 2020 Matthias Stecher. 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.

View file

@ -0,0 +1 @@
if-required

View file

@ -0,0 +1 @@
running

View file

@ -0,0 +1,3 @@
name
state
action