Rework script which checks for uninstallable packages
authorMichael Prokop <mika@grml.org>
Fri, 21 Mar 2014 07:49:37 +0000 (08:49 +0100)
committerMichael Prokop <mika@grml.org>
Fri, 21 Mar 2014 07:49:37 +0000 (08:49 +0100)
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

index b13aab5..bf92ae9 100755 (executable)
@@ -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 #################################################################