~upstart-devel/upstart/upstart-jobs

« back to all changes in this revision

Viewing changes to vivid/etc/init.d/openipmi

  • Committer: Dimitri John Ledkov
  • Date: 2014-11-19 12:58:41 UTC
  • Revision ID: dimitri.j.ledkov@intel.com-20141119125841-98dr37roy8dvcv3b
auto update

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/bash
 
2
#############################################################################
 
3
#
 
4
# ipmi:         OpenIPMI Driver init script
 
5
#
 
6
# Authors:      Matt Domsch <Matt_Domsch@dell.com>
 
7
#               Chris Poblete <Chris_Poblete@dell.com>
 
8
#
 
9
# chkconfig: - 13 87
 
10
# description: OpenIPMI Driver init script
 
11
#
 
12
### BEGIN INIT INFO
 
13
# Provides: ipmidrv
 
14
# Required-Start: $local_fs $remote_fs $syslog
 
15
# Required-Stop: $local_fs $remote_fs $syslog
 
16
# Default-Start:
 
17
# Default-Stop:
 
18
# Short-Description: OpenIPMI Driver init script
 
19
# Description: OpenIPMI Driver init script
 
20
### END INIT INFO
 
21
#
 
22
# Status return code bits
 
23
# no bits set = no errors
 
24
# bit 0 set = minimum modules aren't loaded
 
25
# bit 1 set = requested feature module isn't loaded
 
26
# bit 2 set = /dev/ipmi0 (or /dev/imb if using that instead) doesn't exist
 
27
# bit 3 set = /dev/watchdog doesn't exist
 
28
# bit 4 set = lockfile doesn't exist
 
29
# bit 5 set = modules are loaded even when asked to be unloaded
 
30
 
 
31
#
 
32
#############################################################################
 
33
. /lib/lsb/init-functions
 
34
 
 
35
CONFIGFILE=/etc/default/openipmi
 
36
# source config info
 
37
[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
 
38
 
 
39
#############################################################################
 
40
# GLOBALS
 
41
#############################################################################
 
42
MODULE_NAME="ipmi"
 
43
INTF_NUM=0
 
44
 
 
45
IPMI_SMB_MODULE_NAME="ipmi_smb"
 
46
IPMI_SI_MODULE_NAME="ipmi_si"
 
47
kernel=`uname -r | cut -d. -f1-2`
 
48
if [ "${kernel}" == "2.4" ]; then
 
49
    IPMI_SMB_MODULE_NAME="ipmi_smb_intf"
 
50
    IPMI_SI_MODULE_NAME="ipmi_si_drv"
 
51
fi
 
52
 
 
53
MODULES_INTERFACES=""
 
54
[ "${DEV_IPMI}" = "yes" ] && MODULES_INTERFACES="${MODULES_INTERFACES} ipmi_devintf"
 
55
[ "${IPMI_IMB}" = "yes" ] && MODULES_INTERFACES="${MODULES_INTERFACES} ipmi_imb"
 
56
 
 
57
MODULES_FEATURES=""
 
58
[ "${IPMI_WATCHDOG}" = "yes" ] && MODULES_FEATURES="${MODULES_FEATURES} ipmi_watchdog"
 
59
[ "${IPMI_POWEROFF}" = "yes" ] && MODULES_FEATURES="${MODULES_FEATURES} ipmi_poweroff"
 
60
 
 
61
MODULES_HW=""
 
62
[ "${IPMI_SI}"  = "yes" ] && MODULES_HW="${MODULES_HW} ${IPMI_SI_MODULE_NAME}"
 
63
[ "${IPMI_SMB}" = "yes" ] && MODULES_HW="${MODULES_HW} ${IPMI_SMB_MODULE_NAME}"
 
64
 
 
65
MODULES_BASE="ipmi_msghandler"
 
66
MODULES="${MODULES_INTERFACES} ${MODULES_FEATURES} ${MODULES_HW} ${MODULES_BASE}"
 
67
 
 
68
RETVAL=0
 
69
LOCKFILE=/var/lock/ipmi
 
70
DEV_IPMI_TIMEOUT=15
 
71
 
 
72
UDEV_EXISTS=0
 
73
if [ -e /sbin/udev -o -e /sbin/udevd ]; then
 
74
    UDEV_EXISTS=1
 
75
fi
 
76
 
 
77
#############################################################################
 
78
# NOTES:
 
79
# * /dev/ipmi0 is unconditionally deleted here on ipmi_devintf unload,
 
80
#   because SLES9 and RHEL4 kernels don't send a message for udev to delete
 
81
#   it for us.
 
82
 
83
#############################################################################
 
84
 
 
85
modules_loaded_verbose()
 
86
{
 
87
        OnePlusLoaded=0
 
88
        OnePlusUnloaded=0
 
89
        for m in $@; do
 
90
                if /sbin/lsmod | grep $m >/dev/null 2>&1 ; then
 
91
                        echo "$m module loaded."
 
92
                        OnePlusLoaded=1
 
93
                elif [ -d "/sys/module/$m" ]; then
 
94
                        echo "$m module in kernel."
 
95
                        OnePlusLoaded=1
 
96
                else
 
97
                        echo "$m module not loaded."
 
98
                        OnePlusUnloaded=1
 
99
                fi
 
100
        done
 
101
}
 
102
 
 
103
modules_loaded()
 
104
{
 
105
        OnePlusLoaded=0
 
106
        OnePlusUnloaded=0
 
107
        for m in $@; do
 
108
                if /sbin/lsmod | grep $m >/dev/null 2>&1 ; then
 
109
                        OnePlusLoaded=1
 
110
                elif [ -d "/sys/module/$m" ]; then
 
111
                        OnePlusLoaded=1
 
112
                else
 
113
                        OnePlusUnloaded=1
 
114
                fi
 
115
        done
 
116
}
 
117
 
 
118
device_node_exists ()
 
119
{
 
120
        if [ -e "$1" ]; then
 
121
                echo "$1 exists."
 
122
                return 1
 
123
        fi
 
124
        echo "$1 does not exist."
 
125
        return 0
 
126
}
 
127
 
 
128
minimum_modules_loaded()
 
129
{
 
130
        rc_base=1
 
131
        rc_hw=1
 
132
        modules_loaded_verbose "${MODULES_BASE}"
 
133
        [ ${OnePlusLoaded} -eq 0 ] && rc_base=0
 
134
            
 
135
        modules_loaded_verbose "${MODULES_HW}"
 
136
        [ ${OnePlusLoaded} -eq 0 ] && rc_hw=0
 
137
        
 
138
        return $((rc_base && rc_hw))
 
139
}
 
140
 
 
141
#############################################################################
 
142
 
 
143
load_si()
 
144
{
 
145
        if [ "${IPMI_SI}" = "yes" ]; then
 
146
                modprobe ${IPMI_SI_MODULE_NAME} > /dev/null 2>&1
 
147
                modules_loaded ${IPMI_SI_MODULE_NAME}
 
148
                [ ${OnePlusLoaded} -ne 1 ] && RETVAL=$((RETVAL | 1))
 
149
        fi
 
150
}
 
151
 
 
152
load_smb()
 
153
{
 
154
        if [ "${IPMI_SMB}" = "yes" ]; then
 
155
                modprobe ${IPMI_SMB_MODULE_NAME} > /dev/null 2>&1
 
156
                modules_loaded ${IPMI_SMB_MODULE_NAME}
 
157
                [ ${OnePlusLoaded} -ne 1 ] && RETVAL=$((RETVAL | 1))
 
158
        fi
 
159
}
 
160
 
 
161
load_hw_modules()
 
162
{
 
163
        load_si
 
164
        load_smb
 
165
}
 
166
 
 
167
start_watchdog_common()
 
168
{
 
169
        load_hw_modules
 
170
        modprobe ipmi_watchdog ${IPMI_WATCHDOG_OPTIONS} > /dev/null 2>&1
 
171
        modules_loaded ipmi_watchdog
 
172
        [ ${OnePlusUnloaded} -ne 0 ] &&
 
173
                RETVAL=$((RETVAL | 2)) &&
 
174
                log_end_msg &&
 
175
                return
 
176
        if [ ${UDEV_EXISTS} -eq 0 -a ! -e /dev/watchdog ]; then
 
177
                mknod -m 0600 /dev/watchdog c 10 130
 
178
                [ $? -ne 0 ] &&
 
179
                        RETVAL=$((RETVAL | 8)) &&
 
180
                        log_end_msg &&
 
181
                        return
 
182
        fi
 
183
        #log_success_msg
 
184
}
 
185
 
 
186
start_watchdog_quiet()
 
187
{
 
188
        [ "${IPMI_WATCHDOG}" != "yes" ] &&
 
189
                return
 
190
        start_watchdog_common
 
191
}
 
192
 
 
193
start_watchdog()
 
194
{
 
195
        log_begin_msg $"Starting ipmi_watchdog driver: "
 
196
        [ "${IPMI_WATCHDOG}" != "yes" ] &&
 
197
                RETVAL=$((RETVAL | 2)) &&
 
198
                log_failure_msg "not configured" &&
 
199
                return
 
200
        start_watchdog_common
 
201
        log_end_msg 0
 
202
}
 
203
 
 
204
stop_watchdog()
 
205
{
 
206
        log_begin_msg $"Stopping ipmi_watchdog driver: "
 
207
        modprobe -q -r ipmi_watchdog > /dev/null 2>&1
 
208
        modules_loaded ipmi_watchdog
 
209
        if [ ${OnePlusLoaded} -ne 0 ]; then
 
210
            RETVAL=$((RETVAL | 32))
 
211
            log_failure_msg "failed"
 
212
        else
 
213
            if [ "${IPMI_WATCHDOG}" = "yes" ]; then
 
214
                [ ${UDEV_EXISTS} -eq 0 ] && rm -f /dev/watchdog
 
215
            fi
 
216
            log_success_msg "success"
 
217
        fi
 
218
        log_end_msg 0
 
219
}
 
220
 
 
221
stop_watchdog_quiet()
 
222
{
 
223
        modprobe -q -r ipmi_watchdog > /dev/null 2>&1
 
224
        modules_loaded ipmi_watchdog
 
225
        if [ ${OnePlusLoaded} -ne 0 ]; then
 
226
            RETVAL=$((RETVAL | 32))
 
227
        else
 
228
            if [ "${IPMI_WATCHDOG}" = "yes" ]; then
 
229
                [ ${UDEV_EXISTS} -eq 0 ] && rm -f /dev/watchdog
 
230
            fi
 
231
        fi
 
232
}
 
233
 
 
234
start_powercontrol_common()
 
235
{
 
236
        local poweroff_opts=""
 
237
        load_hw_modules
 
238
        if [ "${IPMI_POWERCYCLE}" == "yes" ]; then
 
239
            modinfo ipmi_poweroff 2>/dev/null | grep poweroff_control > /dev/null 2>&1 && \
 
240
                poweroff_opts="poweroff_control=2"
 
241
            modinfo ipmi_poweroff 2>/dev/null | grep poweroff_powercycle > /dev/null 2>&1 && \
 
242
                poweroff_opts="poweroff_powercycle=1"
 
243
        fi
 
244
        modprobe ipmi_poweroff "${poweroff_opts}" > /dev/null 2>&1
 
245
        modules_loaded ipmi_poweroff
 
246
        [ ${OnePlusUnloaded} -ne 0 ] &&
 
247
                RETVAL=$((RETVAL | 2)) &&
 
248
                log_failure_msg &&
 
249
                return
 
250
        log_success_msg
 
251
}
 
252
 
 
253
start_powercontrol_quiet()
 
254
{
 
255
        [ "${IPMI_POWEROFF}" != "yes" ] &&
 
256
                return
 
257
        log_begin_msg "Starting ipmi_poweroff driver: "
 
258
        start_powercontrol_common
 
259
        log_end_msg 0
 
260
}
 
261
 
 
262
start_powercontrol()
 
263
{
 
264
        log_begin_msg "Starting ipmi_poweroff driver."
 
265
        [ "${IPMI_POWEROFF}" != "yes" ] &&
 
266
                RETVAL=$((RETVAL | 2)) &&
 
267
                log_failure_msg "not configured" &&
 
268
                return
 
269
        start_powercontrol_common
 
270
        log_end_msg 0
 
271
}
 
272
 
 
273
stop_powercontrol()
 
274
{
 
275
        log_being_msg "Stopping ipmi_poweroff driver."
 
276
        modprobe -q -r ipmi_poweroff > /dev/null 2>&1
 
277
        modules_loaded ipmi_poweroff
 
278
        if [ ${OnePlusLoaded} -ne 0 ]; then
 
279
            RETVAL=$((RETVAL | 32))
 
280
            log_failure_msg
 
281
        else
 
282
            log_success_msg
 
283
        fi
 
284
        log_end_msg 0
 
285
}
 
286
 
 
287
stop_powercontrol_quiet()
 
288
{
 
289
        modprobe -q -r ipmi_poweroff > /dev/null 2>&1
 
290
        modules_loaded ipmi_poweroff
 
291
        [ ${OnePlusLoaded} -ne 0 ] && RETVAL=$((RETVAL | 32))
 
292
}
 
293
 
 
294
#############################################################################
 
295
unload_all_ipmi_modules()
 
296
{
 
297
        stop_watchdog_quiet
 
298
        stop_powercontrol_quiet
 
299
        for m in ${MODULES}; do
 
300
                modprobe -q -r ${m} > /dev/null 2>&1
 
301
        done
 
302
        # delete interface node ONLY if ipmi_devintf is unloaded
 
303
        [ `lsmod | grep -c "ipmi_devintf"` -eq 0 ] &&
 
304
                rm -f "/dev/ipmi${INTF_NUM}"
 
305
}
 
306
 
 
307
unload_ipmi_modules_leave_features()
 
308
{
 
309
        for m in ${MODULES_INTERFACES}; do
 
310
                modprobe -q -r ${m} > /dev/null 2>&1
 
311
        done
 
312
        # delete interface node ONLY if ipmi_devintf is unloaded
 
313
        [ `lsmod | grep -c "ipmi_devintf"` -eq 0 ] &&
 
314
                rm -f "/dev/ipmi${INTF_NUM}"
 
315
        lsmod | egrep -q "ipmi_(poweroff|watchdog)" > /dev/null 2>&1
 
316
        if [ "$?" -ne "0" ]; then
 
317
                stop_watchdog_quiet
 
318
                stop_powercontrol_quiet
 
319
                for m in ${MODULES}; do
 
320
                        modprobe -q -r ${m} > /dev/null 2>&1
 
321
                done
 
322
        fi
 
323
}
 
324
 
 
325
#############################################################################
 
326
load_ipmi_modules ()
 
327
{
 
328
        local locdelay
 
329
        modprobe ipmi_msghandler > /dev/null 2>&1
 
330
        modules_loaded ipmi_msghandler
 
331
        [ ${OnePlusLoaded} -ne 1 ] && unload_all_ipmi_modules && RETVAL=$((RETVAL | 1)) && return
 
332
        load_hw_modules
 
333
        [ $((RETVAL & 1)) -eq 1 ] && unload_all_ipmi_modules && RETVAL=$((RETVAL | 1)) && return
 
334
 
 
335
        if [ "${DEV_IPMI}" = "yes" ]; then
 
336
                modprobe ipmi_devintf > /dev/null 2>&1
 
337
                modules_loaded ipmi_devintf
 
338
                RETVAL=$((RETVAL & ~2))
 
339
                [ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
 
340
                if [ ${OnePlusLoaded} -eq 1 ]; then
 
341
                        if [ ${UDEV_EXISTS} -eq 0 ]; then
 
342
                                DEVMAJOR=`cat /proc/devices | awk '/ipmidev/{print $1}'`
 
343
                                rm -f /dev/ipmi${INTF_NUM}
 
344
                                mknod -m 0600 /dev/ipmi${INTF_NUM} c ${DEVMAJOR} 0 || RETVAL=$((RETVAL | 4))
 
345
                        fi
 
346
 
 
347
                        # udev can take several seconds to create /dev/ipmi0, 
 
348
                        # but it happens asynchronously, so delay here
 
349
                        locdelay=${DEV_IPMI_TIMEOUT}
 
350
                        while [ ! -e /dev/ipmi${INTF_NUM} -a ${locdelay} -gt 0 ]; do
 
351
                                locdelay=$((locdelay - 1))
 
352
                                sleep 1
 
353
                        done
 
354
                fi
 
355
        fi
 
356
 
 
357
        if [ "${IPMI_IMB}" = "yes" ]; then
 
358
                modprobe ipmi_imb > /dev/null 2>&1
 
359
                modules_loaded ipmi_imb
 
360
                RETVAL=$((RETVAL & ~2))
 
361
                [ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
 
362
                if [ ${OnePlusLoaded} -eq 1 ]; then
 
363
                        DEVMAJOR=`cat /proc/devices | awk '/imb/{print $1}'`
 
364
                        rm -f /dev/imb
 
365
                        mknod -m 0600 /dev/imb c ${DEVMAJOR} 0 || RETVAL=$((RETVAL | 4))
 
366
                fi
 
367
        fi
 
368
 
 
369
        # Per Corey Minyard, essentially no one uses ipmi_radisys
 
370
        # and we don't want to encourage its further use
 
371
        # so it won't be handled here.
 
372
        return
 
373
}
 
374
 
 
375
#############################################################################
 
376
start()
 
377
{
 
378
        log_begin_msg "Starting ${MODULE_NAME} drivers" "${MODULE_NAME}"
 
379
        load_ipmi_modules
 
380
        if [ ${RETVAL} -eq 0 ]; then
 
381
                touch ${LOCKFILE}
 
382
        else
 
383
                if [ $((RETVAL & 1)) -eq 1 ]; then
 
384
                        log_end_msg 1
 
385
                else
 
386
                        touch ${LOCKFILE}
 
387
                fi
 
388
        fi
 
389
        start_watchdog_quiet
 
390
        start_powercontrol_quiet
 
391
        log_end_msg 0
 
392
}
 
393
 
 
394
#############################################################################
 
395
stop()
 
396
{
 
397
        log_begin_msg "Stopping ${MODULE_NAME} drivers."
 
398
        unload_ipmi_modules_leave_features
 
399
        modules_loaded ${MODULES_INTERFACES}
 
400
        if [ ${OnePlusLoaded} -ne 0 ]; then
 
401
                RETVAL=$((RETVAL | 32))
 
402
                log_failure_msg "may be in use"
 
403
        else
 
404
                rm -f ${LOCKFILE}
 
405
        fi
 
406
        log_end_msg 0
 
407
}
 
408
 
 
409
stop_all()
 
410
{
 
411
        log_begin_msg "Stopping ${MODULE_NAME} drivers."
 
412
        unload_all_ipmi_modules
 
413
        modules_loaded ${MODULES}
 
414
        if [ ${OnePlusLoaded} -ne 0 ]; then
 
415
                RETVAL=$((RETVAL | 32))
 
416
                log_failure_msg "may be in use"
 
417
        else
 
418
                rm -f ${LOCKFILE}
 
419
                log_success_msg
 
420
        fi
 
421
        log_end_msg 0
 
422
}
 
423
 
 
424
#############################################################################
 
425
restart()
 
426
{
 
427
        stop_all
 
428
        RETVAL=0
 
429
        start
 
430
}
 
431
 
 
432
#############################################################################
 
433
 
 
434
status_all()
 
435
{
 
436
        minimum_modules_loaded
 
437
        [ $? -eq 0 ] && RETVAL=$((RETVAL | 1))
 
438
        
 
439
        modules_loaded_verbose ${MODULES_FEATURES} ${MODULES_INTERFACES}
 
440
        [ ${OnePlusUnloaded} -ne 0 ] && RETVAL=$((RETVAL | 2))
 
441
 
 
442
        if [ "${DEV_IPMI}" = "yes" ]; then 
 
443
            device_node_exists /dev/ipmi${INTF_NUM}
 
444
            [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
 
445
        fi
 
446
 
 
447
        if [ "${IPMI_IMB}" = "yes" ]; then
 
448
            device_node_exists /dev/imb
 
449
            [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
 
450
        fi
 
451
 
 
452
        if [ "${IPMI_WATCHDOG}" = "yes" ]; then
 
453
            device_node_exists /dev/watchdog
 
454
            [ $? -eq 0 ] && RETVAL=$((RETVAL | 8))
 
455
        fi
 
456
 
 
457
        [ ! -e ${LOCKFILE} ] && RETVAL=$((RETVAL | 16))
 
458
}
 
459
 
 
460
status()
 
461
{
 
462
        minimum_modules_loaded
 
463
        [ $? -eq 0 ] && RETVAL=$((RETVAL | 1))
 
464
        
 
465
        if [ "${DEV_IPMI}" = "yes" ]; then 
 
466
            modules_loaded_verbose ipmi_devintf
 
467
            [ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
 
468
 
 
469
            device_node_exists /dev/ipmi${INTF_NUM}
 
470
            [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
 
471
        fi
 
472
 
 
473
        if [ "${IPMI_IMB}" = "yes" ]; then
 
474
            device_node_exists /dev/imb
 
475
            [ $? -eq 0 ] && RETVAL=$((RETVAL | 4))
 
476
        fi
 
477
}
 
478
 
 
479
status_watchdog()
 
480
{
 
481
        minimum_modules_loaded
 
482
        [ $? -eq 0 ] && RETVAL=$((RETVAL | 1))
 
483
 
 
484
        modules_loaded_verbose ipmi_watchdog
 
485
        [ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
 
486
 
 
487
        device_node_exists /dev/watchdog
 
488
        [ $? -eq 0 ] && RETVAL=$((RETVAL | 8))
 
489
}
 
490
 
 
491
status_powercontrol()
 
492
{
 
493
        minimum_modules_loaded
 
494
        [ $? -eq 0 ] && RETVAL=$((RETVAL | 1))
 
495
 
 
496
        modules_loaded_verbose ipmi_powercontrol
 
497
        [ ${OnePlusLoaded} -eq 0 ] && RETVAL=$((RETVAL | 2))
 
498
}
 
499
 
 
500
#############################################################################
 
501
usage ()
 
502
{
 
503
        log_action_msg "Usage: $0 {start|stop|status|restart|condrestart|try-restart|start-watchdog|stop-watchdog|status-watchdog|start-powercontrol|stop-powercontrol|status-powercontrol|stop-all|status-all}"
 
504
        RETVAL=1
 
505
}
 
506
 
 
507
condrestart ()
 
508
{
 
509
        [ -e ${LOCKFILE} ] && restart
 
510
}
 
511
 
 
512
#############################################################################
 
513
# MAIN
 
514
#############################################################################
 
515
case "$1" in
 
516
        start) start ;;
 
517
        stop)  stop ;;
 
518
        restart) restart ;;
 
519
        status) status ;;
 
520
        status-all) status_all ;;
 
521
        condrestart) condrestart ;;
 
522
        try-restart) condrestart ;;
 
523
        start-watchdog) start_watchdog ;;
 
524
        stop-watchdog) stop_watchdog ;;
 
525
        status-watchdog) status_watchdog ;;
 
526
        start-powercontrol) start_powercontrol ;;
 
527
        stop-powercontrol) stop_powercontrol ;;
 
528
        status-powercontrol) status_powercontrol ;;
 
529
        stop-all) stop_all ;;
 
530
        *) usage ;;
 
531
esac
 
532
 
 
533
exit ${RETVAL}
 
534
 
 
535
#############################################################################
 
536
# end of file
 
537
#############################################################################
 
538