# /etc/rc.status
# Definition of boot script return messages
#
#   The bootscripts should use the variables rc_done and rc_failed to
#   report whether they failed or succeeded.  See /etc/init.d/skeleton for
#   an example how the shell functions rc_status and rc_reset are used.
#
#   These functions make use of the variables rc_done and rc_failed;
#   rc_done_up and rc_failed_up are the same as rc_done and rc_failed
#   but contain a terminal code to move up one line before the output
#   of the actual string. (This is particularly useful when the script
#    starts a daemon which produces user output with a newline character)
#
#   The variable rc_reset is used by the master resource control script
#   /etc/init.d/rc to turn off all attributes and switch to the standard
#   character set.
#
#    \033          ascii ESCape
#    \033[<NUM>G   move to column <NUM> (linux console, xterm, not vt100)
#    \033[<NUM>C   move <NUM> columns forward but only upto last column
#    \033[<NUM>D   move <NUM> columns backward but only upto first column
#    \033[<NUM>A   move <NUM> rows up
#    \033[<NUM>B   move <NUM> rows down
#    \033[1m       switch on bold
#    \033[31m      switch on red
#    \033[32m      switch on green
#    \033[33m      switch on yellow
#    \033[m        switch off color/bold
#    \017          exit alternate mode (xterm, vt100, linux console)
#    \033[10m      exit alternate mode (linux console)
#    \015          carriage return (without newline)
#

# Do _not_ be fooled by non POSIX locale
LC_ALL=POSIX
export LC_ALL

# Seek for terminal size and, if needed, set default size
if test -z "$LINES" -o -z "$COLUMNS" ; then
    eval `exec 3<&1; stty size <&3 2>/dev/null | (read L C; \
	  echo LINES=${L:-24} COLUMNS=${C:-80})`
fi
test $LINES   -eq 0 && LINES=24
test $COLUMNS -eq 0 && COLUMNS=80
export LINES COLUMNS

# Make sure we have /sbin and /usr/sbin in PATH
case ":$PATH:" in 
    *:/sbin:*)
	;;
    *)
	PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH
	export PATH
	;;
esac

if test -t 1 -a "$TERM" != "raw" -a "$TERM" != "dumb" && stty size <&1 > /dev/null 2>&1 ; then
	 esc=`echo -en "\033"`
        extd="${esc}[1m"
        warn="${esc}[1;31m"
        done="${esc}[1;32m"
        attn="${esc}[1;33m"
        norm=`echo -en "${esc}[m\017"`
        stat=`echo -en "\015${esc}[${COLUMNS}C${esc}[10D"`

     rc_done="${stat}${done}done${norm}"
  rc_running="${stat}${done}running${norm}"
   rc_failed="${stat}${warn}failed${norm}"
   rc_missed="${stat}${warn}missing${norm}"
  rc_skipped="${stat}${attn}skipped${norm}"
     rc_dead="${stat}${warn}dead${norm}"
   rc_unused="${stat}${extd}unused${norm}"
  rc_unknown="${stat}${attn}unknown${norm}"
  rc_done_up="${esc}[1A${rc_done}"
rc_failed_up="${esc}[1A${rc_failed}"
    rc_reset="${norm}${esc}[?25h"
     rc_save="${esc}7${esc}[?25l"
  rc_restore="${esc}8${esc}[?25h"
    function rc_cuu () { test $1 -eq 0 && return; echo -en "\033[${1}A"; }
    function rc_cud () { test $1 -eq 0 && return; echo -en "\033[${1}B"; }
    function rc_timer_on () {
	# Draw seconds of running timout to column.
	# Two arguments: timeout in seconds and offset
	local n=$1
	local c=$2
	(trap "exit 0" TERM
	 while test $((n--)) -gt 0; do
	    sleep 1;
	    if test $n -gt 9 ; then
		echo -en "\015${esc}[${c}C(${n}s) "
	    else
		echo -en "\015${esc}[${c}C( ${n}s) "
	    fi
	done) & _rc_timer_pid=$!
    }
    function rc_timer_off () {
	if test -n "$_rc_timer_pid" ; then
	    kill -TERM $_rc_timer_pid > /dev/null 2>&1
	fi
	unset _rc_timer_pid
    }
else
	 esc=""
        extd=""
        warn=""
        done=""
        attn=""
        norm=""
        stat=""

     rc_done="..done"
  rc_running="..running"
   rc_failed="..failed"
   rc_missed="..missing"
  rc_skipped="..skipped"
     rc_dead="..dead"
   rc_unused="..unused"
  rc_unknown="..unknown"
  rc_done_up="${rc_done}"
rc_failed_up="${rc_failed}"
    rc_reset=""
     rc_save=""
  rc_restore=""
    function rc_cuu () { return; }
    function rc_cud () { return; }
    function rc_timer_on  () { return; }
    function rc_timer_off () { return; }
fi

_rc_service=${0##*/[SK][0-9][0-9]}
_rc_status=0
_rc_status_all=0
_rc_todo=$1
function rc_check ()
{
    _rc_status_ret=$?
    test $_rc_status_ret -eq 0 || _rc_status=$_rc_status_ret
    test $_rc_status     -eq 0 || _rc_status_all=$_rc_status
    return $_rc_check_ret
}
function rc_reset ()
{
    _rc_status=0
    _rc_status_all=0
    rc_check
    return 0
}

if   test "$_rc_todo" = "status" ; then
function rc_status ()
{
    rc_check
    _rc_status_ret=$_rc_status
    local i
    for i ; do
	case "$i" in
	-v|-v[1-9]|-v[1-9][0-9])
	    local vrt=""
	    local out=1
	    local opt="en"

	    test -n "${i#-v}" && vrt="$vrt${esc}[${i#-v}A" || opt="e"
	    case "$_rc_status" in
	    0)	vrt="$vrt$rc_running";		;; # service running
	    1)	vrt="$vrt$rc_dead"   ; out=2	;; # service dead (but has pid file)
	    2)	vrt="$vrt$rc_dead"   ; out=2	;; # service dead (but has lock file)
	    3)	vrt="$vrt$rc_unused" ;		;; # service not running
	    4)	vrt="$vrt$rc_unknown";		;; # status is unknown
	    esac
	    echo -$opt "$rc_save$vrt$rc_restore" 1>&$out

	    # reset _rc_status to 0 after verbose case
	    _rc_status=0 ;;
	-r) rc_reset ;;
	-s) echo -e "$rc_skipped" ; rc_failed 3 ;;
	-u) echo -e "$rc_unused"  ; rc_failed 3 ;;
	*)  echo "rc_status: Usage: [-v[<num>] [-r]|-s|-u]" 1>&2 ; return 0 ;;
	esac
    done
    return $_rc_status_ret
}
elif test -n "$_rc_todo" ; then
function rc_status ()
{
    rc_check
    test "$_rc_status" -gt 7 && rc_failed 1
    _rc_status_ret=$_rc_status
    case "$_rc_todo" in
    stop)
	# program is not running which
	# is success if we stop service
	test "$_rc_status" -eq 7 && rc_failed 0 ;;
    esac
    local i
    for i ; do
	case "$i" in
	-v|-v[1-9]|-v[1-9][0-9])
	    local vrt=""
	    local out=1
	    local opt="en"

	    test -n "${i#-v}" && vrt="$vrt${esc}[${i#-v}A" || opt="e"
	    case "$_rc_status" in
	    0)	vrt="$vrt$rc_done"   ;		;; # success
	    1)	vrt="$vrt$rc_failed" ; out=2	;; # generic or unspecified error
	    2)	vrt="$vrt$rc_failed" ; out=2	;; # invalid or excess args
	    3)	vrt="$vrt$rc_missed" ; out=2	;; # unimplemented feature
	    4)	vrt="$vrt$rc_failed" ; out=2	;; # insufficient privilege
	    5)	vrt="$vrt$rc_skipped"; out=2	;; # program is not installed
	    6)	vrt="$vrt$rc_unused" ; out=2	;; # program is not configured
	    7)	vrt="$vrt$rc_failed" ; out=2	;; # program is not running
	    *)	vrt="$vrt$rc_failed" ; out=2	;; # unknown (maybe used in future)
	    esac
	    echo -$opt "$rc_save$vrt$rc_restore" 1>&$out

	    # reset _rc_status to 0 after verbose case
	    _rc_status=0 ;;
	-r) rc_reset ;;
	-s) echo -e "$rc_skipped" 1>&2 ; rc_failed 5 ;;
	-u) echo -e "$rc_unused"  1>&2 ; rc_failed 6 ;;
	*)  echo "rc_status: Usage: [-v[<num>] [-r]|-s|-u]" 1>&2 ; return 0 ;;
	esac
    done
    return $_rc_status_ret
}
else
function rc_status ()
{
    rc_check
    _rc_status_ret=$_rc_status
    local i
    for i ; do
	case "$i" in
	-v|-v[1-9]|-v[1-9][0-9])
	    local vrt=""
	    local out=1
	    local opt="en"

	    test -n "${i#-v}" && vrt="$vrt${esc}[${i#-v}A" || opt="e"
	    case "$_rc_status" in
	    0)	vrt="$vrt$rc_done"  ;		;; # success
	    *)	vrt="$vrt$rc_failed"; out=2	;; # failed
	    esac
	    echo -$opt "$rc_save$vrt$rc_restore" 1>&$out

	    # reset _rc_status to 0 after verbose case
	    _rc_status=0 ;;
	-r) rc_reset ;;
	-s) echo -e "$rc_skipped"  ; return 0 ;;
	-u) echo -e "$rc_unused"   ; return 0 ;;
	*)  echo "rc_status: Usage: [-v[<num>] [-r]|-s|-u]" 1>&2 ; return 0 ;;
	esac
    done
    return $_rc_status_ret
}
fi

function rc_failed ()
{
    rc_reset
    case "$1" in
    [0-7]) _rc_status=$1 ;;
    "")    _rc_status=1
    esac
    rc_check
    return $_rc_status
}

function rc_exit ()
{
    exit $_rc_status_all
}

function rc_confirm()
{
    local timeout="30"
    local answer=""
    local ret=0

    case "$1" in
    -t) timeout=$2; shift 2 ;;
    esac
    local message="$@, (Y)es/(N)o/(C)ontinue? [y] "
    : ${REDIRECT:=/dev/tty}

    while true ; do
	read -t ${timeout} -n 1 -p "${message}" answer < $REDIRECT > $REDIRECT 2>&1
	case "$answer" in
	[yY]|"") ret=0; break ;;
	[nN])	 ret=1; break ;;
	[cC])	 ret=2; break ;;
	*)	 echo; continue
	esac
    done
    echo
    return $ret
}

function rc_active ()
{
    local x
    for x in /etc/init.d/*.d/S[0-9][0-9]${1} ; do
	test -e $x || break
	return 0
    done
    return 1
}

function rc_splash()
{
    return 0
}

