xref: /openbmc/ipmitool/contrib/ipmi.init.redhat (revision c18ec02f3304ce2a889a50e378f07a4168af3884)
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