Magellan Linux

Contents of /trunk/mage/usr/lib/mage/convert_databases_meta.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 491 - (show annotations) (download) (as text)
Wed May 2 14:54:21 2007 UTC (17 years 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