#!/bin/bash

# Copyright 2002 hp Information Technologies Group, L.P.
#
# See "man chkconfig" for information on next two lines (Red Hat only)
# chkconfig: 2345 91 1
# description: HP Lights-Out Drivers and Agents for Linux
#
#
# Following lines are in conformance with LSB 1.2 spec
### 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/init.d/functions

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
        if [ -f /var/lock/subsys/$1 ]; then
		riisdpid=`pidof cpqriisd`
		if [ ! -z "$riisdpid" ]; then
                	echo "Already started $1" 
                	return
		else
        		rm -f /var/lock/subsys/$1
		fi
        fi
	CIUP=`lsmod | fgrep cpqci`
	if [ ${#CIUP} -eq 0 ]; then
		action $"$1 requires cpqci" /bin/false
		return
	else
        	echo -n $"Starting $1: "
        	daemon /sbin/$1 $2
        	RETVAL=$?
		sleep 6
        	echo
        	[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$1
	fi
        return $RETVAL
}

stop_daemon() {
	riisdpid=`pidof cpqriisd`
	if [ -z "$riisdpid" ]; then
               	echo "Already stopped $1" 
               	return
	else
        	[ -f /sbin/$1 ] || return
        	echo -n $"Stopping $1: "
        	killproc /sbin/$1 2> /dev/null
        	RETVAL=$?
		sleep 6
        	echo
        	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
        	[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$1
        	return $RETVAL
	fi
}

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
		
}

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

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
        	action $"Inserting Driver $1" sh /opt/compaq/hprsm/hprsm start verbose
	fi
}

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

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
		rsmecho "Re-starting $NAME ($PNAME): $AGENTS"
		for AGENT in $AGENTS; do
			if [ "$AGENT" = "cpqrid" ]; then
				stop_svr_agent cmasm2d
				stop_driver cpqrid
				start_driver cpqrid
			fi
			if [ "$AGENT" = "cpqci" ]; then
				stop_svr_agent cmarackd
				stop_svr_agent cmasm2d
				stop_daemon cpqriisd -F
				stop_driver cpqci
				start_driver cpqci
			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
			status cpqriisd
			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
				status cpqriisd
			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
