Annotation of /mcore-src/trunk/mcore-tools/src/include/hwdetection.global.class.in
Parent Directory | Revision Log
Revision 1248 -
(hide annotations)
(download)
Wed Feb 2 20:20:24 2011 UTC (13 years, 4 months ago) by niro
Original Path: mcore-src/trunk/mcore-tools/daemon/include/hwdetection.global.class
File size: 5973 byte(s)
Wed Feb 2 20:20:24 2011 UTC (13 years, 4 months ago) by niro
Original Path: mcore-src/trunk/mcore-tools/daemon/include/hwdetection.global.class
File size: 5973 byte(s)
-initial version
1 | niro | 1248 | # $Id$ |
2 | |||
3 | ## hwdetection, needs >= sys-apps/hwinfo | ||
4 | |||
5 | # hwinfo wrapper to use hwinfo with sudo if requested | ||
6 | hwinfo() | ||
7 | { | ||
8 | local use_sudo="" | ||
9 | case ${SUDO} in | ||
10 | yes|y|true|1) use_sudo=sudo ;; | ||
11 | esac | ||
12 | |||
13 | ${use_sudo} /usr/sbin/hwinfo $@ | ||
14 | } | ||
15 | |||
16 | # get_hwinfo $hw_item | ||
17 | get_hwinfo() | ||
18 | { | ||
19 | local enable_desc="0" | ||
20 | |||
21 | if [[ $1 = --with-description ]] || [[ $1 = -d ]] | ||
22 | then | ||
23 | enable_desc=1 | ||
24 | shift | ||
25 | fi | ||
26 | |||
27 | local item="$1" | ||
28 | local all | ||
29 | local i | ||
30 | |||
31 | # handle special items | ||
32 | case ${item} in | ||
33 | memory) get_hwinfo_memory; return ;; | ||
34 | smp) get_hwinfo_smp; return ;; | ||
35 | esac | ||
36 | |||
37 | all=$(hwinfo --short --"${item}") | ||
38 | |||
39 | declare -i i=0 | ||
40 | while read device description | ||
41 | do | ||
42 | # skip the first line | ||
43 | (( i++ )) | ||
44 | [ ${i} -eq 1 ] && continue | ||
45 | |||
46 | if [[ ${enable_desc} = 1 ]] | ||
47 | then | ||
48 | echo "${device};${description}" | ||
49 | else | ||
50 | echo "${device}" | ||
51 | fi | ||
52 | done <<< "${all}" | ||
53 | } | ||
54 | |||
55 | |||
56 | # special memory case | ||
57 | get_hwinfo_memory() | ||
58 | { | ||
59 | local memory=$(hwinfo --memory | grep "Memory Size" | cut -d: -f2 | sed "s:\ ::") | ||
60 | echo "${memory}" | ||
61 | } | ||
62 | |||
63 | |||
64 | # special smp case | ||
65 | get_hwinfo_smp() | ||
66 | { | ||
67 | local smp=$(hwinfo --smp | grep "SMP support:" | cut -d: -f2 | sed "s:\ ::") | ||
68 | echo "${smp}" | ||
69 | } | ||
70 | |||
71 | |||
72 | # get_driver_modules $hw_item | ||
73 | get_driver_modules() | ||
74 | { | ||
75 | local item="$1" | ||
76 | local modules | ||
77 | |||
78 | # being little tricky here :) | ||
79 | # does following: | ||
80 | # grep: | ||
81 | # -> 'Driver Modules: "via82cxxx", "ide_cd"' | ||
82 | # cut: | ||
83 | # -> ' "via82cxxx", "ide_cd"' | ||
84 | # sed1: | ||
85 | # -> ' modules="via82cxxx", "ide_cd"' | ||
86 | # sed2: | ||
87 | # -> ' modules="via82cxxx ide_cd"' | ||
88 | # then evaluate -> eval modules="via82cxxx ide_cd" | ||
89 | # and we get a variable $modules with all mods | ||
90 | #eval $(hwinfo --"${item}" | grep "Driver Modules:" | cut -d: -f2 | sed -e "s:\":modules=\":" -e "s:\",\ \":\ :") | ||
91 | |||
92 | local i | ||
93 | for i in $(hwinfo --"${item}" | grep "Driver Modules:" | cut -d: -f2 ) | ||
94 | do | ||
95 | eval $(echo "${i}" | sed -e "s:\":modules=\"\${modules}\ :" -e "s:,:\ :") | ||
96 | done | ||
97 | remove_duplicates "${modules}" | ||
98 | } | ||
99 | |||
100 | # remove_duplicates $list | ||
101 | remove_duplicates() | ||
102 | { | ||
103 | local list="$@" | ||
104 | local fixed_list=":" | ||
105 | local i | ||
106 | |||
107 | for i in ${list} | ||
108 | do | ||
109 | if [[ -z $(echo "${fixed_list}" | fgrep ":${i}:") ]] | ||
110 | then | ||
111 | fixed_list="${fixed_list}${i}:" | ||
112 | fi | ||
113 | done | ||
114 | |||
115 | unset list | ||
116 | |||
117 | # remove all ':' and show the cleaned list | ||
118 | # this way fixes double spaces also | ||
119 | local counter | ||
120 | declare -i counter=0 | ||
121 | for i in $(echo ${fixed_list} | sed "s|:| |g") | ||
122 | do | ||
123 | (( counter++ )) | ||
124 | if [[ ${counter} -eq 1 ]] | ||
125 | then | ||
126 | list="${i}" | ||
127 | else | ||
128 | list+=" ${i}" | ||
129 | fi | ||
130 | done | ||
131 | |||
132 | echo "${list}" | ||
133 | } | ||
134 | |||
135 | get_x11_driver_modules() | ||
136 | { | ||
137 | local modules | ||
138 | modules="$(hwinfo --gfxcard | grep 'XFree86 v4 Server Module:' | sed 's/.*Module:\ \(.*\)/\1/')" | ||
139 | |||
140 | # remove duplicates from list and show it | ||
141 | remove_duplicates "${modules}" | ||
142 | } | ||
143 | |||
144 | # get_netcard_driver_modules device | ||
145 | # e.g. get_netcard_driver_modules eth0 | ||
146 | get_netcard_driver_modules() | ||
147 | { | ||
148 | local device="$1" | ||
149 | local modules | ||
150 | |||
151 | if [[ -z ${device} ]] | ||
152 | then | ||
153 | echo "Error: get_netcard_driver_module(): no device given" | ||
154 | return 1 | ||
155 | fi | ||
156 | |||
157 | modules=$(hwinfo --netcard | grep -B1 "Device File: ${device}" | sed 's/.*Modules: \"\(.*\)\"/\1/;q') | ||
158 | remove_duplicates "${modules}" | ||
159 | } | ||
160 | |||
161 | get_blkid_information() | ||
162 | { | ||
163 | local partition="$1" | ||
164 | local variable="$2" | ||
165 | local method | ||
166 | |||
167 | case $1 in | ||
168 | --uuid|-u) shift; method="-U"; partition="$1"; variable="$2" ;; | ||
169 | --label|-l) shift; method="-L"; partition="$1"; variable="$2" ;; | ||
170 | esac | ||
171 | |||
172 | if [[ -z ${partition} ]] | ||
173 | then | ||
174 | echo "Error: get_get_blkid_information()(): no partition given" | ||
175 | return 1 | ||
176 | fi | ||
177 | |||
178 | if [[ -z ${variable} ]] | ||
179 | then | ||
180 | echo "Error: get_get_blkid_information()(): no variable given" | ||
181 | return 1 | ||
182 | fi | ||
183 | |||
184 | blkid -o value -s "${variable}" "${method}" "${partition}" | ||
185 | } | ||
186 | |||
187 | get_fstype() | ||
188 | { | ||
189 | local partition="$1" | ||
190 | if [[ -z ${partition} ]] | ||
191 | then | ||
192 | echo "Error: get_fstype(): no partition given" | ||
193 | return 1 | ||
194 | fi | ||
195 | |||
196 | # does not work with uuids | ||
197 | #mount -f --guess-fstype ${partition} | ||
198 | |||
199 | get_blkid_information ${partition} TYPE | ||
200 | } | ||
201 | |||
202 | get_uuid() | ||
203 | { | ||
204 | local partition="$1" | ||
205 | if [[ -z ${partition} ]] | ||
206 | then | ||
207 | echo "Error: get_uuid(): no partition given" | ||
208 | return 1 | ||
209 | fi | ||
210 | |||
211 | # does not work with uuids | ||
212 | #mount -f --guess-fstype ${partition} | ||
213 | |||
214 | get_blkid_information ${partition} UUID | ||
215 | } | ||
216 | |||
217 | # create_initrd {/path/to/initrd kernelversion </path/to/config>} | ||
218 | # when nothing given then /boot/initrd-$(uname -r).img $(uname -r) will be used | ||
219 | # default config path is /etc/conf.d/mkinitrd | ||
220 | create_initrd() | ||
221 | { | ||
222 | local initrd | ||
223 | local kernel | ||
224 | local config | ||
225 | local chroot | ||
226 | #local root | ||
227 | local modules | ||
228 | # enabled framebuffer modules as default | ||
229 | local framebuffer=1 | ||
230 | |||
231 | # very basic getops | ||
232 | for i in $* | ||
233 | do | ||
234 | case $1 in | ||
235 | #--root|-r) shift; root="$1" ;; | ||
236 | --initrd|-i) shift; initrd="$1" ;; | ||
237 | --config|-c) shift; config="$1" ;; | ||
238 | --kernelversion|-v) shift; kernel="$1" ;; | ||
239 | --nofb) shift; framebuffer=0 | ||
240 | esac | ||
241 | shift | ||
242 | done | ||
243 | |||
244 | [[ -z ${initrd} ]] && initrd="/boot/initrd-$(uname -r).img" | ||
245 | [[ -z ${kernel} ]] && kernel="$(uname -r)" | ||
246 | [[ -z ${config} ]] && config="/etc/conf.d/mkinitrd" | ||
247 | |||
248 | if [[ ! -z ${INSTALL_ROOT} ]] | ||
249 | then | ||
250 | config="${INSTALL_ROOT}/${config}" | ||
251 | chroot="chrooted" | ||
252 | fi | ||
253 | |||
254 | # get various modules needed to boot | ||
255 | modules="$(get_driver_modules disk)" | ||
256 | modules+=" $(get_driver_modules scsi)" | ||
257 | modules+=" $(get_driver_modules cdrom)" | ||
258 | |||
259 | # check for special ide_disk drivers (ata support) | ||
260 | if [[ ! -z $(echo ${modules} | grep ide_disk) ]] | ||
261 | then | ||
262 | modules+=" $(grep ide_disk /proc/modules | cut -d' ' -f4 | sed '/-/d;s:,:\ :g')" | ||
263 | fi | ||
264 | |||
265 | # add some generic modules | ||
266 | modules+=" sg_mod sg loop sr_mod sd_mod ide-cd ide-cd_mod ide-disk" | ||
267 | |||
268 | # add generic framebuffer modules | ||
269 | [[ ${framebuffer} = 1 ]] && modules+=" uvesafb" | ||
270 | |||
271 | # remove all duplicate modules | ||
272 | modules="$(remove_duplicates ${modules})" | ||
273 | |||
274 | # create the config and an initrd | ||
275 | echo "# autogenerated config file" > ${config} | ||
276 | echo "MODULES=\"${modules}\"" >> ${config} | ||
277 | echo "IMAGE_TYPE=\"initramfs\"" >> ${config} | ||
278 | |||
279 | ${chroot} mkinitrd -f ${initrd} ${kernel} | ||
280 | } | ||
281 | |||
282 | chrooted() | ||
283 | { | ||
284 | local cmd="$@" | ||
285 | |||
286 | mount -t sysfs sysfs ${INSTALL_ROOT}/sys | ||
287 | mount -t proc proc ${INSTALL_ROOT}/proc | ||
288 | mount -o bind /dev ${INSTALL_ROOT}/dev | ||
289 | |||
290 | chroot ${INSTALL_ROOT} ${cmd} | ||
291 | |||
292 | umount ${INSTALL_ROOT}/dev | ||
293 | umount ${INSTALL_ROOT}/proc | ||
294 | umount ${INSTALL_ROOT}/sys | ||
295 | } |