[__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…
	
	Add table
		Add a link
		
	
		Reference in a new issue