#!/bin/bash log_dpkg() { echo dpkg $@ /usr/bin/dpkg $@ } # to be used on debian prior to jessie dpkg_verify() { local exitcode file pkg hashfile rfile phash hash exitcode=0 for file in $*; do pkg=`dpkg -S "$file" | cut -d: -f 1` hashfile="/var/lib/dpkg/info/$pkg.md5sums" if [ -s "$hashfile" ]; then rfile=`echo "$file" | cut -d/ -f 2-` phash=`grep -E "$rfile\$" "$hashfile" | cut -d\ -f 1` hash=`md5sum "$file" | cut -d\ -f 1` if [ "$hash" = "$phash" ]; then echo "$file: ok" else echo "$file: CHANGED" exitcode=1 fi else echo "$file: UNKNOWN" exitcode=1 fi done return $exitcode } cmd_install() { local n=`basename $1` n=`echo $n | sed "s/_[0-9.-]\+_amd64.deb//"` /bin/bash $0 -q $n >/dev/null 2>&1 && { fatal "$n is already installed (`/bin/bash $0 -q $n`)" } cmd_update $1 } cmd_update() { $dpkg --dry-run -i $1 || fatal "Test-installation failed." $dpkg -i $1 || fatal "Installation failed." } cmd_erase() { #$dpkg -r $1 $dpkg --purge $1 } cmd_query() { [ "$query_cmds" ] && { local cmd installed local id=name if [ "`echo $query_cmds | sed 's/.*p.*//'`" ]; then id=pkg query_cmds=`echo $query_cmds | sed 's/p//'` elif [ "`echo $query_cmds | sed 's/.*f.*//'`" ]; then id=file query_cmds=`echo $query_cmds | sed 's/f//'` fi for cmd in $query_cmds; do case $cmd in V) $dpkg --verify $1 ;; i) case $id in file) $dpkg -p $1;; name) $dpkg -I $1;; pkg) $dpkg -S $1;; esac ;; a) $dpkg -L $1 ;; esac done return $? } local p=`echo $1 | sed 's/-[0-9.-]\+$//'` local v=`echo $1 | sed "s/^$p-*//"` local ip=`dpkg-query -W -f '${Package}' $p >/dev/null 2>&1` [ $? != 0 -o -z "$ip" ] && exit 1 local iv=`dpkg-query -W -f '${Version}' $p >/dev/null 2>&1` [ "$v" ] && { [ "$v" != "$iv" ] && { echo "tried $1, installed version is $iv" >&2 exit 1 } } echo $ip-$iv return 0 } usage() { echo "usage: $myname [-h] [... misc rpm options]" [ "$1" ] && exit $1 } fatal() { echo $@ >&2 exit 1 } # -- here we go myname=`basename $0` dpkg=log_dpkg cmd="" set -- `getopt hqiUeVfap "$@"` while [ "$1" != -- ]; do case $1 in -h) usage 0 ;; -q) [ "$cmd" ] && usage 1 cmd=query ;; -V|-f|-a|-p) [ "$cmd" ] && { [ "$cmd" = query ] || usage 1 query_cmds="$cmd ${1:1:1}" } ;; -i) [ "$cmd" ] && { [ "$cmd" = query ] || usage 1 query_cmds="$cmd ${1:1:1}" continue } cmd=install ;; -U) [ "$cmd" ] && usage 1 cmd=update ;; -e) [ "$cmd" ] && usage 1 cmd=erase ;; *) usage 1 ;; esac shift done shift [ $# != 1 ] && usage 1 [ "$cmd" ] || usage 1 eval cmd_\$cmd $1