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: