#!/bin/bash # $HeadURL$ $LastChangedRevision$ set -e PROGNAME=$(basename $0) # Load support functions . $(pcms-config PCMS_SHARE_PREFIX)/scripts/support.sh # Other globals export DEBIAN_FRONTEND=noninteractive main() { local VERB PKG # Defaults for options VERBOSELEVEL=2 # Process options while [ $# -ge 1 ]; do case $1 in -d) VERBOSELEVEL=$2; shift ;; --debug=*) VERBOSELEVEL=${1#*=} ;; -v|--verbose) VERBOSELEVEL=3 ;; --) shift; break ;; -*) error "main: $1: bad option" ;; *) break ;; esac shift done # Process arguments [ $# -ge 1 ] || usage VERB=$1 shift # Sanity checks and derivations if [ $VERB = upgrade ]; then VERB=dist-upgrade warning "'upgrade' argument remapped to 'dist-upgrade'" fi case $VERB in install|remove|update|dist-upgrade|autoremove) : ;; *) usage ;; esac # Guts debug 10 "main: calling [$VERB $*] ..." ${VERB//-/_} "$@" debug 10 "main: done" } usage() { echo "Usage: $PROGNAME {install|remove|update|dist-upgrade|autoremove} [ ]" >&2 exit 1 } package_is_installed() { local PKG PKG=$1 debug 10 "package_is_installed: PKG=$PKG" #[ -f /var/lib/dpkg/info/$PKG.list ] || return 1 { dpkg-query -f '${binary:Package}\n' -W | fgrep -qx -e $PKG -e $PKG:amd64 -e $PKG:i386; } || return 1 } install() { local PKG PKG=$1 # Install package if necessary if ! package_is_installed $PKG; then filter_apt_get_blurb eatmydata_if_possible apt-get -y -qq --purge --reinstall --no-install-recommends -o DPkg::options::=--force-confmiss,confnew install $PKG package_is_installed $PKG || error "$PKG: tried to install but failed (hints: see messages above)" fi # touch needed so make can reference time of installation. touch /var/lib/dpkg/info/$PKG.list mkdir -p /var/lib/debfoster lineinfile --after=EOF --text=$PKG --file=/var/lib/debfoster/keepers } remove() { local PKG PKG=$1 debug 10 "remove: PKG=$PKG" # Remove package if necessary debug 10 "remove: checking if package is installed ..." if package_is_installed $PKG; then debug 10 "remove: package is installed; removing it ..." eatmydata_if_possible apt-get -y -qq --purge autoremove $PKG { ! package_is_installed $PKG; } || error "$PKG: tried to remove but failed (hints: see messages above)" fi debug 10 "remove: cleaning up debfoster ..." mkdir -p /var/lib/debfoster cat /var/lib/debfoster/keepers /dev/null > /tmp/package.$$.keepers 2>/dev/null || true fgrep -vx $PKG /tmp/package.$$.keepers > /var/lib/debfoster/keepers || true rm -f /tmp/package.$$.keepers } update() { filter_apt_get_blurb eatmydata_if_possible apt-get -qq update } dist_upgrade() { #eatmydata_if_possible dpkg -a --configure filter_apt_get_blurb eatmydata_if_possible apt-get -y -qq -o DPkg::options::=--force-confdef,confold dist-upgrade } autoremove() { filter_apt_get_blurb eatmydata_if_possible apt-get -y -qq --purge autoremove } filter_apt_get_blurb() { local RC debug 10 "filter_apt_get_blurb: calling [$*] ..." "$@" > /tmp/package.$$.stdout 2>/tmp/package.$$.stderr || RC=$? egrep -v '^(\(Reading database \.\.\.|Selecting previously unselected package|Preparing to unpack \.\.\.)' /tmp/package.$$.stdout || true cat /tmp/package.$$.stderr >&2 rm -f /tmp/package.$$.stdout /tmp/package.$$.stderr return $RC } eatmydata_if_possible() { if [ -x /usr/bin/eatmydata ]; then debug 10 "eatmydata_if_possible: calling [eatmydata $*] ..." eatmydata "$@" < /dev/null else debug 10 "eatmydata_if_possible: calling [$*] (no eatmydata) ..." "$@" < /dev/null fi } main "$@"