summaryrefslogtreecommitdiff
path: root/contrib/ipmi.init.redhat
blob: f77168c5f0a3cdce8df81092058e427096520328 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/bin/sh
#
# chkconfig: 2345 11 60
# description: start, stop, or query ipmi system monitoring tools
# config: /etc/sysconfig/ipmi
#
# For Redhat, Fedora, or similar systems.  Handles both 2.4 and 2.6
# configurations.  Requires an /etc/sysconfig/ipmi file to function,
# see below.
#
# Phil Hollenback
# philiph@pobox.com

# Source function library.
. /etc/init.d/functions

# Exit silently if we don't have a sysconfig file,
# and read IPMI setting from it to determine whether or
# not to continue.
# The only current setting is ipmi={YES|NO}, whether or not
# to enable IPMI.
[ -f /etc/sysconfig/ipmi ] || exit 0
. /etc/sysconfig/ipmi
[ "${IPMI}" = "yes" ] || exit 0

RETVAL=0

start() {
	echo -n $"Starting ipmi: "

	# If ipmidev isn't listed in /proc/devices, try
	# loading the modules.
	if ! grep -q ipmidev /proc/devices
	then
	    /sbin/modprobe ipmi_msghandler || RETVAL=1
	    /sbin/modprobe ipmi_devintf || RETVAL=1
	    # Try loading new driver module, fall back to old
	    # module if that fails.
	    if ! /sbin/modprobe ipmi_si >/dev/null 2>&1
	    then
		/sbin/modprobe ipmi_si_drv || RETVAL=1
	    fi
	fi


	# If ipmidev still isn't listed in /proc/devices after we load
	# modules, this just isn't going to work.  Set RETVAL to mark
	# this failure.
	grep -q ipmidev /proc/devices || RETVAL=1

	# remove old device file always
	# in case ipmi gets assigned new dynamic major number from kernel
	if [ -c /dev/ipmi0 ]; then
	    rm -f /dev/ipmi0
	fi

	# Check if the device file exists and create if not.
	if [ ! -c /dev/ipmi0 ] && [ $RETVAL -eq 0 ]
	then
	    major=$(awk '/ ipmidev$/{print $1}' /proc/devices)
	    /bin/mknod -m 0600 /dev/ipmi0 c $major 0 || RETVAL=1
	fi

	if [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ipmi ; then
		echo_success
		echo
	else
		echo_failure
		echo
	fi
}

stop() {
	echo -n $"Shutting down ipmi: "

	# Stop doesn't actually do anything because we currently don't
	# unload ipmi modules on stop.  That might change in the future
 	# if we decide unloading the ipmi modules is safe.
	RETVAL=0

	if [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ipmi ; then
		echo_success
		echo
	else
		echo_failure
		echo
	fi
}

dostatus() {
	# Extract cpu temperatures from ipmitool output.

	# Abort if we don't have the ipmitool program.
	if ! /usr/bin/ipmitool -V >/dev/null
	then
	    echo "/usr/bin/ipmitool not found!" >&2
	    exit 1
	fi

	# Abort if ipmi isn't loaded.
	if ! grep -q ipmidev /proc/devices
	then
	    echo "ipmi not listed in /proc/devices!" >&2
	    exit 1
	fi

	# Check if we are running on a v1.0 IPMI system, and
	# change our processor search string appropriately.
	if /usr/bin/ipmitool -I open bmc info | \
		grep -q "IPMI Version.*1.0"
	then
	    IpmiVersion="1.0"
	fi

	# Determine # of running processors
	NumProcs=$(grep -c processor /proc/cpuinfo)
	if [ $NumProcs -eq 0 ]
	then
	    echo "Can't determine number of processors!" >&2
	    exit 1
	fi

	# Now build the query string.  Concatenate it into
	# one string because that's more efficient on 2.4 systems.
	Count=1
	TempString=""
	while [ $Count -le $NumProcs ]
	do
	    if [ x$IpmiVersion  = x"1.0" ]
	    then
		TempString="$TempString CPU\ $Count"
	    else
		TempString="$TempString Processor$Count\ Temp"
	    fi
	    Count=$((Count + 1))
	done
	# building TempString like this and eval'ing it is ugly, but
	# it's the only way I could make the quoting work.  Sorry.
	TempString="/usr/bin/ipmitool -I open sensor get $TempString"
	eval $TempString | awk -v "c=$Count" '
BEGIN {
   n = 1
}
/Sensor Reading/ {
   printf "CPU%s Temp: %s\n",n,$4
   n++
}
END {
   if ( n != c) {
	printf "Error: found %s CPUs, but got temps for %s\n",--c,--n >"/dev/stderr"
	exit 1
   }
   exit 0
}'
	RETVAL=$((RETVAL + $?))
	return $RETVAL
}

restart() {
	stop
	start
	RETVAL=$?
}

condrestart() {
	[ -e /var/lock/subsys/ipmi ] && restart || :
}

remove () {
	# Actually remove the drivers.  Don't do during stop in case
	# this causes system to become unstable (a la lm_sensors)
	if /sbin/lsmod | awk '{print $1}' | grep -q ipmi_
	then
	    # Try removing both 2.4 and 2.6 modules.
	    /sbin/rmmod ipmi_si 2>/dev/null
	    /sbin/rmmod ipmi_si_drv 2>/dev/null
	    /sbin/rmmod ipmi_devintf
	    /sbin/rmmod ipmi_msghandler
	else
	    echo "No ipmi modules loaded!" >&2
	    RETVAL=1
	    return $RETVAL
	fi

	# Wait a sec to give modules time to unload.
	sleep 1

	# Check if we failed to remove any modules, and complain if so.
	if /sbin/lsmod | awk '{print $1}' | grep -q ipmi_
	then
	    echo "ipmi modules still loaded!" >&2
	    RETVAL=1
	    return $RETVAL
	fi
}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
	dostatus
	;;
  restart|reload)
	restart
	;;
  condrestart)
	condrestart
	;;
  remove)
	remove
	;;
  *)
	echo "Usage: ipmi {start|stop|status|restart|condrestart|remove}"
	exit 1
esac

exit $RETVAL