--- mage/trunk/include/mtools.minc 2012/11/06 12:54:28 4046 +++ mage/trunk/include/mtools.minc 2012/11/06 12:57:02 4047 @@ -1,4 +1,4 @@ -# $Header: /alx-cvs/mage-eglibc/include/mtools.minc,v 1.1.1.1 2008/03/05 15:10:52 niro Exp $ +# $Id$ # adds services to runlevels and starts them # mstartservice service {/path/to/service_exec} @@ -7,10 +7,24 @@ local service="$1" local service_exec="$2" + # only run if sysV init was found + if [[ ! -f /etc/rc.d/init.d/functions ]] + then + echo "sysV init not found, not adding service ${service} to runlevels!" + return + fi + + # don't run if feature !autosvc was set + if mqueryfeature "!autosvc" + then + echo "!autosvc detected; auto management of services disabled." + return + fi + [[ -z ${service_exec} ]] && service_exec="$(which ${service})" # add service to default runlevels - echo "Adding ${service} to default runlevels ..." + echo -e " ${COLBLUE}[${COLGREEN}+${COLBLUE}]${COLDEFAULT} adding ${service} to default runlevels ..." [[ -x ${MROOT}/etc/rc.d/init.d/${service} ]] && rc-config add ${service} &> /dev/null # do not start services on bootstrap or MROOT!=/ @@ -35,13 +49,34 @@ local service="$1" local service_exec="$2" - [[ -z ${service_exec} ]] && service_exec="$(which ${service})" + # only run if sysV init was found + if [[ ! -f /etc/rc.d/init.d/functions ]] + then + echo "sysV init not found, not adding service ${service} to runlevels!" + return + fi + + # don't run if feature !autosvc was set + if mqueryfeature "!autosvc" + then + echo "!autosvc detected; auto management of services disabled." + return + fi + + if [[ -z ${service_exec} ]] + then + service_exec="$(which ${service})" + elif [[ x$(basename ${service_exec}) = x${service_exec} ]] + then + # expand full path + service_exec="$(which ${service_exec})" + fi # only stop the service if ${service_exec} does not exist - [[ -f ${MROOT}/${service_exec} ]] && return + [[ -x ${MROOT}/${service_exec} ]] && return # del services from runlevel regardless if they exist or not - echo "Removing ${service} from default runlevels ..." + echo -e " ${COLBLUE}[${COLRED}-${COLBLUE}]${COLDEFAULT} removing ${service} from default runlevels ..." rc-config del ${service} &> /dev/null # do not stop services on bootstrap or MROOT!=/ @@ -55,4 +90,207 @@ killall -9 ${service_exec} &> /dev/null fi fi -} \ No newline at end of file +} + +# reloads a service if already running +# mreloadservice service {/path/to/service_exec} +mreloadservice() +{ + local service="$1" + local service_exec="$2" + + # only run if sysV init was found + if [[ ! -f /etc/rc.d/init.d/functions ]] + then + echo "sysV init not found, not adding service ${service} to runlevels!" + return + fi + + # don't run if feature !autosvc was set + if mqueryfeature "!autosvc" + then + echo "!autosvc detected; auto management of services disabled." + return + fi + + [[ -z ${service_exec} ]] && service_exec="$(which ${service})" + + # do not stop services on bootstrap or MROOT!=/ + if [[ ${MAGE_BOOTSTRAP} != true ]] && [[ -z ${MROOT} ]] || [[ ${MROOT} = / ]] + then + # only reload the service if running + if [[ -n $(pidof ${service_exec}) ]] + then + /etc/init.d/${service} reload + fi + fi +} + +# adds systemd units to runlevels and starts them +# mstartunit service {/path/to/service_exec} +mstartunit() +{ + local service="$1" + local service_exec="$2" + local opts + + # only run if systemd was found + if [[ ! -x /bin/systemctl ]] && [[ ! -x /usr/bin/systemctl ]] + then + echo "systemd not found, not adding unit ${service} to runlevels!" + return + fi + + # don't run if feature !autosvc was set + if mqueryfeature "!autosvc" + then + echo "!autosvc detected; auto management of services disabled." + return + fi + + if [[ ${MROOT} != / ]] && [[ ! -z ${MROOT} ]] + then + opts="--root ${MROOT}" + fi + + if [[ -z ${service_exec} ]] + then + case ${service} in + *.service) service_exec="$(which ${service%%.service} 2> /dev/null)" ;; + *.socket) service_exec="$(which ${service%%.socket} 2> /dev/null)" ;; + *.mount) service_exec="$(which ${service%%.mount} 2> /dev/null)" ;; + *.target) service_exec="$(which ${service%%.target} 2> /dev/null)" ;; + *) service_exec="$(which ${service} 2> /dev/null)" ;; + esac + fi + + # add service to default runlevels + echo -e " ${COLBLUE}[${COLGREEN}+${COLBLUE}]${COLDEFAULT} adding unit ${service} to default runlevels ..." + # reload daemon to honor changed unit files + systemctl ${opts} daemon-reload + systemctl ${opts} enable ${service} + + # do not start services on bootstrap or MROOT!=/ + if [[ ${MAGE_BOOTSTRAP} != true ]] && [[ -z ${MROOT} ]] || [[ ${MROOT} = / ]] + then + echo -e " ${COLBLUE}[${COLGREEN}+${COLBLUE}]${COLDEFAULT} starting unit ${service} ..." + # start or restart the service + # dont use try-restart, works only with active services! + systemctl restart ${service} + fi +} + +# removes systemd units from runlevels and stops them +# mstopunit service {/path/to/service_exec} +mstopunit() +{ + local service="$1" + local service_exec="$2" + local opts + + # only run if systemd was found + if [[ ! -x /bin/systemctl ]] && [[ ! -x /usr/bin/systemctl ]] + then + echo "systemd not found, not removing unit ${service} from runlevels!" + return + fi + + # don't run if feature !autosvc was set + if mqueryfeature "!autosvc" + then + echo "!autosvc detected; auto management of services disabled." + return + fi + + if [[ ${MROOT} != / ]] && [[ ! -z ${MROOT} ]] + then + opts="--root ${MROOT}" + fi + + if [[ -z ${service_exec} ]] + then + case ${service} in + *.service) service_exec="$(which ${service%%.service} 2> /dev/null)" ;; + *.socket) service_exec="$(which ${service%%.socket} 2> /dev/null)" ;; + *.mount) service_exec="$(which ${service%%.mount} 2> /dev/null)" ;; + *.target) service_exec="$(which ${service%%.target} 2> /dev/null)" ;; + *) service_exec="$(which ${service} 2> /dev/null)" ;; + esac + elif [[ x$(basename ${service_exec}) = x${service_exec} ]] + then + # expand full path + service_exec="$(which ${service_exec})" + fi + + # only stop the service if ${service_exec} does not exist + [[ -x ${MROOT}/${service_exec} ]] && return + + # del services from runlevel regardless if they exist or not + echo -e " ${COLBLUE}[${COLRED}-${COLBLUE}]${COLDEFAULT} removing unit ${service} from default runlevels ..." + # reload daemon to honor changed unit files + systemctl ${opts} daemon-reload + systemctl ${opts} disable ${service} + + # do not stop services on bootstrap or MROOT!=/ + if [[ ${MAGE_BOOTSTRAP} != true ]] && [[ -z ${MROOT} ]] || [[ ${MROOT} = / ]] + then + echo -e " ${COLBLUE}[${COLGREEN}+${COLBLUE}]${COLDEFAULT} stopping unit ${service} ..." + systemctl stop ${service} + # try harder + if [[ -n $(pidof ${service_exec}) ]] + then + killall -15 ${service_exec} &> /dev/null + sleep 1 + killall -9 ${service_exec} &> /dev/null + fi + fi +} + +# reloads a systemd unit if already running +# mreloadunit service {/path/to/service_exec} +mreloadunit() +{ + local service="$1" + local service_exec="$2" + local opts + + # only run if systemd was found + if [[ ! -x /bin/systemctl ]] && [[ ! -x /usr/bin/systemctl ]] + then + echo "systemd not found, not removing unit ${service} from runlevels!" + return + fi + + # don't run if feature !autosvc was set + if mqueryfeature "!autosvc" + then + echo "!autosvc detected; auto management of services disabled." + return + fi + + if [[ ${MROOT} != / ]] && [[ ! -z ${MROOT} ]] + then + opts="--root ${MROOT}" + fi + + if [[ -z ${service_exec} ]] + then + case ${service} in + *.service) service_exec="$(which ${service%%.service} 2> /dev/null)" ;; + *.socket) service_exec="$(which ${service%%.socket} 2> /dev/null)" ;; + *.mount) service_exec="$(which ${service%%.mount} 2> /dev/null)" ;; + *.target) service_exec="$(which ${service%%.target} 2> /dev/null)" ;; + *) service_exec="$(which ${service} 2> /dev/null)" ;; + esac + fi + + # reload daemon to honor changed unit files + systemctl ${opts} daemon-reload + + # do not stop services on bootstrap or MROOT!=/ + if [[ ${MAGE_BOOTSTRAP} != true ]] && [[ -z ${MROOT} ]] || [[ ${MROOT} = / ]] + then + # only reload the service if running + systemctl reload-or-try-restart ${service} + fi +}