From: "Brian C. Lane" bcl@redhat.com
This will allow the /tmp directory to be overridden for testing purposes. Pass --tmpdir /path/to/tmp/ to override it. Note that the = syntax is *not* supported, they must be separate arguments.
This also changes the ifcfg files to have their keys sorted so that testing the output is easier. --- dracut/parse-kickstart | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-)
diff --git a/dracut/parse-kickstart b/dracut/parse-kickstart index 9a62df2..ed63340 100755 --- a/dracut/parse-kickstart +++ b/dracut/parse-kickstart @@ -42,6 +42,8 @@ from collections import OrderedDict # Default logging: none log = logging.getLogger('parse-kickstart').addHandler(logging.NullHandler())
+TMPDIR = "/tmp" + # Helper function for reading simple files in /sys def readsysfile(f): '''Return the contents of f, or "" if missing.''' @@ -134,7 +136,7 @@ class DriverDisk(commands.driverdisk.F14_DriverDisk): # disk sources cannot be added to cmdline because the initial # driver-update run has already finished. if dd_disk: - with open("/tmp/dd_args_ks", "w") as f: + with open(TMPDIR+"/dd_args_ks", "w") as f: f.write(" ".join(dd_disk))
# network sources can be added to the existing cmdline, they @@ -326,7 +328,7 @@ def ksnet_to_dracut(args, lineno, net, bootdev=False): if net.device: line.append("bootdev=%s" % net.device) # touch /tmp/net.ifaces to make sure dracut brings up network - open("/tmp/net.ifaces", "a") + open(TMPDIR+"/net.ifaces", "a")
if net.essid or net.wepkey or net.wpakey: # TODO: make dracut support wireless? (do we care?) @@ -358,9 +360,9 @@ def ksnet_to_ifcfg(net, filename=None): return ifcfg = dict() if filename is None: - filename = "/tmp/ifcfg/ifcfg-%s" % dev - if not os.path.isdir("/tmp/ifcfg"): - os.makedirs("/tmp/ifcfg") + filename = TMPDIR+"/ifcfg/ifcfg-%s" % dev + if not os.path.isdir(TMPDIR+"/ifcfg"): + os.makedirs(TMPDIR+"/ifcfg") ifcfg['DEVICE'] = dev hwaddr = readsysfile("/sys/class/net/%s/address" % dev) if "ifname={0}:{1}".format(dev, hwaddr).upper() in open("/proc/cmdline").read().upper(): @@ -412,8 +414,8 @@ def ksnet_to_ifcfg(net, filename=None): # TODO: dhcpclass, ethtool, essid/wepkey/wpakay, etc.
if net.bootProto == 'dhcp': - srcpath = "/tmp/dhclient.%s.lease" % dev - dstdir = "/tmp/ifcfg-leases" + srcpath = TMPDIR+"/dhclient.%s.lease" % dev + dstdir = TMPDIR+"/ifcfg-leases" dstpath = "%s/dhclient-%s-%s.lease" % (dstdir, ifcfg['UUID'], dev) if os.path.exists(srcpath): if not os.path.isdir(dstdir): @@ -441,7 +443,7 @@ def ksnet_to_ifcfg(net, filename=None): 'HWADDR' : readsysfile("/sys/class/net/%s/address" % slave), } add_s390_settings(slave, slave_ifcfg) - slave_filename = "/tmp/ifcfg/ifcfg-%s" % "_".join(slave_ifcfg['NAME'].split(" ")) + slave_filename = TMPDIR+"/ifcfg/ifcfg-%s" % "_".join(slave_ifcfg['NAME'].split(" ")) log.info("writing ifcfg %s for slave %s of bond %s", slave_filename, slave, dev) write_ifcfg(slave_filename, slave_ifcfg)
@@ -465,7 +467,7 @@ def ksnet_to_ifcfg(net, filename=None): if cfg: slave_ifcfg['TEAM_PORT_CONFIG'] = "'" + cfg + "'"
- slave_filename = "/tmp/ifcfg/ifcfg-%s" % "_".join(slave_ifcfg['NAME'].split(" ")) + slave_filename = TMPDIR+"/ifcfg/ifcfg-%s" % "_".join(slave_ifcfg['NAME'].split(" ")) log.info("writing ifcfg %s for slave %s of team %s", slave_filename, slave, dev) write_ifcfg(slave_filename, slave_ifcfg)
@@ -502,7 +504,7 @@ def ksnet_to_ifcfg(net, filename=None): 'BRIDGE' : dev, 'HWADDR' : readsysfile("/sys/class/net/%s/address" % slave), } - slave_filename = "/tmp/ifcfg/ifcfg-%s" % "_".join(slave_ifcfg['NAME'].split(" ")) + slave_filename = TMPDIR+"/ifcfg/ifcfg-%s" % "_".join(slave_ifcfg['NAME'].split(" ")) log.info("writing ifcfg %s for slave %s of bridge %s", slave_filename, slave, dev) write_ifcfg(slave_filename, slave_ifcfg)
@@ -515,7 +517,7 @@ def ksnet_to_ifcfg(net, filename=None): ifcfg['NAME'] = "VLAN connection %s" % interface_name ifcfg['DEVICE'] = interface_name ifcfg['PHYSDEV'] = dev - filename = "/tmp/ifcfg/ifcfg-%s" % interface_name + filename = TMPDIR+"/ifcfg/ifcfg-%s" % interface_name
log.info("writing ifcfg %s for %s", filename, dev) if write_ifcfg(filename, ifcfg): @@ -525,7 +527,7 @@ def write_ifcfg(filename, ifcfg): try: with open(filename, "w") as f: f.write('# Generated by parse-kickstart\n') - for k,v in ifcfg.items(): + for k,v in sorted(ifcfg.items()): f.write("%s=%s\n" % (k,v)) except IOError as e: log.error("can't write %s: %s", filename, e) @@ -543,13 +545,24 @@ def process_kickstart(ksfile): parser.readKickstart(processed_file) except KickstartError as e: log.error(str(e)) - with open("/tmp/ks.info", "a") as f: + with open(TMPDIR+"/ks.info", "a") as f: f.write('parsed_kickstart="%s"\n' % processed_file) log.info("finished parsing kickstart") return processed_file, handler.output
if __name__ == '__main__': log = init_logger() + + # Override tmp directory path for testing. Don't use argparse because we don't want to + # include that dependency in the initramfs. Pass '--tmpdir /path/to/tmp/' + if "--tmpdir" in sys.argv: + idx = sys.argv.index("--tmpdir") + try: + sys.argv.pop(idx) + TMPDIR = os.path.normpath(sys.argv.pop(idx)) + except IndexError: + pass + for path in sys.argv[1:]: outfile, output = process_kickstart(path) for line in filter(None, output):