From c701eefdfc1608c1655defece1c2e3f8ff5cde66 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Fri, 21 Mar 2014 08:49:37 +0100 Subject: [PATCH] Rework script which checks for uninstallable packages While older versions of dpkg reported: | No packages found matching ${package}. newer ones report: | dpkg-query: no packages found matching ${package} Newer versions of dpkg also seem to mix stdout and stderr (looking like buffering problems?), so the result is unreliable for us. Therefore split handling of stdout and stderr output. This fixes the problem that the junit output wasn't really adequate anymore lately. --- etc/grml/fai/config/scripts/GRMLBASE/01-packages | 47 +++++++++++++++--------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/etc/grml/fai/config/scripts/GRMLBASE/01-packages b/etc/grml/fai/config/scripts/GRMLBASE/01-packages index b13aab5..bf92ae9 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/01-packages +++ b/etc/grml/fai/config/scripts/GRMLBASE/01-packages @@ -12,25 +12,36 @@ set -e PACKAGE_LIST=/var/log/install_packages.list if ! [ -r "$target/${PACKAGE_LIST}" ] ; then - echo "No $target/${PACKAGE_LIST} found, will not run package validation check." + echo "No $target/${PACKAGE_LIST} found, will not run package validation check." else - printf "Validating package list: " - TMPFILE=$(mktemp) - - $ROOTCMD dpkg --list $(grep -v '^#' $target/${PACKAGE_LIST} | grep -v -- '-$') 2>&1 | \ - grep -e '^un' -e 'No packages' > "$TMPFILE" || true - - awk '/^un/ {print $2 " not_installable"}' "$TMPFILE" > "$LOGDIR/package_errors.log" - awk '/^No packages found matching/ {print $5 " not_available"}' "$TMPFILE" | \ - sed 's/\. / /' >> "$LOGDIR/package_errors.log" - - if [ -s "$TMPFILE" ] ; 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 "$TMPFILE" + 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 ################################################################# -- 2.1.4