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 |