#!/bin/sh
#
# functions	This file contains functions to be used by most or all
#		shell scripts in the /etc/init.d directory.
#
# Version:	@(#) /etc/init.d/functions 1.01 26-Oct-1993
#
# Author:	Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Hacked by:    Greg Galloway and Marc Ewing
#
#
# i18n originally by: 	Arnaldo Carvalho de Melo <acme@conectiva.com.br>,
#			Wanderlei Antonio Cavassin
TEXTDOMAIN=initscripts
TEXTDOMAINDIR=/etc/locale
export TEXTDOMAINDIR

# First set up a default search path.
export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"

# Get a sane screen width
[ -z "$COLUMNS" ] && COLUMNS=80

# Read in our configuration
if [ -z "$BOOTUP" ]; then
  if [ -f /etc/sysconfig/init ]; then
      . /etc/sysconfig/init
  else
    # This all seem confusing? Look in /etc/sysconfig/init,
    # or in /usr/doc/initscripts-*/sysconfig.txt
    BOOTUP=color
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \\033[0;39m"
    LOGLEVEL=1
  fi
  if [ -x /sbin/consoletype ]; then
    if [ "`consoletype`" = "serial" ]; then
      BOOTUP=serial
      MOVE_TO_COL=
      SETCOLOR_SUCCESS=
      SETCOLOR_FAILURE=
      SETCOLOR_WARNING=
      SETCOLOR_NORMAL=
    fi
  fi
fi

if [ "$BOOTUP" != "verbose" ]; then
   INITLOG_ARGS="-q"
else
   INITLOG_ARGS=
fi

if [ -z "$GP_LANG" -a -f /etc/sysconfig/i18n ]; then
   GP_LANG=$(sed -n 's/^LANG=//p' < /etc/sysconfig/i18n)
fi

gprintf() {
        if [ -x /usr/bin/gettext -a -n "$1" ]; then 
	   local TEXT=`LANGUAGE=$GP_LANG gettext -e --domain=$TEXTDOMAIN "$1"`
	else
	   local TEXT=$1
	fi
	[ "${1#*\\n}" ] || TEXT="$TEXT\n"

	# For aurora we need to print the untranslated string surrounded by hide/end
	# before printing the translated string (Fred Wed Jan 24 18:11:22 2001).
	if [ -n "$aurora" ] && /etc/aurora/Monitor query; then
	    if [ "${1#*\\n}" ]; then
		local ENTEXT="$1\n"
	    else
		local ENTEXT=$1
	    fi
	fi
	shift
	if [ -n "$aurora" ] && /etc/aurora/Monitor query; then
	    echo "hide"
	    printf "$ENTEXT" "$@"
	    echo
	    echo "end"
	fi
	printf "$TEXT" "$@"
}	

# Frontend to gprintf (support up to 4 %s in format string)
# returns the message transleted in GPRINTF_MSG and
# the resting parms in GPRINTF_REST
# This simplifies a lot the call of functions like action,
# now with i18n support
gprintf_msg_rest() {
case "$1" in
       *%s*%s*%s*%s*)
               GPRINTF_MSG=$(gprintf "$1" "$2" "$3" "$4" "$5")
               shift 5;;
       *%s*%s*%s*)
               GPRINTF_MSG=$(gprintf "$1" "$2" "$3" "$4")
               shift 4;;
       *%s*%s*)
               GPRINTF_MSG=$(gprintf "$1" "$2" "$3")
               shift 3;;
       *%s*)
               GPRINTF_MSG=$(gprintf "$1" "$2")
               shift 2;;
       *)
               GPRINTF_MSG=$(gprintf "$1")
               shift;;
esac
GPRINTF_REST="$@"
}



# Check if $pid (could be plural) are running
checkpid() {
	while [ "$1" ]; do
	   [ -d /proc/$1 ] && return 0
	   shift
	done
	return 1
}
	

# A function to start a program.
daemon() {
	# Test syntax.
	local gotbase=
	local base= user= nice= bg= pid
	nicelevel=0
	while [ "$1" != "${1##[-+]}" ]; do
	  case $1 in
	    '')    gprintf "%s: Usage: daemon [+/-nicelevel] {program}\n" $0
	           return 1;;
	    --check)
		   base=$2
		   gotbase="yes"
		   shift 2
		   ;;
	    --check=?*)
	    	   base=${1#--user=}
		   shift
		   ;;
	    --user)
		   user=$2
		   shift 2
		   ;;
	    --user=?*)
	           user=${1#--user=}
		   shift
		   ;;
	    --bg|--background)
	           bg=''&''
		   shift
		   ;;
	    [-+][0-9]*)
	    	   nice="nice -n $1"
	           shift
		   ;;
	    *)     gprintf "%s: Usage: daemon [+/-nicelevel] {program}\n" $0
	           return 1;;
	  esac
	done

        # Save basename.
        [ -z $gotbase ] && base=${1##*/}

        # See if it's already running. Look *only* at the pid file.
        pidlist=`pidfileofproc $base`
	
	[ -n "$pid" ] && return

	# make sure it doesn't core dump anywhere; while this could mask
	# problems with the daemon, it also closes some security problems
	ulimit -S -c 0 >/dev/null 2>&1
	
	# And start it up.
	if [ -z "$user" ]; then
	   $nice initlog $INITLOG_ARGS -c "$*$bg"
	else
	   $nice initlog $INITLOG_ARGS -c "su $user -c \"$*$bg\"" && success "%s startup" $base || failure "%s startup" $base
	fi
	[ $? = 0 ] && success "%s startup" $base || failure "%s startup" $base
}

# A function to stop a program.
killproc() {
	RC=0
	# Test syntax.
	if [ $# = 0 ]; then
		gprintf "Usage: killproc {program} [signal]\n"
		return 1
	fi

	notset=0
	# check for second arg to be kill level
	if [ "$2" != "" ] ; then
		killlevel=$2
	else
		notset=1
		killlevel="-9"
	fi

        # Save basename.
        base=${1##*/}

        # Find pid.
	pid=`pidofproc $base`

        # Kill it.
        if [ -n "$pid" ] ; then
                [ $BOOTUP = "verbose" ] && echo -n "$base "
		if [ "$notset" = "1" ] ; then
		       if checkpid $pid 2>&1; then
			   # TERM first, then KILL if not dead
			   kill -TERM $pid
			   usleep 100000
			   if checkpid $pid && sleep 1 &&
			      checkpid $pid && sleep 3 &&
			      checkpid $pid ; then
                                kill -KILL $pid
				usleep 100000
			   fi
		        fi
			checkpid $pid
			RC=$?
			[ $RC -eq 0 ] && failure "%s shutdown" $base || success "%s shutdown" $base
			RC=$((! $RC))
		# use specified level only
		else
		        if checkpid $pid >/dev/null 2>&1; then
	                	kill $killlevel $pid
				RC=$?
				[ $RC -eq 0 ] && success "%s %s" $base $killlevel || failure "%s %s" $base $killlevel
			fi
		fi
	else
	    failure "%s shutdown" $base
	fi

        # Remove pid file if any.
	if [ "$notset" = "1" ]; then
            rm -f /var/run/$base.pid
	fi
	return $RC
}

# A function to find the pid of a program. Looks *only* at the pidfile
pidfileofproc() {
	local base=${1##*/}
	local pid
	
	# Test syntax.
	if [ $# = 0 ] ; then
		gprintf "Usage: pidofproc {program}\n"
		return 1
	fi

	# First try "/var/run/*.pid" files
	if [ -f /var/run/${base}.pid ] ; then
	        read pid < /var/run/${base}.pid
		for p in $line ; do
		       [ -z "$p##[0-9]}" -a -d /proc/$p ] && pid="$pid $p"
		done
	        if [ -n "$pid" ] ; then
	                echo $pid
	                return 0
	        fi
	fi
}

# A function to find the pid of a program.
pidofproc() {
	base=${1##*/}

	# Test syntax.
	if [ $# = 0 ] ; then
		gprintf "Usage: pidofproc {program}\n"
		return 1
	fi

	# First try "/var/run/*.pid" files
	if [ -f /var/run/${base}.pid ] ; then
	        local line p pid=
		read line < /var/run/${base}.pid
		for p in $line ; do
		       [ -z "$p##[0-9]}" -a -d /proc/$p ] && pid="$pid $p"
		done
	        if [ -n "$pid" ] ; then
	                echo $pid
	                return 0
	        fi
	fi

	# Next try "pidof"
	pidof -o $$ -o $PPID -o %PPID -x ${base}
}

status() {
	local base=${1##*/}
	local pid

	# Test syntax.
	if [ $# = 0 ] ; then
		gprintf "Usage: status {program}\n"
		return 1
	fi

	# First try "pidof"
	pid=`pidof -o $$ -o $PPID -o %PPID -x ${base}`
	if [ "$pid" != "" ] ; then
	        gprintf "%s (pid %s) is running...\n" ${base} $pid
	        return 0
	fi

	# Next try "/var/run/*.pid" files
	if [ -f /var/run/${base}.pid ] ; then
	        read pid < /var/run/${base}.pid
	        if [ "$pid" != "" ] ; then
	                gprintf "%s dead but pid file exists\n" ${base}
	                return 1
	        fi
	fi
	# See if /var/lock/subsys/${base} exists
	if [ -f /var/lock/subsys/${base} ]; then
		gprintf "%s dead but subsys locked\n" ${base}
		return 2
	fi
	gprintf "%s is stopped\n" ${base}
	return 3
}

echo_success() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "[  "
  [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
  if [ -n "$aurora" ] && /etc/aurora/Monitor query; then
      echo -n "OK"
  else
      gprintf "OK"
  fi
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "  ]"
  echo -ne "\r"
  return 0
}

echo_failure() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  if [ -n "$aurora" ] && /etc/aurora/Monitor query; then
      echo -n "FAILED"
  else
      gprintf "FAILED"
  fi
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 1
}

echo_passed() {
  [ "$BOOTUP" = "color" ] && $MOVE_TO_COL
  echo -n "["
  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
  if [ -n "$aurora" ] && /etc/aurora/Monitor query; then
      echo -n "PASSED"
  else
      gprintf "PASSED"
  fi
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo -n "]"
  echo -ne "\r"
  return 1
}

# Log that something succeeded
success() {
  gprintf_msg_rest "$@"
  if [ -z "$IN_INITLOG" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$GPRINTF_MSG" -e 1
  else
     # silly hack to avoid EPIPE killing rc.sysinit
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" ] && echo_success
  return 0
}

# Log that something failed
failure() {
  rc=$?
  gprintf_msg_rest "$@"
  if [ -z "$IN_INITLOG" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$GPRINTF_MSG" -e 2
  else
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$GPRINTF_MSG\" -e 2" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" ] && echo_failure
  return $rc
}

# Log that something passed, but may have had errors. Useful for fsck
passed() {
  rc=$?
  gprintf_msg_rest "$@"
  if [ -z "$IN_INITLOG" ]; then
     initlog $INITLOG_ARGS -n $0 -s "$GPRINTF_MSG" -e 1
  else
     trap "" SIGPIPE
     echo "$INITLOG_ARGS -n $0 -s \"$1\" -e 1" >&21
     trap - SIGPIPE
  fi
  [ "$BOOTUP" != "verbose" ] && echo_passed
  return $rc
}  

# Run some action. Log its output.
action() {
  gprintf_msg_rest "$@"
  echo -n "$GPRINTF_MSG "
  initlog $INITLOG_ARGS -c "$GPRINTF_REST" && success "$GPRINTF_MSG" || failure "$GPRINTF_MSG"
  rc=$?
  echo
  return $rc
}

# returns OK if $1 contains $2
strstr() {
  [ "$1" = "$2" ] && return 0
  slice=${1#*$2*}
  [ "$slice" = "$1" ] && return 1
  return 0
}


# Confirm whether we really want to run this service
confirm() {
  if [ -n "$aurora" ] && /etc/aurora/Monitor query ; then
   aurora_cmd
    aurora_set_dialog_title ync
     echo START SERVICE:
     echo Do you want to start the service $1?
    aurora_end
    aurora_show_dialog ync
   aurora_end
  else
  gprintf "Start service %s (Y)es/(N)o/(C)ontinue? [Y] \n" $1
  local YES=`gprintf "yY"`
  local NOT=`gprintf "nN"`
  local CNT=`gprintf "cC"`

  read answer
  fi

  if strstr "$YES" "$answer" || [ "$answer" = "" ] ; then
    return 0
  elif strstr "$CNT" "$answer" ; then
    return 2
  elif strstr "$NOT" "$answer" ; then
    return 1
  fi
  confirm $*
}
