Contents of /trunk/mage/usr/lib/mage/convert_databases_meta.sh
Parent Directory | Revision Log
Revision 491 -
(show annotations)
(download)
(as text)
Wed May 2 14:54:21 2007 UTC (17 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 13099 byte(s)
Wed May 2 14:54:21 2007 UTC (17 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 13099 byte(s)
-added metafile conversion script
1 | #!/bin/bash |
2 | |
3 | source /etc/mage.rc.global |
4 | source /etc/mage.rc |
5 | |
6 | |
7 | #### fixups #### |
8 | #MLIBDIR=/home/tjoke/alx-cvs/magellan-src/mage/usr/lib/mage |
9 | MLIBDIR=/home/rogalla/cvsroot/magellan-src/mage/usr/lib/mage |
10 | INSTALLDB=/var/db/mage |
11 | METADIR=/var/cache/mage/meta |
12 | ################# |
13 | |
14 | source ${MLIBDIR}/mage4.functions.sh |
15 | source ${MLIBDIR}/sql_functions.sh |
16 | |
17 | die() |
18 | { |
19 | echo -e "Exited ${BASH_SOURCE} at line no ${BASH_LINENO}." |
20 | echo -e "$@" |
21 | exit 1 |
22 | } |
23 | |
24 | sql() |
25 | { |
26 | local sqlcmd="$*" |
27 | [[ -z ${sqlcmd} ]] && die "no sqlcmd given." |
28 | |
29 | sqlite3 -nullvalue 'NULL' -list -separator '|' ${DBFILE} << EOF || die "error running '$@'" |
30 | ${sqlcmd}; |
31 | EOF |
32 | } |
33 | |
34 | create_database_layout() |
35 | { |
36 | sql "create table categories(id integer primary key, pcat text unique)" |
37 | sql "create table packages(id integer primary key, |
38 | pname text, |
39 | pver text, |
40 | pbuild text, |
41 | pcat_id numeric, |
42 | state text, |
43 | provide text, |
44 | pkgtype text |
45 | )" |
46 | sql "create table depends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" |
47 | sql "create table sdepends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" |
48 | sql "create table packages_info(id integer primary key, pkg_id numeric, arch text, md5 text, mtime numeric, homepage text, description text, size numeric)" |
49 | #sql "create table packages_content(id integer primary key, pkginfo_id numeric, char text, dirs text, files text, pipes text, symlinks text)" |
50 | sql "create table packages_content(id integer primary key, pkginfo_id numeric, char blob, dirs blob, files blob, pipes blob, symlinks blob)" |
51 | sql "create table packages_routines(id integer primary key, |
52 | pkg_id numeric, |
53 | mincludes text, |
54 | preinstall numeric, |
55 | postinstall numeric, |
56 | preremove numeric, |
57 | postremove numeric, |
58 | script text)" |
59 | } |
60 | |
61 | convert_meta_db() |
62 | { |
63 | local i |
64 | local magefile |
65 | local pcat |
66 | local pname |
67 | local pver |
68 | local pbuild |
69 | local pcatid |
70 | local state |
71 | local pkgid |
72 | local dep |
73 | local descriptiom |
74 | local homepage |
75 | local provide |
76 | local pkgtype |
77 | local preinstall |
78 | local postinstall |
79 | local preremove |
80 | local postremove |
81 | local sym |
82 | local depname |
83 | local depver |
84 | local depbuild |
85 | local depcat |
86 | local depcatid |
87 | local md5file |
88 | local md5sum |
89 | |
90 | # create categories |
91 | cat ${SMAGESCRIPTSDIR}/.known_categories | while read pcat |
92 | do |
93 | case ${pcat} in |
94 | include|profiles) continue;; |
95 | esac |
96 | |
97 | sql "insert into categories (pcat) values('${pcat}')" |
98 | done |
99 | |
100 | # create packages |
101 | for pkg in $(find ${METADIR} -mindepth 2 -maxdepth 2 -type d | sort) |
102 | do |
103 | case ${DEBUG} in |
104 | 1|true) echo "converting ${pkg}" ;; |
105 | esac |
106 | pcat="$(sed -n '2p' ${pkg}/meta)" |
107 | pname="$(sed -n '1p' ${pkg}/meta)" |
108 | pver="$(sed -n '3p' ${pkg}/meta)" |
109 | pbuild="$(sed -n '4p' ${pkg}/meta)" |
110 | state="$(sed -n '5p' ${pkg}/meta)" |
111 | [[ -f ${pkg}/provides ]] && provide="$(< ${pkg}/provides)" |
112 | pkgtype="$(sed -n '8p' ${pkg}/meta)" |
113 | |
114 | pcatid=$(sql "select id from categories where pcat='${pcat}'") |
115 | sql "insert into packages(pname, pver, pbuild, pcat_id, state, provide, pkgtype ) |
116 | values('${pname}','${pver}','${pbuild}','${pcatid}','${state}','${provide}','${pkgtype}')" |
117 | |
118 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
119 | |
120 | if [[ -f ${pkg}/depend ]] |
121 | then |
122 | # depends |
123 | while read sym dep |
124 | do |
125 | [[ -z ${dep} ]] && continue |
126 | depcat="$(dep2pcat ${dep})" |
127 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
128 | depname="$(dep2pname ${dep})" |
129 | depver="$(dep2pver ${dep})" |
130 | sql "insert into depends(pkg_id, relation, pcat_id, pname, pver, pbuild) |
131 | values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" |
132 | done << EOF |
133 | $(<${pkg}/depend) |
134 | EOF |
135 | fi |
136 | |
137 | if [[ -f ${pkg}/sdepend ]] |
138 | then |
139 | # sdepends |
140 | while read sym dep |
141 | do |
142 | [[ -z ${dep} ]] && continue |
143 | depcat="$(dep2pcat ${dep})" |
144 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
145 | depname="$(dep2pname ${dep})" |
146 | depver="$(dep2pver ${dep})" |
147 | sql "insert into sdepends(pkg_id, relation, pcat_id, pname, pver, pbuild) |
148 | values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" |
149 | done << EOF |
150 | $(<${pkg}/sdepend) |
151 | EOF |
152 | fi |
153 | |
154 | for arch in i686 x86_64 |
155 | do |
156 | if [[ -f ${pkg}/${arch}/desc ]] |
157 | then |
158 | md5sum="$(sed -n '1p' ${pkg}/${arch}/desc)" |
159 | mtime="$(sed -n '3p' ${pkg}/${arch}/desc)" |
160 | size="$(sed -n '2p' ${pkg}/${arch}/desc)" |
161 | fi |
162 | |
163 | # fix descriptions |
164 | description="$(sed -n '6p' ${pkg}/meta | sed s:\':\'\':g)" |
165 | homepage="$(sed -n '7p' ${pkg}/meta)" |
166 | |
167 | sql "insert into packages_info(pkg_id, arch, md5, description, homepage, mtime, size) |
168 | values('${pkgid}','${arch}','${md5sum}','${description}','${homepage}','${mtime}','${size}')" |
169 | done |
170 | |
171 | # id, pkg_id, arch, md5, mtime, homepage, description, size |
172 | |
173 | |
174 | mincludes="$(sed -n '10p' ${pkg}/meta)" |
175 | |
176 | # |
177 | # install routines & includes |
178 | # |
179 | # # needs special magic: the last line of typeset has no ';' |
180 | # # but to eval the function we must append it |
181 | # # so this sed deletes the last line of the typeset output |
182 | # # and replaces it with an ;} and a newline between |
183 | # # |
184 | # # but we will not add this fun when no postinstall etc are given |
185 | # # -> [[ -n $(typeset -f postinstall ]] && |
186 | # # |
187 | # # also the character ' is a problem while importing to sql |
188 | # # because we use ' as escape char. so we replace it with '' |
189 | # # |
190 | # # $([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}") |
191 | # # |
192 | # sql "insert into packages_routines(pkg_id, |
193 | # mincludes, |
194 | # postinstall, |
195 | # preinstall, |
196 | # preremove, |
197 | # postremove) |
198 | # values('${pkgid}', |
199 | # '${mincludes}', |
200 | # '$([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}")', |
201 | # '$([[ -n $(typeset -f preinstall) ]] && echo -e "$(typeset -f preinstall | sed s:\':\'\':g | sed '$d');\n}")', |
202 | # '$([[ -n $(typeset -f preremove) ]] && echo -e "$(typeset -f preremove | sed s:\':\'\':g | sed '$d');\n}")', |
203 | # '$([[ -n $(typeset -f postremove) ]] && echo -e "$(typeset -f postremove | sed s:\':\'\':g | sed '$d');\n}")')" |
204 | |
205 | local do_preinst=0 |
206 | local do_postinst=0 |
207 | local do_prerm=0 |
208 | local do_postrm=0 |
209 | local do_script=0 |
210 | local script="" |
211 | |
212 | [[ -f ${pkg}/preinstall ]] && do_preinst=1 && do_script=1 |
213 | [[ -f ${pkg}/postinstall ]] && do_postinst=1 && do_script=1 |
214 | [[ -f ${pkg}/preremove ]] && do_prerm=1 && do_script=1 |
215 | [[ -f ${pkg}/postremove ]] && do_postrm=1 && do_script=1 |
216 | |
217 | if [[ ${do_script} = 1 ]] |
218 | then |
219 | script="$(basename ${DBFILE} .sql).routines/${pkgid}/routines.sh" |
220 | install -d $(dirname ${DBFILE})/$(dirname ${script}) |
221 | cat ${pkg}/routines.sh > $(dirname ${DBFILE})/${script} |
222 | chmod 0755 $(dirname ${DBFILE})/${script} |
223 | fi |
224 | |
225 | sql "insert into packages_routines(pkg_id, |
226 | mincludes, |
227 | postinstall, |
228 | preinstall, |
229 | preremove, |
230 | postremove, |
231 | script) |
232 | values('${pkgid}', |
233 | '${INHERITS}', |
234 | '${do_postinst}', |
235 | '${do_preinst}', |
236 | '${do_prerm}', |
237 | '${do_postrm}', |
238 | '${script}')" |
239 | |
240 | unset state |
241 | unset pkgtype |
242 | unset md5sum |
243 | unset mtime |
244 | unset size |
245 | unset description |
246 | unset mincludes |
247 | unset pname |
248 | unset pver |
249 | unset pbuild |
250 | unset preinstall |
251 | unset postinstall |
252 | unset preremove |
253 | unset postremove |
254 | done |
255 | } |
256 | |
257 | |
258 | convert_install_db() |
259 | { |
260 | local i |
261 | local magefile |
262 | local pcat |
263 | local pname |
264 | local pver |
265 | local pbuild |
266 | local pcatid |
267 | local state |
268 | local preinstall |
269 | local postinstall |
270 | local preremove |
271 | local postremove |
272 | local pkgid |
273 | local dep |
274 | local PKGNAME |
275 | local STATE |
276 | local DESCRIPTION |
277 | local HOMEPAGE |
278 | local DEPEND |
279 | local SDEPEND |
280 | local PROVIDE |
281 | local PKGTYPE |
282 | local preinstall |
283 | local postinstall |
284 | local preremove |
285 | local postremove |
286 | local sym |
287 | local depname |
288 | local depver |
289 | local depbuild |
290 | local depcat |
291 | local depcatid |
292 | local md5file |
293 | local md5sum |
294 | local pkginfoid |
295 | local entrydir |
296 | |
297 | # create categories |
298 | for i in virtual ${INSTALLDB}/* |
299 | do |
300 | pcat="$(basename ${i})" |
301 | case ${pcat} in |
302 | include|profiles) continue;; |
303 | esac |
304 | |
305 | sql "insert into categories (pcat) values('${pcat}')" |
306 | done |
307 | |
308 | # create packages |
309 | for magefile in $(find ${INSTALLDB} -type f -name *.mage| sort) |
310 | do |
311 | case ${DEBUG} in |
312 | 1|true) echo "converting ${magefile}" ;; |
313 | esac |
314 | |
315 | pcat="$(magename2pcat ${magefile})" |
316 | pname="$(magename2pname ${magefile})" |
317 | pver="$(magename2pver ${magefile})" |
318 | pbuild="$(magename2pbuild ${magefile})" |
319 | # substitute r from pbuild |
320 | pbuild="${pbuild/r/}" |
321 | |
322 | source ${magefile} |
323 | |
324 | pcatid=$(sql "select id from categories where pcat='${pcat}'") |
325 | sql "insert into packages( |
326 | pname, |
327 | pver, |
328 | pbuild, |
329 | pcat_id, |
330 | state, |
331 | provide, |
332 | pkgtype |
333 | ) |
334 | values( |
335 | '${pname}', |
336 | '${pver}', |
337 | '${pbuild}', |
338 | '${pcatid}', |
339 | '${STATE}', |
340 | '${PROVIDE}', |
341 | '${PKGTYPE}' |
342 | )" |
343 | |
344 | pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") |
345 | # depends |
346 | while read sym dep |
347 | do |
348 | [[ -z ${dep} ]] && continue |
349 | depcat="$(dep2pcat ${dep})" |
350 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
351 | depname="$(dep2pname ${dep})" |
352 | depver="$(dep2pver ${dep})" |
353 | sql "insert into depends(pkg_id, |
354 | relation, |
355 | pcat_id, |
356 | pname, |
357 | pver, |
358 | pbuild) |
359 | values('${pkgid}', |
360 | '${sym}', |
361 | '${depcatid}', |
362 | '${depname}', |
363 | '${depver}', |
364 | '${depbuild}')" |
365 | done << EOF |
366 | ${DEPEND} |
367 | EOF |
368 | # sdepends |
369 | while read sym dep |
370 | do |
371 | [[ -z ${dep} ]] && continue |
372 | depcat="$(dep2pcat ${dep})" |
373 | depcatid=$(sql "select id from categories where pcat='${depcat}'") |
374 | depname="$(dep2pname ${dep})" |
375 | depver="$(dep2pver ${dep})" |
376 | sql "insert into sdepends(pkg_id, |
377 | relation, |
378 | pcat_id, |
379 | pname, |
380 | pver, |
381 | pbuild) |
382 | values('${pkgid}', |
383 | '${sym}', |
384 | '${depcatid}', |
385 | '${depname}', |
386 | '${depver}', |
387 | '${depbuild}')" |
388 | done << EOF |
389 | ${SDEPEND} |
390 | EOF |
391 | |
392 | DESCRIPTION="$(echo ${DESCRIPTION} | sed s:\':\'\':g)" |
393 | sql "insert into packages_info(pkg_id, arch, md5, description, homepage) |
394 | values('${pkgid}','${ARCH}','${md5sum}','${DESCRIPTION}','${HOMEPAGE}')" |
395 | |
396 | |
397 | # install routines & includes |
398 | sql "insert into packages_routines(pkg_id, |
399 | mincludes, |
400 | postinstall, |
401 | preinstall, |
402 | preremove, |
403 | postremove) |
404 | values('${pkgid}', |
405 | '${mincludes}', |
406 | '$(typeset -f postinstall | sed s:\':\'\':g)', |
407 | '$(typeset -f preinstall | sed s:\':\'\':g)', |
408 | '$(typeset -f preremove | sed s:\':\'\':g)', |
409 | '$(typeset -f postremove | sed s:\':\'\':g)')" |
410 | |
411 | #### #### |
412 | # record contents # |
413 | #### #### |
414 | pkginfoid=$(sql "select id from packages_info where pkg_id='${pkgid}' and arch='${ARCH}'") |
415 | entrydir="$(dirname ${magefile})" |
416 | # sql "insert into packages_content(pkginfo_id, |
417 | # char, |
418 | # dirs, |
419 | # files, |
420 | # pipes, |
421 | # symlinks) |
422 | # values('${pkginfoid}', |
423 | # '$(< ${entrydir}/.char)', |
424 | # '$(< ${entrydir}/.dirs)', |
425 | # '$(< ${entrydir}/.files)', |
426 | # '$(< ${entrydir}/.pipes)', |
427 | # '$(< ${entrydir}/.symlinks)')" |
428 | sql "insert into packages_content(pkginfo_id, |
429 | char, |
430 | dirs, |
431 | files, |
432 | pipes, |
433 | symlinks) |
434 | values('${pkginfoid}', |
435 | 'records/${pkginfoid}/char.bz2', |
436 | 'records/${pkginfoid}/dirs.bz2', |
437 | 'records/${pkginfoid}/files.bz2', |
438 | 'records/${pkginfoid}/pipes.bz2', |
439 | 'records/${pkginfoid}/symlinks.bz2')" |
440 | # create compressed content files |
441 | local entryfile |
442 | for entryfile in char dirs files pipes symlinks |
443 | do |
444 | install -d $(dirname ${DBFILE})/records/${pkginfoid} |
445 | cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${DBFILE})/records/${pkginfoid}/${entryfile}.bz2 |
446 | done |
447 | |
448 | unset PKGNAME |
449 | unset DEPEND |
450 | unset SDEPEND |
451 | unset PROVIDE |
452 | |
453 | # unset these functions |
454 | unset -f preinstall |
455 | unset -f postinstall |
456 | unset -f preremove |
457 | unset -f postremove |
458 | done |
459 | } |
460 | |
461 | convert_virtual_defaults() |
462 | { |
463 | local virtual |
464 | local package |
465 | local vcat |
466 | local vname |
467 | local pcat |
468 | local pname |
469 | |
470 | sql "create table virtual_defaults(id integer primary key, vcat text,vname text, pcat text, pname text)" |
471 | |
472 | while read virtual package |
473 | do |
474 | vcat="$(dirname ${virtual})" |
475 | vname="$(basename ${virtual})" |
476 | pcat="$(dirname ${package})" |
477 | pname="$(basename ${package})" |
478 | |
479 | sql "insert into virtual_defaults(vcat,vname,pcat,pname) values('${vcat}','${vname}','${pcat}','${pname}')" |
480 | done < /etc/mage-profile/virtuals.defaults |
481 | } |
482 | |
483 | |
484 | # packages db |
485 | #DBFILE=/home/tjoke/DATABASES/mage6.sql |
486 | #create_database_layout |
487 | #convert_mage_db |
488 | |
489 | # virtual default |
490 | #DBFILE=/home/tjoke/DATABASES/virtuals6.sql |
491 | #convert_virtual_defaults |
492 | |
493 | # # install db |
494 | # DBFILE=/home/tjoke/DATABASES/install6.sql |
495 | # create_database_layout |
496 | # convert_install_db |
497 | |
498 | |
499 | METHOD="$1" |
500 | DBFILE="$2" |
501 | |
502 | [[ -z ${METHOD} ]] && die "No method given. Use --install, --packages or --virtual for your appropiate task" |
503 | [[ -z ${DBFILE} ]] && die "No database given." |
504 | |
505 | case $1 in |
506 | --install|-i) |
507 | create_database_layout |
508 | convert_install_db |
509 | ;; |
510 | --packages|-p) |
511 | create_database_layout |
512 | convert_meta_db |
513 | ;; |
514 | --virtuals|-v) |
515 | convert_virtual_defaults |
516 | ;; |
517 | *) die "Unkown method." ;; |
518 | esac |