forked from ungleich-public/cdist
[__systemd_service] new type to manage the state of systemd services
This commit is contained in:
parent
51ba4a49d8
commit
ef089d1c61
6 changed files with 256 additions and 0 deletions
43
cdist/conf/type/__systemd_service/explorer/state
Executable file
43
cdist/conf/type/__systemd_service/explorer/state
Executable 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"
|
98
cdist/conf/type/__systemd_service/gencode-remote
Executable file
98
cdist/conf/type/__systemd_service/gencode-remote
Executable 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
|
110
cdist/conf/type/__systemd_service/man.rst
Normal file
110
cdist/conf/type/__systemd_service/man.rst
Normal 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.
|
1
cdist/conf/type/__systemd_service/parameter/boolean
Normal file
1
cdist/conf/type/__systemd_service/parameter/boolean
Normal file
|
@ -0,0 +1 @@
|
||||||
|
if-required
|
|
@ -0,0 +1 @@
|
||||||
|
running
|
3
cdist/conf/type/__systemd_service/parameter/optional
Normal file
3
cdist/conf/type/__systemd_service/parameter/optional
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
name
|
||||||
|
state
|
||||||
|
action
|
Loading…
Reference in a new issue