#!/bin/bash # # This script only works with packages built for Slackware 8.1 or higher # while it relies on the new naming scheme (NAME-VERSION-ARCH-BUILT) # # This is the rewritten version (II) of listpkg # # 0.0.1 04.02.2005 Initial version # # 0.0.2 10.02.2005 # - added version information (II_0.0.2) # - archivepkg (-z) and checkpkg (-c) added but not functional # - package list given on the command line is not handled correctly # # 0.0.3 11.02.2005 # - format of /tmp/pkginfo changed from PKGNAME VERSION ARCH BUILT # to COMPLETE_NAME:PKGNAME:VERSION:ARCH:BUILT # - correct handling of the package list given on the commandline, # no asterisks # # 0.0.4 17.02.2005 # - 666 auf /tmp/pkginfo # # 0.0.5 23.02.2005 # - basic asterix handling (buggy!) # - option -p implemented # Author: Armin Meyer-Larsen MYNAME=$(basename $0) PKGROOT=${PKGROOT:-/} VERSION=II_0.0.5 CR_DATE="2005-02-23.17:54" # date +%Y-%m-%d.%H:%M # Read config # =========== CONFIGPATH=$CONFIGPATH:/etc:/usr/local/etc:/etc/slack-pkg for i in $(echo $CONFIGPATH | sed -e 's/:/ /g') do [ -r $i/slack-pkgrc ] && . $i/slack-pkgrc done # Where to find Slackware's package information # ============================================= SLACKDB=${SLACKDB:-/var/log/packages} SLACKSCRIPTDIR=${SLACKSCRIPTDIR:-/var/log/scripts} SLACK_PKG=/usr/local/sbin/slack-pkg TMP=${TMP:-/tmp} # Return-Codes # ============ OK=${OK:-0} ERR_UNKN=${ERR_UNKN:-255} ERR_DIST=${ERR_UNKN:-127} ERR_NSET=${ERR_NSET:-254} ERR_OPT=${ERR_OPT:-1} ERR_ARG=${ERR_ARG:-2} ERR_PKG=${ERR_PKG:-3} # Asterix # ======= if [ ! -d ${TMP}/.slackpkg/.leerdir ] then rm -rf ${TMP}/.slackpkg/.leerdir mkdir -p ${TMP}/.slackpkg/.leerdir fi RCWD=$PWD cd ${TMP}/.slackpkg/.leerdir # Slackware-Version # ================= if [ -f /etc/slackware-version ] then SLACKVERSION=$(cat ${PKGROOT}/etc/slackware-version | cut -d" " -f2) else printf "\n $MYNAME: Cannot determine your Slackware version\n Exiting...\n\n" 1>&2 cd $RCWD ; exit $ERR_DIST fi ### I. Functions # PKGINFO() pkginfo() { echo -n Reading Package Information... CWD=$PWD cd $PKGROOT/$SLACKDB # We silently suppress entries that do not follow the new naming scheme ... for i in $(find . -name '*-*-*-*' ) do printf "%s:%s:%s:%s:%s\n" $(echo $i | sed -e 's#^\./##g') $(echo $i | sed -e 's#./\(.*\)-\(.*\)-\(.*\)-\(.*\)#\1 \2 \3 \4#') done | sort > ${TMP}/pkginfo _RC=$? chmod 666 ${TMP}/pkginfo 2>/dev/null echo done cd $CWD return $_RC } # FEXIT # ===== fexit() { RC=${RC:-$ERR_NSET} cd $RCWD exit $RC } # FHELP() # ======= fhelp() { echo echo " Usage:" echo " ------" echo " $MYNAME [ -s | -S ] [ PKG1 [ PKG2 [...] ] " echo " $MYNAME [ -a | -i | -l | -p ] PKG" echo " $MYNAME -w FILE" echo " $MYNAME -h | -u | -V" echo } # F_ARGERROR # ========== # required variables: OPT fargerror() { printf "\n $MYNAME: Option $OPT requires an argument\n\n" return $ERR_ARG } # F_PKGERR # ======== # required variables: WHATPKG fpkgerr() { printf "\n $MYNAME: Package ${WHATPKG} not installed.\n\n" 1>&2 return $ERR_PKG } # PRINTHEADER() # ============= printheader() { echo echo "Path: $SLACKDB" printf "\n %-22s%-15s%-7s%5s\n" PACKAGE VERSION ARCH BUILT echo "=====================================================" } # FINDPKG() # ========= # returns the complete filename to package WHATPKG findpkg() { if [ -f "${SLACKDB}/${WHATPKG}" ] then FOUNDPKG=${SLACKDB}/${WHATPKG} else FOUNDPKG=$(ls ${SLACKDB}/${WHATPKG}-[0-9IVX]*-*-* 2>/dev/null) fi if [ -f "$FOUNDPKG" ] then echo $FOUNDPKG else WHATPKG="$FOUNDPKG" fpkgerr # WHATPKG required for fpkgerr! RC=$? fexit fi } # PKGLIST # ======= # returns list of packagenames from cmdline # required variables: PACKAGES pkglist() { for i in $PACKAGES do echo "$i" | grep '\*' >/dev/null 2>&1 if [ "$?" = "0" ] then # asterix egrep ^$(echo "$i" | sed -e 's/*/.*/g'): ${TMP}/pkginfo | cut -d: -f1 else # regular argument egrep "(^$i:|:$i:)" ${TMP}/pkginfo | cut -d: -f1 fi done return } # PKGSIZE() # ========= # returns size of ${1}, needs SZ to be set to COMPRESSED or UNCOMPRESSED pkgsize() { # compressed or uncompressed size? if [ "$SZ" = "COMPRESSED" ] then z=z elif [ "$SZ" = "UNCOMPRESSED" ] then z="" else RC=$ERR_UNKN fexit fi # print header echo echo "Path: $SLACKSCRIPTDIR" echo printf "%-22s%-15s%10s\n" Package Version "${z}Size (kB)" echo "=========================================================" if [ -z "$__PKG" ] # remember: $__PKG is $* then PKGLIST=$(cat ${TMP}/pkginfo | awk -F: '{print $2;}') else PKGLIST="$__PKG" fi for _PKG in $PKGLIST do FILE=${SLACKDB}/$(egrep "(:${_PKG}:|^${_PKG}:)" ${TMP}/pkginfo | awk -F: '{print $1}') VERS=$(egrep "(:${_PKG}:|^${_PKG}:)" ${TMP}/pkginfo | awk -F: '{print $3}') PKG=$(egrep "(:${_PKG}:|^${_PKG}:)" ${TMP}/pkginfo | awk -F: '{print $2}') SIZE=$(grep "^$SZ PACKAGE SIZE:" $FILE | awk '{print $4;}') printf "%-22s%-15s%10s\n" $PKG $VERS $SIZE done return $OK } ### II How are we called? case "$MYNAME" in archivepkg ) exec slack-pkg -z $* ;; checkpkg ) exec slack-pkg -c $* ;; listpkg ) true ;; * ) true ;; esac ### III. Updating List of Installed Packages if [ ! -e ${TMP}/pkginfo ] then touch ${TMP}/pkginfo && sleep 2 && touch $PKGROOT/$SLACKDB fi if [ $PKGROOT/$SLACKDB -nt ${TMP}/pkginfo ] then pkginfo fi # At this point we are sure that we have a recent pkginfo. # and we can start working ### IV. Command line options if [ $# = 0 ] then printheader printf " %-22s%-15s%-7s%5s\n" $(cat ${TMP}/pkginfo | awk -F: '{print $2, $3, $4, $5;}') else while [ "$#" -gt "0" ] do case "$1" in # LIST PACKAGE CONTENTS "-a" | "--all" ) [ -z "$2" ] && OPT="$1" fargerror WHATPKG=$2 PKG=$(findpkg) || RC=$? fexit cat $PKG shift shift ;; # CHECK "-c" | "--check" ) true shift ;; # HELP "-h" | "--hilfe" | "--help" ) fhelp RC=$OK fexit ;; # INSTALL SCRIPT "-i" | "--install" | "--install-script" ) [ -z "$2" ] && OPT="$1" fargerror WHATPKG=$2 _PKG=$(findpkg) || RC=$? fexit PKG=$(basename $_PKG) if [ -e $SLACKSCRIPTDIR/$PKG ] then echo echo "Path: $SLACKSCRIPTDIR" echo echo "Installation script of package $PKG:" echo "=========================================================" cat $SLACKSCRIPTDIR/$PKG echo else echo echo " Package $PKG" echo " doesn't contain an installation script." echo fi shift shift ;; # FILE LIST "-l" | "--list" | "--file-list" ) [ -z "$2" ] && { OPT="$1" fargerror ; RC=$? fexit ; } WHATPKG=$2 PKG=$(findpkg) || RC=$? fexit echo echo "Path: $SLACKDB" echo echo "Contents of package $(basename $PKG):" echo "=========================================================" tail +$(($(grep -n "FILE LIST:" ${PKG} | cut -d: -f1)+1)) ${PKG} echo shift shift ;; # PACKAGE DESCRIPTION "-p" | "--package-description" ) [ -z "$2" ] && { OPT="$1" fargerror ; RC=$? fexit ; } WHATPKG=$2 PKG=$(findpkg) [ -z "$PKG" ] && RC=$ERR_PKG fexit BGN_LN=$(($(grep -n 'PACKAGE DESCRIPTION:' $PKG | cut -d: -f1)+1)) END_LN=$(($(grep -n 'FILE LIST:' $PKG | cut -d: -f1) )) printf "\nPath : $SLACKDB\nPackage: $(basename $PKG)\n\n" tail +$BGN_LN $PKG | head -$((END_LN-BGN_LN)) | awk -F: '{print $2;}' echo RC=$? fexit shift shift ;; # UNCOMPRESSED PACKAGE SIZE "-s" | "--size" ) OPT=$1 # parameter value for fargerror; required! shift PACKAGES="$*" __PKG=$(pkglist) if [ \( -n "$1" \) -a \( -z "$__PKG" \) ] then WHATPKG="$1" fpkgerr RC=$? echo fexit fi SZ="UNCOMPRESSED" pkgsize RC=$? echo fexit ;; # COMPRESSED PACKAGE SIZE "-S" | "--compressed-size" ) OPT=$1 # parameter value for fargerror; required! shift PACKAGES="$*" __PKG=$(pkglist) if [ \( -n "$1" \) -a \( -z "$__PKG" \) ] then WHATPKG="$1" fpkgerr RC=$? echo fexit fi SZ="COMPRESSED" pkgsize RC=$? echo fexit ;; # RESERVED - TESTING SWITCH! "-t" | "--test" ) shift [ ! -z "$*" ] && PACKAGES="$*" pkglist RC=$? fexit ;; # FORCE UPDATE PKGINFO "-u" | "--force-update" ) echo pkginfo RC=$? echo fexit ;; # VERSION "-V" | "--version" ) printf "\n $MYNAME $VERSION ($CR_DATE)\n\n" RC=$OK fexit ;; # SEARCH FILE IN ALL PACKAGES "-w" | "--whereis" | "-f" | "--file" ) [ -z "$2" ] && OPT="$1" fargerror printf "\nPath: /var/adm/packages\n\n" ( cd ${SLACKDB} && grep "$2" * | egrep -v '.*:.*:' ) echo shift shift ;; # ARCHIVEPKG "-z" | "--archive" ) true shift ;; # UNKNOWN OPTION "-"*) printf "\n$MYNAME: invalid option $1\n" 1>&2 fhelp 1>&2 RC=$ERR_OPT fexit ;; # PACKAGE LIST *) [ ! -z "$*" ] && PACKAGES="$*" PKGLIST=$(pkglist) if [ ! -z "$PKGLIST" ] then printheader for _PKG in ${PKGLIST} do printf " %-22s%-15s%-7s%5s\n" $(egrep "(:${_PKG}:|^${_PKG}:)" ${TMP}/pkginfo | awk -F: '{print $2, $3, $4, $5;}') done | uniq echo else WHATPKG=$PACKAGES fpkgerr RC=$? fi break ;; esac done fi cd $RCWD fexit