Gentoo Archives: gentoo-commits

From: "Daniel Drake (dsd)" <dsd@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-x86 commit in sys-kernel/module-rebuild/files: module-rebuild-0.6
Date: Fri, 31 Oct 2008 22:53:46
Message-Id: E1Kw2sB-0000RH-QP@stork.gentoo.org
1 dsd 08/10/31 22:53:43
2
3 Added: module-rebuild-0.6
4 Log:
5 Pass --ignore-default-opts to emerge, thanks to Allen Brooker in bug #137056. Add paludis support thanks to Jack Byer in bug #207681. Fix typo in error message thanks to Dan Wallis in bug #238044.
6 (Portage version: 2.2_rc12/cvs/Linux 2.6.27-gentoo-r2 i686)
7
8 Revision Changes Path
9 1.1 sys-kernel/module-rebuild/files/module-rebuild-0.6
10
11 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/sys-kernel/module-rebuild/files/module-rebuild-0.6?rev=1.1&view=markup
12 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/sys-kernel/module-rebuild/files/module-rebuild-0.6?rev=1.1&content-type=text/plain
13
14 Index: module-rebuild-0.6
15 ===================================================================
16 #!/bin/bash
17 #######################################
18 # Inspiration from bug #34921
19 # Thanks to Paul Varner
20
21 # Distributed under the GPL v2
22 # Written by John Mylchreest (johnm@g.o)
23 # Copyright Gentoo Linux
24
25 if [[ `id -u` != 0 ]]; then
26 echo "This application must be run as root."
27 exit 1
28 fi
29
30 R_VERSION="0.5"
31 R_MODULES="${ROOT}/var/lib/module-rebuild/moduledb"
32 R_PORTAGEQ="`which portageq 2>/dev/null`"
33 if [[ -z ${R_PORTAGEQ} ]]; then
34 echo "** FATAL: Unable to find portageq."
35 exit 1
36 fi
37 R_PORTDIR=`${R_PORTAGEQ} portdir`
38 R_VDBPATH=`${R_PORTAGEQ} vdb_path`
39 R_OPTION_X=0;
40 R_OPTION_C=0;
41 R_OPTION_PM="portage";
42
43 package_valid() {
44 local package=${1}
45 [[ -z ${package} ]] && return 1
46 [[ -z ${package/*\/*} ]] && return 0 || return 1
47 }
48
49 package_valid_strict() {
50 local package=${1}
51 package_valid ${package} && [[ -z ${package%%*-[0-9]*} ]] && return 0 || return 1
52 }
53
54 package_exists() {
55 local package=${1}
56
57 package=${package%-[0-9]*}
58 if $(${R_PORTAGEQ} has_version / ${package}); then
59 return 0
60 else
61 return 1
62 fi
63 }
64
65 db_module_exists() {
66 local line package=${1}
67
68 for line in `<${R_MODULES}`; do
69 [[ -z ${line/*${package}*} ]] && return 0
70 done
71 return 1
72 }
73
74 db_module_toggle() {
75 local package=${1} toggleto=${2} togglefrom line
76
77 if db_module_exists ${package}; then
78 line=`grep ${package} ${R_MODULES}`
79 togglefrom=${line#*:}
80 togglefrom=${togglefrom/:*}
81 if [[ -z ${toggleto} ]]; then
82 [[ ${togglefrom} = 0 ]] && toggleto=1 || toggleto=0
83 fi
84 echo "** Setting ${package}; rebuild=${toggleto}."
85 sed -i -e "s:\(.\:\)\([01]\)\(\:${package}\):\1${toggleto}\3:g" ${R_MODULES}
86 else
87 echo "** ${package} not found in moduledb."
88 fi
89 }
90
91 db_module_add() {
92 local package=${1}
93
94 if db_module_exists ${package}; then
95 echo -e "${C_BOLD}** Module already exists in moduledb.${C_NORM}"
96 db_module_toggle ${package} 1
97 return 0
98 else
99 if package_exists ${package}; then
100 echo -e "${C_BOLD}${C_GREEN}** Adding ${package} to moduledb.${C_NORM}"
101 echo "m:1:${package}" >> ${R_MODULES}
102 return 0
103 else
104 echo -e "${C_RED}** Unable to locate an available ebuild for ${package}.${C_NORM}"
105 echo "** Please manually emerge ${package} first."
106 fi
107 fi
108 return 1
109 }
110
111 db_module_del() {
112 local package=${1}
113
114 if db_module_exists ${package}; then
115 echo "** Removing ${package} from moduledb."
116 sed -ie "/.*${package/\//\\/}.*/d" ${R_MODULES}
117 return 0
118 else
119 echo "** ${package} not found in moduledb."
120 return 1
121 fi
122 }
123
124 db_module_list() {
125 local line auto pkg a=0 b=0
126
127 for line in `<${R_MODULES}`; do
128 mode=${line:0:1}
129 pkg=${line#*:}
130 auto=${pkg/:*}
131 pkg=${pkg/*:}
132
133 if [[ ${R_OPTION_X} == 1 ]]; then
134 pkg=${pkg%-[0-9]*}
135 package_valid ${pkg}
136 else
137 package_valid_strict ${pkg} && pkg="=${pkg}"
138 fi
139
140 if [[ ${auto} = 1 ]]; then
141 tomerge[${a}]=${pkg}
142 a=$((${a} + 1))
143 else
144 toignore[${b}]=${pkg}
145 b=$((${b} + 1))
146 fi
147 done
148
149 pkg="${tomerge[@]}${toignore[@]}"
150 if [[ -z ${pkg} ]]; then
151 echo -e "${C_BOLD}${C_RED}** There are no known modules. Quitting.${C_NORM}"
152 exit 1
153 fi
154
155 if [[ -n ${tomerge[@]} ]]; then
156 echo -e "${C_BOLD}${C_GREEN}** Packages which I will emerge are:${C_NORM}"
157 for pkg in ${tomerge[@]}; do
158 echo -e "\t${pkg}"
159 done
160 fi
161
162 if [[ -n ${toignore[@]} ]]; then
163 echo -e "${C_BOLD}${C_GREEN}** Packages which I will ignore are:${C_NORM}"
164 for pkg in ${toignore[@]}; do
165 echo -e "\t${pkg}"
166 done
167 fi
168 }
169
170 db_module_populate() {
171 local i x=0 pkg version list pad
172
173 # Lets find them all
174 # chances are we will get a few dupes in here.
175 version=`uname -r`
176 for pkg in `grep -i /lib/modules/${version}/.*o ${R_VDBPATH}/*/*/CONTENTS`; do
177 pad=""; x=0;
178
179 if [[ -z ${pkg//${R_VDBPATH}*} ]]; then
180 for((i=0;i<=${#pkg};i++)); do
181 [[ ${pkg:${i}:1} = / ]] && x=$((${x} + 1));
182 [[ ${x} == 4 ]] || [[ ${x} == 5 ]] && pad="${pad}${pkg:${i}:1}";
183 done
184 # Remove any dupes
185 list=${list//${pad:1}}
186 list="${list} ${pad:1}"
187 fi
188 done
189
190 for pkg in ${list}; do
191 db_module_add ${pkg};
192 done
193 }
194
195 db_module_merge() {
196 local i pkg
197
198 echo -e "${C_BOLD}** Preparing to merge modules:${C_NORM}"
199 db_module_list >/dev/null
200
201 if [[ -z ${tomerge[@]} ]]; then
202 echo -e "${C_BOLD}${C_RED}** No packages to merge. Quitting.${C_NORM}"
203 exit 1
204 fi
205
206 echo -e "${C_BOLD}${C_GREEN}** Packages which I will emerge are:"${C_NORM}
207 for pkg in ${tomerge[@]}; do
208 echo -e "\t${pkg}"
209 done
210
211 for((i=1;i<6;i++)); do
212 echo -en "${C_BOLD}${C_RED}$((6 - ${i})) ${C_NORM}"
213 sleep 1
214 done
215 echo
216
217 case ${R_OPTION_PM} in
218 portage) emerge --ignore-default-opts --oneshot --nodeps ${tomerge[@]};;
219 paludis) paludis --install --preserve-world --continue-on-failure if-satisfied --dl-upgrade as-needed ${tomerge[@]};;
220 *) echo "** Unsupported package manager"; phelp; exit 1;;
221 esac
222 }
223
224 phelp() {
225 cat << EOF
226 module-rebuild [options] action [category/package]
227 Version: ${R_VERSION}
228
229 Where options are:
230 -X - Emerge based on package names,
231 not exact versions.
232 -C - Disable all coloured output.
233 -P foo - Specify package manager: portage(default) or paludis
234
235 Where action is one of:
236 add - Add package to moduledb.
237 del - Delete a package from moduledb.
238 toggle - Toggle auto-rebuild of Package.
239 list - List packages to auto-rebuild.
240 rebuild - Rebuild packages.
241 populate - Populate the database with any
242 packages which currently install
243 drivers into the running kernel.
244
245 EOF
246
247 }
248
249 check_validity() {
250 local package=${1} strict=${2:-0} ret=1
251
252 [[ ${strict} = 0 ]] && package_valid ${package} && ret=0
253 [[ ${strict} = 1 ]] && package_valid_strict ${package} && ret=0
254
255 if [[ ${ret} != 0 ]]; then
256 echo "** Please pass the fully qualified package. For example:"
257 echo "** media-video/nvidia-kernel-1.0.7174"
258 exit 1
259 fi
260 }
261
262 while getopts "XCP:" options; do
263 case ${options} in
264 X) R_OPTION_X='1';;
265 C) R_OPTION_C='1';;
266 P) R_OPTION_PM="$OPTARG";;
267 *) phelp; exit 1;;
268 esac
269 done
270
271 if [[ ${R_OPTION_C} == 0 ]]; then
272 C_BOLD='\e[1m'
273 C_NORM='\e[0m'
274 C_GREEN='\e[32m'
275 C_RED='\e[31m'
276 else
277 C_BOLD=''
278 C_NORM=''
279 C_GREEN=''
280 C_RED=''
281 fi
282
283 x=0
284 for i in ${@:${OPTIND}}; do
285 if [[ ${i:0:1} != - ]]; then
286 R_PARAMS[${x}]=${i}
287 x=$((${x} + 1))
288 fi
289 done
290 unset i x
291
292 # If the moduledb doesnt exist, lets populate it automatically.
293 if [[ ! -f ${R_MODULES} ]]; then
294 echo -e "${C_BOLD}${C_RED}No moduledb found...${C_NORM}"
295
296 [[ ! -d ${ROOT}/var/lib/module-rebuild/ ]] && \
297 echo -e "${C_BOLD}Creating moduledb state directory.${C_NORM}"; \
298 mkdir -p ${ROOT}/var/lib/module-rebuild/
299
300 echo -e "${C_BOLD}Populating moduledb...${C_NORM}"
301 touch ${R_MODULES}
302 R_PARAMS[0]=populate
303 fi
304
305 case ${R_PARAMS[0]} in
306 add) check_validity ${R_PARAMS[1]} 1; db_module_add ${R_PARAMS[1]};;
307 del) check_validity ${R_PARAMS[1]}; db_module_del ${R_PARAMS[1]};;
308 toggle) check_validity ${R_PARAMS[1]}; db_module_toggle ${R_PARAMS[1]};;
309 list) db_module_list;;
310 rebuild) db_module_merge;;
311 populate) db_module_populate;;
312 *) phelp; exit 1;;
313 esac