#!/bin/bash # query mage database for installed packages # $Id$ # always export C locale to fix utf-8 issues export LC_ALL=C 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=0 SEARCH_ONLY_PATH=0 SEARCH_ONLY_CAT=0 SEARCH_EXACT_FILENAME=0 # 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"; if [[ -z ${S_PNAME} ]]; then print_usage; exit 1; fi ;; -v) shift; S_PVER="$1"; if [[ -z ${S_PVER} ]]; then print_usage; exit 1; fi ;; -b) shift; S_PBUILD="$1"; if [[ -z ${S_PBUILD} ]]; then print_usage; exit 1; fi ;; -i) GET_INVENTORY="1" ;; -f) SEARCH_ONLY_PATH="1"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; -e) SEARCH_ONLY_PATH="1"; SEARCH_EXACT_FILENAME="1"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; -c) SEARCH_ONLY_CAT="1"; shift; SEARCH_CAT="$1"; if [[ -z ${SEARCH_CAT} ]]; then print_usage; exit 1; fi ;; -h) print_usage; exit 0 ;; -*) print_usage; exit 1 ;; esac shift done source /etc/mage.rc.global source ${MAGERC} RETVAL=1 if [[ ${SEARCH_ONLY_PATH} = 1 ]] then unset S_PACKAGES unset i pkg if [[ ${SEARCH_EXACT_FILENAME} = 1 ]] 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} = 1 ]] then # no packages of SEARCH_CAT are installed [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1 find ${MROOT}${INSTALLDB}/${SEARCH_CAT} -maxdepth 1 -mindepth 1 -printf "${SEARCH_CAT}/%P\n" | sort exit 0 fi # generate multidim array declare -i INSTALL_DATABASE_COUNT=0 for line in $(find ${MROOT}${INSTALLDB} -maxdepth 2 -mindepth 2 -printf '%P\n' | sort) do INSTALL_DATABASE_PCAT[${INSTALL_DATABASE_COUNT}]="${line%/*}" pkgname="${line#*/}" INSTALL_DATABASE_PNAME[${INSTALL_DATABASE_COUNT}]="${pkgname%-*-*}" pkgversion="${pkgname//${pkgname%-*-*}-}" INSTALL_DATABASE_PVER[${INSTALL_DATABASE_COUNT}]="${pkgversion%-*}" INSTALL_DATABASE_PBUILD[${INSTALL_DATABASE_COUNT}]="${pkgname##*-}" (( INSTALL_DATABASE_COUNT++ )) done if [[ ${GET_INVENTORY} = 1 ]] then # build the list first for ((i=0; i