#!/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)" } convert_mage_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 # create categories for i in virtual ${MAGEDIR}/* 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 ${MAGEDIR} -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 for arch in i686 x86_64 do md5file="${MAGEDIR}/${pcat}/${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 mincludes="$(grep -r 'minclude ' ${magefile} | cut -d: -f2 | sed s:minclude\ ::)" # 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)')" unset PKGNAME unset DEPEND unset SDEPEND unset PROVIDE # 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}', # '$(< ${entrydir}/.char)', # '$(< ${entrydir}/.dirs)', # '$(< ${entrydir}/.files)', # '$(< ${entrydir}/.pipes)', # '$(< ${entrydir}/.symlinks)')" sql "insert into packages_content(pkginfo_id, char, dirs, files, pipes, symlinks) values('${pkginfoid}', 'records/${pkginfoid}/char.bz2', 'records/${pkginfoid}/dirs.bz2', 'records/${pkginfoid}/files.bz2', 'records/${pkginfoid}/pipes.bz2', 'records/${pkginfoid}/symlinks.bz2')" # create compressed content files local entryfile for entryfile in char dirs files pipes symlinks do install -d $(dirname ${DBFILE})/records/${pkginfoid} cat ${entrydir}/.${entryfile} | bzip2 -9 >> $(dirname ${DBFILE})/records/${pkginfoid}/${entryfile}.bz2 done unset PKGNAME unset DEPEND unset SDEPEND unset PROVIDE # 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 } # packages db #DBFILE=/home/tjoke/DATABASES/mage6.sql #create_database_layout #convert_mage_db # virtual default #DBFILE=/home/tjoke/DATABASES/virtuals6.sql #convert_virtual_defaults # # install db # DBFILE=/home/tjoke/DATABASES/install6.sql # create_database_layout # convert_install_db 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_mage_db ;; --virtuals|-v) convert_virtual_defaults ;; *) die "Unkown method." ;; esac