# /etc/rc.status # This file contains a functions to record, display, and return the actual # rc status information in init scripts. # See https://en.opensuse.org/openSUSE:Packaging_init_scripts#Status_Functions # for more info. # # The following functions are provided: # # rc_active # This function checks whether a service is enabled (by symlinks). # It returns "0" if the service is enabled in a runlevel and # returns "1" otherwise. # # rc_exit # This function terminates an init script with the exit status # appropriate to the overall rc status. # # rc_failed [num] # This function sets the local and the overall rc status to a selected # value defined by the parameter num. The value "1" is used by default. # # rc_check # This function checks the exit status of the last command ($?) and sets # the local rc status to this value if the value is different from "0". # Then it sets the overall rc status to the value of the local rc status # if it differs from "0". This function is used internally by other rc # status functions. # # rc_reset # This function sets both the local and the overall rc status to "0". # # rc_status [-r] [-s] [-u] [-v[num]] # This function checks, sets, and displays the rc status. By default, # it is quiet: it only calls rc_check. So, it must be called with an # option to display the status. The options have the following meaning: # -r calls rc_reset. This option is usable together with -v. The command # rc_status -v -r checks, sets, and displays the current rc status. # Then rc_reset is called. # -s displays "skipped" and sets the status to "3". It means an # unimplemented feature. # -u displays "unused" and sets the status to "3". It means an # unimplemented feature. # -v[num] displays the actual status and resets local status to "0". # By default, the status is displayed on the actual line. The # parameter num defines that it should display num lines above the # actual cursor position. if test -z "$PREVENT_LOOP" && test $PPID -ne 1 && test $# -eq 1 ; then unit_name= case "$0" in /etc/init.d/*|/etc/rc.d/*) unit_name=${0##*/} ;; */rc*) unit_name=`readlink "$0"` unit_name=${unit_name##*/} ;; esac if test -n "$unit_name"; then if [ "$1" = "status" ]; then PREVENT_LOOP=1 "$0" "$1" exec /usr/bin/systemctl -l status "${unit_name}.service" else exec /usr/bin/systemctl --ignore-dependencies $1 "${unit_name}.service" fi fi unset unit_name fi # local rc status rc_status=0 # overall rc status rc_status_overall=0 # echo opt to enable interpretation of backslash escapes # eopt="-e" # output messages msg_done="done" msg_failed="failed" msg_missed="missed" msg_skipped="skipped" msg_unused="unused" msg_running="running" msg_dead="dead" msg_unknown="unknown" # parent cmd rc_action=$1 rc_active () { local file for file in /etc/rc*.d/S[0-9][0-9]$1 ; do test -h $file && return 0 done return 1 } rc_exit () { exit $rc_status_overall } rc_failed () { if [ -z "$1" ] ; then rc_status=1 else rc_status=$1 fi rc_status_overall=$rc_status return $rc_status } rc_check () { result=$? test $result -ne 0 && rc_status=$result test $rc_status -ne 0 && rc_status_overall=$rc_status return $result } rc_reset () { rc_status=0 rc_status_overall=0 return 0 } if [ "$rc_action" = "status" ] ; then rc_status () { rc_check ret=$rc_status local op for op ; do case "$op" in -v) case "$rc_status" in 0) echo $eopt $msg_running ;; 1|2) echo $eopt $msg_dead ;; 3) echo $eopt $msg_unused ;; 4) echo $eopt $msg_unknown ;; esac rc_status=0 ;; -r) rc_reset ;; -s) echo $eopt msg_skipped ; rc_failed 3 ;; -u) echo $eopt msg_unused ; rc_failed 3 ;; *) echo "rc_status: Usage [-v] [-r] [-s] [-u]" ;; esac done return $ret } elif [ -n "$rc_action" ] ; then # "start", "stop", etc... rc_status () { rc_check ret=$rc_status if [ "$rc_action" = "stop" -a $rc_status -eq 7 ] ; then # we've stopped the service: 7 -> 0 rc_failed 7 fi local op for op ; do case "$op" in -v) case "$rc_status" in 0) echo $eopt $msg_done ;; 3) echo $eopt $msg_missed ;; 5) echo $eopt $msg_skipped ;; 6) echo $eopt $msg_unused ;; *) echo $eopt $msg_failed ;; esac rc_status=0 ;; -r) rc_reset ;; -s) echo $eopt msg_skipped ; rc_failed 5 ;; -u) echo $eopt msg_unused ; rc_failed 6 ;; *) echo "rc_status: Usage [-v] [-r] [-s] [-u]" ;; esac done return $ret } else rc_status () { rc_check ret=$rc_status local op for op ; do case "$op" in -v) case "$rc_status" in 0) echo $eopt $msg_done ;; *) echo $eopt $msg_failed ;; esac rc_status=0 ;; -r) rc_reset ;; -s) echo $eopt msg_skipped ; rc_failed 0 ;; -u) echo $eopt msg_unused ; rc_failed 0 ;; *) echo "rc_status: Usage [-v] [-r] [-s] [-u]" ;; esac done return $ret } fi