summaryrefslogtreecommitdiff
blob: 7efc15a7bc45ac19f309ab30e5e925c143904c30 (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
#!/sbin/runscript
#
# dellomsa-drivers
#
#           Dell OMSA driver module loading script
#
#           This script takes care of loading correct driver modules
#	    (if available) for the OpenManage Server Administrator.
#	    It checks that the server really is Dell and finds out
#	    which environment driver to load (dcdesm/dcdtvm/dcdipm).
#	    Module "dcdbas" is the base module and is always loaded.
#	    This script also creates necessary devices nodes in /dev.
#

OMSADIR=/opt/dell/srvadmin

depend() {
	use logger net
}

checkconfig() {
	if [ ! -d ${OMSADIR} ]; then
		eerror "Directory ${OMSADIR} does not exist"
		return 1
	fi
	if [ ! -x ${OMSADIR}/hapi/bin/dchcfg32 ]; then
		eerror "File ${OMSADIR}/hapi/bin/dchcfg32 does not exist"
		return 1
	fi
	if [ ! -x ${OMSADIR}/omil/prereqcheck/sysreport ]; then
		eerror "File ${OMSADIR}/omil/prereqcheck/sysreport does not exist"
		return 1
	fi
}

checkmodules() {
    	# check that the system is Dell (output contains "System ID" if Dell)
    	${OMSADIR}/omil/prereqcheck/sysreport | grep -q "System ID" && true
    	if [ $? -ne 0 ]; then
        	eerror "Non-Dell system, not loading drivers."
        	return 1
    	fi

    	# get the running kernel version
    	KVER=`/bin/uname -r`

    	# check that the modules exist
    	MODULESMISSING=0
    	MODULES="dcdbas dcdtvm dcdesm dcdipm"
    	for MODULE in ${MODULES}; do
        	if [ ! -f /lib/modules/${KVER}/extra/${MODULE}.ko ]; then
	    		# some of the modules are missing
            		eerror "driver modules unavailable for ${KVER}"
            		return 1
        	fi
    	done
}

loadmodules() {
	ebegin "Loading base dell module"
    	# first load the base module "dcdbas"
    	/sbin/modprobe dcdbas
	eend $?

    	# check that dcdbas is now listed in /proc/devices
    	grep -q dcdbas /proc/devices && true
    	if [ $? -ne 0 ]; then
        	eerror "Error! Something is really wrong: dcdbas module was loaded"
        	eerror "successfully, but dcdbas is not listed in /proc/devices!"
        	return 1
    	fi

    	# re-create required device nodes in /dev

    	# base device node is always re-created
    	EsmBASDevMAJOR=`grep dcdbas /proc/devices | awk '{print $1}'`
    	if [ -e /dev/EsmBASDev0 ]; then # /dev/EsmBASDev exists
        	rm -f /dev/EsmBASDev0
    	fi
    	mknod -m 0600 /dev/EsmBASDev0 c ${EsmBASDevMAJOR} 0
    	ln -sf /dev/EsmBASDev0 /dev/EsmBASDev

    	# find out which environment module to use (dcdesm|dcdtvm|dcdipm)
	export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${OMSADIR}/hapi/bin/
    	${OMSADIR}/hapi/bin/dchcfg32 command=getsystype >/dev/null 2>&1 && true
    	case "$?" in
        	1) # TVM
            		ebegin "Loading [TVM]"
            		/sbin/modprobe dcdtvm
            		EsmTVMDevMAJOR=`grep dcdtvm /proc/devices | awk '{print $1}'`
            		if [ -e /dev/EsmTVMDev0 ]; then # /dev/EsmTVMDev exists
                		rm -f /dev/EsmTVMDev0
            		fi
            		mknod -m 0600 /dev/EsmTVMDev0 c ${EsmTVMDevMAJOR} 0
            		ln -sf /dev/EsmTVMDev0 /dev/EsmTVMDev
			eend $?
            		;;
        	2) # ESM
            		ebegin "Loading [ESM]"
            		/sbin/modprobe dcdesm
            		EsmESMDevMAJOR=`grep dcdesm /proc/devices | awk '{print $1}'`
            		if [ -e /dev/EsmESM2Dev0 ]; then # /dev/EsmESM2Dev exists
                		rm -f /dev/EsmESM2Dev0
            		fi
            		mknod -m 0600 /dev/EsmESM2Dev0 c ${EsmESMDevMAJOR} 0
            		ln -sf /dev/EsmESM2Dev0 /dev/EsmESM2Dev
			eend $?
            		;;
        	4) # IPMI
            		ebegin "Loading [IPMI]"
            		/sbin/modprobe dcdipm
            		EsmIPMDevMAJOR=`grep dcdipm /proc/devices | awk '{print $1}'`
            		if [ -e /dev/EsmIPMDev0 ]; then # /dev/EsmIPMDev exists
                		rm -f /dev/EsmIPMDev0
            		fi
            		mknod -m 0600 /dev/EsmIPMDev0 c ${EsmIPMDevMAJOR} 0
            		ln -sf /dev/EsmIPMDev0 /dev/EsmIPMDev
			eend $?
            		;;
        	*) # unknown or none
            		einfo "unknown env. platform, env. driver not loaded."
            		;;
    	esac
}
start(){
	checkconfig || return 1
	checkmodules || return 1
	loadmodules
}

stop() {
	ebegin "Unloading dell drivers"
    	/sbin/rmmod dcdtvm >/dev/null 2>&1 && true
   	/sbin/rmmod dcdesm >/dev/null 2>&1 && true
    	/sbin/rmmod dcdipm >/dev/null 2>&1 && true
    	/sbin/rmmod dcdbas >/dev/null 2>&1 && true
	eend $?
}