#!/bin/bash

# Copyright 2002 hp Information Technologies Group, L.P.

# See "man insserv" for information on next eight lines
### BEGIN INIT INFO
# Provides:            hprsm
# Required-Start:
# Required-Stop:
# Default-Start:       2 3 4 5
# Default-Stop:        0 1 6
# Description:         starts hprsm (HP Lights-Out Drivers and Agents)
### END INIT INFO

# Source function library
. /etc/rc.status
. /etc/rc.config

LOGFILE=/var/spool/compaq/cma.log
NAME="HP Lights-Out Drivers and Agents"
ETCROOT="/opt/compaq/server/etc"
PNAME="hprsm"
SNMPD="snmpd"
PNAMES="cpqci cpqrid cpqriisd cmasm2d cmarackd"
USAGE="Usage: $PNAME {start|stop|restart|status} [cpqci|cpqrid|cpqriisd|cmasm2d|cmarackd]..."

rsmecho () {
	echo $*
	echo $* >>$LOGFILE 2>&1
}

rsmusage () {
	rsmecho $USAGE
}

if [ "$#" -lt 1 ]; then
	rsmusage
	exit 1
fi

OPCODE=$1
shift
AGENTS=$*

for i in $AGENTS; do
	FOUND=0
	for j in $PNAMES; do
		if [ $i = $j ]; then
			FOUND=1
			break;
		fi
	done
	if [ $FOUND = "0" ]; then
		rsmusage
		exit 1
	fi
done

start_daemon() {
        [ -f /sbin/$1 ] || return
        echo -n $"Starting $1: "
        checkproc /sbin/$1
        if [ $? -eq 0 ]; then
                echo -n " - already running ! "
        fi
        CIUP=`lsmod | fgrep cpqci`
        if [ ${#CIUP} -eq 0 ]; then
                echo -n " - requires cpqci"
        else
        	startproc -u root -g root /sbin/$1 $2
	fi
        rc_status
        rc_status -v
	sleep 6
}

stop_daemon() {
        [ -f /sbin/$1 ] || return
        echo -n $"Stopping $1: "
        checkproc /sbin/$1 || echo -n "- not running !"
        killproc -TERM /sbin/$1
        rc_status -v
	sleep 6
        case "$1" in
        cpqriisd)
                SHMID=`ipcs -m | grep 0x0000bbbd | cut -d ' ' -f 2`
                if [ "$SHMID" != "" ]; then
                        ipcrm shm $SHMID 2> /dev/null > /dev/null
                fi
                ;;
        esac
}

start_svr_agent() {
	svrpid=`pidof $1`
        if [ -z "$svrpid" ]; then
		snmppid=`pidof $SNMPD`
        	svrpeerpid=`pidof cmasvrpeerd`
		if [ -z "$snmppid" ]; then
			rsmecho
			rsmecho "Can not start $1! ($SNMPD is not running)"
			RETVAL=1
		else
                	if [ -z "$svrpeerpid" ]; then
                        	rsmecho
                        	rsmecho "WARNING: cmasvrpeerd is not running;"
                        	rsmecho "without cmasvrpeerd you will be"
                        	rsmecho "unable to access $1 MIB data."
                	fi
			[ -x $ETCROOT/$1 ] && $ETCROOT/$1 start
		fi
	else
		echo "Already started $1"
	fi
        rc_status
        rc_status -v
}

stop_svr_agent() {
	svrpid=`pidof $1`
        if [ -z "$svrpid" ]; then
		echo "Already stopped $1"
	else
		[ -x $ETCROOT/$1 ] && $ETCROOT/$1 stop
	fi
        rc_status
        rc_status -v

}

restart_svr_agent() {
	[ -x $ETCROOT/$1 ] && $ETCROOT/$1 restart
}

status_svr_agent() {
	[ -x $ETCROOT/$1 ] && $ETCROOT/$1 status
}

start_driver() {
        RUNNING=`lsmod | fgrep $1`
        if [ ${#RUNNING} -ne 0 ]; then
                echo "Already started $1"
        else
        	echo -n $"Inserting Driver $1" 
		sh /opt/compaq/hprsm/hprsm start verbose
        fi
        rc_status
        rc_status -v
}

stop_driver() {
        RUNNING=`lsmod | fgrep $1`
        if [ ${#RUNNING} -ne 0 ]; then
		echo -n $"Removing Driver $1" 
		sh /opt/compaq/hprsm/hprsm stop verbose
        else
                echo "Already stopped $1"
        fi
        rc_status
        rc_status -v
}

status_driver() {
        RUNNING=`lsmod | fgrep $1`
        if [ ${#RUNNING} -ne 0 ]; then
                echo "$1 is running..."
        else
                echo "$1 is not loaded"
        fi
}

[ -d /var/lock/subsys ] && VARLOCKSUBSYS=1 || VARLOCKSUBSYS=0

RETVAL=0
PATH=/opt/compaq/server/bin:$PATH

case "$OPCODE" in
  start)
	if [ -z "$AGENTS" ]; then #start everything
		rsmecho "Starting $NAME ($PNAME)"
		if [ -f /opt/compaq/cpqrid/enabled ]; then
			start_driver cpqrid
			start_svr_agent cmasm2d
		else
			start_driver cpqci
			start_daemon cpqriisd -F
			start_svr_agent cmasm2d
			start_svr_agent cmarackd
		fi
	else
		for AGENT in $AGENTS; do
			if [ "$AGENT" = "cpqrid" ]; then
				start_driver cpqrid
			fi
			if [ "$AGENT" = "cpqci" ]; then
				start_driver cpqci
			fi
			if [ "$AGENT" = "cpqriisd" ]; then
        			DRIVERUP=`lsmod | fgrep cpqci`
        			if [ ${#DRIVERUP} -eq 0 ]; then
					start_driver cpqci
				fi
				start_daemon cpqriisd -F
			fi
			if [ "$AGENT" = "cmasm2d" ]; then
                                if [ -f /opt/compaq/cpqrid/enabled ]; then
        				DRIVERUP=`lsmod | fgrep cpqrid`
        				if [ ${#DRIVERUP} -eq 0 ]; then
						start_driver cpqrid
					fi
                                else
        				DRIVERUP=`lsmod | fgrep cpqci`
        				if [ ${#DRIVERUP} -eq 0 ]; then
						start_driver cpqci
					fi
                                fi
		    		start_svr_agent cmasm2d
			fi
			if [ "$AGENT" = "cmarackd" ]; then
        			DRIVERUP=`lsmod | fgrep cpqci`
        			if [ ${#DRIVERUP} -eq 0 ]; then
					start_driver cpqci
				fi
		    		start_svr_agent cmarackd
			fi
		done
	fi
	[ "$VARLOCKSUBSYS" = "1" ] && touch /var/lock/subsys/$PNAME
	rsmecho
	;;
  stop)
	if [ -z "$AGENTS" ]; then #stop all 
		rsmecho "Shutting down $NAME ($PNAME)"
		if [ -f /opt/compaq/cpqrid/enabled ]; then
			stop_svr_agent cmasm2d
			stop_driver cpqrid
		else
			stop_svr_agent cmarackd
			stop_svr_agent cmasm2d
			stop_daemon cpqriisd -F
			stop_driver cpqci
		fi
	else
		for AGENT in $AGENTS; do
			if [ "$AGENT" = "cpqrid" ]; then
				stop_svr_agent cmasm2d
				stop_driver cpqrid
			fi
			if [ "$AGENT" = "cpqci" ]; then
				stop_svr_agent cmarackd
				stop_svr_agent cmasm2d
				stop_daemon cpqriisd -F
				stop_driver cpqci
			fi
			if [ "$AGENT" = "cpqriisd" ]; then
				stop_daemon cpqriisd -F
			fi
			if [ "$AGENT" = "cmasm2d" ]; then
		    		stop_svr_agent cmasm2d
			fi
			if [ "$AGENT" = "cmarackd" ]; then
		    		stop_svr_agent cmarackd
			fi
		done
	fi
	if  [ "$VARLOCKSUBSYS" = "1" ]; then
		REMOVELOCK=1
		for AGENT in $PNAMES; do
			pidlist=`pidof -o $$ $AGENT`
			if [ ! -z "$pidlist" ]; then
				REMOVELOCK=0
				break;
			fi
		done
		[ $REMOVELOCK = "1" ] && rm -f /var/lock/subsys/$PNAME
	fi
	rsmecho
	;;
  restart)
	if [ -z "$AGENTS" ]; then #restart all agents
		rsmecho "Re-starting $NAME ($PNAME): All agents"
		if [ -f /opt/compaq/cpqrid/enabled ]; then
			stop_svr_agent cmasm2d
			stop_driver cpqrid
			start_driver cpqrid
			start_svr_agent cmasm2d
		else
			stop_svr_agent cmarackd
			stop_svr_agent cmasm2d
			stop_daemon cpqriisd -F
			stop_driver cpqci
			start_driver cpqci
			start_daemon cpqriisd -F
			start_svr_agent cmasm2d
			start_svr_agent cmarackd
		fi
	else
		for AGENT in $AGENTS; do
			if [ "$AGENT" = "cpqrid" ]; then
				stop_svr_agent cmasm2d
				stop_driver cpqrid
				start_driver cpqrid
				start_svr_agent cmasm2d
			fi
			if [ "$AGENT" = "cpqci" ]; then
				stop_svr_agent cmarackd
				stop_svr_agent cmasm2d
				stop_daemon cpqriisd -F
				stop_driver cpqci
				start_driver cpqci
				start_daemon cpqriisd -F
				start_svr_agent cmasm2d
				start_svr_agent cmarackd
			fi
			if [ "$AGENT" = "cpqriisd" ]; then
				stop_daemon cpqriisd -F
				start_daemon cpqriisd -F
			fi
			if [ "$AGENT" = "cmasm2d" ]; then
		    		restart_svr_agent cmasm2d
			fi
			if [ "$AGENT" = "cmarackd" ]; then
		    		restart_svr_agent cmarackd
			fi
		done
	fi
	rsmecho
	;;
  status)
	if [ -z "$AGENTS" ]; then #status all agents
                if [ -f /opt/compaq/cpqrid/enabled ]; then
                        status_driver cpqrid
                        status_svr_agent cmasm2d
                else
                        status_driver cpqci
			echo -n "Checking for cpqriisd: "
			/sbin/checkproc /sbin/cpqriisd && echo "OK" || echo "No process"
                        status_svr_agent cmasm2d
                        status_svr_agent cmarackd
                fi
	else
		for AGENT in $AGENTS; do
                        if [ "$AGENT" = "cpqrid" ]; then
                                status_driver cpqrid
                        fi
                        if [ "$AGENT" = "cpqci" ]; then
                                status_driver cpqci
                        fi
                        if [ "$AGENT" = "cpqriisd" ]; then
				echo -n "Checking for cpqriisd: "
				/sbin/checkproc /sbin/cpqriisd && echo "OK" || echo "No process"
                        fi
                        if [ "$AGENT" = "cmasm2d" ]; then
                                status_svr_agent cmasm2d
                        fi
                        if [ "$AGENT" = "cmarackd" ]; then
                                status_svr_agent cmarackd
                        fi
		done
	fi
	RETVAL=$?
	;;
  *)
	rsmusage
	exit 1
esac

exit $RETVAL
