X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=service;h=f882bdb2888fd1d2535ce383b87c03716f4c6ec6;hb=b402dd3f91a54c34d9eaf99bee8e4a129286c749;hp=5567c74488c8cd835648ae62d77f7831f3cb8c62;hpb=32eb19405e44ba3beba12bd2242bad02b8322dce;p=projects%2Frc-scripts.git diff --git a/service b/service index 5567c744..f882bdb2 100755 --- a/service +++ b/service @@ -16,8 +16,70 @@ 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 + 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 @@ -26,30 +88,26 @@ status_all() { *) if ! is_ignored_file "${SERVICE}" \ && [ -x "${SERVICEDIR}/${SERVICE}" ]; then - if [ -f /etc/init/${SERVICE}.conf ]; then - # U for upstart - TYPE='U' + 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" "[?]" "$SERVICE:" "unknown" 1>&2 - echo " [ ? ]{$TYPE} $SERVICE" + printf " %s %-60s %s\n" "$TYPE:[?]" "$SERVICE:" "unknown" continue else - out=$(env -i USE_UPSTART=$USE_UPSTART LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1) + 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 " [ + ]{$TYPE} $SERVICE" + printf " %s %-60s %s\n" "$TYPE:[+]" "$SERVICE:" "running" continue else - #printf " %s %-60s %s\n" "[-]" "$SERVICE:" "NOT running" - echo " [ - ]{$TYPE} $SERVICE" + printf " %s %-60s %s %s\n" "$TYPE:[-]" "$SERVICE:" "NOT running" continue fi fi - #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status fi ;; esac @@ -61,7 +119,7 @@ USAGE="Usage: $(basename $0) < option > | --status-all | \ [ service_name [ command | --full-restart ] ]" SERVICE= -USE_UPSTART= +USE_SYSTEMD= if [ -d /etc/rc.d/init.d ]; then SERVICEDIR="/etc/rc.d/init.d" @@ -85,12 +143,16 @@ while [ $# -gt 0 ]; do echo "${VERSION}" >&2 exit 0 ;; - --upstart) - USE_UPSTART=yes + --ignore-dependencies) + export SYSTEMCTL_IGNORE_DEPENDENCIES=1 + shift + ;; + --skip-redirect) + export SYSTEMCTL_SKIP_REDIRECT=1 shift ;; - --no-upstart) - USE_UPSTART=no + --no-systemd) + USE_SYSTEMD=no shift ;; *) @@ -100,8 +162,8 @@ while [ $# -gt 0 ]; do elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then SERVICE="${1}" if [ -x "${SERVICEDIR}/${SERVICE}" ]; then - env -i USE_UPSTART=$USE_UPSTART LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop - env -i USE_UPSTART=$USE_UPSTART LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start + env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop + env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start exit $? fi elif [ -z "${SERVICE}" ]; then @@ -116,8 +178,11 @@ while [ $# -gt 0 ]; do esac done -if [ -x "${SERVICEDIR}/${SERVICE}" ]; then - exec env -i USE_UPSTART=$USE_UPSTART LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${ACTION} ${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