diff --git a/pungi/phases/buildinstall.py b/pungi/phases/buildinstall.py index abf83382..709c6bf7 100644 --- a/pungi/phases/buildinstall.py +++ b/pungi/phases/buildinstall.py @@ -194,13 +194,51 @@ def get_kickstart_file(compose): return kickstart_path +BOOT_CONFIGS = [ + "isolinux/isolinux.cfg", + "etc/yaboot.conf", + "ppc/ppc64/yaboot.conf", + "EFI/BOOT/BOOTX64.conf", + "EFI/BOOT/grub.cfg", +] + + +def tweak_configs(path, volid, ks_file, configs=BOOT_CONFIGS): + volid_escaped = volid.replace(" ", r"\x20").replace("\\", "\\\\") + volid_escaped_2 = volid_escaped.replace("\\", "\\\\") + found_configs = [] + for config in configs: + config_path = os.path.join(path, config) + if not os.path.exists(config_path): + continue + found_configs.append(config) + + with open(config_path, "r") as f: + data = f.read() + os.unlink(config_path) # break hadlink by removing file writing a new one + + # double-escape volid in yaboot.conf + new_volid = volid_escaped_2 if 'yaboot' in config else volid_escaped + + ks = (" ks=hd:LABEL=%s:/ks.cfg" % new_volid) if ks_file else "" + + # pre-f18 + data = re.sub(r":CDLABEL=[^ \n]*", r":CDLABEL=%s%s" % (new_volid, ks), data) + # f18+ + data = re.sub(r":LABEL=[^ \n]*", r":LABEL=%s%s" % (new_volid, ks), data) + data = re.sub(r"(search .* -l) '[^'\n]*'", r"\1 '%s'" % volid, data) + + with open(config_path, "w") as f: + f.write(data) + + return found_configs + + # HACK: this is a hack! # * it's quite trivial to replace volids # * it's not easy to replace menu titles # * we probably need to get this into lorax def tweak_buildinstall(compose, src, dst, arch, variant, label, volid, kickstart_file=None): - volid_escaped = volid.replace(" ", r"\x20").replace("\\", "\\\\") - volid_escaped_2 = volid_escaped.replace("\\", "\\\\") tmp_dir = compose.mkdtemp(prefix="tweak_buildinstall_") # verify src @@ -219,39 +257,9 @@ def tweak_buildinstall(compose, src, dst, arch, variant, label, volid, kickstart cmd = "cp -av --remove-destination %s/* %s/" % (pipes.quote(src), pipes.quote(tmp_dir)) run(cmd) - # tweak configs - configs = [ - "isolinux/isolinux.cfg", - "etc/yaboot.conf", - "ppc/ppc64/yaboot.conf", - "EFI/BOOT/BOOTX64.conf", - "EFI/BOOT/grub.cfg", - ] - for config in configs: - config_path = os.path.join(tmp_dir, config) - if not os.path.exists(config_path): - continue - - data = open(config_path, "r").read() - os.unlink(config_path) # break hadlink by removing file writing a new one - - new_volid = volid_escaped - if "yaboot" in config: - # double-escape volid in yaboot.conf - new_volid = volid_escaped_2 - - ks = "" - if kickstart_file: - shutil.copy2(kickstart_file, os.path.join(dst, "ks.cfg")) - ks = " ks=hd:LABEL=%s:/ks.cfg" % new_volid - - # pre-f18 - data = re.sub(r":CDLABEL=[^ \n]*", r":CDLABEL=%s%s" % (new_volid, ks), data) - # f18+ - data = re.sub(r":LABEL=[^ \n]*", r":LABEL=%s%s" % (new_volid, ks), data) - data = re.sub(r"(search .* -l) '[^'\n]*'", r"\1 '%s'" % volid, data) - - open(config_path, "w").write(data) + found_configs = tweak_configs(tmp_dir, volid, kickstart_file) + if kickstart_file and found_configs: + shutil.copy2(kickstart_file, os.path.join(dst, "ks.cfg")) images = [ os.path.join(tmp_dir, "images", "efiboot.img"), @@ -265,7 +273,7 @@ def tweak_buildinstall(compose, src, dst, arch, variant, label, volid, kickstart cmd = ["LIBGUESTFS_BACKEND=direct", "guestmount", "-a", image, "-m", "/dev/sda", mount_tmp_dir] run(cmd) - for config in configs: + for config in BOOT_CONFIGS: config_path = os.path.join(tmp_dir, config) config_in_image = os.path.join(mount_tmp_dir, config) diff --git a/tests/test_buildinstall.py b/tests/test_buildinstall.py index 0993605d..c68329c0 100644 --- a/tests/test_buildinstall.py +++ b/tests/test_buildinstall.py @@ -13,7 +13,8 @@ import sys sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) -from pungi.phases.buildinstall import BuildinstallPhase, BuildinstallThread, link_boot_iso +from pungi.phases.buildinstall import (BuildinstallPhase, BuildinstallThread, link_boot_iso, + BOOT_CONFIGS, tweak_configs) from tests.helpers import DummyCompose, PungiTestCase, touch, boom @@ -750,5 +751,33 @@ class TestSymlinkIso(PungiTestCase): [mock.call('Server', 'x86_64', image)]) +class TestTweakConfigs(PungiTestCase): + + def test_tweak_configs(self): + configs = [] + for cfg in BOOT_CONFIGS: + if 'yaboot' not in cfg: + configs.append(os.path.join(self.topdir, cfg)) + touch(configs[-1], ':LABEL=baz') + tweak_configs(self.topdir, 'new volid', os.path.join(self.topdir, 'ks.cfg')) + for cfg in configs: + with open(cfg) as f: + self.assertEqual( + f.read().strip(), + ':LABEL=new\\x20volid ks=hd:LABEL=new\\x20volid:/ks.cfg') + + def test_tweak_configs_yaboot(self): + configs = [] + for cfg in BOOT_CONFIGS: + if 'yaboot' in cfg: + configs.append(os.path.join(self.topdir, cfg)) + touch(configs[-1], ':LABEL=baz') + tweak_configs(self.topdir, 'new volid', os.path.join(self.topdir, 'ks.cfg')) + for cfg in configs: + with open(os.path.join(self.topdir, cfg)) as f: + self.assertEqual( + f.read().strip(), + ':LABEL=new\\\\x20volid ks=hd:LABEL=new\\\\x20volid:/ks.cfg') + if __name__ == "__main__": unittest.main()