Magellan Linux

Contents of /trunk/magellan-initscripts/sbin/modules-update

Parent Directory Parent Directory | Revision Log Revision Log


Revision 698 - (show annotations) (download)
Tue Mar 25 21:41:22 2008 UTC (16 years, 1 month ago) by niro
File size: 10179 byte(s)
-using the complete rewrite from gentoo-upstream to be fully compat with >=module-init-tools-3.4

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

Properties

Name Value
svn:executable *