513 lines
12 KiB
Plaintext
513 lines
12 KiB
Plaintext
|
#!/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
|
||
|
#############################################################################
|
||
|
|