#!/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 
 | 
############################################################################# 
 |