--- trunk/mage/usr/lib/mage/mage4.functions.sh 2005/09/09 16:35:46 226 +++ trunk/mage/usr/lib/mage/mage4.functions.sh 2005/10/21 16:01:40 280 @@ -1,6 +1,6 @@ #!/bin/bash # Magellan Linux Installer Functions (mage.functions.sh) -# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.1 2005-09-09 16:35:38 niro Exp $ +# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.9 2005-10-21 16:01:40 niro Exp $ mage_setup() { @@ -432,6 +432,7 @@ local magefile local dbrecorddir local provide + local i # very basic getops for i in $* @@ -473,7 +474,6 @@ # create fake file descriptors # used by virtual and source packages - local i for i in .dirs .symlinks .files .pipes .char do touch ${dbrecorddir}/${i} @@ -504,7 +504,10 @@ provide="$(get_value_from_magefile PROVIDE ${magefile})" if [ -n "${provide}" ] then - virtuals_add "${provide}" "${pcat}/${pname}" + for i in ${provide} + do + virtuals_add "${i}" "${pcat}/${pname}" + done fi } @@ -523,6 +526,7 @@ local magefile local dbrecorddir local provide + local i # very basic getops for i in $* @@ -556,7 +560,10 @@ provide="$(get_value_from_magefile PROVIDE ${magefile})" if [ -n "${provide}" ] then - virtuals_del "${provide}" "${pcat}/${pname}" + for i in ${provide} + do + virtuals_del "${i}" "${pcat}/${pname}" + done fi # removes database entry @@ -744,7 +751,7 @@ do [ -z "${pathto}" ] && continue - if [ -e "${MROOT}${pathto}" ] + if [ ! -e "${MROOT}${pathto}" ] then [[ ${VERBOSE} = on ]] && \ echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}" @@ -758,10 +765,35 @@ # 1=keep me # case ${retval} in 0) - [[ ${VERBOSE} = on ]] && echo -e "\t<<< FILE: ${MROOT}${pathto}" - rm "${MROOT}${pathto}" - ;; + # check if the file is config_protected + # ${MROOT} will automatically added if set !! + is_config_protected "${pathto}" + retval="$?" + + # 0 - not protected # + # 1 - error # + # 2 - protected # + # 3 - protected but masked # + + case ${retval} in + # file is not protected - delete it + 0|3) + [[ ${VERBOSE} = on ]] && echo -e "\t<<< FILE: ${MROOT}${pathto}" + rm "${MROOT}${pathto}" + ;; + # file is protected, do not delete + 2) + if [[ ${VERBOSE} = on ]] + then + echo -en "${COLRED}" + echo -n "! prot " + echo -en "${COLDEFAULT}" + echo " === FILE: ${MROOT}${pathto}" + fi + ;; + esac + ;; 1) [[ ${VERBOSE} = on ]] && \ echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}" @@ -932,14 +964,11 @@ [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_directories() .dirs not found" - # uninstall of dirs ## added small hack to fix dirs - # must be reverse -> smage2 doesn't sort them - # -> using tac - # sets fieldseperator to "§" instead of " " IFS=§ - while read pathto posix + # reversed order is mandatory ! + tac ${MROOT}${INSTALLDB}/${pfull}/.dirs | while read pathto posix do [ -z "${pathto}" ] && continue @@ -954,7 +983,7 @@ if [ -f "${MROOT}${pathto}/.keep" ] then [[ ${VERBOSE} = on ]] && \ - echo -e "${COLRED} .keep${COLDEFAULT} === DIR: ${MROOT}${pathto}" + echo -e "${COLRED}! .keep${COLDEFAULT} === DIR: ${MROOT}${pathto}" continue fi @@ -971,7 +1000,7 @@ [[ ${VERBOSE} = on ]] && \ echo -e "${COLRED}! empty${COLDEFAULT} === DIR: ${MROOT}${pathto}" fi - done < ${MROOT}${INSTALLDB}/${pfull}/.dirs + done # very important: unsetting the '§' fieldseperator IFS=$'\n' @@ -1493,6 +1522,7 @@ local oldline local line i local installed_file + local OLDIFS if virtuals_read ${virtualname} then @@ -1515,6 +1545,7 @@ # make a backup mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old + OLDIFS="${IFS}" IFS=$'\n' for line in $(< ${MROOT}${VIRTUALDB_FILE}.old) do @@ -1526,10 +1557,10 @@ echo "${line}" >> ${MROOT}${VIRTUALDB_FILE} fi done - - #unset IFS + # unset IFS + IFS="${OLDIFS}" else - echo -ne "${COLBLUE} *** ${COLDEFAULT}" + echo -ne "${COLBLUE} >>> ${COLDEFAULT}" echo "register ${pkgname} as ${virtualname} ..." echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE} fi @@ -1541,61 +1572,68 @@ #$1 virtualname; $2 pkgname virtuals_del() { - local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED - - VIRTUAL_NAME=$1 - PKG_NAME=$2 - - #first check if exists - if virtuals_read ${VIRTUAL_NAME} + local virtualname="$1" + local pkgname="$2" + local oldline + local method + local line i x + local pkg_installed + local OLDIFS + + # first check if exists + if virtuals_read ${virtualname} then - #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME} + # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME} declare -i x=0 - for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs) + for i in $(virtuals_read ${virtualname} showpkgs) do - if [ "${i}" == "${PKG_NAME}" ] + if [[ ${i} = ${pkgname} ]] then - PKG_INSTALLED=true + pkg_installed=true fi ((x++)) done - - #abort if not installed - if [ "${PKG_INSTALLED}" != "true" ] + + # abort if not installed + if [[ ${pkg_installed} != true ]] then - echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}." + echo -ne "${COLBLUE} --- ${COLDEFAULT}" + echo "${pkgname} does not exists in ${virtualname}." return 0 fi - + if [ ${x} -ge 2 ] then - METHOD=update + method=update else - METHOD=delall + method=delall fi - - #get the complete line - OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)" - - #make a backup + + # get the complete line + oldline="$(virtuals_read ${virtualname} showline)" + + # make a backup of the db mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old - - #parse virtualdb + + # parse virtualdb + OLDIFS="${IFS}" IFS=$'\n' for line in $(< ${VIRTUALDB_FILE}.old) do - if [ "${line}" == "${OLD_LINE}" ] + if [[ ${line} = ${oldline} ]] then #delall or update? - case ${METHOD} in + case ${method} in update) - echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..." - #del PKG_NAME from line - echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE} + echo -ne "${COLBLUE} *** ${COLDEFAULT}" + echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..." + # del PKG_NAME from line + echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE} ;; delall) - echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..." - #continue; do not write anything + echo -ne "${COLBLUE} <<< ${COLDEFAULT}" + echo "Deleting ${virtualname} in virtual database ..." + # continue; do not write anything continue ;; esac @@ -1603,9 +1641,11 @@ echo "${line}" >> ${VIRTUALDB_FILE} fi done - unset IFS + # unset IFS + IFS="${OLDIFS}" else - echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database." + echo -ne "${COLBLUE} --- ${COLDEFAULT}" + echo "${virtualname} does not exists in virtual database." fi } @@ -1670,7 +1710,7 @@ local newest_mage local installed_mage - newest_mage="$( CATEGORIE=app-mage MAGENAME=mage get_highest_magefile;echo $(basename ${MAGEFILE} .mage) )" + newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)" installed_mage="$(magequery -n mage | cut -d' ' -f5)" if [[ ${newest_mage} > ${installed_mage} ]] @@ -1963,6 +2003,8 @@ local PKGTYPE local preinstall local postinstall + local preremove + local postremove # sanity checks [ -f ${magefile} ] && source ${magefile} || \ @@ -1972,6 +2014,12 @@ source ${magefile} eval value=\$$(echo ${var}) echo "${value}" + + # unset these functions + unset -f preinstall + unset -f postinstall + unset -f preremove + unset -f postremove } mage_install() @@ -1988,6 +2036,8 @@ local PKGTYPE local preinstall local postinstall + local preremove + local postremove local pcat local pname @@ -2149,6 +2199,12 @@ # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} " echo "successfully installed." + + # unset these functions + unset -f preinstall + unset -f postinstall + unset -f preremove + unset -f postremove } md5sum_packages() @@ -2253,20 +2309,23 @@ echo -ne "${COLBLUE} --- ${COLDEFAULT}" echo "following candidate(s) will be removed:" echo -ne "${COLBLUE} --- ${COLDEFAULT}" - echo -ne "\033[1m${can_pcat}/${can_pname}:${COLDEFAULT}" + echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}" echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}" echo - echo -ne "${COLBLUE} --- ${COLDEFAULT}" - echo "( Press [CTRL+C] to abort )" - echo -ne "${COLBLUE} --- ${COLDEFAULT}" - echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..." - for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--)) - do - echo -ne "${COLRED} ${i}${COLDEFAULT}" - sleep 1 - done - echo - echo + if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ] + then + echo -ne "${COLBLUE} --- ${COLDEFAULT}" + echo "( Press [CTRL+C] to abort )" + echo -ne "${COLBLUE} --- ${COLDEFAULT}" + echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..." + for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--)) + do + echo -ne "${COLRED} ${i}${COLDEFAULT}" + sleep 1 + done + echo + echo + fi for pkg in ${list} do @@ -2304,6 +2363,8 @@ local PKGTYPE local preinstall local postinstall + local preremove + local postremove local pcat local pname @@ -2341,7 +2402,7 @@ echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}" - magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage" + magefile="${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage" source ${magefile} ## preremove scripts @@ -2401,6 +2462,12 @@ # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}" # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} " echo "successfully removed." + + # unset these functions + unset -f preinstall + unset -f postinstall + unset -f preremove + unset -f postremove } show_etc_update_mesg() { @@ -2415,3 +2482,109 @@ echo "Please run 'etc-update' to update your configuration files." echo } + +pkgsearch() +{ + local string="$1" + local result + local pkg + local pcat + local pname + local magefile + local pver + local pbuild + local state + local descriptiom + local homepage + local i + local all_installed + local ipver + local ipbuild + + # only names no versions + result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name *${string}*)" + #result="$(find ${MAGEDIR} -type f -name *${string}*.mage | sort)" + + # nothing found + [[ -z ${result} ]] && die "No package found containing '${string}' in the name." + + for pkg in ${result} + do + # dirty, but does the job + pcat="$(magename2pcat ${pkg}/foo)" + pname="$(magename2pname ${pkg}-foo-foo)" + + # get highest version available + magefile=$(get_highest_magefile ${pcat} ${pname}) + + # now get all needed infos to print a nice output + pver="$(magename2pver ${magefile})" + pbuild="$(magename2pbuild ${magefile})" + state="$(get_value_from_magefile STATE ${magefile})" + description="$(get_value_from_magefile DESCRIPTION ${magefile})" + homepage="$(get_value_from_magefile HOMEPAGE ${magefile})" + + # all installed + for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat}) + do + ipver="$(magename2pver ${i})" + ipbuild="$(magename2pbuild ${i})" + + if [[ -z ${all_installed} ]] + then + all_installed="${ipver}-${ipbuild}" + else + all_installed="${all_installed} ${ipver}-${ipbuild}" + fi + done + [[ -z ${all_installed} ]] && all_installed="none" + + case ${state} in + stable) state=${COLGREEN}"[s] ";; + testing) state=${COLYELLOW}"[t] ";; + unstable) state=${COLRED}"[u] ";; + old) state=${COLGRAY}"[o] ";; + esac + + echo -e "${state}${pcat}/${pname}"${COLDEFAULT} + echo " Latest available: ${pver}-${pbuild}" + echo " Installed versions: ${all_installed}" + echo " Description: ${description}" + echo " Homepage: ${homepage}" + echo + + unset pcat + unset pname + unset magefile + unset pver + unset pbuild + unset state + unset descriptiom + unset homepage + unset all_installed + unset ipver + unset ipbuild + done +} + +export_inherits() +{ + local include="$1" + shift + + while [ "$1" ] + do + local functions="$1" + + # sanity checks + [ -z "${include}" ] && die "export_inherits(): \$include not given." + [ -z "${functions}" ] && die "export_inherits(): \$functions not given." + + eval "${functions}() { ${include}_${functions} ; }" + + # debug + [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}" + + shift + done +}