#!/bin/bash source /etc/mage.rc.global source /etc/mage.rc #### fixups #### MLIBDIR=/home/tjoke/alx-cvs/magellan-src/mage/usr/lib/mage INSTALLDB=/var/db/mage ################# source ${MLIBDIR}/mage4.functions.sh source ${MLIBDIR}/sql_functions.sh die() { echo -e "Exited ${BASH_SOURCE} at line no ${BASH_LINENO}." echo -e "$@" exit 1 } sql() { local sqlcmd="$*" [[ -z ${sqlcmd} ]] && die "no sqlcmd given." sqlite3 -nullvalue 'NULL' -list -separator '|' ${DBFILE} << EOF || die "error running '$@'" ${sqlcmd}; EOF } create_database_layout() { sql "create table categories(id integer primary key, pcat text unique)" sql "create table packages(id integer primary key, pname text, pver text, pbuild text, pcat_id numeric, state text, provide text, pkgtype text )" sql "create table depends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" sql "create table sdepends(id integer primary key, pkg_id numeric, relation text, pcat_id numeric, pname text, pver text, pbuild text)" sql "create table packages_info(id integer primary key, pkg_id numeric, arch text, md5 text, mtime numeric, homepage text, description text, size numeric)" #sql "create table packages_content(id integer primary key, pkginfo_id numeric, char text, dirs text, files text, pipes text, symlinks text)" sql "create table packages_content(id integer primary key, pkginfo_id numeric, char blob, dirs blob, files blob, pipes blob, symlinks blob)" # sql "create table packages_routines(id integer primary key, # pkg_id numeric, # mincludes text, # preinstall text, # postinstall text, # preremove text, # postremove text, # extra_functions text, # extra_vars text)" sql "create table packages_routines(id integer primary key, pkg_id numeric, mincludes text, preinstall numeric, postinstall numeric, preremove numeric, postremove numeric, script text)" } convert_smage_db() { local i local smagefile local PCATEGORIE local PNAME local PVER local PBUILD local pcatid local STATE local pkgid local dep local PKGNAME local DESCRIPTION local HOMEPAGE local DEPEND local SDEPEND local PROVIDE local PKGTYPE local preinstall local postinstall local preremove local postremove local sym local depname local depver local depbuild local depcat local depcatid local md5file local md5sum # create categories cat ${SMAGESCRIPTSDIR}/.known_categories | while read pcat do case ${pcat} in include|profiles) continue;; esac sql "insert into categories (pcat) values('${pcat}')" done # create packages for smagefile in $(find ${SMAGESCRIPTSDIR}/glibc-nptl -type f -name '*'.smage2 | sort) do case ${DEBUG} in 1|true) echo "converting ${smagefile}" ;; esac source ${smagefile} # substitute r from pbuild PBUILD="${PBUILD/r/}" pcatid=$(sql "select id from categories where pcat='${PCATEGORIE}'") sql "insert into packages( pname, pver, pbuild, pcat_id, state, provide, pkgtype ) values( '${PNAME}', '${PVER}', '${PBUILD}', '${pcatid}', '${STATE}', '${PROVIDE}', '${PKGTYPE}' )" pkgid=$(sql "select id from packages where pname='${PNAME}' and pver='${PVER}' and pbuild='${PBUILD}'") # depends while read sym dep do [[ -z ${dep} ]] && continue depcat="$(dep2pcat ${dep})" depcatid=$(sql "select id from categories where pcat='${depcat}'") depname="$(dep2pname ${dep})" depver="$(dep2pver ${dep})" sql "insert into depends(pkg_id, relation, pcat_id, pname, pver, pbuild) values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" done << EOF ${DEPEND} EOF # sdepends while read sym dep do [[ -z ${dep} ]] && continue depcat="$(dep2pcat ${dep})" depcatid=$(sql "select id from categories where pcat='${depcat}'") depname="$(dep2pname ${dep})" depver="$(dep2pver ${dep})" sql "insert into sdepends(pkg_id, relation, pcat_id, pname, pver, pbuild) values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" done << EOF ${SDEPEND} EOF for arch in i686 x86_64 do md5file="${MAGEDIR}/${PCATEGORIE}/${PNAME}/md5/${PNAME}-${PVER}-${arch}-r${PBUILD}.md5" [[ -f ${md5file} ]] && md5sum="$(cat ${md5file} | cut -d' ' -f1)" # fix descriptions DESCRIPTION="$(echo ${DESCRIPTION} | sed s:\':\'\':g)" sql "insert into packages_info(pkg_id, arch, md5, description, homepage) values('${pkgid}','${arch}','${md5sum}','${DESCRIPTION}','${HOMEPAGE}')" done # using $INHERITS directly #mincludes="$(grep -r 'minclude ' ${magefile} | cut -d: -f2 | sed s:minclude\ ::)" # # # # # # install routines & includes # # # # # # needs special magic: the last line of typeset has no ';' # # # but to eval the function we must append it # # # so this sed deletes the last line of the typeset output # # # and replaces it with an ;} and a newline between # # # # # # but we will not add this fun when no postinstall etc are given # # # -> [[ -n $(typeset -f postinstall ]] && # # # # # # also the character ' is a problem while importing to sql # # # because we use ' as escape char. so we replace it with '' # # # # # # $([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}") # # # # # sql "insert into packages_routines(pkg_id, # # mincludes, # # postinstall, # # preinstall, # # preremove, # # postremove) # # values('${pkgid}', # # '${mincludes}', # # '$([[ -n $(typeset -f postinstall) ]] && echo -e "$(typeset -f postinstall | sed s:\':\'\':g | sed '$d');\n}")', # # '$([[ -n $(typeset -f preinstall) ]] && echo -e "$(typeset -f preinstall | sed s:\':\'\':g | sed '$d');\n}")', # # '$([[ -n $(typeset -f preremove) ]] && echo -e "$(typeset -f preremove | sed s:\':\'\':g | sed '$d');\n}")', # # '$([[ -n $(typeset -f postremove) ]] && echo -e "$(typeset -f postremove | sed s:\':\'\':g | sed '$d');\n}")')" local do_preinst=0 local do_postinst=0 local do_prerm=0 local do_postrm=0 local do_script=0 local script="" [[ -n $(typeset -f preinstall) ]] && do_preinst=1 && do_script=1 [[ -n $(typeset -f postinstall) ]] && do_postinst=1 && do_script=1 [[ -n $(typeset -f preremove) ]] && do_prerm=1 && do_script=1 [[ -n $(typeset -f postremove) ]] && do_postrm=1 && do_script=1 [[ ${do_script} = 1 ]] && script="$(basename ${DBFILE} .sql).routines/${pkgid}/routines.sh" sql "insert into packages_routines(pkg_id, mincludes, postinstall, preinstall, preremove, postremove, script) values('${pkgid}', '${INHERITS}', '${do_postinst}', '${do_pretinst}', '${do_prerm}', '${do_postrm}', '${script}')" # create it only if do_script=1 if [[ ${do_script} = 1 ]] then # create a routines script local routines=$(dirname ${DBFILE})/${script} install -d $(dirname ${routines}) echo "#!/bin/sh" > ${routines} echo "# routines.sh script for #${pkgid}, ${PNAME}-${PVER}-${PBUILD}" >> ${routines} echo >> ${routines} # special functions and variables if [[ -n ${SPECIAL_VARS} ]] then local i for i in ${SPECIAL_VARS} do # being tricky here :) echo "${i}=\"$(eval echo \$${i})\"" >> ${routines} done echo >> ${routines} fi # add special functions if [[ -n ${SPECIAL_FUNCTIONS} ]] then local i for i in ${SPECIAL_FUNCTIONS} do # add to mage (quotes needed !) typeset -f "${i}" >> ${routines} echo >> ${routines} # unset to be safe (quotes needed !) unset "${i}" done echo >> ${routines} fi # postinstall and co for i in preinstall postinstall preremove postremove do if [[ -n $(typeset -f "${i}") ]] then typeset -f "${i}" >> ${routines} echo >> ${routines} fi done # create start logic echo >> ${routines} echo 'case $1 in' >> ${routines} echo ' preinstall) preinstall ;;' >> ${routines} echo ' postinstall) postinstall ;;' >> ${routines} echo ' preremove) preremove ;;' >> ${routines} echo ' postremove) postremove ;;' >> ${routines} echo 'esac' >> ${routines} echo >> ${routines} fi unset PCATEGORIE unset PNAME unset PVER unset PBUILD unset STATE unset DESCRIPTION unset HOMEPAGE unset PKGTYPE unset PKGNAME unset DEPEND unset SDEPEND unset PROVIDE unset SPECIAL_VARS unset SPECIAL_FUNCTIONS unset INHERITS # unset these functions unset -f preinstall unset -f postinstall unset -f preremove unset -f postremove done } convert_install_db() { local i local magefile local pcat local pname local pver local pbuild local pcatid local state local preinstall local postinstall local preremove local postremove local pkgid local dep local PKGNAME local STATE local DESCRIPTION local HOMEPAGE local DEPEND local SDEPEND local PROVIDE local PKGTYPE local preinstall local postinstall local preremove local postremove local sym local depname local depver local depbuild local depcat local depcatid local md5file local md5sum local pkginfoid local entrydir # create categories for i in virtual ${INSTALLDB}/* do pcat="$(basename ${i})" case ${pcat} in include|profiles) continue;; esac sql "insert into categories (pcat) values('${pcat}')" done # create packages for magefile in $(find ${INSTALLDB} -type f -name *.mage| sort) do case ${DEBUG} in 1|true) echo "converting ${magefile}" ;; esac pcat="$(magename2pcat ${magefile})" pname="$(magename2pname ${magefile})" pver="$(magename2pver ${magefile})" pbuild="$(magename2pbuild ${magefile})" # substitute r from pbuild pbuild="${pbuild/r/}" source ${magefile} pcatid=$(sql "select id from categories where pcat='${pcat}'") sql "insert into packages( pname, pver, pbuild, pcat_id, state, provide, pkgtype ) values( '${pname}', '${pver}', '${pbuild}', '${pcatid}', '${STATE}', '${PROVIDE}', '${PKGTYPE}' )" pkgid=$(sql "select id from packages where pname='${pname}' and pver='${pver}' and pbuild='${pbuild}'") # depends while read sym dep do [[ -z ${dep} ]] && continue depcat="$(dep2pcat ${dep})" depcatid=$(sql "select id from categories where pcat='${depcat}'") depname="$(dep2pname ${dep})" depver="$(dep2pver ${dep})" sql "insert into depends(pkg_id, relation, pcat_id, pname, pver, pbuild) values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" done << EOF ${DEPEND} EOF # sdepends while read sym dep do [[ -z ${dep} ]] && continue depcat="$(dep2pcat ${dep})" depcatid=$(sql "select id from categories where pcat='${depcat}'") depname="$(dep2pname ${dep})" depver="$(dep2pver ${dep})" sql "insert into sdepends(pkg_id, relation, pcat_id, pname, pver, pbuild) values('${pkgid}', '${sym}', '${depcatid}', '${depname}', '${depver}', '${depbuild}')" done << EOF ${SDEPEND} EOF DESCRIPTION="$(echo ${DESCRIPTION} | sed s:\':\'\':g)" sql "insert into packages_info(pkg_id, arch, md5, description, homepage) values('${pkgid}','${ARCH}','${md5sum}','${DESCRIPTION}','${HOMEPAGE}')" # install routines & includes sql "insert into packages_routines(pkg_id, mincludes, postinstall, preinstall, preremove, postremove) values('${pkgid}', '${mincludes}', '$(typeset -f postinstall | sed s:\':\'\':g)', '$(typeset -f preinstall | sed s:\':\'\':g)', '$(typeset -f preremove | sed s:\':\'\':g)', '$(typeset -f postremove | sed s:\':\'\':g)')" #### #### # record contents # #### #### pkginfoid=$(sql "select id from packages_info where pkg_id='${pkgid}' and arch='${ARCH}'") entrydir="$(dirname ${magefile})" sql "insert into packages_content(pkginfo_id, char, dirs, files, pipes, symlinks) values('${pkginfoid}', '$(basename ${DBFILE} .sql).records/${pkginfoid}/char.bz2', '$(basename ${DBFILE} .sql).records/${pkginfoid}/dirs.bz2', '$(basename ${DBFILE} .sql).records/${pkginfoid}/files.bz2', '$(basename ${DBFILE} .sql).records/${pkginfoid}/pipes.bz2', '$(basename ${DBFILE} .sql).records/${pkginfoid}/symlinks.bz2')" # create compressed content files local entryfile for entryfile in char dirs files pipes symlinks do install -d $(dirname ${DBFILE})/$(basename ${DBFILE} .sql).records/${pkginfoid} cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${DBFILE})/$(basename ${DBFILE} .sql).records/${pkginfoid}/${entryfile}.bz2 done unset PKGNAME unset DEPEND unset SDEPEND unset PROVIDE unset SPECIAL_VARS unset SPECIAL_FUNCTIONS # unset these functions unset -f preinstall unset -f postinstall unset -f preremove unset -f postremove done } convert_virtual_defaults() { local virtual local package local vcat local vname local pcat local pname sql "create table virtual_defaults(id integer primary key, vcat text,vname text, pcat text, pname text)" while read virtual package do vcat="$(dirname ${virtual})" vname="$(basename ${virtual})" pcat="$(dirname ${package})" pname="$(basename ${package})" sql "insert into virtual_defaults(vcat,vname,pcat,pname) values('${vcat}','${vname}','${pcat}','${pname}')" done < /etc/mage-profile/virtuals.defaults } METHOD="$1" DBFILE="$2" [[ -z ${METHOD} ]] && die "No method given. Use --install, --packages or --virtual for your appropiate task" [[ -z ${DBFILE} ]] && die "No database given." case $1 in --install|-i) create_database_layout convert_install_db ;; --packages|-p) create_database_layout convert_smage_db ;; --virtuals|-v) convert_virtual_defaults ;; *) die "Unkown method." ;; esac