From e6ddc645625ab76dd1d0c9215dfa9d9e3024bea9 Mon Sep 17 00:00:00 2001 From: abs Date: Mon, 2 Jul 2001 14:12:29 +0000 Subject: Correctly import pkgchk-1.00 (into pkgtools not pkg_tools) pkgchk verifies that the versions of installed packages matches those in pkgsrc, optionally adding missing or updating mismatched packages. It can verify all installed packages, or check against a set of packages based on the hostname, architecture, and other characteristics. --- pkgtools/pkgchk/files/pkgchk.sh | 216 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100755 pkgtools/pkgchk/files/pkgchk.sh (limited to 'pkgtools/pkgchk/files/pkgchk.sh') diff --git a/pkgtools/pkgchk/files/pkgchk.sh b/pkgtools/pkgchk/files/pkgchk.sh new file mode 100755 index 00000000000..68011dd3d6e --- /dev/null +++ b/pkgtools/pkgchk/files/pkgchk.sh @@ -0,0 +1,216 @@ +#!/bin/sh -e +# +# $Id: pkgchk.sh,v 1.1.1.1 2001/07/02 14:12:30 abs Exp $ + +extract_variables() + { + # Establish PKGSRCDIR + # + + if [ -z "$PKGSRCDIR" ];then + if [ -f /etc/mk.conf ] ;then + eval `printf 'all:\n\t@echo PKGSRCDIR=${PKGSRCDIR}\n' | make -f - -f /etc/mk.conf` + fi + if [ -z "$PKGSRCDIR" ];then + PKGSRCDIR=/usr/pkgsrc + fi + fi + if [ ! -d $PKGSRCDIR ];then + echo "Unable to locate PKGSRCDIR '$PKGSRCDIR'" + exit 1; + fi + + # Now we have PKGSRCDIR, use it to determine PACKAGES, and PKGCHK_CONF + # + eval `printf 'CATEGORIES=x\nDISTNAME=x\nall:\n + @echo PACKAGES=${PACKAGES} + @echo PKGCHK_CONF=${PKGCHK_CONF} + ' | (cd $PKGSRCDIR ; make -f - -f $PKGSRCDIR/mk/bsd.prefs.mk)` + + if [ -z "$PACKAGES" ];then + PACKAGES=$PKGSRCDIR/packages + fi + + if [ -z "$PKGCHK_CONF" ];then + PKGCHK_CONF=$PKGSRCDIR/pkgchk.conf + fi + if [ ! -r $PKGCHK_CONF ];then + echo "Unable to read PKGCHK_CONF '$PKGCHK_CONF'" + exit 1; + fi + } + +pkg_install() + { + PKGNAME=$1 + PKGDIR=$2 + INSTALL=$3 + if [ -n "$opt_b" -a -f $PACKAGES/All/$PKGNAME.tgz ] ; then + if [ $INSTALL = U ];then + if pkg_delete $PKGNAME ; then + echo "Deleted $PKGNAME" + else + echo "Can only update packages with dependencies via -s" + fi + fi + echo "Installing binary package $PKGNAME.tgz" + pkg_add $PACKAGES/All/$PKGNAME.tgz + elif [ -n "$opt_s" ]; then + echo "Building $PKGNAME" + cd $PKGSRCDIR/$PKGDIR + make update + fi + } + +args=`getopt D:IU:abchisuv $*` +if [ $? != 0 ]; then + opt_h=1 +fi +set -- $args +while [ $# != 0 ]; do + case "$1" in + -D ) opt_D="$2" ; shift;; + -U ) opt_U="$2" ; shift;; + -a ) opt_a=1 ; opt_c=1 ;; + -b ) opt_b=1 ;; + -c ) opt_c=1 ;; + -h ) opt_h=1 ;; + -i ) opt_i=1 ;; + -s ) opt_s=1 ;; + -u ) opt_u=1 ;; + -v ) opt_v=1 ;; + -- ) break ;; + esac + shift +done + +if [ -z "$opt_b" -a -z "$opt_s" ];then + opt_b=1; opt_s=1; +fi + +if [ -z "$opt_a" -a -z "$opt_c" -a -z "$opt_i" ];then + echo "Must specify at least one of -a, -c, or -i"; + echo + opt_h=1; +fi + +if [ -n "$opt_h" -o $# != 1 ];then + echo 'Usage: pkgchk [opts] + -D tags Comma separated list of additional pkgchk.conf tags to set + -U tags Comma separated list of pkgchk.conf tags to unset + -a Add all missing packages (implies -c) + -b Limit installations to binary packages + -c Check installed packages against pkgchk.conf + -h This help + -i Check versions of installed packages (ignore pkgchk.conf) + -s Limit installations to building from source + -u Update all mismatched packages + -v Verbose + +pkgchk verifies installed packages against pkgsrc. +The most common usage is 'pkgchk -i' to check all installed packages. +For more advanced usage, including defining a set of desired packages based +on hostname and type, see pkgchk(8). +' + exit 1 +fi + +extract_variables + +if [ -n "$opt_i" ];then + PKGDIRLIST=`pkg_info -B \* | awk '/PKGPATH= /{print $2}'` +fi + +if [ -n "$opt_c" ];then + # Determine list of tags + # + TAGS="`hostname -s`,`hostname`,`uname -srm | awk '{print $1"-"$2"-"$3","$1"-"$2","$1"-"$3","$1","$2","$3}'`" + if [ -f /usr/X11R6/lib/libX11.so -o /usr/X11R6/lib/libX11.a ];then + TAGS="$TAGS,x11" + fi + if [ -n "$opt_D" ];then + TAGS="$TAGS,$opt_D" + fi + if [ -n "$opt_v" ];then + echo "set TAGS=$TAGS" + echo "unset TAGS=$opt_U" + fi + + # Extract list of valid pkgdirs + # + PKGDIRLIST="$PKGDIRLIST "`awk -v setlist=$TAGS -v unsetlist=$opt_U ' + BEGIN { + split(setlist, tmp, ","); + for (tag in tmp) + { taglist[tmp[tag]] = 1; } + taglist["*"] = 1; + split(unsetlist, tmp, ","); + for (tag in tmp) + { + print "UN "notaglist[tag] > "/dev/stderr" + delete taglist[tmp[tag]] + } + taglist["*"] = "*" + } + { + sub("#.*", ""); + split($0, chklist, "[ ]*"); + need = 0; + for (chk in chklist) # For each word on the line + { + if (sub("^-", "", chklist[chk])) # If it begins with a '-' + { + if (chklist[chk] in taglist) # If match, discard + { next; } + } + else + { + if (chklist[chk] in taglist) # If match, note needed + { need = 1; } + } + } + if (need) + { print $1 } + } + ' < $PKGCHK_CONF + ` +fi + +# Check packages are installed +# +for pkgdir in $PKGDIRLIST ; do + cd $PKGSRCDIR/$pkgdir + # Use 'make x' rather than 'make all' to avoid potential licence errors + pkgname=`printf 'x:\n\t@echo ${PKGNAME}\n'|make -f - -f Makefile x` + if [ -z "$pkgname" ]; then + echo "Unable to extract PKGNAME for $pkgdir" + exit 1 + fi + + if [ ! -d /var/db/pkg/$pkgname ];then + echo -n "$pkgname: " + pkg=`echo $pkgname | sed 's/-[0-9].*//'` + pkginstalled=`pkg_info -e $pkg || true` + INSTALL= + if [ -n "$pkginstalled" ];then + echo -n "version mismatch - $pkginstalled" + if [ -n "$opt_u" ]; then + INSTALL=U + fi + else + echo -n "missing" + if [ -n "$opt_a" ] ; then + INSTALL=I + fi + fi + if [ -f $PACKAGES/All/$pkgname.tgz ] ;then + echo -n " (binary package available)" + fi + echo + if [ -n "$INSTALL" ];then + pkg_install $pkgname $pkgdir $INSTALL + fi + elif [ -n "$opt_v" ];then + echo "$pkgname: OK" + fi +done -- cgit v1.2.3