From: Michael Prokop Date: Fri, 21 Mar 2014 07:49:37 +0000 (+0100) Subject: Rework script which checks for uninstallable packages X-Git-Tag: v0.23.1~2 X-Git-Url: https://git.grml.org/?p=grml-live.git;a=commitdiff_plain;h=c701eefdfc1608c1655defece1c2e3f8ff5cde66 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. --- 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 #################################################################