#!/bin/bash # query mage database for installed packages # $Id$ print_usage() { echo "$(basename $0 .sh) querys the mage database for installed packages." echo echo " -n NAME searches for name NAME" echo " -v VER searches for version VER, needs -n" echo " -b BUILD searches for build number BUILD, needs -n -v" echo " -c CAT shows all packages of given categorie" echo " -i shows an inventory of all installed packages" echo " -f PATH searches packages which own given file" echo " -e PATH searches the package which owns the exact given filename" echo echo " Examples:" echo echo " $(basename $0 .sh) -n xorg -v 6.8.0 -b r1" echo " searches for package xorg-6.8.0-r1" echo } # default args: GET_INVENTORY=false SEARCH_ONLY_PATH=false SEARCH_ONLY_CAT=false SEARCH_EXACT_FILENAME=false # no params given, or is only an arg not ar param, exit if [[ $# -lt 1 ]] || [[ ${1:0:1} != - ]] then print_usage exit 1 fi # very basic getops for i in $* do case $1 in -n) shift; S_PNAME="$1" ;; -v) shift; S_PVER="$1" ;; -b) shift; S_PBUILD="$1" ;; -i) GET_INVENTORY="true" ;; -f) SEARCH_ONLY_PATH="true"; shift; SEARCH_PATH="$1" ;; -e) SEARCH_ONLY_PATH="true"; SEARCH_EXACT_FILENAME="true"; shift; SEARCH_PATH="$1" ;; -c) SEARCH_ONLY_CAT="true"; shift; SEARCH_CAT="$1" ;; -h) print_usage; exit 0 ;; -*) print_usage; exit 1 ;; esac shift done source /etc/mage.rc.global source /etc/mage.rc RETVAL=1 if [[ ${SEARCH_ONLY_PATH} = true ]] then unset S_PACKAGES unset i pkg if [[ ${SEARCH_EXACT_FILENAME} = true ]] then # fix ++, which gets interpreted as a regex SEARCH_PATH="${SEARCH_PATH//+/\\+}" # fix [, which gets interpreted as a regex SEARCH_PATH="${SEARCH_PATH//[/\\[}" S_CANDIDATES=$(egrep -rl "^${SEARCH_PATH}§" ${INSTALLDB}) else S_CANDIDATES=$(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB}) fi for i in ${S_CANDIDATES} do # ignore magefiles! case ${i} in *.mage) continue ;; esac # print categorie and pkgname pkg="$(basename ${i%/*/*})/$(basename ${i%/*})" if [[ -z $(echo ${S_PACKAGES} | grep ${pkg}) ]] then S_PACKAGES="${S_PACKAGES} ${pkg}" fi done # show packages for pkg in ${S_PACKAGES} do echo "${pkg}" done exit 0 fi if [[ ${SEARCH_ONLY_CAT} = true ]] then # no packages of SEARCH_CAT are installed [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1 for i in ${INSTALLDB}/${SEARCH_CAT}/* do # print categorie and pkgname echo "$(basename ${i%/*})/$(basename ${i})" done exit 0 fi if [[ ${GET_INVENTORY} = true ]] then for package in $(find ${MROOT}${INSTALLDB} -mindepth 2 -maxdepth 2 -type d -printf "%h,%f\n" | sort) do pcat="$(basename $(echo ${package} | cut -d, -f1))" pname="$(echo ${package} | cut -d, -f2)" if [[ -z ${invlist} ]] then invlist="${pcat}/${pname}" else invlist="${invlist} ${pcat}/${pname}" fi done # now show the list echo "${invlist}" exit 0 fi for i in ${MROOT}${INSTALLDB}/*/* do INST_PNAME=no INST_PVER=no INST_PBUILD=no x=$(basename ${i}) PNAME=${x%-*-*} PVER=$(echo ${x#${PNAME}-} | cut -d- -f1) PBUILD=$(echo ${x#${PNAME}-} | cut -d- -f2) if [[ ${PNAME} == ${S_PNAME} ]] then INST_PNAME=yes if [[ -n ${S_PVER} ]] then if [[ ${PVER} == ${S_PVER} ]] then INST_PVER=yes fi if [[ -n ${S_PBUILD} ]] then if [[ ${PBUILD} == ${S_PBUILD} ]] then INST_PBUILD=yes fi fi fi # search for pname only if [[ -n ${S_PNAME} ]] && [[ -z ${S_PVER} ]] && [[ -z ${S_PBUILD} ]] then if [[ ${INST_PNAME} = yes ]] then echo "${S_PNAME} is installed [ ${PNAME}-${PVER}-${PBUILD} ]" RETVAL=0 break fi fi # search for pname and pver if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -z ${S_PBUILD} ]] then if [[ ${INST_PNAME} = yes ]] && [[ ${INST_PVER} = yes ]] then echo "${S_PNAME}-${S_PVER} is installed [ ${PNAME}-${PVER}-${PBUILD} ]" RETVAL=0 break fi fi # search for pname, pver and pbuild if [[ -n ${S_PNAME} ]] && [[ -n ${S_PVER} ]] && [[ -n ${S_PBUILD} ]] then if [[ ${INST_PNAME} = yes ]] && [[ ${INST_PVER} = yes ]] && [[ ${INST_PBUILD} = yes ]] then echo "${S_PNAME}-${S_PVER}-${S_PBUILD} is installed [ ${PNAME}-${PVER}-${PBUILD} ]" RETVAL=0 break fi fi fi done exit ${RETVAL}