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