def get_extra_pkgs(dbo, share_dir, compose_type): """Return extra packages needed for the output type :param dbo: dnf base object :type dbo: dnf.Base :param share_dir: Path to the top level share directory :type share_dir: str :param compose_type: The type of output to create from the recipe :type compose_type: str :returns: List of package names (name only, not NEVRA) :rtype: list Currently this is only needed by live-iso, it reads ./live/live-install.tmpl and processes only the installpkg lines. It lists the packages needed to complete creation of the iso using the templates such as x86.tmpl Keep in mind that the live-install.tmpl is shared between livemedia-creator and lorax-composer, even though the results are applied differently. """ if compose_type != "live-iso": return [] # get the arch information to pass to the runner arch = ArchData(get_buildarch(dbo)) defaults = DataHolder(basearch=arch.basearch) templatedir = joinpaths(find_templates(share_dir), "live") runner = LiveTemplateRunner(dbo, templatedir=templatedir, defaults=defaults) runner.run("live-install.tmpl") log.debug("extra pkgs = %s", runner.pkgs) return runner.pkgnames
def make_livecd(opts, mount_dir, work_dir): """ Take the content from the disk image and make a livecd out of it :param opts: options passed to livemedia-creator :type opts: argparse options :param str mount_dir: Directory tree to compress :param str work_dir: Output compressed image to work_dir+images/install.img This uses wwood's squashfs live initramfs method: * put the real / into LiveOS/rootfs.img * make a squashfs of the LiveOS/rootfs.img tree * This is loaded by dracut when the cmdline is passed to the kernel: root=live:CDLABEL=<volid> rd.live.image """ kernel_arch = get_arch(mount_dir) arch = ArchData(kernel_arch) # TODO: Need to get release info from someplace... product = DataHolder(name=opts.project, version=opts.releasever, release="", variant="", bugurl="", isfinal=False) # Link /images to work_dir/images to make the templates happy if os.path.islink(joinpaths(mount_dir, "images")): os.unlink(joinpaths(mount_dir, "images")) execWithRedirect("/bin/ln", ["-s", joinpaths(work_dir, "images"), joinpaths(mount_dir, "images")]) # The templates expect the config files to be in /tmp/config_files # I think these should be release specific, not from lorax, but for now configdir = joinpaths(opts.lorax_templates,"live/config_files/") configdir_path = "tmp/config_files" fullpath = joinpaths(mount_dir, configdir_path) if os.path.exists(fullpath): remove(fullpath) copytree(configdir, fullpath) isolabel = opts.volid or "{0.name}-{0.version}-{1.basearch}".format(product, arch) if len(isolabel) > 32: isolabel = isolabel[:32] log.warning("Truncating isolabel to 32 chars: %s", isolabel) tb = TreeBuilder(product=product, arch=arch, domacboot=opts.domacboot, inroot=mount_dir, outroot=work_dir, runtime=RUNTIME, isolabel=isolabel, templatedir=joinpaths(opts.lorax_templates,"live/"), extra_boot_args=opts.extra_boot_args) log.info("Rebuilding initrds") if not opts.dracut_args: dracut_args = DRACUT_DEFAULT else: dracut_args = [] for arg in opts.dracut_args: dracut_args += arg.split(" ", 1) log.info("dracut args = %s", dracut_args) tb.rebuild_initrds(add_args=dracut_args) log.info("Building boot.iso") tb.build() return work_dir
def make_runtime(opts, mount_dir, work_dir, size=None): """ Make the squashfs image from a directory :param opts: options passed to livemedia-creator :type opts: argparse options :param str mount_dir: Directory tree to compress :param str work_dir: Output compressed image to work_dir+images/install.img :param int size: Size of disk image, in GiB """ kernel_arch = get_arch(mount_dir) # Fake dnf object fake_dbo = FakeDNF(conf=DataHolder(installroot=mount_dir)) # Fake arch with only basearch set arch = ArchData(kernel_arch) # TODO: Need to get release info from someplace... product = DataHolder(name=opts.project, version=opts.releasever, release="", variant="", bugurl="", isfinal=False) # This is a mounted image partition, cannot hardlink to it, so just use it # symlink mount_dir/images to work_dir/images so we don't run out of space os.makedirs(joinpaths(work_dir, "images")) rb = RuntimeBuilder(product, arch, fake_dbo) compression, compressargs = squashfs_args(opts) log.info("Creating runtime") rb.create_ext4_runtime(joinpaths(work_dir, RUNTIME), size=size, compression=compression, compressargs=compressargs)
def make_runtime(opts, mount_dir, work_dir, size=None): """ Make the squashfs image from a directory :param opts: options passed to livemedia-creator :type opts: argparse options :param str mount_dir: Directory tree to compress :param str work_dir: Output compressed image to work_dir+images/install.img :param int size: Size of disk image, in GiB :returns: rc of squashfs creation :rtype: int """ kernel_arch = get_arch(mount_dir) # Fake dnf object fake_dbo = FakeDNF(conf=DataHolder(installroot=mount_dir)) # Fake arch with only basearch set arch = ArchData(kernel_arch) # TODO: Need to get release info from someplace... product = DataHolder(name=opts.project, version=opts.releasever, release="", variant="", bugurl="", isfinal=False) rb = RuntimeBuilder(product, arch, fake_dbo) compression, compressargs = squashfs_args(opts) if opts.squashfs_only: log.info("Creating a squashfs only runtime") return rb.create_squashfs_runtime(joinpaths(work_dir, RUNTIME), size=size, compression=compression, compressargs=compressargs) else: log.info("Creating a squashfs+ext4 runtime") return rb.create_ext4_runtime(joinpaths(work_dir, RUNTIME), size=size, compression=compression, compressargs=compressargs)
def install_branding(self, repo_dir, variant=None, skip_branding=False): """Run the get_branding function in a test repo""" with tempfile.TemporaryDirectory(prefix="lorax.test.") as root_dir: dbo = get_dnf_base_object(root_dir, ["file://"+repo_dir], enablerepos=[], disablerepos=[]) self.assertTrue(dbo is not None) product = DataHolder(name="Fedora", version="33", release="33", variant=variant, bugurl="http://none", isfinal=True) arch = ArchData(os.uname().machine) rb = RuntimeBuilder(product, arch, dbo, skip_branding=skip_branding) return rb._branding
def squashfs_args(opts): """ Returns the compression type and args to use when making squashfs :param opts: ArgumentParser object with compression and compressopts :returns: tuple of compression type and args :rtype: tuple """ compression = opts.compression or "xz" arch = ArchData(opts.arch or os.uname().machine) if compression == "xz" and arch.bcj: compressargs = ["-Xbcj", arch.bcj] else: compressargs = [] return (compression, compressargs)
def install_branding(self, repo_dir, variant=None, skip_branding=False): """Run the _install_branding and return the names of the installed packages""" with tempfile.TemporaryDirectory(prefix="lorax.test.") as root_dir: dbo = get_dnf_base_object(root_dir, ["file://"+repo_dir], enablerepos=[], disablerepos=[]) self.assertTrue(dbo is not None) product = DataHolder(name="Fedora", version="33", release="33", variant=variant, bugurl="http://none", isfinal=True) arch = ArchData(os.uname().machine) rb = RuntimeBuilder(product, arch, dbo, skip_branding=skip_branding) rb._install_branding() dbo.resolve() self.assertTrue(dbo.transaction is not None) return sorted(p.name for p in dbo.transaction.install_set)
def squashfs_args(opts): """ Returns the compression type and args to use when making squashfs :param opts: ArgumentParser object with compression and compressopts :returns: tuple of compression type and args :rtype: tuple """ compression = opts.compression or "xz" arch = ArchData(opts.arch or os.uname().machine) if compression == "xz" and arch.bcj and not opts.compress_args: # default to bcj when using xz compressargs = ["-Xbcj", arch.bcj] elif opts.compress_args: compressargs = [] for arg in opts.compress_args: compressargs += arg.split(" ", 1) else: compressargs = [] return (compression, compressargs)