bac8b4246e
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
91 lines
2.9 KiB
Plaintext
Executable File
91 lines
2.9 KiB
Plaintext
Executable File
#!/usr/local/bin/dib-python
|
|
|
|
# Copyright 2017 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# 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:
|
|
e = subprocess.CalledProcessError(subp.returncode, cmdline)
|
|
e.output = out
|
|
raise e
|
|
|
|
# second, compose the list of modules to boot
|
|
modules_to_boot.append(dracut_object.get('name', None))
|
|
|
|
# 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
|
|
raise e
|
|
|
|
kernel_set = out.decode().split(':')
|
|
kernel_search = re.match("vmlinuz-(.*)", kernel_set[0])
|
|
kernel_version = "%s" % kernel_search.groups(1)
|
|
ramdisk_path = "/boot/%s" % kernel_set[1].strip()
|
|
modules_to_boot = ' ' .join(modules_to_boot)
|
|
|
|
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:
|