Annotation of /tags/init-0_6_0/sbin/modules-update
Parent Directory | Revision Log
Revision 1278 -
(hide annotations)
(download)
Thu May 12 16:03:35 2011 UTC (13 years, 4 months ago) by niro
Original Path: trunk/magellan-initscripts/sbin/modules-update
File size: 10431 byte(s)
Thu May 12 16:03:35 2011 UTC (13 years, 4 months ago) by niro
Original Path: trunk/magellan-initscripts/sbin/modules-update
File size: 10431 byte(s)
-renamed modules.d -> modprobe.d
1 | niro | 2 | #!/bin/bash |
2 | niro | 698 | # vim:ts=4 |
3 | # Distributed under the terms of the GNU General Public License v2 | ||
4 | niro | 2 | # |
5 | niro | 698 | # This script will do: |
6 | # - create /etc/modules.conf from /etc/modules.d/* | ||
7 | # - create /etc/modprobe.conf from /etc/modprobe.d/* | ||
8 | # - update modules.dep if modules.conf has been updated so depmod doesnt whine | ||
9 | niro | 276 | # |
10 | niro | 698 | # This is all for backwards compatibility. In the perfect world, we would be |
11 | # running a linux-2.6 kernel and not have any modules.d directory. Then there | ||
12 | # would be no work for us as module-init-tools automatically scans modprobe.d. | ||
13 | # Until that happens, we'll keep scanning and warning and being a pita. | ||
14 | niro | 276 | # |
15 | niro | 2 | |
16 | |||
17 | niro | 698 | MROOT="${MROOT%/}/" |
18 | [ "${MROOT}" = "${MROOT#/}" ] && MROOT="${PWD}/${MROOT}" | ||
19 | cd "${MROOT}" | ||
20 | |||
21 | argv0=${0##*/} | ||
22 | . /etc/init.d/functions || { | ||
23 | echo "${argv0}: Could not source /etc/init.d/functions!" 1>&2 | ||
24 | exit 1 | ||
25 | } | ||
26 | umask 022 | ||
27 | esyslog() { :; } | ||
28 | export PATH=/sbin:${PATH} | ||
29 | |||
30 | niro | 276 | # |
31 | niro | 698 | # Setup some variables |
32 | niro | 276 | # |
33 | niro | 2 | |
34 | niro | 1278 | HEADER="### This file is automatically generated by modules-update" |
35 | HEADER_OLD="### This file is automatically generated by update-modules" | ||
36 | VERSION="1.5" | ||
37 | niro | 2 | |
38 | niro | 698 | # |
39 | niro | 276 | # Parse command-line |
40 | niro | 698 | # |
41 | |||
42 | VERBOSE=0 | ||
43 | DEBUG=0 | ||
44 | FORCE="false" | ||
45 | BACKUP="false" | ||
46 | KV= | ||
47 | while [ -n "$1" ] ; do | ||
48 | case $1 in | ||
49 | --assume-kernel=*) KV=${1#*=};; | ||
50 | -b|--backup) BACKUP="true";; | ||
51 | -f|--force|force) FORCE="true";; | ||
52 | -v|--verbose) ((VERBOSE+=1));; | ||
53 | -d|--debug) ((DEBUG+=1));; | ||
54 | niro | 1278 | -V|--version) exec echo "${argv0}: ${VERSION}";; |
55 | niro | 698 | -h|--help) |
56 | cat <<-EOF | ||
57 | niro | 1278 | Usage: modules-update [options] |
58 | niro | 698 | |
59 | Options: | ||
60 | --assume-kernel=KV Assume the kernel is at least version KV | ||
61 | -b, --backup Backup existing config files (add .old ext) | ||
62 | -f, --force Force execution in face of bad things | ||
63 | -v, --verbose Be a bit more verbose in what we do | ||
64 | -d, --debug Helpful debug output | ||
65 | -V, --version Dump version info | ||
66 | -h, --help This help screen, duh | ||
67 | EOF | ||
68 | exit 0 | ||
69 | ;; | ||
70 | niro | 276 | *) |
71 | echo "Error: I don't understand $1" | ||
72 | niro | 698 | exit 1 |
73 | ;; | ||
74 | niro | 276 | esac |
75 | shift | ||
76 | done | ||
77 | niro | 2 | |
78 | niro | 698 | if [ ! -w ./etc ] ; then |
79 | echo "You must be root to do this" | ||
80 | exit 2 | ||
81 | fi | ||
82 | niro | 276 | |
83 | niro | 698 | [ ${DEBUG} -gt 0 ] && set -x |
84 | |||
85 | veinfo() { [ ${VERBOSE} -gt 0 ] && echo "$*" ; return 0 ; } | ||
86 | vewarn() { [ ${VERBOSE} -gt 0 ] && echo "$*" ; return 0 ; } | ||
87 | |||
88 | [ "${MROOT}" != "/" ] && veinfo "Operating on MROOT = '${MROOT}'" | ||
89 | |||
90 | # | ||
91 | # Let's check the optimal case first: nothing to do | ||
92 | # | ||
93 | if ! ${FORCE} ; then | ||
94 | if [ ! -d "./etc/modules.d" ] ; then | ||
95 | if [ ! -d "./etc/modprobe.d" ] ; then | ||
96 | veinfo "No /etc/modules.d or /etc/modprobe.d dir; Nothing to do!" | ||
97 | exit 0 | ||
98 | |||
99 | elif [ -e "./etc/modprobe.conf" ] ; then | ||
100 | vewarn "You should put settings in /etc/modprobe.d/ rather than modprobe.conf" | ||
101 | |||
102 | elif [ -e "./etc/modules.conf" ] ; then | ||
103 | vewarn "If you only run linux-2.4, you should delete /etc/modules.conf" | ||
104 | |||
105 | else | ||
106 | veinfo "We have just /etc/modprobe.d; Nothing to do!" | ||
107 | exit 0 | ||
108 | fi | ||
109 | else | ||
110 | vewarn "You have /etc/modules.d, so things need to get coalesced" | ||
111 | fi | ||
112 | fi | ||
113 | |||
114 | # | ||
115 | # Build list of config files to generate and verify none | ||
116 | # have been modified in any way | ||
117 | # | ||
118 | for x in modprobe.conf modules.conf ; do | ||
119 | x="./etc/${x}" | ||
120 | [ -r ${x} ] || continue | ||
121 | |||
122 | niro | 1278 | _header="$(sed -ne 1p ${x})" |
123 | if [ "${_header}" != "${HEADER}" ] && [ "${_header}" != "${HEADER_OLD}" ]; then | ||
124 | niro | 698 | echo "Warning: ${x#.} has not been automatically generated" |
125 | |||
126 | if ${FORCE} ; then | ||
127 | echo "--force specified, (re)generating file anyway" | ||
128 | else | ||
129 | niro | 1278 | echo "Use \"modules-update force\" to force (re)generation" |
130 | niro | 698 | exit 1 |
131 | fi | ||
132 | fi | ||
133 | done | ||
134 | |||
135 | |||
136 | # | ||
137 | # If the system doesnt have old modutils, then this is prob linux-2.6 only | ||
138 | # | ||
139 | if type -P modprobe.old > /dev/null || \ | ||
140 | LC_ALL=C modprobe -V 2>/dev/null | grep -qs "modprobe version" | ||
141 | niro | 2 | then |
142 | niro | 698 | GENERATE_OLD="true" |
143 | niro | 276 | else |
144 | niro | 698 | GENERATE_OLD="false" |
145 | niro | 2 | fi |
146 | |||
147 | |||
148 | # Reset the sorting order since we depend on it | ||
149 | export LC_COLLATE="C" | ||
150 | |||
151 | niro | 698 | KV=${KV:-$(uname -r)} |
152 | |||
153 | |||
154 | # | ||
155 | # Desc: backup a config file if need be and replace with new one | ||
156 | # Usage: backup <old config file to backup> <new config file to replace with> | ||
157 | # Ex: backup /etc/modules.conf /etc/modules.conf.tempfile | ||
158 | # | ||
159 | backup() { | ||
160 | if ${BACKUP} && [ -e "$1" ] ; then | ||
161 | mv -f "$1" "$1".old | ||
162 | fi | ||
163 | mv -f "$2" "$1" | ||
164 | niro | 2 | } |
165 | |||
166 | |||
167 | niro | 698 | # |
168 | # Desc: Create module header | ||
169 | # Usage: create_header <config dir> | ||
170 | # Ex: create_header /etc/modules.d | ||
171 | create_header() { | ||
172 | local moddir=$1 | ||
173 | niro | 105 | |
174 | niro | 698 | cat <<-EOF |
175 | ${HEADER} | ||
176 | # | ||
177 | # Please do not edit this file directly. If you want to change or add | ||
178 | # anything please take a look at the files in ${moddir} and read | ||
179 | niro | 1278 | # the manpage for modules-update(8). |
180 | niro | 698 | # |
181 | EOF | ||
182 | } | ||
183 | niro | 2 | |
184 | niro | 698 | |
185 | # | ||
186 | # Desc: Combine all config files in a dir and place output in a file | ||
187 | # Usage: generate_config <output config file> <config dir> <reference config dir> <silent> | ||
188 | # Ex: generate_config /etc/modules.conf /etc/modules.d | ||
189 | # | ||
190 | niro | 276 | generate_config() { |
191 | niro | 698 | local config=$1 |
192 | local moddir=$2 | ||
193 | local refdir=$3 | ||
194 | local silent=$4 | ||
195 | local tmpfile="${config}.$$" | ||
196 | niro | 2 | |
197 | niro | 698 | [ -z "${silent}" ] && echo "Updating ${config#./etc/}" |
198 | niro | 2 | |
199 | niro | 698 | create_header ${refdir:-${moddir}} > "${tmpfile}" |
200 | niro | 2 | |
201 | niro | 698 | for cfg in "${moddir}"/* ; do |
202 | [ -d "${cfg}" ] && continue | ||
203 | [ ! -r "${cfg}" ] && continue | ||
204 | niro | 2 | |
205 | niro | 698 | # Skip backup and RCS files #20597 |
206 | case ${cfg} in *~|*.bak|*,v) continue;; esac | ||
207 | niro | 2 | |
208 | niro | 698 | # If config file is found in the reference dir, then skip it |
209 | [ -n "${refdir}" ] && [ -e "${refdir}/${cfg##*/}" ] && continue | ||
210 | |||
211 | ( | ||
212 | niro | 1278 | echo "### modules-update: start processing ${cfg#.}" |
213 | niro | 698 | if [ -x "${cfg}" ] ; then |
214 | niro | 276 | # $cfg can be executable; nice touch, Wichert! :) |
215 | niro | 698 | "${cfg}" |
216 | niro | 276 | else |
217 | niro | 698 | cat "${cfg}" |
218 | niro | 276 | fi |
219 | niro | 698 | echo |
220 | niro | 1278 | echo "### modules-update: end processing ${cfg#.}" |
221 | niro | 698 | echo |
222 | ) >> "${tmpfile}" | ||
223 | niro | 276 | done |
224 | niro | 2 | |
225 | niro | 698 | backup "${config}" "${tmpfile}" |
226 | |||
227 | niro | 276 | return 0 |
228 | } | ||
229 | niro | 105 | |
230 | niro | 698 | |
231 | # | ||
232 | # Generate the old modules.conf file based upon all the snippets in | ||
233 | # modules.d. Since modprobe doesnt handle modules.d, we need to gather | ||
234 | # the files together in modules.conf for it. | ||
235 | # | ||
236 | |||
237 | if [ ! -d "./etc/modules.d" ] ; then | ||
238 | veinfo "No need to generate modules.conf :)" | ||
239 | |||
240 | elif ${FORCE} || is_older_than ./etc/modules.conf ./etc/modules.d ; then | ||
241 | generate_config ./etc/modules.conf ./etc/modules.d | ||
242 | |||
243 | else | ||
244 | veinfo "modules.conf: already up-to-date wheatness" | ||
245 | fi | ||
246 | |||
247 | # | ||
248 | # Call depmod to keep insmod from complaining that modules.conf is more | ||
249 | # recent then the modules.dep file. | ||
250 | # | ||
251 | if [ -e "./etc/modules.conf" ] ; then | ||
252 | depfile=$( | ||
253 | # the modules.conf file has optional syntax: | ||
254 | # depfile=/path/to/modules.dep | ||
255 | ret=$(sed -n -e '/^[[:space:]]*depfile=/s:.*=::p' ./etc/modules.conf) | ||
256 | eval echo "${ret:-/lib/modules/${KV}/modules.dep}" | ||
257 | ) | ||
258 | |||
259 | if [ -d "${depfile%/*}" ] ; then | ||
260 | if [ ./etc/modules.conf -nt "${depfile}" ] ; then | ||
261 | arch=$(uname -m) | ||
262 | echo "Updating modules.dep" | ||
263 | for cfg in /lib/modules/${KV}/build /usr/src/linux-${KV} \ | ||
264 | /lib/modules/${KV} /boot /usr/src/linux "" | ||
265 | do | ||
266 | cfg=".${cfg}/System.map" | ||
267 | for suffix in -genkernel-${arch}-${KV} -genkernel-'*'-${KV} -${KV} "" ; do | ||
268 | scfg=$(echo ${cfg}${suffix}) | ||
269 | scfg=${scfg%% *} | ||
270 | [ -f "${scfg}" ] && cfg=${scfg} && break 2 | ||
271 | done | ||
272 | cfg="" | ||
273 | done | ||
274 | [ -n "${cfg}" ] && cfg="-F ${cfg}" | ||
275 | depmod -b "${ROOT}" -a ${cfg} ${KV} | ||
276 | veinfo "Ran: depmod -b '${ROOT}' -a ${cfg} ${KV}" | ||
277 | else | ||
278 | veinfo "modules.dep: already up-to-date goodness" | ||
279 | fi | ||
280 | else | ||
281 | vewarn "The dir '${depfile}' does not exist, skipping call to depmod" | ||
282 | niro | 2 | fi |
283 | niro | 276 | fi |
284 | niro | 105 | |
285 | niro | 698 | |
286 | # | ||
287 | # Generate the new modprobe.conf file if possible. What this entails is | ||
288 | # grabbing details from the old modprobe via the -c option and sticking | ||
289 | # it in the newer config file. This is useful for backwards compat support | ||
290 | # and for packages that provide older style /etc/modules.d/ files but not | ||
291 | # newer style /etc/modprobe.d/ files. | ||
292 | # | ||
293 | # First we try to use the script `generate-modprobe.conf` from the | ||
294 | # module-init-tools and if that fails us, we try and generate modprobe.conf | ||
295 | # ourselves from the /etc/modules.d/ files. | ||
296 | # | ||
297 | if ! type -P generate-modprobe.conf > /dev/null ; then | ||
298 | vewarn "Skipping /etc/modprobe.conf generation (generate-modprobe.conf doesn't exist)" | ||
299 | |||
300 | elif ! ${FORCE} && ! is_older_than ./etc/modprobe.conf ./etc/modules.d ./etc/modprobe.d ; then | ||
301 | veinfo "modprobe.conf: already up-to-date nutness" | ||
302 | |||
303 | niro | 1278 | elif [ ! -e ./etc/modules.conf -a ! -e ./etc/modules.d ] ; then |
304 | veinfo "No need to generate modprobe.conf :)" | ||
305 | rm -f ./etc/modprobe.conf | ||
306 | |||
307 | niro | 698 | else |
308 | # | ||
309 | # First, bitch like crazy | ||
310 | # | ||
311 | for f in ./etc/modules.d/* ; do | ||
312 | # hack: ignore baselayout ;x | ||
313 | case ${f##*/} in | ||
314 | aliases|i386) continue;; | ||
315 | esac | ||
316 | [ -e "${f}" ] || continue | ||
317 | if [ ! -e "./etc/modprobe.d/${f##*/}" ] ; then | ||
318 | echo "Please file a bug about ${f#.}: it needs an /etc/modprobe.d/${f##*/}" | ||
319 | niro | 276 | fi |
320 | niro | 698 | done |
321 | |||
322 | generated_ok=0 | ||
323 | tmpfile="./etc/modprobe.conf.$$" | ||
324 | |||
325 | # | ||
326 | # First we try to use regular generate-modprobe.conf | ||
327 | # | ||
328 | if ${GENERATE_OLD} ; then | ||
329 | echo "Updating modprobe.conf" | ||
330 | create_header /etc/modprobe.d > "${tmpfile}" | ||
331 | if generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \ | ||
332 | >> "${tmpfile}" 2> "${tmpfile}.err" | ||
333 | niro | 2 | then |
334 | niro | 698 | backup "./etc/modprobe.conf" "${tmpfile}" |
335 | generated_ok=1 | ||
336 | niro | 2 | else |
337 | niro | 698 | [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err" |
338 | echo "Warning: could not generate /etc/modprobe.conf!" | ||
339 | niro | 2 | fi |
340 | niro | 698 | fi |
341 | niro | 276 | |
342 | niro | 698 | # |
343 | # If the helper script failed, we fall back to doing it by hand | ||
344 | # | ||
345 | if [[ ${generated_ok} -eq 0 ]] ; then | ||
346 | echo "Updating modprobe.conf by hand" | ||
347 | niro | 276 | |
348 | niro | 698 | generate_config ./etc/modprobe.conf ./etc/modules.d ./etc/modprobe.d 0 |
349 | create_header /etc/modprobe.d > "${tmpfile}" | ||
350 | niro | 276 | |
351 | niro | 698 | # Just use generate-modprobe.conf to filter compatible syntax |
352 | if TESTING_MODPROBE_CONF=./etc/modprobe.conf \ | ||
353 | generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \ | ||
354 | >> "${tmpfile}" 2> "${tmpfile}.err" | ||
355 | then | ||
356 | # we use mv here instead of backup_config() as the call to | ||
357 | # generate_config() above already took care of the backup | ||
358 | mv -f "${tmpfile}" "./etc/modprobe.conf" | ||
359 | else | ||
360 | [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err" | ||
361 | echo "Warning: could not generate /etc/modprobe.conf!" | ||
362 | niro | 276 | fi |
363 | niro | 2 | fi |
364 | |||
365 | niro | 698 | # |
366 | # Now append all the new files ... modprobe will not scan /etc/modprobe.d/ | ||
367 | # if /etc/modprobe.conf exists, so we need to append /etc/modprobe.conf with | ||
368 | # /etc/modprobe.d/* ... http://bugs.gentoo.org/145962 | ||
369 | # | ||
370 | if [[ -e ./etc/modprobe.conf ]] ; then | ||
371 | for cfg in ./etc/modprobe.d/* ; do | ||
372 | [ -d "${cfg}" ] && continue | ||
373 | [ ! -r "${cfg}" ] && continue | ||
374 | |||
375 | # Skip backup and RCS files #20597 | ||
376 | case ${cfg} in *~|*.bak|*,v) continue;; esac | ||
377 | |||
378 | ( | ||
379 | echo | ||
380 | niro | 1278 | echo "### modules-update: start processing ${cfg#.}" |
381 | niro | 698 | cat "${cfg}" |
382 | niro | 1278 | echo "### modules-update: end processing ${cfg#.}" |
383 | niro | 698 | ) >> "./etc/modprobe.conf" |
384 | done | ||
385 | niro | 276 | fi |
386 | niro | 698 | |
387 | rm -f "${tmpfile}" "${tmpfile}.err" | ||
388 | niro | 2 | fi |
389 | |||
390 | niro | 698 | : # make sure we fall through with 0 exit status |
Properties
Name | Value |
---|---|
svn:executable | * |