From bac8b4246ec3e5e22be2b62968f74195e9d3b42c Mon Sep 17 00:00:00 2001
From: Ian Wienand <iwienand@redhat.com>
Date: Tue, 13 Aug 2019 11:13:46 +1000
Subject: [PATCH] dracut-regenerate: catch failures and exit code

This seems to miss the exit code of the dracut process, which actualy
caused some issues in I8511669e188717494daf2bc1384a6dd346f942a4 where
it would have been much clearer to stop after the initramfs generation
failed.

Add some debug messages, and catch any errors from the final call.

Change-Id: I6f89441ec4709f5199535e15a7cc53a3a8af273d
---
 .../finalise.d/50-dracut-regenerate           | 33 ++++++++++++++++---
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/diskimage_builder/elements/dracut-regenerate/finalise.d/50-dracut-regenerate b/diskimage_builder/elements/dracut-regenerate/finalise.d/50-dracut-regenerate
index 813fb0e6c..e30de8a72 100755
--- a/diskimage_builder/elements/dracut-regenerate/finalise.d/50-dracut-regenerate
+++ b/diskimage_builder/elements/dracut-regenerate/finalise.d/50-dracut-regenerate
@@ -14,22 +14,34 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import logging
 import os
 import re
 import subprocess
 import yaml
 
 
+logging.basicConfig(
+    level=logging.DEBUG if int(os.getenv('DIB_DEBUG_TRACE', 0)) > 0
+    else logging.INFO)
+
+
 def main():
+    logging.info("Starting dracut regeneration")
+    logging.debug("Debug logging enabled")
+
     dracut_env = os.getenv('DIB_DRACUT_ENABLED_MODULES')
     dracut_objects = yaml.safe_load(dracut_env)
 
+    logging.debug(dracut_objects)
+
     modules_to_boot = []
     for dracut_object in dracut_objects:
         # first, install dependent packages
         packages = dracut_object.get('packages', [])
         for package in packages:
             cmdline = ["install-packages", package]
+            logging.debug("Calling: %s" % cmdline)
             subp = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
             out = subp.communicate()[0]
             if subp.returncode:
@@ -43,9 +55,9 @@ def main():
     # regenerate dracut with the list of installed modules
     if len(modules_to_boot) > 0:
         cmdline = ["select-boot-kernel-initrd"]
+        logging.debug("Calling: %s" % cmdline)
         subp = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
         out, err = subp.communicate()
-
         if subp.returncode:
             e = subprocess.CalledProcessError(subp.returncode, cmdline)
             e.output = out
@@ -57,11 +69,22 @@ def main():
         ramdisk_path = "/boot/%s" % kernel_set[1].strip()
         modules_to_boot = ' ' .join(modules_to_boot)
 
-        subp = subprocess.Popen(['dracut', '--force', '--add', modules_to_boot,
-                                 '-f', ramdisk_path, kernel_version],
-                                stdout=subprocess.PIPE)
-        subp.wait()
+        cmdline = ['dracut', '--force', '--add', modules_to_boot,
+                   '-f', ramdisk_path, kernel_version]
+        logging.debug("Calling: %s" % cmdline)
+        subp = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
+        out, err = subp.communicate()
+        if subp.returncode:
+            e = subprocess.CalledProcessError(subp.returncode, cmdline)
+            e.output = out
+            raise e
+
+    logging.info("dracut regenerate done")
 
 
 if __name__ == '__main__':
     main()
+
+# Local Variables:
+# mode: python
+# End: