Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 491 - (hide 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 niro 491 #!/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