1*c18ec02fSPetter Reinholdtsen#!/bin/sh 2*c18ec02fSPetter Reinholdtsen# 3*c18ec02fSPetter Reinholdtsen# chkconfig: 2345 11 60 4*c18ec02fSPetter Reinholdtsen# description: start, stop, or query ipmi system monitoring tools 5*c18ec02fSPetter Reinholdtsen# config: /etc/sysconfig/ipmi 6*c18ec02fSPetter Reinholdtsen# 7*c18ec02fSPetter Reinholdtsen# For Redhat, Fedora, or similar systems. Handles both 2.4 and 2.6 8*c18ec02fSPetter Reinholdtsen# configurations. Requires an /etc/sysconfig/ipmi file to function, 9*c18ec02fSPetter Reinholdtsen# see below. 10*c18ec02fSPetter Reinholdtsen# 11*c18ec02fSPetter Reinholdtsen# Phil Hollenback 12*c18ec02fSPetter Reinholdtsen# philiph@pobox.com 13*c18ec02fSPetter Reinholdtsen 14*c18ec02fSPetter Reinholdtsen# Source function library. 15*c18ec02fSPetter Reinholdtsen. /etc/init.d/functions 16*c18ec02fSPetter Reinholdtsen 17*c18ec02fSPetter Reinholdtsen# Exit silently if we don't have a sysconfig file, 18*c18ec02fSPetter Reinholdtsen# and read IPMI setting from it to determine whether or 19*c18ec02fSPetter Reinholdtsen# not to continue. 20*c18ec02fSPetter Reinholdtsen# The only current setting is ipmi={YES|NO}, whether or not 21*c18ec02fSPetter Reinholdtsen# to enable IPMI. 22*c18ec02fSPetter Reinholdtsen[ -f /etc/sysconfig/ipmi ] || exit 0 23*c18ec02fSPetter Reinholdtsen. /etc/sysconfig/ipmi 24*c18ec02fSPetter Reinholdtsen[ "${IPMI}" = "yes" ] || exit 0 25*c18ec02fSPetter Reinholdtsen 26*c18ec02fSPetter ReinholdtsenRETVAL=0 27*c18ec02fSPetter Reinholdtsen 28*c18ec02fSPetter Reinholdtsenstart() { 29*c18ec02fSPetter Reinholdtsen echo -n $"Starting ipmi: " 30*c18ec02fSPetter Reinholdtsen 31*c18ec02fSPetter Reinholdtsen # If ipmidev isn't listed in /proc/devices, try 32*c18ec02fSPetter Reinholdtsen # loading the modules. 33*c18ec02fSPetter Reinholdtsen if ! grep -q ipmidev /proc/devices 34*c18ec02fSPetter Reinholdtsen then 35*c18ec02fSPetter Reinholdtsen /sbin/modprobe ipmi_msghandler || RETVAL=1 36*c18ec02fSPetter Reinholdtsen /sbin/modprobe ipmi_devintf || RETVAL=1 37*c18ec02fSPetter Reinholdtsen # Try loading new driver module, fall back to old 38*c18ec02fSPetter Reinholdtsen # module if that fails. 39*c18ec02fSPetter Reinholdtsen if ! /sbin/modprobe ipmi_si >/dev/null 2>&1 40*c18ec02fSPetter Reinholdtsen then 41*c18ec02fSPetter Reinholdtsen /sbin/modprobe ipmi_si_drv || RETVAL=1 42*c18ec02fSPetter Reinholdtsen fi 43*c18ec02fSPetter Reinholdtsen fi 44*c18ec02fSPetter Reinholdtsen 45*c18ec02fSPetter Reinholdtsen 46*c18ec02fSPetter Reinholdtsen # If ipmidev still isn't listed in /proc/devices after we load 47*c18ec02fSPetter Reinholdtsen # modules, this just isn't going to work. Set RETVAL to mark 48*c18ec02fSPetter Reinholdtsen # this failure. 49*c18ec02fSPetter Reinholdtsen grep -q ipmidev /proc/devices || RETVAL=1 50*c18ec02fSPetter Reinholdtsen 51*c18ec02fSPetter Reinholdtsen # remove old device file always 52*c18ec02fSPetter Reinholdtsen # in case ipmi gets assigned new dynamic major number from kernel 53*c18ec02fSPetter Reinholdtsen if [ -c /dev/ipmi0 ]; then 54*c18ec02fSPetter Reinholdtsen rm -f /dev/ipmi0 55*c18ec02fSPetter Reinholdtsen fi 56*c18ec02fSPetter Reinholdtsen 57*c18ec02fSPetter Reinholdtsen # Check if the device file exists and create if not. 58*c18ec02fSPetter Reinholdtsen if [ ! -c /dev/ipmi0 ] && [ $RETVAL -eq 0 ] 59*c18ec02fSPetter Reinholdtsen then 60*c18ec02fSPetter Reinholdtsen major=$(awk '/ ipmidev$/{print $1}' /proc/devices) 61*c18ec02fSPetter Reinholdtsen /bin/mknod -m 0600 /dev/ipmi0 c $major 0 || RETVAL=1 62*c18ec02fSPetter Reinholdtsen fi 63*c18ec02fSPetter Reinholdtsen 64*c18ec02fSPetter Reinholdtsen if [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ipmi ; then 65*c18ec02fSPetter Reinholdtsen echo_success 66*c18ec02fSPetter Reinholdtsen echo 67*c18ec02fSPetter Reinholdtsen else 68*c18ec02fSPetter Reinholdtsen echo_failure 69*c18ec02fSPetter Reinholdtsen echo 70*c18ec02fSPetter Reinholdtsen fi 71*c18ec02fSPetter Reinholdtsen} 72*c18ec02fSPetter Reinholdtsen 73*c18ec02fSPetter Reinholdtsenstop() { 74*c18ec02fSPetter Reinholdtsen echo -n $"Shutting down ipmi: " 75*c18ec02fSPetter Reinholdtsen 76*c18ec02fSPetter Reinholdtsen # Stop doesn't actually do anything because we currently don't 77*c18ec02fSPetter Reinholdtsen # unload ipmi modules on stop. That might change in the future 78*c18ec02fSPetter Reinholdtsen # if we decide unloading the ipmi modules is safe. 79*c18ec02fSPetter Reinholdtsen RETVAL=0 80*c18ec02fSPetter Reinholdtsen 81*c18ec02fSPetter Reinholdtsen if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ipmi ; then 82*c18ec02fSPetter Reinholdtsen echo_success 83*c18ec02fSPetter Reinholdtsen echo 84*c18ec02fSPetter Reinholdtsen else 85*c18ec02fSPetter Reinholdtsen echo_failure 86*c18ec02fSPetter Reinholdtsen echo 87*c18ec02fSPetter Reinholdtsen fi 88*c18ec02fSPetter Reinholdtsen} 89*c18ec02fSPetter Reinholdtsen 90*c18ec02fSPetter Reinholdtsendostatus() { 91*c18ec02fSPetter Reinholdtsen # Extract cpu temperatures from ipmitool output. 92*c18ec02fSPetter Reinholdtsen 93*c18ec02fSPetter Reinholdtsen # Abort if we don't have the ipmitool program. 94*c18ec02fSPetter Reinholdtsen if ! /usr/bin/ipmitool -V >/dev/null 95*c18ec02fSPetter Reinholdtsen then 96*c18ec02fSPetter Reinholdtsen echo "/usr/bin/ipmitool not found!" >&2 97*c18ec02fSPetter Reinholdtsen exit 1 98*c18ec02fSPetter Reinholdtsen fi 99*c18ec02fSPetter Reinholdtsen 100*c18ec02fSPetter Reinholdtsen # Abort if ipmi isn't loaded. 101*c18ec02fSPetter Reinholdtsen if ! grep -q ipmidev /proc/devices 102*c18ec02fSPetter Reinholdtsen then 103*c18ec02fSPetter Reinholdtsen echo "ipmi not listed in /proc/devices!" >&2 104*c18ec02fSPetter Reinholdtsen exit 1 105*c18ec02fSPetter Reinholdtsen fi 106*c18ec02fSPetter Reinholdtsen 107*c18ec02fSPetter Reinholdtsen # Check if we are running on a v1.0 IPMI system, and 108*c18ec02fSPetter Reinholdtsen # change our processor search string appropriately. 109*c18ec02fSPetter Reinholdtsen if /usr/bin/ipmitool -I open bmc info | \ 110*c18ec02fSPetter Reinholdtsen grep -q "IPMI Version.*1.0" 111*c18ec02fSPetter Reinholdtsen then 112*c18ec02fSPetter Reinholdtsen IpmiVersion="1.0" 113*c18ec02fSPetter Reinholdtsen fi 114*c18ec02fSPetter Reinholdtsen 115*c18ec02fSPetter Reinholdtsen # Determine # of running processors 116*c18ec02fSPetter Reinholdtsen NumProcs=$(grep -c processor /proc/cpuinfo) 117*c18ec02fSPetter Reinholdtsen if [ $NumProcs -eq 0 ] 118*c18ec02fSPetter Reinholdtsen then 119*c18ec02fSPetter Reinholdtsen echo "Can't determine number of processors!" >&2 120*c18ec02fSPetter Reinholdtsen exit 1 121*c18ec02fSPetter Reinholdtsen fi 122*c18ec02fSPetter Reinholdtsen 123*c18ec02fSPetter Reinholdtsen # Now build the query string. Concatenate it into 124*c18ec02fSPetter Reinholdtsen # one string because that's more efficient on 2.4 systems. 125*c18ec02fSPetter Reinholdtsen Count=1 126*c18ec02fSPetter Reinholdtsen TempString="" 127*c18ec02fSPetter Reinholdtsen while [ $Count -le $NumProcs ] 128*c18ec02fSPetter Reinholdtsen do 129*c18ec02fSPetter Reinholdtsen if [ x$IpmiVersion = x"1.0" ] 130*c18ec02fSPetter Reinholdtsen then 131*c18ec02fSPetter Reinholdtsen TempString="$TempString CPU\ $Count" 132*c18ec02fSPetter Reinholdtsen else 133*c18ec02fSPetter Reinholdtsen TempString="$TempString Processor$Count\ Temp" 134*c18ec02fSPetter Reinholdtsen fi 135*c18ec02fSPetter Reinholdtsen Count=$((Count + 1)) 136*c18ec02fSPetter Reinholdtsen done 137*c18ec02fSPetter Reinholdtsen # building TempString like this and eval'ing it is ugly, but 138*c18ec02fSPetter Reinholdtsen # it's the only way I could make the quoting work. Sorry. 139*c18ec02fSPetter Reinholdtsen TempString="/usr/bin/ipmitool -I open sensor get $TempString" 140*c18ec02fSPetter Reinholdtsen eval $TempString | awk -v "c=$Count" ' 141*c18ec02fSPetter ReinholdtsenBEGIN { 142*c18ec02fSPetter Reinholdtsen n = 1 143*c18ec02fSPetter Reinholdtsen} 144*c18ec02fSPetter Reinholdtsen/Sensor Reading/ { 145*c18ec02fSPetter Reinholdtsen printf "CPU%s Temp: %s\n",n,$4 146*c18ec02fSPetter Reinholdtsen n++ 147*c18ec02fSPetter Reinholdtsen} 148*c18ec02fSPetter ReinholdtsenEND { 149*c18ec02fSPetter Reinholdtsen if ( n != c) { 150*c18ec02fSPetter Reinholdtsen printf "Error: found %s CPUs, but got temps for %s\n",--c,--n >"/dev/stderr" 151*c18ec02fSPetter Reinholdtsen exit 1 152*c18ec02fSPetter Reinholdtsen } 153*c18ec02fSPetter Reinholdtsen exit 0 154*c18ec02fSPetter Reinholdtsen}' 155*c18ec02fSPetter Reinholdtsen RETVAL=$((RETVAL + $?)) 156*c18ec02fSPetter Reinholdtsen return $RETVAL 157*c18ec02fSPetter Reinholdtsen} 158*c18ec02fSPetter Reinholdtsen 159*c18ec02fSPetter Reinholdtsenrestart() { 160*c18ec02fSPetter Reinholdtsen stop 161*c18ec02fSPetter Reinholdtsen start 162*c18ec02fSPetter Reinholdtsen RETVAL=$? 163*c18ec02fSPetter Reinholdtsen} 164*c18ec02fSPetter Reinholdtsen 165*c18ec02fSPetter Reinholdtsencondrestart() { 166*c18ec02fSPetter Reinholdtsen [ -e /var/lock/subsys/ipmi ] && restart || : 167*c18ec02fSPetter Reinholdtsen} 168*c18ec02fSPetter Reinholdtsen 169*c18ec02fSPetter Reinholdtsenremove () { 170*c18ec02fSPetter Reinholdtsen # Actually remove the drivers. Don't do during stop in case 171*c18ec02fSPetter Reinholdtsen # this causes system to become unstable (a la lm_sensors) 172*c18ec02fSPetter Reinholdtsen if /sbin/lsmod | awk '{print $1}' | grep -q ipmi_ 173*c18ec02fSPetter Reinholdtsen then 174*c18ec02fSPetter Reinholdtsen # Try removing both 2.4 and 2.6 modules. 175*c18ec02fSPetter Reinholdtsen /sbin/rmmod ipmi_si 2>/dev/null 176*c18ec02fSPetter Reinholdtsen /sbin/rmmod ipmi_si_drv 2>/dev/null 177*c18ec02fSPetter Reinholdtsen /sbin/rmmod ipmi_devintf 178*c18ec02fSPetter Reinholdtsen /sbin/rmmod ipmi_msghandler 179*c18ec02fSPetter Reinholdtsen else 180*c18ec02fSPetter Reinholdtsen echo "No ipmi modules loaded!" >&2 181*c18ec02fSPetter Reinholdtsen RETVAL=1 182*c18ec02fSPetter Reinholdtsen return $RETVAL 183*c18ec02fSPetter Reinholdtsen fi 184*c18ec02fSPetter Reinholdtsen 185*c18ec02fSPetter Reinholdtsen # Wait a sec to give modules time to unload. 186*c18ec02fSPetter Reinholdtsen sleep 1 187*c18ec02fSPetter Reinholdtsen 188*c18ec02fSPetter Reinholdtsen # Check if we failed to remove any modules, and complain if so. 189*c18ec02fSPetter Reinholdtsen if /sbin/lsmod | awk '{print $1}' | grep -q ipmi_ 190*c18ec02fSPetter Reinholdtsen then 191*c18ec02fSPetter Reinholdtsen echo "ipmi modules still loaded!" >&2 192*c18ec02fSPetter Reinholdtsen RETVAL=1 193*c18ec02fSPetter Reinholdtsen return $RETVAL 194*c18ec02fSPetter Reinholdtsen fi 195*c18ec02fSPetter Reinholdtsen} 196*c18ec02fSPetter Reinholdtsen 197*c18ec02fSPetter Reinholdtsen# See how we were called. 198*c18ec02fSPetter Reinholdtsencase "$1" in 199*c18ec02fSPetter Reinholdtsen start) 200*c18ec02fSPetter Reinholdtsen start 201*c18ec02fSPetter Reinholdtsen ;; 202*c18ec02fSPetter Reinholdtsen stop) 203*c18ec02fSPetter Reinholdtsen stop 204*c18ec02fSPetter Reinholdtsen ;; 205*c18ec02fSPetter Reinholdtsen status) 206*c18ec02fSPetter Reinholdtsen dostatus 207*c18ec02fSPetter Reinholdtsen ;; 208*c18ec02fSPetter Reinholdtsen restart|reload) 209*c18ec02fSPetter Reinholdtsen restart 210*c18ec02fSPetter Reinholdtsen ;; 211*c18ec02fSPetter Reinholdtsen condrestart) 212*c18ec02fSPetter Reinholdtsen condrestart 213*c18ec02fSPetter Reinholdtsen ;; 214*c18ec02fSPetter Reinholdtsen remove) 215*c18ec02fSPetter Reinholdtsen remove 216*c18ec02fSPetter Reinholdtsen ;; 217*c18ec02fSPetter Reinholdtsen *) 218*c18ec02fSPetter Reinholdtsen echo "Usage: ipmi {start|stop|status|restart|condrestart|remove}" 219*c18ec02fSPetter Reinholdtsen exit 1 220*c18ec02fSPetter Reinholdtsenesac 221*c18ec02fSPetter Reinholdtsen 222*c18ec02fSPetter Reinholdtsenexit $RETVAL 223