#!/bin/bash
-# Filename: /etc/grml/fai/config/scripts/GRMLBASE/01-packages
+# Filename: ${GRML_FAI_CONFIG}/config/scripts/GRMLBASE/01-packages
# Purpose: check for packages that have been requested but could not be installed
# Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
# Bug-Reports: see http://grml.org/bugs/
set -u
set -e
-[ -r /etc/grml/grml-live.conf ] && . /etc/grml/grml-live.conf
-[ -r /etc/grml/grml-live.local ] && . /etc/grml/grml-live.local
+PACKAGE_LIST=/var/log/install_packages.list
-
-if ! [ -r "$target/tmp/packages.list" ] ; then
- echo "No $target/tmp/packages.list found, will not run package validation check."
+if ! [ -r "$target/${PACKAGE_LIST}" ] ; then
+ echo "No $target/${PACKAGE_LIST} found, will not run package validation check."
else
- printf "Validating package list: "
- if $ROOTCMD dpkg --list $(grep -v '^#' $target/tmp/packages.list) >/dev/null 2>$LOGDIR/package_errors.log ; then
- printf "done - no errors found\n"
- else
- printf "failed (there have been errors, find them at $LOGDIR/package_errors.log)\n"
- fi
+ printf "Validating package list: "
+
+ TMPSTDOUT=$(mktemp)
+ TMPSTDERR=$(mktemp)
+
+ # 1) catch packages that aren't in state 'ii' (marked for installation
+ # and successfully instead) on stdout
+ # 2) catch error messages like 'dpkg-query: no packages found matching $package"
+ # for packages unknown to dpkg on stderr
+ # NOTE: 'grep -v -- '-$' ignores packages in FAI's package list that are
+ # marked for removal
+ $ROOTCMD dpkg --list $(grep -v '^#' $target/${PACKAGE_LIST} | grep -v -- '-$') 2>"$TMPSTDERR" | \
+ grep -e '^[urph][ncufhWt]' > "$TMPSTDOUT" || true
+
+ # extract packages from stdout
+ awk '/^un/ {print $2 " not_installable"}' "$TMPSTDOUT" > "$LOGDIR/package_errors.log"
+
+ # extract packages from stderr
+ grep 'packages found matching' "$TMPSTDERR" | \
+ sed 's/dpkg-query: [Nn]o packages found matching \(.*\)/\1 not_installable/' >> "$LOGDIR/package_errors.log"
+
+ if [ -s "$LOGDIR/package_errors.log" ] ; then
+ printf "failed (there have been errors, find them at $LOGDIR/package_errors.log)\n"
+ else
+ printf "done - no errors found\n"
+ fi
+
+ rm -f "$TMPSTDOUT" "$TMPSTDERR"
fi
## END OF FILE #################################################################
-# vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=3
+# vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=2