#!/usr/bin/bash # Check whether file $1 is a backup or rpm-generated file and should be ignored # Copy of the function from etc/rc.d/init.d/functions is_ignored_file() { case "$1" in *~ | *.bak | *.old | *.orig | *.rpmnew | *.rpmorig | *.rpmsave) return 0 ;; esac return 1 } VERSION="$(basename $0) ver. 1.1" USAGE="Usage: $(basename $0) < option > | --status-all | \ [ service_name [ command | --full-restart ] ]" SERVICEDIR="/etc/init.d" ACTIONDIR="/usr/libexec/initscripts/legacy-actions" SERVICE= ACTION= OPTIONS= if [ $# -eq 0 ]; then echo "${USAGE}" >&2 exit 1 fi cd / while [ $# -gt 0 ]; do case "${1}" in --help | -h | --h* ) echo "${USAGE}" >&2 exit 0 ;; --version | -V ) echo "${VERSION}" >&2 exit 0 ;; --ignore-dependencies) export SYSTEMCTL_IGNORE_DEPENDENCIES=1 shift ;; --skip-redirect) export SYSTEMCTL_SKIP_REDIRECT=1 shift ;; *) if [ -z "${SERVICE}" ] && [ $# -eq 1 ] && [ "${1}" = "--status-all" ]; then # symlink /etc/init.d -> rc.d/init.d is provided by initscripts package cd ${SERVICEDIR} || { echo $"Support for initscripts isn't installed" >&2 ; exit 4 ; } for SERVICE in * ; do case "${SERVICE}" in functions | halt | killall | single| linuxconf| kudzu) ;; *) if ! is_ignored_file "${SERVICE}" \ && [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status fi ;; esac done exit 0 elif [ $# -eq 2 ] && [ "${2}" = "--full-restart" ]; then # symlink /etc/init.d -> rc.d/init.d is provided by initscripts package [ -L "${SERVICEDIR}" ] || { echo $"Support for initscripts isn't installed" >&2 ; exit 4 ; } SERVICE="${1}" if [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start exit $? fi elif [ -z "${SERVICE}" ]; then SERVICE="${1}" elif [ -z "${ACTION}" ]; then ACTION="${1}" else OPTIONS="${OPTIONS} ${1}" fi shift ;; esac done if [ -f "${SERVICEDIR}/${SERVICE}" ]; then # LSB daemons that dies abnormally in systemd looks alive in systemd's eyes due to RemainAfterExit=yes # lets reap them before next start if [ "${ACTION}" = 'start' ] && \ [ "$(systemctl show -p ActiveState "${SERVICE}".service --value)" = 'active' ] && \ [ "$(systemctl show -p SubState "${SERVICE}".service --value)" = 'exited' ]; then /bin/systemctl stop "${SERVICE}".service fi # Workaround to be able to "stop" network.service when it's in inactive state using service instead of systemctl # Useful for manual testing of network if [ "${SERVICE}" = 'network' ] && [ "${ACTION}" = 'stop' ] && \ [ "$(systemctl show -p ActiveState network.service --value)" = 'inactive' ] && \ [ "$(systemctl show -p SourcePath network.service --value)" = '/etc/rc.d/init.d/network' ]; then export SYSTEMCTL_SKIP_REDIRECT=1 fi env -i PATH="$PATH" TERM="$TERM" SYSTEMCTL_IGNORE_DEPENDENCIES="${SYSTEMCTL_IGNORE_DEPENDENCIES}" SYSTEMCTL_SKIP_REDIRECT="${SYSTEMCTL_SKIP_REDIRECT}" "${SERVICEDIR}/${SERVICE}" "${ACTION}" ${OPTIONS} elif [ -n "${ACTION}" ] && [ -x "${ACTIONDIR}/${SERVICE}/${ACTION}" ]; then env -i PATH="$PATH" TERM="$TERM" SYSTEMCTL_IGNORE_DEPENDENCIES="${SYSTEMCTL_IGNORE_DEPENDENCIES}" SYSTEMCTL_SKIP_REDIRECT="${SYSTEMCTL_SKIP_REDIRECT}" "${ACTIONDIR}/${SERVICE}/${ACTION}" ${OPTIONS} elif [[ $ACTION =~ ^(start|stop|restart|try-restart|reload|reload-or-restart|try-reload-or-restart|force-reload|status|condrestart)$ ]]; then SERVICE_MANGLED=$(/usr/bin/systemd-escape --mangle "${SERVICE}") echo $"Redirecting to /bin/systemctl ${ACTION} ${SERVICE_MANGLED}${OPTIONS:+ }${OPTIONS}" >&2 exec /bin/systemctl "${ACTION}" "${SERVICE_MANGLED}" ${OPTIONS} else echo $"The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, reload-or-restart, try-reload-or-restart, force-reload, status, condrestart). For other actions, please try to use systemctl." >&2 exit 2 fi