From d636b827839332a2d90c6224e2ee8c8dee16b7e0 Mon Sep 17 00:00:00 2001 From: Will Woods Date: Fri, 1 Jul 2011 15:42:47 -0400 Subject: [PATCH] Move generate_module_data before create_runtime module-info and the updated depmod stuff need to be inside the runtime image, so this needs to happen before create_runtime. Accordingly, generate_module_data gets moved to RuntimeBuilder. --- src/pylorax/__init__.py | 6 ++-- src/pylorax/treebuilder.py | 61 +++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/pylorax/__init__.py b/src/pylorax/__init__.py index 5bafd8a9..5204b5b5 100644 --- a/src/pylorax/__init__.py +++ b/src/pylorax/__init__.py @@ -214,6 +214,9 @@ class Lorax(BaseLoraxClass): logger.info("cleaning unneeded files") rb.cleanup() + logger.info("generating kernel module metadata") + rb.generate_module_data() + logger.info("creating the runtime image") runtime = "images/install.img" # FIXME: compression options (type, speed, etc.) @@ -224,9 +227,6 @@ class Lorax(BaseLoraxClass): inroot=installroot, outroot=self.outputdir, runtime=runtime, templatedir=templatedir) - logger.info("generating kernel module metadata") - treebuilder.generate_module_data() - logger.info("rebuilding initramfs images") treebuilder.rebuild_initrds(add_args=["--xz"]) diff --git a/src/pylorax/treebuilder.py b/src/pylorax/treebuilder.py index 85153ec1..da033b2a 100644 --- a/src/pylorax/treebuilder.py +++ b/src/pylorax/treebuilder.py @@ -40,6 +40,27 @@ templatemap = { 's390x': 's390.tmpl', } +def generate_module_info(moddir, outfile=None): + def module_desc(mod): + return check_output(["modinfo", "-F", "description", mod]).strip() + def read_module_set(name): + return set(l.strip() for l in open(joinpaths(moddir,name)) if ".ko" in l) + modsets = {'scsi':read_module_set("modules.block"), + 'eth':read_module_set("modules.networking")} + + modinfo = list() + for root, dirs, files in os.walk(moddir): + for modtype, modset in modsets.items(): + for mod in modset.intersection(files): # modules in this dir + (name, ext) = os.path.splitext(mod) # foo.ko -> (foo, .ko) + desc = module_desc(joinpaths(root,mod)) or "%s driver" % name + modinfo.append(dict(name=name, type=modtype, desc=desc)) + + out = open(outfile or joinpaths(moddir,"module-info"), "w") + out.write("Version 0\n") + for mod in sorted(modinfo, key=lambda m: m.get('name')): + out.write('{name}\n\t{type}\n\t"{desc:.65}"\n'.format(**mod)) + class RuntimeBuilder(object): '''Builds the anaconda runtime image.''' def __init__(self, product, arch, yum, templatedir=None): @@ -78,6 +99,15 @@ class RuntimeBuilder(object): removelocales = locales.difference(keeplocales) self._runner.run("runtime-cleanup.tmpl", removelocales=removelocales) + def generate_module_data(self): + root = self.vars.root + moddir = joinpaths(root, "lib/modules/") + for kver in os.listdir(moddir): + ksyms = joinpaths(root, "boot/System.map-%s" % kver) + logger.info("doing depmod and module-info for %s", kver) + check_call(["depmod", "-a", "-F", ksyms, "-b", root, kver]) + generate_module_info(moddir+kver, outfile=moddir+"module-info") + def create_runtime(self, outfile="/tmp/squashfs.img"): # make live rootfs image - must be named "LiveOS/rootfs.img" for dracut workdir = joinpaths(os.path.dirname(outfile), "runtime-workdir") @@ -107,16 +137,6 @@ class TreeBuilder(object): def kernels(self): return findkernels(root=self.vars.inroot) - def generate_module_data(self): - inroot = self.vars.inroot - for kernel in self.kernels: - kver = kernel.version - ksyms = joinpaths(inroot, "boot/System.map-%s" % kver) - logger.info("doing depmod and module-info for %s", kver) - check_call(["depmod", "-a", "-F", ksyms, "-b", inroot, kver]) - moddir = joinpaths(inroot, "lib/modules/") - generate_module_info(moddir+kver, outfile=moddir+"module-info") - def rebuild_initrds(self, add_args=[], backup=""): '''Rebuild all the initrds in the tree. If backup is specified, each initrd will be renamed with backup as a suffix before rebuilding. @@ -170,27 +190,6 @@ def findkernels(root="/", kdir="boot"): return kernels -def generate_module_info(moddir, outfile=None): - def module_desc(mod): - return check_output(["modinfo", "-F", "description", mod]).strip() - def read_module_set(name): - return set(l.strip() for l in open(joinpaths(moddir,name)) if ".ko" in l) - modsets = {'scsi':read_module_set("modules.block"), - 'eth':read_module_set("modules.networking")} - - modinfo = list() - for root, dirs, files in os.walk(moddir): - for modtype, modset in modsets.items(): - for mod in modset.intersection(files): # modules in this dir - (name, ext) = os.path.splitext(mod) # foo.ko -> (foo, .ko) - desc = module_desc(joinpaths(root,mod)) or "%s driver" % name - modinfo.append(dict(name=name, type=modtype, desc=desc)) - - out = open(outfile or joinpaths(moddir,"module-info"), "w") - out.write("Version 0\n") - for mod in sorted(modinfo, key=lambda m: m.get('name')): - out.write('{name}\n\t{type}\n\t"{desc:.65}"\n'.format(**mod)) - # udev whitelist: 'a-zA-Z0-9#+.:=@_-' (see is_whitelisted in libudev-util.c) udev_blacklist=' !"$%&\'()*,/;<>?[\\]^`{|}~' # ASCII printable, minus whitelist udev_blacklist += ''.join(chr(i) for i in range(32)) # ASCII non-printable