From 3d5a3edb67883ec9a18136cffbbe71306c02ec17 Mon Sep 17 00:00:00 2001 From: Will Woods Date: Thu, 28 Apr 2011 16:41:24 -0400 Subject: [PATCH] Replace images with treebuilder --- src/pylorax/__init__.py | 50 +-- src/pylorax/images.py | 812 ---------------------------------------- 2 files changed, 19 insertions(+), 843 deletions(-) delete mode 100644 src/pylorax/images.py diff --git a/src/pylorax/__init__.py b/src/pylorax/__init__.py index 3bac85f2..2a2c4fa7 100644 --- a/src/pylorax/__init__.py +++ b/src/pylorax/__init__.py @@ -51,7 +51,6 @@ from installtree import LoraxInstallTree from buildstamp import BuildStamp from treeinfo import TreeInfo from discinfo import DiscInfo -import images class ArchData(object): lib64_arches = ("x86_64", "ppc64", "sparc64", "s390x", "ia64") @@ -273,46 +272,35 @@ class Lorax(BaseLoraxClass): discinfo = DiscInfo(self.product.release, self.arch.basearch) discinfo.write(joinpaths(self.outputdir, ".discinfo")) - # create .treeinfo - treeinfo = TreeInfo(self.product.name, self.product.version, - self.product.variant, self.arch.basearch) - - # get the image class - factory = images.Factory() - imgclass = factory.get_class(self.arch.basearch) - - ctype = self.conf.get("compression", "type") - cspeed = self.conf.get("compression", "speed") - - i = imgclass(kernellist=kernels, - installtree=self.installtree, - outputroot=self.outputdir, - product=self.product.name, - version=self.product.version, - treeinfo=treeinfo, - basearch=self.arch.basearch, - ctype=ctype, - cspeed=cspeed) - - # backup required files - i.backup_required(self.workdir) + # XXX do we need to backup installtree here? logger.info("getting list of not required packages") remove = template.getdata("remove", mode="lines") self.installtree.remove_packages(remove) - # cleanup python files logger.info("cleaning up python files") self.installtree.cleanup_python_files() - # compress install tree (create initrd) - logger.info("creating the initrd") - i.create_initrd(self.arch.libdir) + # Set up the TreeInfo object - we're about to start building + treeinfo = TreeInfo(self.product.name, self.product.version, + self.product.variant, self.arch.basearch) - # create boot iso - logger.info("creating boot iso") - i.create_boot(efiboot=None) # FIXME restore proper EFI function + logger.info("creating the runtime image") + runtime = joinpaths(self.workdir, "install.img") + ctype = self.conf.get("compression", "type") + cspeed = self.conf.get("compression", "speed") + self.installtree.compress(runtime, ctype, cspeed) + cpfile(runtime, joinpaths(self.outputdir, "images/install.img")) + treeinfo.add_section("stage2", {"mainimage": "images/install.img"}) + logger.info("building output tree and boot images") + treebuilder = TreeBuilder(product, arch, + self.installtree.root, self.outputdir) + treebuilder.build() + for section, data in treebuilder.treeinfo_data: + treeinfo.add_section(section, data) + + # write .treeinfo treeinfo.write(joinpaths(self.outputdir, ".treeinfo")) def get_buildarch(self): diff --git a/src/pylorax/images.py b/src/pylorax/images.py deleted file mode 100644 index ece8b008..00000000 --- a/src/pylorax/images.py +++ /dev/null @@ -1,812 +0,0 @@ -# -# images.py -# -# Copyright (C) 2011 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Red Hat Author(s): Martin Gracik -# - -import logging -logger = logging.getLogger("pylorax.images") - -import os -import subprocess -import shutil -import glob -import collections - -from base import DataHolder -from sysutils import joinpaths, cpfile, replace - -import constants - - -##### constants ##### - -ANABOOTDIR = "usr/share/anaconda/boot" - -# ppc -ETCDIR = "etc" -PPCPARENT = "ppc" -CHRPDIR = "ppc/chrp" -IMAGESDIR = "images" - -PPC32DIR = "ppc/ppc32" -PPC64DIR = "ppc/ppc64" -MACDIR = "ppc/mac" -NETBOOTDIR = "images/netboot" - -MKZIMAGE = "usr/bin/mkzimage" -ZIMAGE_STUB = "usr/share/ppc64-utils/zImage.stub" -WRAPPER = "usr/sbin/wrapper" - -ISOPATHDIR = "isopath" - -MKISOFS = "mkisofs" -MAPPING = joinpaths(ANABOOTDIR, "mapping") -MAGIC = joinpaths(ANABOOTDIR, "magic") -IMPLANTISOMD5 = "implantisomd5" - -# x86 -ISOLINUXDIR = "isolinux" -PXEBOOTDIR = "images/pxeboot" - -ISOLINUX_BIN = "usr/share/syslinux/isolinux.bin" -SYSLINUX_CFG = "usr/share/anaconda/boot/syslinux.cfg" - -ISOHYBRID = "isohybrid" - -# s390 -INITRD_ADDRESS = "0x02000000" - -# sparc -SPARCDIR = "boot" - - -class PPC(object): - - def __init__(self, kernellist, installtree, outputroot, product, version, - treeinfo, basearch, ctype, cspeed): - - self.kernellist = kernellist - self.installtree = installtree - self.outputroot = outputroot - self.product = product - self.version = version - self.treeinfo = treeinfo - self.basearch = basearch - self.ctype = ctype - self.cspeed = cspeed - self.kernels, self.initrds = [], [] - - self.reqs = collections.defaultdict(str) - - def backup_required(self, workdir): - # yaboot.conf - yabootconf = joinpaths(self.installtree.root, ANABOOTDIR, - "yaboot.conf.in") - - self.reqs["yabootconf"] = cpfile(yabootconf, workdir) - - # bootinfo.txt - bootinfo_txt = joinpaths(self.installtree.root, ANABOOTDIR, - "bootinfo.txt") - - self.reqs["bootinfo_txt"] = cpfile(bootinfo_txt, workdir) - - # efika.forth - efika_forth = joinpaths(self.installtree.root, "boot", - "efika.forth") - - self.reqs["efika_forth"] = cpfile(efika_forth, workdir) - - # yaboot - yaboot = joinpaths(self.installtree.root, "usr/lib/yaboot/yaboot") - self.reqs["yaboot"] = cpfile(yaboot, workdir) - - # ofboot.b - ofboot_b = joinpaths(self.installtree.root, ANABOOTDIR, "ofboot.b") - self.reqs["ofboot_b"] = cpfile(ofboot_b, workdir) - - # yaboot.conf.3264 - yabootconf3264 = joinpaths(self.installtree.root, ANABOOTDIR, - "yaboot.conf.3264") - - self.reqs["yabootconf3264"] = cpfile(yabootconf3264, workdir) - - def create_initrd(self, libdir): - # create directories - logger.info("creating required directories") - os.makedirs(joinpaths(self.outputroot, ETCDIR)) - os.makedirs(joinpaths(self.outputroot, PPCPARENT)) - os.makedirs(joinpaths(self.outputroot, CHRPDIR)) - os.makedirs(joinpaths(self.outputroot, IMAGESDIR)) - - # set up biarch test - ppc32dir = joinpaths(self.outputroot, PPC32DIR) - ppc64dir = joinpaths(self.outputroot, PPC64DIR) - biarch = lambda: (os.path.exists(ppc32dir) and - os.path.exists(ppc64dir)) - - # create images - for kernel in self.kernellist: - # set up bits - kernel_arch = kernel.version.split(".")[-1] - if (kernel_arch == "ppc"): - bits = 32 - ppcdir = PPC32DIR - fakearch = "ppc" - elif (kernel_arch == "ppc64"): - bits = 64 - ppcdir = PPC64DIR - fakearch = "" - else: - raise Exception("unknown kernel arch {0}".format(kernel_arch)) - - # create ppc dir - os.makedirs(joinpaths(self.outputroot, ppcdir)) - - # create mac dir - os.makedirs(joinpaths(self.outputroot, MACDIR)) - - # create netboot dir - os.makedirs(joinpaths(self.outputroot, NETBOOTDIR)) - - # copy kernel - logger.info("copying kernel image") - kernel.fname = "vmlinuz" - dst = joinpaths(self.outputroot, ppcdir, kernel.fname) - kernel.fpath = cpfile(kernel.fpath, dst) - - # create and copy initrd - initrd = DataHolder() - initrd.fname = "ramdisk.image.gz" - initrd.fpath = joinpaths(self.outputroot, ppcdir, initrd.fname) - initrd.itype = kernel.ktype - - logger.info("compressing the install tree") - self.installtree.compress(initrd, kernel, self.ctype, self.cspeed) - - # add kernel and initrd to the list - self.kernels.append(kernel) - self.initrds.append(initrd) - - # add kernel and initrd to .treeinfo - section = "images-{0}".format(kernel_arch) - data = {"kernel": joinpaths(ppcdir, kernel.fname)} - self.treeinfo.add_section(section, data) - data = {"initrd": joinpaths(ppcdir, initrd.fname)} - self.treeinfo.add_section(section, data) - - # copy yaboot.conf - dst = joinpaths(self.outputroot, ppcdir, "yaboot.conf") - yabootconf = cpfile(self.reqs["yabootconf"], dst) - - replace(yabootconf, r"%BITS%", str(bits)) - replace(yabootconf, r"%PRODUCT%", self.product) - replace(yabootconf, r"%VERSION%", self.version) - - mkzimage = joinpaths(self.installtree.root, MKZIMAGE) - zimage_stub = joinpaths(self.installtree.root, ZIMAGE_STUB) - wrapper = joinpaths(self.installtree.root, WRAPPER) - - # XXX - wrapper_a = joinpaths(self.installtree.root, - "usr/%s/kernel-wrapper/wrapper.a" % libdir) - - ppc_img_fname = "ppc{0}.img".format(bits) - ppc_img_fpath = joinpaths(self.outputroot, NETBOOTDIR, - ppc_img_fname) - - if (os.path.exists(mkzimage) and os.path.exists(zimage_stub)): - logger.info("creating the z image") - - # XXX copy zImage.lds - zimage_lds = joinpaths(self.installtree.root, - "usr/%s/kernel-wrapper/zImage.lds" % libdir) - zimage_lds = cpfile(zimage_lds, - joinpaths(self.outputroot, ppcdir)) - - # change current working directory - cwd = os.getcwd() - os.chdir(joinpaths(self.outputroot, ppcdir)) - - # run mkzimage - cmd = [mkzimage, kernel.fpath, "no", "no", initrd.fpath, - zimage_stub, ppc_img_fpath] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # remove zImage.lds - os.unlink(zimage_lds) - - # return to former working directory - os.chdir(cwd) - - elif (os.path.exists(wrapper) and os.path.exists(wrapper_a)): - logger.info("running kernel wrapper") - # run wrapper - cmd = [wrapper, "-o", ppc_img_fpath, "-i", initrd.fpath, - "-D", os.path.dirname(wrapper_a), kernel.fpath] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - if os.path.exists(ppc_img_fpath): - # add ppc image to .treeinfo - section = "images-{0}".format(kernel_arch) - data = {"zimage": joinpaths(NETBOOTDIR, ppc_img_fname)} - self.treeinfo.add_section(section, data) - - if (bits == 32): - # set up prepboot - p = joinpaths(NETBOOTDIR, ppc_img_fname) - prepboot = ["-prep-boot {0}".format(p)] - - # remove netboot dir if empty - try: - os.rmdir(joinpaths(self.outputroot, NETBOOTDIR)) - except OSError: - pass - - # copy bootinfo.txt - cpfile(self.reqs["bootinfo_txt"], - joinpaths(self.outputroot, PPCPARENT)) - - # copy efika.forth - cpfile(self.reqs["efika_forth"], - joinpaths(self.outputroot, PPCPARENT)) - - # copy yaboot to chrp dir - yaboot = cpfile(self.reqs["yaboot"], - joinpaths(self.outputroot, CHRPDIR)) - - if (os.path.exists(joinpaths(self.outputroot, MACDIR))): - # copy yaboot and ofboot.b to mac dir - cpfile(yaboot, joinpaths(self.outputroot, MACDIR)) - cpfile(self.reqs["ofboot_b"], joinpaths(self.outputroot, MACDIR)) - - # set up macboot - p = joinpaths(self.outputroot, ISOPATHDIR, MACDIR) - macboot = ["-hfs-volid {0}".format(self.version), - "-hfs-bless {0}".format(p)] - - # add note to yaboot - cmd = [joinpaths(self.installtree.root, "usr/lib/yaboot/addnote"), - yaboot] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # copy yaboot.conf to etc dir - if biarch(): - yabootconf = cpfile(self.reqs["yabootconf3264"], - joinpaths(self.outputroot, ETCDIR, - "yaboot.conf")) - - replace(yabootconf, r"%BITS%", "32") - replace(yabootconf, r"%PRODUCT%", self.product) - replace(yabootconf, r"%VERSION%", self.version) - - else: - cpfile(joinpaths(self.outputroot, ppcdir, "yaboot.conf"), - joinpaths(self.outputroot, ETCDIR)) - - def create_boot(self, efiboot=None): - # create isopath dir - isopathdir = joinpaths(self.outputroot, ISOPATHDIR) - os.makedirs(isopathdir) - - # copy etc dir and ppc dir to isopath dir - shutil.copytree(joinpaths(self.outputroot, ETCDIR), - joinpaths(isopathdir, ETCDIR)) - shutil.copytree(joinpaths(self.outputroot, PPCPARENT), - joinpaths(isopathdir, PPCPARENT)) - - if (os.path.exists(joinpaths(self.outputroot, NETBOOTDIR))): - # create images dir in isopath dir if we have ppc images - imagesdir = joinpaths(isopathdir, IMAGESDIR) - os.makedirs(imagesdir) - - # copy netboot dir to images dir - shutil.copytree(joinpaths(self.outputroot, NETBOOTDIR), - joinpaths(imagesdir, os.path.basename(NETBOOTDIR))) - - # define prepboot and macboot - prepboot = [] if "prepboot" not in locals() else locals()["prepboot"] - macboot = [] if "macboot" not in locals() else locals()["macboot"] - - # create boot image - boot_fpath = joinpaths(self.outputroot, IMAGESDIR, "boot.iso") - - # run mkisofs - cmd = [MKISOFS, "-o", boot_fpath, "-chrp-boot", "-U"] + prepboot + \ - ["-part", "-hfs", "-T", "-r", "-l", "-J", "-A", - '"%s %s"' % (self.product, self.version), - "-sysid", "PPC", "-V", '"PBOOT"', - "-volset", '"%s"' % self.version, "-volset-size", "1", - "-volset-seqno", "1"] + macboot + \ - ["-map", joinpaths(self.installtree.root, MAPPING), - "-magic", joinpaths(self.installtree.root, MAGIC), - "-no-desktop", "-allow-multidot", "-graft-points", isopathdir] - - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # run implantisomd5 - cmd = [IMPLANTISOMD5, boot_fpath] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # remove isopath dir - shutil.rmtree(isopathdir) - - -class X86(object): - - def __init__(self, kernellist, installtree, outputroot, product, version, - treeinfo, basearch, ctype, cspeed): - - self.kernellist = kernellist - self.installtree = installtree - self.outputroot = outputroot - self.product = product - self.version = version - self.treeinfo = treeinfo - self.basearch = basearch - self.ctype = ctype - self.cspeed = cspeed - self.kernels, self.initrds = [], [] - - self.reqs = collections.defaultdict(str) - - def backup_required(self, workdir): - # isolinux.bin - isolinux_bin = joinpaths(self.installtree.root, ISOLINUX_BIN) - if not os.path.exists(isolinux_bin): - raise Exception("isolinux.bin not present") - - self.reqs["isolinux_bin"] = cpfile(isolinux_bin, workdir) - - # syslinux.cfg - syslinux_cfg = joinpaths(self.installtree.root, SYSLINUX_CFG) - self.reqs["syslinux_cfg"] = cpfile(syslinux_cfg, workdir) - - # memtest - memtest = glob.glob(joinpaths(self.installtree.root, "boot", - "memtest*")) - - if memtest: - self.reqs["memtest"] = cpfile(memtest[-1], - joinpaths(workdir, "memtest")) - - # *.msg files - msgfiles = glob.glob(joinpaths(self.installtree.root, ANABOOTDIR, - "*.msg")) - - if not msgfiles: - raise Exception("message files not present") - - self.reqs["msgfiles"] = [] - for src in msgfiles: - self.reqs["msgfiles"].append(cpfile(src, workdir)) - - # splash - splash = joinpaths(self.installtree.root, ANABOOTDIR, - "syslinux-vesa-splash.jpg") - - if not splash: - raise Exception("syslinux-vesa-splash.jpg not present") - - self.reqs["splash"] = cpfile(splash, workdir) - - # vesamenu.c32 - vesamenu = joinpaths(self.installtree.root, - "usr/share/syslinux/vesamenu.c32") - - self.reqs["vesamenu"] = cpfile(vesamenu, workdir) - - # grub.conf - grubconf = joinpaths(self.installtree.root, ANABOOTDIR, "grub.conf") - self.reqs["grubconf"] = cpfile(grubconf, workdir) - - def create_initrd(self, libdir): - # create directories - logger.info("creating required directories") - os.makedirs(joinpaths(self.outputroot, ISOLINUXDIR)) - os.makedirs(joinpaths(self.outputroot, PXEBOOTDIR)) - - # copy isolinux.bin to isolinux dir - cpfile(self.reqs["isolinux_bin"], - joinpaths(self.outputroot, ISOLINUXDIR)) - - # copy syslinux.cfg to isolinux dir (XXX rename to isolinux.cfg) - isolinux_cfg = cpfile(self.reqs["syslinux_cfg"], - joinpaths(self.outputroot, ISOLINUXDIR, - "isolinux.cfg")) - - replace(isolinux_cfg, r"@PRODUCT@", self.product) - replace(isolinux_cfg, r"@VERSION@", self.version) - - # copy memtest - if self.reqs["memtest"]: - cpfile(self.reqs["memtest"], - joinpaths(self.outputroot, ISOLINUXDIR)) - - with open(isolinux_cfg, "a") as f: - f.write("label memtest86\n") - f.write(" menu label ^Memory test\n") - f.write(" kernel memtest\n") - f.write(" append -\n") - - # copy *.msg files - for src in self.reqs["msgfiles"]: - dst = cpfile(src, joinpaths(self.outputroot, ISOLINUXDIR)) - replace(dst, r"@VERSION@", self.version) - - # copy syslinux-vesa-splash.jpg - splash = cpfile(self.reqs["splash"], - joinpaths(self.outputroot, ISOLINUXDIR, "splash.jpg")) - - # copy vesamenu.c32 - cpfile(self.reqs["vesamenu"], - joinpaths(self.outputroot, ISOLINUXDIR)) - - # set up isolinux.cfg - replace(isolinux_cfg, r"default linux", "default vesamenu.c32") - replace(isolinux_cfg, r"prompt 1", "#prompt 1") - - # copy grub.conf - grubconf = cpfile(self.reqs["grubconf"], - joinpaths(self.outputroot, ISOLINUXDIR)) - - replace(grubconf, r"@PRODUCT@", self.product) - replace(grubconf, r"@VERSION@", self.version) - - # create images - for kernel in self.kernellist: - # set up file names - suffix = "" - if (kernel.ktype == constants.K_PAE): - suffix = "-PAE" - elif (kernel.ktype == constants.K_XEN): - suffix = "-XEN" - - logger.info("copying kernel image") - kernel.fname = "vmlinuz{0}".format(suffix) - if not suffix: - # copy kernel to isolinux dir - kernel.fpath = cpfile(kernel.fpath, - joinpaths(self.outputroot, ISOLINUXDIR, - kernel.fname)) - - # create link in pxeboot dir - os.link(kernel.fpath, - joinpaths(self.outputroot, PXEBOOTDIR, kernel.fname)) - else: - # copy kernel to pxeboot dir - kernel.fpath = cpfile(kernel.fpath, - joinpaths(self.outputroot, PXEBOOTDIR, - kernel.fname)) - - # create and copy initrd to pxeboot dir - initrd = DataHolder() - initrd.fname = "initrd{0}.img".format(suffix) - initrd.fpath = joinpaths(self.outputroot, PXEBOOTDIR, initrd.fname) - initrd.itype = kernel.ktype - - logger.info("compressing the install tree") - self.installtree.compress(initrd, kernel, self.ctype, self.cspeed) - - # add kernel and initrd to the list - self.kernels.append(kernel) - self.initrds.append(initrd) - - if not suffix: - # create link in isolinux dir - os.link(initrd.fpath, - joinpaths(self.outputroot, ISOLINUXDIR, initrd.fname)) - - # add kernel and initrd to .treeinfo - section = "images-{0}".format("xen" if suffix else self.basearch) - data = {"kernel": joinpaths(PXEBOOTDIR, kernel.fname)} - self.treeinfo.add_section(section, data) - data = {"initrd": joinpaths(PXEBOOTDIR, initrd.fname)} - self.treeinfo.add_section(section, data) - - if not suffix: - # add boot.iso to .treeinfo - data = {"boot.iso": joinpaths(IMAGESDIR, "boot.iso")} - self.treeinfo.add_section(section, data) - - # create images-xen section on x86_64 - if self.basearch == "x86_64": - section = "images-xen" - data = {"kernel": joinpaths(PXEBOOTDIR, kernel.fname)} - self.treeinfo.add_section(section, data) - data = {"initrd": joinpaths(PXEBOOTDIR, initrd.fname)} - self.treeinfo.add_section(section, data) - - def create_boot(self, efiboot=None): - # define efiargs and efigraft - efiargs, efigraft = [], [] - if efiboot: - efiargs = ["-eltorito-alt-boot", "-e", - joinpaths(IMAGESDIR, "efiboot.img"), "-no-emul-boot"] - efigraft = ["EFI/BOOT={0}/EFI/BOOT".format(self.outputroot)] - - # create boot image - boot_fpath = joinpaths(self.outputroot, IMAGESDIR, "boot.iso") - - # run mkisofs - cmd = [MKISOFS, "-v", "-o", boot_fpath, "-b", - "{0}/isolinux.bin".format(ISOLINUXDIR), "-c", - "{0}/boot.cat".format(ISOLINUXDIR), "-no-emul-boot", - "-boot-load-size", "4", "-boot-info-table"] + efiargs + \ - ["-R", "-J", "-V", "'{0}'".format(self.product), "-T", - "-graft-points", - "isolinux={0}".format(joinpaths(self.outputroot, ISOLINUXDIR)), - "images={0}".format(joinpaths(self.outputroot, IMAGESDIR))] + \ - efigraft - - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - if os.path.exists(ISOHYBRID): - # run isohybrid - cmd = [ISOHYBRID, boot_fpath] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # run implantisomd5 - cmd = [IMPLANTISOMD5, boot_fpath] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - -class S390(object): - - def __init__(self, kernellist, installtree, outputroot, product, version, - treeinfo, basearch, ctype, cspeed): - - self.kernellist = kernellist - self.installtree = installtree - self.outputroot = outputroot - self.product = product - self.version = version - self.treeinfo = treeinfo - self.basearch = basearch - self.ctype = ctype - self.cspeed = cspeed - self.kernels, self.initrds = [], [] - - self.reqs = collections.defaultdict(str) - - def backup_required(self, workdir): - pass - - def create_initrd(self, libdir): - # create directories - os.makedirs(joinpaths(self.outputroot, IMAGESDIR)) - - # copy redhat.exec - cpfile(joinpaths(self.installtree.root, ANABOOTDIR, "redhat.exec"), - joinpaths(self.outputroot, IMAGESDIR)) - - # copy generic.prm - generic_prm = cpfile(joinpaths(self.installtree.root, ANABOOTDIR, - "generic.prm"), - joinpaths(self.outputroot, IMAGESDIR)) - - # copy generic.ins - generic_ins = cpfile(joinpaths(self.installtree.root, ANABOOTDIR, - "generic.ins"), self.outputroot) - - replace(generic_ins, r"@INITRD_LOAD_ADDRESS@", INITRD_ADDRESS) - - for kernel in self.kernellist: - # copy kernel - kernel.fname = "kernel.img" - kernel.fpath = cpfile(kernel.fpath, - joinpaths(self.outputroot, IMAGESDIR, - kernel.fname)) - - # create and copy initrd - initrd = DataHolder() - initrd.fname = "initrd.img" - initrd.fpath = joinpaths(self.outputroot, IMAGESDIR, initrd.fname) - - logger.info("compressing the install tree") - self.installtree.compress(initrd, kernel, self.ctype, self.cspeed) - - # run addrsize - addrsize = joinpaths(self.installtree.root, "usr/libexec", - "anaconda", "addrsize") - - cmd = [addrsize, INITRD_ADDRESS, initrd.fpath, - joinpaths(self.outputroot, IMAGESDIR, "initrd_addrsize")] - - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # add kernel and initrd to .treeinfo - kernel_arch = kernel.version.split(".")[-1] - section = "images-{0}".format(kernel_arch) - data = {"kernel": joinpaths(IMAGESDIR, kernel.fname), - "initrd": joinpaths(IMAGESDIR, initrd.fname), - "initrd.addrsize": joinpaths(IMAGESDIR, "initrd_addrsize"), - "generic.prm": joinpaths(IMAGESDIR, - os.path.basename(generic_prm)), - "generic.ins": os.path.basename(generic_ins)} - self.treeinfo.add_section(section, data) - - # create cdboot.img - bootiso_fpath = joinpaths(self.outputroot, IMAGESDIR, "cdboot.img") - - # run mks390cdboot - mks390cdboot = joinpaths(self.installtree.root, "usr/libexec", - "anaconda", "mk-s390-cdboot") - - cmd = [mks390cdboot, "-i", kernel.fpath, "-r", initrd.fpath, - "-p", generic_prm, "-o", bootiso_fpath] - - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - p.wait() - - # add cdboot.img to treeinfo - data = {"cdboot.img": joinpaths(IMAGESDIR, "cdboot.img")} - self.treeinfo.add_section(section, data) - - def create_boot(self, efiboot=None): - pass - - -class SPARC(object): - - def __init__(self, kernellist, installtree, outputroot, product, version, - treeinfo, basearch, ctype, cspeed): - - self.kernellist = kernellist - self.installtree = installtree - self.outputroot = outputroot - self.product = product - self.version = version - self.treeinfo = treeinfo - self.basearch = basearch - self.ctype = ctype - self.cspeed = cspeed - self.kernels, self.initrds = [], [] - - self.reqs = collections.defaultdict(str) - - def backup_required(self, workdir): - os.makedirs(joinpaths(workdir, "bfiles")) - - for fname in glob.glob(joinpaths(self.installtree.root, "boot/*.b")): - cpfile(fname, joinpaths(workdir, "bfiles")) - - self.reqs["bfiles"] = glob.glob(joinpaths(workdir, "bfiles/*.b")) - - def create_initrd(self, libdir): - # create directories - os.makedirs(joinpaths(self.outputroot, IMAGESDIR)) - os.makedirs(joinpaths(self.outputroot, SPARCDIR)) - - # copy silo.conf - siloconf = cpfile(joinpaths(self.installtree.root, ANABOOTDIR, - "silo.conf"), - joinpaths(self.outputroot, SPARCDIR)) - - # copy boot.msg - bootmsg = cpfile(joinpaths(self.installtree.root, ANABOOTDIR, - "boot.msg"), - joinpaths(self.outputroot, SPARCDIR)) - - replace(bootmsg, r"%PRODUCT%", self.product) - replace(bootmsg, r"%VERSION%", self.version) - - # copy *.b to sparc dir - for fname in self.reqs["bfiles"]: - cpfile(fname, joinpaths(self.outputroot, SPARCDIR)) - - # create images - for kernel in self.kernellist: - # copy kernel - kernel.fname = "vmlinuz" - kernel.fpath = cpfile(kernel.fpath, - joinpaths(self.outputroot, SPARCDIR, - kernel.fname)) - - # create and copy initrd - initrd = DataHolder() - initrd.fname = "initrd.img" - initrd.fpath = joinpaths(self.outputroot, SPARCDIR, initrd.fname) - - logger.info("compressing the install tree") - self.installtree.compress(initrd, kernel, self.ctype, self.cspeed) - - # add kernel and initrd to .treeinfo - kernel_arch = kernel.version.split(".")[-1] - section = "images-{0}".format(kernel_arch) - data = {"kernel": joinpaths(SPARCDIR, kernel.fname), - "initrd":joinpaths(SPARCDIR, initrd.fname)} - self.treeinfo.add_section(section, data) - - def create_boot(self, efiboot=None): - # create isopath dir - isopathdir = joinpaths(self.outputroot, ISOPATHDIR) - os.makedirs(isopathdir) - - # copy sparc dir to isopath dir - shutil.copytree(joinpaths(self.outputroot, SPARCDIR), - joinpaths(isopathdir, SPARCDIR)) - - # create boot.iso - bootiso_fpath = joinpaths(self.outputroot, IMAGESDIR, "boot.iso") - - # run mkisofs (XXX what's with the "Fedora" exclude?) - cmd = [MKISOFS, "-R", "-J", "-T", - "-G", "/%s" % joinpaths(SPARCDIR, "isofs.b"), - "-B", "...", - "-s", "/%s" % joinpaths(SPARCDIR, "silo.conf"), - "-r", "-V", '"PBOOT"', "-A", - '"%s %s"' % (self.product, self.version), - "-x", "Fedora", "-x", "repodata", "-sparc-label", - '"%s %s Boot Disc"' % (self.product, self.version), - "-o", bootiso_fpath, "-graft-points", - "boot=%s" % joinpaths(self.outputroot, SPARCDIR)] - - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - - p.wait() - - # run implantisomd5 - cmd = [IMPLANTISOMD5, bootiso_fpath] - p = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stdout=subprocess.PIPE) - - p.wait() - - # remove isopath dir - shutil.rmtree(isopathdir) - - -class Factory(object): - - DISPATCH_MAP = {"ppc": PPC, - "i386": X86, - "x86_64": X86, - "s390": S390, - "s390x": S390, - "sparc": SPARC} - - def __init__(self): - pass - - def get_class(self, arch): - if arch in self.DISPATCH_MAP: - return self.DISPATCH_MAP[arch] - else: - raise Exception("no support for {0}".format(arch))