
Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Signed-off-by: Joe MacDonald <joe_macdonald@mentor.com>
12 KiB
Executable File
#!/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
#############################################################################