diff --git a/scripts/dpm.sh b/scripts/dpm.sh index 38ba1728..b609d891 100644 --- a/scripts/dpm.sh +++ b/scripts/dpm.sh @@ -1,4 +1,36 @@ -#!/bin/sh +#!/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() { @@ -24,8 +56,36 @@ cmd_erase() cmd_query() { - [ "$query_cmd" ] && { - eval cmd_query_\$query_cmd $1 + [ "$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 $? } @@ -59,10 +119,10 @@ fatal() # -- here we go myname=`basename $0` -dpkg=/usr/bin/dpkg +dpkg=log_dpkg cmd="" -set -- `getopt hqiUe "$@"` +set -- `getopt hqiUeVfap "$@"` while [ "$1" != -- ]; do case $1 in -h) @@ -72,8 +132,18 @@ case $1 in [ "$cmd" ] && usage 1 cmd=query ;; + -V|-f|-a|-p) + [ "$cmd" ] && { + [ "$cmd" = query ] || usage 1 + query_cmds="$cmd ${1:1:1}" + } + ;; -i) - [ "$cmd" ] && usage 1 + [ "$cmd" ] && { + [ "$cmd" = query ] || usage 1 + query_cmds="$cmd ${1:1:1}" + continue + } cmd=install ;; -U)