#!/bin/sh
#############################################################################
#
# ipmi:		OpenIPMI Driver helper script
#
# Authors:	Jan Safranek <jsafrane@redhat.com>
#
# Based on IPMI init script by:
#               Matt Domsch <Matt_Domsch@dell.com>
#               Chris Poblete <Chris_Poblete@dell.com>
#
# Status return code bits
# no bits set = no errors
# bit 0 set = minimum modules aren't loaded
# bit 1 set = requested feature module isn't loaded
# bit 2 set = /dev/ipmi0 (or /dev/imb if using that instead) doesn't exist
# bit 3 set = /dev/watchdog doesn't exist
# bit 4 set = lockfile doesn't exist
# bit 5 set = modules are loaded even when asked to be unloaded

CONFIGFILE=/etc/sysconfig/ipmi
# source config info
[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}

#############################################################################
# GLOBALS
#############################################################################
MODULE_NAME="ipmi"
INTF_NUM=0

IPMI_SMB_MODULE_NAME="ipmi_smb"
IPMI_SI_MODULE_NAME="ipmi_si"
kernel=`uname -r | cut -d. -f1-2`
if [ "${kernel}" == "2.4" ]; then
    IPMI_SMB_MODULE_NAME="ipmi_smb_intf"
    IPMI_SI_MODULE_NAME="ipmi_si_drv"
fi

MODULES_INTERFACES=""
[ "${DEV_IPMI}" = "yes" ] && MODULES_INTERFACES="${MODULES_INTERFACES} ipmi_devintf"
[ "${IPMI_IMB}" = "yes" ] && MODULES_INTERFACES="${MODULES_INTERFACES} ipmi_imb"

MODULES_FEATURES=""
[ "${IPMI_WATCHDOG}" = "yes" ] && MODULES_FEATURES="${MODULES_FEATURES} ipmi_watchdog"
[ "${IPMI_POWEROFF}" = "yes" ] && MODULES_FEATURES="${MODULES_FEATURES} ipmi_poweroff"

MODULES_HW=""
[ "${IPMI_SI}"  = "yes" ] && MODULES_HW="${MODULES_HW} ${IPMI_SI_MODULE_NAME}"
[ "${IPMI_SMB}" = "yes" ] && MODULES_HW="${MODULES_HW} ${IPMI_SMB_MODULE_NAME}"

MODULES_BASE="ipmi_msghandler"
MODULES="${MODULES_INTERFACES} ${MODULES_FEATURES} ${MODULES_HW} ${MODULES_BASE}"

RETVAL=0
LOCKFILE=/var/lock/subsys/ipmi
DEV_IPMI_TIMEOUT=150

UDEV_EXISTS=0
if [ -e /sbin/udev -o -e /sbin/udevd ]; then
    UDEV_EXISTS=1
fi

#############################################################################
# NOTES:
# * /dev/ipmi0 is unconditionally deleted here on ipmi_devintf unload,
#   because SLES9 and RHEL4 kernels don't send a message for udev to delete
#   it for us.
# 
#############################################################################

modules_loaded_verbose()
{
	OnePlusLoaded=0
	OnePlusUnloaded=0
	for m in $@; do
		if /sbin/lsmod | grep $m >/dev/null 2>&1 ; then
			echo "$m module loaded."
			OnePlusLoaded=1
		else
			echo "$m module not loaded."
			OnePlusUnloaded=1
		fi
	done
}

modules_loaded()
{
	OnePlusLoaded=0
	OnePlusUnloaded=0
	for m in $@; do
		if /sbin/lsmod | grep $m >/dev/null 2>&1 ; then
			OnePlusLoaded=1
		else
			OnePlusUnloaded=1
		fi
	done
}

device_node_exists ()
{
	if [ -e "$1" ]; then
		echo "$1 exists."
		return 1
	fi
	echo "$1 does not exist."
	return 0
}

minimum_modules_loaded()
{
        rc_base=1
	rc_hw=1
        modules_loaded_verbose "${MODULES_BASE}"
	[ ${OnePlusLoaded} -eq 0 ] && rc_base=0
	    
	modules_loaded_verbose "${MODULES_HW}"
	[ ${OnePlusLoaded} -eq 0 ] && rc_hw=0
	
	return $((rc_base && rc_hw))
}

#############################################################################

load_si()
{
	if [ "${IPMI_SI}" = "yes" ]; then
		modprobe ${IPMI_SI_MODULE_NAME} > /dev/null 2>&1
		modules_loaded ${IPMI_SI_MODULE_NAME}
		[ ${OnePlusLoaded} -ne 1 ] && RETVAL=$((RETVAL | 1))
	fi
}

load_smb()
{
	if [ "${IPMI_SMB}" = "yes" ]; then
		modprobe ${IPMI_SMB_MODULE_NAME} > /dev/null 2>&1
		modules_loaded ${IPMI_SMB_MODULE_NAME}
		[ ${OnePlusLoaded} -ne 1 ] && RETVAL=$((RETVAL | 1))
	fi
}

load_hw_modules()
{
	load_si
	load_smb
}

start_watchdog_common()
{
	load_hw_modules
	modprobe ipmi_watchdog ${IPMI_WATCHDOG_OPTIONS} > /dev/null 2>&1
	modules_loaded ipmi_watchdog
	[ ${OnePlusUnloaded} -ne 0 ] &&
		RETVAL=$((RETVAL | 2)) &&
		echo "Watchdog startup failed: cannot load ipmi_watchdog module" &&
		return
	if [ ${UDEV_EXISTS} -eq 0 -a ! -e /dev/watchdog ]; then
		mknod -m 0600 /dev/watchdog c 10 130
		[ $? -ne 0 ] &&
			RETVAL=$((RETVAL | 8)) &&
			echo "Watchdog startup failed: cannot create /dev/watchdog" &&
			return
	fi
}

start_watchdog_quiet()
{
	[ "${IPMI_WATCHDOG}" != "yes" ] &&
		return
	start_watchdog_common
}

start_watchdog()
{
	[ "${IPMI_WATCHDOG}" != "yes" ] &&
		RETVAL=$((RETVAL | 2)) &&
		echo "Watchdog not configured" &&
		return
	start_watchdog_common
}

stop_watchdog()
{
	modprobe -q -r ipmi_watchdog > /dev/null 2>&1
	modules_loaded ipmi_watchdog
	if [ ${OnePlusLoaded} -ne 0 ]; then
	    RETVAL=$((RETVAL | 32))
	    echo "Watchog shutdown failed: cannot unload ipmi_watchdog module"
	else
	    if [ "${IPMI_WATCHDOG}" = "yes" ]; then
		[ ${UDEV_EXISTS} -eq 0 ] && rm -f /dev/watchdog
	    fi
	fi
}

stop_watchdog_quiet()
{
	modprobe -q -r ipmi_watchdog > /dev/null 2>&1
	modules_loaded ipmi_watchdog
	if [ ${OnePlusLoaded} -ne 0 ]; then
	    RETVAL=$((RETVAL | 32))
	else
	    if [ "${IPMI_WATCHDOG}" = "yes" ]; then
		[ ${UDEV_EXISTS} -eq 0 ] && rm -f /dev/watchdog
	    fi
	fi
}

start_powercontrol_common()
{
	local poweroff_opts=""
	load_hw_modules
	if [ "${IPMI_POWERCYCLE}" == "yes" ]; then
	    modinfo ipmi_poweroff 2>/dev/null | grep poweroff_control > /dev/null 2>&1 && \
		poweroff_opts="poweroff_control=2"
	    modinfo ipmi_poweroff 2>/dev/null | grep poweroff_powercycle > /dev/null 2>&1 && \
		poweroff_opts="poweroff_powercycle=1"
	fi
	modprobe ipmi_poweroff "${poweroff_opts}" > /dev/null 2>&1
	modules_loaded ipmi_poweroff
	[ ${OnePlusUnloaded} -ne 0 ] &&
		RETVAL=$((RETVAL | 2)) &&
		echo "Powercontroll startup failed: cannot load ipmi_poweroff module" &&
		return
}

start_powercontrol_quiet()
{
	[ "${IPMI_POWEROFF}" != "yes" ] &&
		return
	start_powercontrol_common
}

start_powercontrol()
{
	[ "${IPMI_POWEROFF}" != "yes" ] &&
		RETVAL=$((RETVAL | 2)) &&
		echo "Powercontroll not configured" &&
		return
	start_powercontrol_common
}

stop_powercontrol()
{
	modprobe -q -r ipmi_poweroff > /dev/null 2>&1
	modules_loaded ipmi_poweroff
	if [ ${OnePlusLoaded} -ne 0 ]; then
	    RETVAL=$((RETVAL | 32))
	    echo "Powercontroll shutdown failed: cannot unload ipmi_poweroff module"
	fi
}

stop_powercontrol_quiet()
{
	modprobe -q -r ipmi_poweroff > /dev/null 2>&1
	modules_loaded ipmi_poweroff
	[ ${OnePlusLoaded} -ne 0 ] && RETVAL=$((RETVAL | 32))
}

#############################################################################
unload_all_ipmi_modules()
{
	stop_watchdog_quiet
	stop_powercontrol_quiet
	for m in ${MODULES}; do
		modprobe -q -r ${m} > /dev/null 2>&1
	done
        # delete interface node ONLY if ipmi_devintf is unloaded
        [ `lsmod | grep -c "ipmi_devintf"` -eq 0 ] &&
	        rm -f "/dev/ipmi${INTF_NUM}"
}

unload_ipmi_modules_leave_features()
{
	for m in ${MODULES_INTERFACES}; do
		modprobe -q -r ${m} > /dev/null 2>&1
	done
        # delete interface node ONLY if ipmi_devintf is unloaded
        [ `lsmod | grep -c "ipmi_devintf"` -eq 0 ] &&
	        rm -f "/dev/ipmi${INTF_NUM}"
	lsmod | egrep -q "ipmi_(poweroff|watchdog)" > /dev/null 2>&1
	if [ "$?" -ne "0" ]; then
		stop_watchdog_quiet
		stop_powercontrol_quiet
		for m in ${MODULES}; do
			modprobe -q -r ${m} > /dev/null 2>&1
		done
	fi
}

#############################################################################
load_ipmi_modules ()
{
	local locdelay
	modprobe ipmi_msghandler > /dev/null 2>&1
	modules_loaded ipmi_msghandler
	[ ${OnePlusLoaded} -ne 1 ] && unload_all_ipmi_modules && RETVAL=$((RETVAL | 1)) && return
	load_hw_modules
	[ $((RETVAL & 1)) -eq 1 ] && unload_all_ipmi_modules && RETVAL=$((RETVAL | 1)) && return

	if [ "${DEV_IPMI}" = "yes" ]; then
		modprobe ipmi_devintf > /dev/null 2>&1
		modules_loaded ipmi_devintf
		RETVAL=$((RETVAL & ~2))
		[ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
		if [ ${OnePlusLoaded} -eq 1 ]; then
			if [ ${UDEV_EXISTS} -eq 0 ]; then
				DEVMAJOR=`cat /proc/devices | awk '/ipmidev/{print $1}'`
				rm -f /dev/ipmi${INTF_NUM}
				mknod -m 0600 /dev/ipmi${INTF_NUM} c ${DEVMAJOR} 0 || RETVAL=$((RETVAL | 4))
			fi

			# udev can take several seconds to create /dev/ipmi0, 
			# but it happens asynchronously, so delay here
			locdelay=${DEV_IPMI_TIMEOUT}
			while [ ! -e /dev/ipmi${INTF_NUM} -a ${locdelay} -gt 0 ]; do
				locdelay=$((locdelay - 1))
				sleep 0.1
			done
		fi
	fi

	if [ "${IPMI_IMB}" = "yes" ]; then
		modprobe ipmi_imb > /dev/null 2>&1
		modules_loaded ipmi_imb
		RETVAL=$((RETVAL & ~2))
		[ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
		if [ ${OnePlusLoaded} -eq 1 ]; then
			DEVMAJOR=`cat /proc/devices | awk '/imb/{print $1}'`
			rm -f /dev/imb
			mknod -m 0600 /dev/imb c ${DEVMAJOR} 0 || RETVAL=$((RETVAL | 4))
		fi
	fi

	# Per Corey Minyard, essentially no one uses ipmi_radisys
	# and we don't want to encourage its further use
	# so it won't be handled here.
	return
}

#############################################################################
start()
{
	load_ipmi_modules
	if [ ${RETVAL} -eq 0 ]; then
		touch ${LOCKFILE}
	else
		if [ $((RETVAL & 1)) -eq 1 ]; then
			echo "Startup failed."
		else
			touch ${LOCKFILE} && echo "Warning!?"
		fi
	fi
	start_watchdog_quiet
	start_powercontrol_quiet
}

#############################################################################
stop()
{
	unload_ipmi_modules_leave_features
	modules_loaded ${MODULES_INTERFACES}
	if [ ${OnePlusLoaded} -ne 0 ]; then
		RETVAL=$((RETVAL | 32))
		echo "Shutdown failed, something may be in use"
	else
		rm -f ${LOCKFILE}
	fi
}

stop_all()
{
	unload_all_ipmi_modules
	modules_loaded ${MODULES}
	if [ ${OnePlusLoaded} -ne 0 ]; then
		RETVAL=$((RETVAL | 32))
		echo "Shutdown failed, something may be in use"
	else
		rm -f ${LOCKFILE}
	fi
}

#############################################################################
restart()
{
	stop_all
	RETVAL=0
	start
}

#############################################################################

reload()
{
	stop_all
	RETVAL=0
	start
}

#############################################################################

status_all()
{
	minimum_modules_loaded
	[ $? -eq 0 ] && RETVAL=$((RETVAL | 1))
	
	modules_loaded_verbose ${MODULES_FEATURES} ${MODULES_INTERFACES}
	[ ${OnePlusUnloaded} -ne 0 ] && RETVAL=$((RETVAL | 2))

	if [ "${DEV_IPMI}" = "yes" ]; then 
	    device_node_exists /dev/ipmi${INTF_NUM}
	    [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
	fi

	if [ "${IPMI_IMB}" = "yes" ]; then
	    device_node_exists /dev/imb
	    [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
	fi

	if [ "${IPMI_WATCHDOG}" = "yes" ]; then
	    device_node_exists /dev/watchdog
	    [ $? -eq 0 ] && RETVAL=$((RETVAL | 8))
	fi

	[ ! -e ${LOCKFILE} ] && RETVAL=$((RETVAL | 16))
}

status()
{
	minimum_modules_loaded
	[ $? -eq 0 ] && RETVAL=$((RETVAL | 1))
	
	if [ "${DEV_IPMI}" = "yes" ]; then 
	    modules_loaded_verbose ipmi_devintf
	    [ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))

	    device_node_exists /dev/ipmi${INTF_NUM}
	    [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
	fi

	if [ "${IPMI_IMB}" = "yes" ]; then
	    device_node_exists /dev/imb
	    [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
	fi
}

status_watchdog()
{
	minimum_modules_loaded
	[ $? -eq 0 ] && RETVAL=$((RETVAL | 1))

	modules_loaded_verbose ipmi_watchdog
	[ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))

	device_node_exists /dev/watchdog
	[ $? -eq 0 ] && RETVAL=$((RETVAL | 8))
}

status_powercontrol()
{
	minimum_modules_loaded
	[ $? -eq 0 ] && RETVAL=$((RETVAL | 1))

	modules_loaded_verbose ipmi_powercontrol
	[ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
}

#############################################################################
usage ()
{
	echo $"Usage: $0 {start|stop|status" 1>&2
	echo $"          restart|condrestart|try-restart|reload|force-reload" 1>&2
	echo $"          start-watchdog|stop-watchdog|status-watchdog" 1>&2
	echo $"          start-powercontrol|stop-powercontrol|status-powercontrol" 1>&2
	echo $"          stop-all|status-all}" 1>&2
	RETVAL=2
}

condrestart ()
{
	[ -e ${LOCKFILE} ] && restart
}

#############################################################################
# MAIN
#############################################################################
case "$1" in
	start) start ;;
	stop)  stop ;;
	restart) restart ;;
	force-reload) reload ;;
	reload) reload ;;
	status)	status ;;
	status-all) status_all ;;
	condrestart) condrestart ;;
	try-restart) condrestart ;;
	start-watchdog) start_watchdog ;;
	stop-watchdog) stop_watchdog ;;
	status-watchdog) status_watchdog ;;
	start-powercontrol) start_powercontrol ;;
	stop-powercontrol) stop_powercontrol ;;
	status-powercontrol) status_powercontrol ;;
	stop-all) stop_all ;;
	*) usage ;;
esac

exit ${RETVAL}

#############################################################################
# end of file
#############################################################################

