#!/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 os import re import subprocess import yaml def main(): dracut_env = os.getenv('DIB_DRACUT_ENABLED_MODULES') dracut_objects = yaml.safe_load(dracut_env) 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] 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"] 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) subp = subprocess.Popen(['dracut', '--force', '--add', modules_to_boot, '-f', ramdisk_path, kernel_version], stdout=subprocess.PIPE) subp.wait() if __name__ == '__main__': main()