--- rxstack.orig 2004-07-12 14:17:51.000000000 -0400 +++ rxstack 2004-07-12 14:34:28.000000000 -0400 @@ -1,13 +1,388 @@ #!/bin/sh # -# chkconfig: +# chkconfig: # description: Regina Stack daemon. # processname: rxstack # pidfile: /var/run/rxstack.pid # config: /etc/sysconfig/rxstack -# source function library -. /etc/rc.d/init.d/functions +# Make sure umask is sane +umask 022 + +# Set up a default search path. +PATH="/usr/sbin:/sbin:/usr/bin:/bin:/usr/X11R6/bin" +export PATH + +# Get a sane screen width +[ -z "${COLUMNS:-}" ] && COLUMNS=80 + +# Read in our configuration +if [ -z "${BOOTUP:-}" ]; then + 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 [ "${BOOTUP:-}" != "verbose" ]; then + INITLOG_ARGS="-q" +else + INITLOG_ARGS= +fi + +# Check if $pid (could be plural) are running +checkpid() { + local i + + for i in $* ; do + [ -d "/proc/$i" ] || return 1 + done + return 0 +} + + +# A function to start a program. +daemon() { + # Test syntax. + local gotbase= force= + local base= user= nice= bg= pid= + nicelevel=0 + while [ "$1" != "${1##[-+]}" ]; do + case $1 in + '') echo $"$0: Usage: daemon [+/-nicelevel] {program}" + return 1;; + --check) + base=$2 + gotbase="yes" + shift 2 + ;; + --check=?*) + base=${1#--check=} + gotbase="yes" + shift + ;; + --user) + user=$2 + shift 2 + ;; + --user=?*) + user=${1#--user=} + shift + ;; + --force) + force="force" + shift + ;; + [-+][0-9]*) + nice="nice -n $1" + shift + ;; + *) echo $"$0: Usage: daemon [+/-nicelevel] {program}" + return 1;; + esac + done + + # Save basename. + [ -z "$gotbase" ] && base=${1##*/} + + # See if it's already running. Look *only* at the pid file. + if [ -f /var/run/${base}.pid ]; then + local line p + read line < /var/run/${base}.pid + for p in $line ; do + [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p" + done + fi + + [ -n "${pid:-}" -a -z "${force:-}" ] && 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 + + # if they set NICELEVEL, honor it + [ -n "$NICELEVEL" ] && nice="nice -n $NICELEVEL" + + # Echo daemon + [ "${BOOTUP:-}" = "verbose" -a -z "$LSB" ] && echo -n " $base" + + # And start it up. + if [ -z "$user" ]; then + "$*" + else + "su -s /bin/bash - $user -c \"$*\"" + fi + [ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup" +} + +# A function to stop a program. +killproc() { + RC=0 + # Test syntax. + if [ "$#" -eq 0 ]; then + echo $"Usage: killproc {program} [signal]" + return 1 + fi + + notset=0 + # check for second arg to be kill level + if [ -n "$2" ]; then + killlevel=$2 + else + notset=1 + killlevel="-9" + fi + + # Save basename. + base=${1##*/} + + # Find pid. + pid= + if [ -f /var/run/${base}.pid ]; then + local line p + read line < /var/run/${base}.pid + for p in $line ; do + [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p" + done + fi + if [ -z "$pid" ]; then + pid=`pidof -o $$ -o $PPID -o %PPID -x $1 || \ + pidof -o $$ -o $PPID -o %PPID -x $base` + fi + + # Kill it. + if [ -n "${pid:-}" ] ; then + [ "$BOOTUP" = "verbose" -a -z "$LSB" ] && echo -n "$base " + if [ "$notset" -eq "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 $"$base shutdown" || success $"$base shutdown" + RC=$((! $RC)) + # use specified level only + else + if checkpid $pid; then + kill $killlevel $pid + RC=$? + [ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel" + fi + fi + else + failure $"$base shutdown" + RC=1 + 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##*/} + + # Test syntax. + if [ "$#" = 0 ] ; then + echo $"Usage: pidfileofproc {program}" + 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 +} + +# A function to find the pid of a program. +pidofproc() { + base=${1##*/} + + # Test syntax. + if [ "$#" = 0 ]; then + echo $"Usage: pidofproc {program}" + 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 + pidof -o $$ -o $PPID -o %PPID -x $1 || \ + pidof -o $$ -o $PPID -o %PPID -x $base +} + +status() { + local base=${1##*/} + local pid + + # Test syntax. + if [ "$#" = 0 ] ; then + echo $"Usage: status {program}" + return 1 + fi + + # First try "pidof" + pid=`pidof -o $$ -o $PPID -o %PPID -x $1 || \ + pidof -o $$ -o $PPID -o %PPID -x ${base}` + if [ -n "$pid" ]; then + echo $"${base} (pid $pid) is running..." + return 0 + fi + + # Next try "/var/run/*.pid" files + if [ -f /var/run/${base}.pid ] ; then + read pid < /var/run/${base}.pid + if [ -n "$pid" ]; then + echo $"${base} dead but pid file exists" + return 1 + fi + fi + # See if /var/lock/subsys/${base} exists + if [ -f /var/lock/subsys/${base} ]; then + echo $"${base} dead but subsys locked" + return 2 + fi + echo $"${base} is stopped" + return 3 +} + +echo_success() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[ " + [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS + echo -n $"OK" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo -n " ]" + echo -ne "\r" + return 0 +} + +echo_failure() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[" + [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE + echo -n $"FAILED" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo -n "]" + echo -ne "\r" + return 1 +} + +echo_passed() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[" + [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING + echo -n $"PASSED" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo -n "]" + echo -ne "\r" + return 1 +} + +echo_warning() { + [ "$BOOTUP" = "color" ] && $MOVE_TO_COL + echo -n "[" + [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING + echo -n $"WARNING" + [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL + echo -n "]" + echo -ne "\r" + return 1 +} + +# Log that something succeeded +success() { + [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_success + return 0 +} + +# Log that something failed +failure() { + rc=$? + [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_failure + [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes + return $rc +} + +# Log that something passed, but may have had errors. Useful for fsck +passed() { + rc=$? + [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_passed + return $rc +} + +# Log a warning +warning() { + rc=$? + [ "$BOOTUP" != "verbose" -a -z "$LSB" ] && echo_warning + return $rc +} + +# Run some action. Log its output. +action() { + STRING=$1 + echo -n "$STRING " + shift + rc=$? + echo + return $rc +} + +# returns OK if $1 contains $2 +strstr() { + [ "${1#*$2*}" = "$1" ] && return 1 + return 0 +} + +# Confirm whether we really want to run this service +confirm() { + [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=yes + while : ; do + echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] " + read answer + if strstr $"yY" "$answer" || [ "$answer" = "" ] ; then + return 0 + elif strstr $"cC" "$answer" ; then + rm -f /var/run/confirm + [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --details=no + return 2 + elif strstr $"nN" "$answer" ; then + return 1 + fi + done +} RETVAL=0