181 lines
6.0 KiB
Plaintext
181 lines
6.0 KiB
Plaintext
|
#!/bin/bash
|
||
|
#systemctl wrapper fo Koozali SME Server
|
||
|
|
||
|
allargs=$@
|
||
|
opts=();
|
||
|
syscommand="";
|
||
|
sysunit=""
|
||
|
debug=$(/sbin/e-smith/config get debug || echo "false")
|
||
|
if [ "$debug" != "true" ]; then debug=false;fi
|
||
|
|
||
|
# short OPTIONS we must pay attention as they have more arguments
|
||
|
#-t, --type=
|
||
|
#-s, --signal=
|
||
|
#-p, --property=
|
||
|
#-o, --output=
|
||
|
#-n, --lines=
|
||
|
#-H, --host=
|
||
|
#-M, --machine=
|
||
|
|
||
|
#commands we should return directly to systemd
|
||
|
#list-units,list-sockets,list-timers,is-active,is-failed,status,show,cat,set-property,help,reset-failed,list-dependencies,
|
||
|
#list-unit-files,is-enabled,get-default,set-default
|
||
|
#list-machines
|
||
|
#list-jobs
|
||
|
#snapshot,delete
|
||
|
#show-environment,set-environment,unset-environment,import-environment
|
||
|
#daemon-reload,daemon-reexec
|
||
|
#is-system-running,default,rescue,emergency,halt,poweroff,reboot,kexec,switch-root,suspend,hibernate,hybrid-sleep
|
||
|
|
||
|
# This is a list of commands :
|
||
|
# -we want to handle ourself or
|
||
|
# -we need to translate for systemd or
|
||
|
# -we do not want admin uses against the SME Server
|
||
|
#
|
||
|
# commands we handle: start,stop,reload,restart,try-restart,reload-or-restart,reload-or-try-restart,isolate,kill
|
||
|
# enable,disable,reenable,preset,preset-all,mask,unmask,link,add-wants,edit
|
||
|
# commands we deactivate/hide : mask,unmask,link,add-wants,edit set-default
|
||
|
# not systemd but we might use them : adjust sigterm sighup sigusr1 sigusr2
|
||
|
filteredcommands=(start stop reload restart try-restart reload-or-restart reload-or-try-restart isolate kill enable disable reenable preset preset-all adjust sigterm sighup sigusr1 sigusr2 mask unmask link add-wants add-requires edit set-default );
|
||
|
|
||
|
# fucntion to check if this is a command we want
|
||
|
contains2 () {
|
||
|
local seeking=$1
|
||
|
local in=0
|
||
|
for element in "${filteredcommands[@]}"; do
|
||
|
if [[ $element == "$seeking" ]]; then
|
||
|
in=1
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
return $in
|
||
|
}
|
||
|
|
||
|
# if no args we return to systemcl
|
||
|
if [ $# -eq 0 ]; then
|
||
|
echo "we return to systemctl"
|
||
|
/usr/bin/systemctl
|
||
|
exit
|
||
|
fi
|
||
|
|
||
|
#parse args
|
||
|
while [ "$#" -gt 0 ]; do
|
||
|
case "$1" in
|
||
|
-p|-t|-s|-o|-n|H|-M) temp=$1; shift ; opts+=("$temp $1"); ;;
|
||
|
--*) opts+=("$1") ;;
|
||
|
-*) opts+=("$1") ;;
|
||
|
*) if [[ "$syscommand" == "" ]]; then syscommand="$1" ; else sysunit="$1"; fi ;;
|
||
|
esac
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
servicename=${sysunit%".service"}
|
||
|
|
||
|
#we return to systemd systemctl command unless this is one of the command we want to handle
|
||
|
if ( contains2 "$syscommand" ) ; then
|
||
|
($debug) && echo "we return to /usr/bin/systemctl ${allargs[*]}"
|
||
|
/usr/bin/systemctl ${allargs[*]}
|
||
|
exit
|
||
|
fi
|
||
|
|
||
|
|
||
|
# here we convert sig* to kill -s=SIG* or SME commant to ones systemd recognize
|
||
|
case "$syscommand" in
|
||
|
adjust|sighup|sigusr1|sigusr2)
|
||
|
$syscommand="reload-or-restart";
|
||
|
;;
|
||
|
sigterm)
|
||
|
$syscommand="restart";
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
|
||
|
# catch here non unit signals, or ones we would like to do something different
|
||
|
#enable disable reenable preset preset-all
|
||
|
#mask unmask link add-wants edit
|
||
|
case "$syscommand" in
|
||
|
preset-all)
|
||
|
($debug) && echo "We do /etc/e-smith/events/actions/systemd-default"
|
||
|
/etc/e-smith/events/actions/systemd-default
|
||
|
exit
|
||
|
;;
|
||
|
preset)
|
||
|
# TODO looking if we could use /etc/e-smith/events/actions/systemd-default none $servicename
|
||
|
($debug) && echo "We do /etc/e-smith/events/actions/systemd-default"
|
||
|
/etc/e-smith/events/actions/systemd-default
|
||
|
exit
|
||
|
;;
|
||
|
enable|disable|reenable)
|
||
|
# looking if we could use
|
||
|
newstatus="enabled"
|
||
|
todo="enable"
|
||
|
if [ $syscommand == "disable" ]; then newstatus="disabled";todo="disable" ; fi
|
||
|
/sbin/e-smith/config setprop $servicename status $newstatus
|
||
|
#/etc/e-smith/events/actions/systemd-default none $servicename
|
||
|
# TODO looking if we could do it only for the service would be great!
|
||
|
($debug) && echo "We do /etc/e-smith/events/actions/systemd-default"
|
||
|
($debug) && echo "/usr/bin/systemctl $todo $sysunit ${opts[*]}"
|
||
|
/etc/e-smith/events/actions/systemd-default
|
||
|
/usr/bin/systemctl $todo $sysunit ${opts[*]}
|
||
|
exit
|
||
|
;;
|
||
|
set-default |isolate)
|
||
|
echo "We only $syscommand against sme-server.target"
|
||
|
($debug) && echo "/etc/e-smith/events/actions/systemd-default"
|
||
|
($debug) && echo "/etc/e-smith/events/actions/systemd-isolate"
|
||
|
/etc/e-smith/events/actions/systemd-default
|
||
|
/etc/e-smith/events/actions/systemd-isolate
|
||
|
;;
|
||
|
link|mask|unmask|add-wants|add-requires|edit)
|
||
|
echo "Please, do not use $syscommand for Koozali SME Server"
|
||
|
exit
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
|
||
|
#check the unit exist or fails : we do not care systemctl will do this...
|
||
|
|
||
|
# here we check if in db and if enabled or disabled
|
||
|
# if not or not service = return to systemctl directly
|
||
|
stype=$(/sbin/e-smith/db configuration gettype $servicename || echo "none")
|
||
|
sstatus=$(/sbin/e-smith/db configuration getprop $servicename status || echo "disabled")
|
||
|
if [ $stype == "none" ] ; then
|
||
|
# not defined in db, we redirect
|
||
|
echo "Information: $sysunit is not defined in configuration DB."
|
||
|
($debug) && echo "/usr/bin/systemctl ${allargs[*]}"
|
||
|
/usr/bin/systemctl ${allargs[*]}
|
||
|
exit
|
||
|
elif [ $stype != "service" ] ; then
|
||
|
echo "Information: $sysunit is not defined as a service in configuration DB but $type"
|
||
|
($debug) && echo "/usr/bin/systemctl ${allargs[*]}"
|
||
|
/usr/bin/systemctl ${allargs[*]}
|
||
|
exit
|
||
|
elif [ $sstatus == "disabled" ]; then
|
||
|
echo "Information: $sysunit is $sstatus in configuration DB."
|
||
|
# we might want to simply stop
|
||
|
#/usr/bin/systemctl stop $sysunit
|
||
|
# but we will do what we were asked for
|
||
|
($debug) && echo "/usr/bin/systemctl ${allargs[*]}"
|
||
|
/usr/bin/systemctl ${allargs[*]}
|
||
|
exit
|
||
|
elif [ $sstatus == "enabled" ]; then
|
||
|
#echo "$sstatus"
|
||
|
# starting in case
|
||
|
#systemctl is-active -q $sysunit will return zero if active; non zero if not
|
||
|
#/usr/bin/systemctl is-active -q $sysunit || /usr/bin/systemctl start $sysunit
|
||
|
# now executing the command
|
||
|
($debug) && echo "/usr/bin/systemctl $syscommand $sysunit ${opts[*]}"
|
||
|
/usr/bin/systemctl $syscommand $sysunit ${opts[*]}
|
||
|
exit
|
||
|
fi
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
echo "if you see that, we missed something, report the command to https://bugs.koozali.org"
|
||
|
echo "options : " ${opts[*]};
|
||
|
echo "command : " $syscommand;
|
||
|
echo "unit :" $sysunit;
|
||
|
echo $@
|