Provide workaround for systemd's systemctl failures on jessie
[grml-live.git] / etc / grml / fai / config / scripts / GRMLBASE / 01-packages
index b598516..bf92ae9 100755 (executable)
@@ -9,21 +9,39 @@
 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/${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: "
-   if $ROOTCMD dpkg --list $(grep -v '^#' $target/${PACKAGE_LIST} | grep -v -- '-$') >/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 #################################################################