X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=service;h=f882bdb2888fd1d2535ce383b87c03716f4c6ec6;hb=d64dc33640917a00ddfb060452555d0274f54d27;hp=c29c382a442a375e2d947badac68757fd30b7f9b;hpb=58f95af1c2d07c4434cbfd33ba5254254019c5d7;p=projects%2Frc-scripts.git diff --git a/service b/service index c29c382a..f882bdb2 100755 --- a/service +++ b/service @@ -16,11 +16,110 @@ is_ignored_file() { return 1 } +# check if SERVICE is present in systemd and ACTION is valid systemctl command +# returns false if systemd is disabled or not active +is_systemd_service() { + local SERVICE=$1 ACTION=$2 + + [ "$USE_SYSTEMD" = "no" ] && return 1 + + # if we are called from systemd itself, because some .service specified + # invocation via /sbin/service. this avoids loops + # detect this via CMDLINE var, which has leaked from geninitrd + if [ -n "$CMDLINE" ]; then + echo >&2 "Warning: CMDLINE env set, likely you are defining .service to use /sbin/service, please use /etc/rc.d/init.d/ instead" + return 1 + fi + + case "$ACTION" in + # list obtained as: man systemctl | grep N.*A.*M.*E + start | \ + stop | \ + reload | \ + restart | \ + try-restart | \ + reload-or-restart | \ + reload-or-try-restart | \ + isolate | \ + kill | \ + is-active | \ + status | \ + show | \ + reset-failed | \ + enable | \ + disable | \ + is-enabled | \ + reenable | \ + preset | \ + mask | \ + unmask | \ + link | \ + load | \ + snapshot | \ + delete | \ + set-environment | \ + unset-environment ) + ;; + *) + #echo "Not valid systemd command" + return 1 + esac + + [ -x /bin/systemd_booted ] || return 1 + /bin/systemd_booted || return 1 + + /bin/systemctl show "$SERVICE".service | grep -q LoadError= && return 1 || return 0 +} + +status_all() { + local SERVICE TYPE has_systemd + + if [ "$USE_SYSTEMD" != "no" ] && [ -x /bin/systemd_booted ] && /bin/systemd_booted; then + has_systemd=1 + else + unset has_systemd + fi + + cd ${SERVICEDIR} + for SERVICE in *; do + case "${SERVICE}" in + functions | halt | killall | single| linuxconf| kudzu) + ;; + *) + if ! is_ignored_file "${SERVICE}" \ + && [ -x "${SERVICEDIR}/${SERVICE}" ]; then + if [ "$has_systemd" ] && [ -f /lib/systemd/system/${SERVICE}.service ]; then + # D for SystemD + TYPE='D' + else + # S for SysVinit + TYPE='S' + fi + if ! grep -qs "\Wstatus)" "$SERVICE"; then + printf " %s %-60s %s\n" "$TYPE:[?]" "$SERVICE:" "unknown" + continue + else + out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1) + if [ "$?" = "0" -a -n "$out" ]; then + printf " %s %-60s %s\n" "$TYPE:[+]" "$SERVICE:" "running" + continue + else + printf " %s %-60s %s %s\n" "$TYPE:[-]" "$SERVICE:" "NOT running" + continue + fi + fi + fi + ;; + esac + done +} + VERSION="$(basename $0) ver. 0.91-pld" USAGE="Usage: $(basename $0) < option > | --status-all | \ [ service_name [ command | --full-restart ] ]" SERVICE= +USE_SYSTEMD= if [ -d /etc/rc.d/init.d ]; then SERVICEDIR="/etc/rc.d/init.d" @@ -36,45 +135,29 @@ fi cd / while [ $# -gt 0 ]; do case "${1}" in - --help | -h | --h* ) + --help | -h | --h* ) echo "${USAGE}" >&2 exit 0 ;; - --version | -V ) + --version | -V ) echo "${VERSION}" >&2 exit 0 ;; + --ignore-dependencies) + export SYSTEMCTL_IGNORE_DEPENDENCIES=1 + shift + ;; + --skip-redirect) + export SYSTEMCTL_SKIP_REDIRECT=1 + shift + ;; + --no-systemd) + USE_SYSTEMD=no + shift + ;; *) if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then - cd ${SERVICEDIR} - for SERVICE in *; do - case "${SERVICE}" in - functions | halt | killall | single| linuxconf| kudzu) - ;; - *) - if ! is_ignored_file "${SERVICE}" \ - && [ -x "${SERVICEDIR}/${SERVICE}" ]; then - if ! grep -qs "\Wstatus)" "$SERVICE"; then - #printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2 - echo " [ ? ] $SERVICE" 1>&2 - continue - else - out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1) - if [ "$?" = "0" -a -n "$out" ]; then - #printf " %s %-60s %s\n" "[+]" "$SERVICE:" "running" - echo " [ + ] $SERVICE" - continue - else - #printf " %s %-60s %s\n" "[-]" "$SERVICE:" "NOT running" - echo " [ - ] $SERVICE" - continue - fi - fi - #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status - fi - ;; - esac - done + status_all exit 0 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then SERVICE="${1}" @@ -85,6 +168,8 @@ while [ $# -gt 0 ]; do fi elif [ -z "${SERVICE}" ]; then SERVICE="${1}" + elif [ -z "${ACTION}" ]; then + ACTION="${1}" else OPTIONS="${OPTIONS} ${1}" fi @@ -93,8 +178,11 @@ while [ $# -gt 0 ]; do esac done -if [ -x "${SERVICEDIR}/${SERVICE}" ]; then - env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS} +if is_systemd_service "${SERVICE}" "${ACTION}"; then + echo >&2 "Redirecting to /bin/systemctl --output=cat ${ACTION} ${SERVICE}.service ${OPTIONS}" + exec /bin/systemctl --output=cat ${ACTION} ${SERVICE}.service ${OPTIONS} +elif [ -x "${SERVICEDIR}/${SERVICE}" ]; then + exec env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${ACTION} ${OPTIONS} else echo "${SERVICE}: unrecognized service" >&2 exit 1