def write_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: scf = SimpleConfigFile() scf.set(('key1', 'value1')) scf.write(testconfig.name) testconfig.flush() self.assertEqual(open(testconfig.name).read(), 'KEY1=value1\n')
def write(self, filename=None, use_tmp=False): if self._dirty or filename: # ifcfg-rh is using inotify IN_CLOSE_WRITE event so we don't use # temporary file for new configuration ifcfglog.debug("IfcfgFile.write %s:\n%s", self.filename, self.__str__()) SimpleConfigFile.write(self, filename, use_tmp=use_tmp) self._dirty = False
def read_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: scf = SimpleConfigFile() open(testconfig.name, 'w').write('KEY1="value1"\n') testconfig.flush() scf.read(testconfig.name) self.assertEqual(scf.get('key1'), 'value1')
def test_read(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: scf = SimpleConfigFile() open(testconfig.name, 'w').write('KEY1="value1"\n') testconfig.flush() scf.read(testconfig.name) assert scf.get('key1') == 'value1'
def read_test(self): with tempfile.NamedTemporaryFile() as testconfig: scf = SimpleConfigFile() open(testconfig.name, 'w').write('KEY1="value1"\n') testconfig.flush() scf.read(testconfig.name) self.assertEqual(scf.get('key1'), 'value1')
def unset(self, *args): for key in args: if self.get(key): self._dirty = True break else: return ifcfglog.debug("IfcfgFile.unset %s: %s", self.filename, args) SimpleConfigFile.unset(self, *args)
def set(self, *args): for (key, data) in args: if self.get(key) != data: break else: return ifcfglog.debug("IfcfgFile.set %s: %s", self.filename, args) SimpleConfigFile.set(self, *args) self._dirty = True
def read_write_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) scf.write(testconfig.name) testconfig.flush() self.assertEqual(open(testconfig.name).read(), self.TEST_CONFIG)
def append_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() keys = [("NEWKEY", "NEWKEY=froboz")] simple_replace(testconfig.name, keys) config = SimpleConfigFile(testconfig.name) config.read() self.assertEqual(config.get("NEWKEY"), "froboz")
def replace_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() keys = [("BOOT", "BOOT=never")] simple_replace(testconfig.name, keys) config = SimpleConfigFile(testconfig.name) config.read() self.assertEqual(config.get("BOOT"), "never")
def no_append_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() keys = [("BOOT", "BOOT=sometimes"), ("NEWKEY", "NEWKEY=froboz")] simple_replace(testconfig.name, keys, add=False) config = SimpleConfigFile(testconfig.name) config.read() self.assertEqual(config.get("BOOT"), "sometimes") self.assertEqual(config.get("NEWKEY"), "")
def execute(self, storage, ksdata, instClass, users, payload): """ Execute the addon :param storage: Blivet storage object :param ksdata: Kickstart data object :param instClass: Anaconda installclass object :param users: Anaconda users object :param payload: object managing packages and environment groups for the installation """ if not self.enabled: return log.info("Executing docker addon") # This gets called after installation, before initramfs regeneration and kickstart %post scripts. execWithRedirect("mount", ["-o", "bind", getSysroot()+"/var/lib/docker", "/var/lib/docker"]) execWithRedirect("mount", ["-o", "bind", getSysroot()+"/etc/docker", "/etc/docker"]) # Start up the docker daemon log.debug("Starting docker daemon") docker_cmd = ["docker", "daemon"] if ksdata.selinux.selinux: docker_cmd += ["--selinux-enabled"] # Add storage specific arguments to the command docker_cmd += self.storage.docker_cmd(storage, ksdata, instClass, users) docker_cmd += ["--ip-forward=false", "--iptables=false"] docker_cmd += self.extra_args docker_proc = startProgram(docker_cmd, stdout=open("/tmp/docker-daemon.log", "w"), reset_lang=True) log.debug("Running docker commands") script = AnacondaKSScript(self.content, inChroot=False, logfile="/tmp/docker-addon.log") script.run("/") # Kill the docker process log.debug("Shutting down docker daemon") docker_proc.kill() log.debug("Writing docker configs") self.storage.write_configs(storage, ksdata, instClass, users) # Rewrite the OPTIONS entry with the extra args and/or storage specific changes try: docker_cfg = SimpleConfigFile(getSysroot()+"/etc/sysconfig/docker") docker_cfg.read() options = self.storage.options(docker_cfg.get("OPTIONS")) if self.save_args: log.info("Adding extra args to docker OPTIONS") options += " " + " ".join(self.extra_args) docker_cfg.set(("OPTIONS", options)) docker_cfg.write() except IOError as e: log.error("Error updating OPTIONS in /etc/sysconfig/docker: %s", e) # Copy the log files to the system dstdir = "/var/log/anaconda/" os.makedirs(dstdir, exist_ok=True) for l in ["docker-daemon.log", "docker-addon.log"]: shutil.copy2("/tmp/"+l, dstdir+l)
def write_new_keys_test(self): from pyanaconda.simpleconfig import SimpleConfigFile scf = SimpleConfigFile() scf.read(self.PATH) scf.set(("key1", "value1")) scf.write("/tmp/file") self.assertEqual( open("/tmp/file").read(), self.CONTENT + "KEY1=value1\n")
def execute(self, storage, ksdata, instClass, users): """ Execute the addon :param storage: Blivet storage object :param ksdata: Kickstart data object :param instClass: Anaconda installclass object :param users: Anaconda users object """ log.info("Executing docker addon") # This gets called after installation, before initramfs regeneration and kickstart %post scripts. execWithRedirect("mount", ["-o", "bind", getSysroot()+"/var/lib/docker", "/var/lib/docker"]) execWithRedirect("mount", ["-o", "bind", getSysroot()+"/etc/docker", "/etc/docker"]) # Start up the docker daemon log.debug("Starting docker daemon") dm_fs = "dm.fs=%s" % self.fstype pool_name = "dm.thinpooldev=/dev/mapper/%s-docker--pool" % self.vgname docker_cmd = ["docker", "daemon"] if ksdata.selinux.selinux: docker_cmd += ["--selinux-enabled"] docker_cmd += ["--storage-driver", "devicemapper", "--storage-opt", dm_fs, "--storage-opt", pool_name, "--ip-forward=false", "--iptables=false"] docker_cmd += self.extra_args docker_proc = startProgram(docker_cmd, stdout=open("/tmp/docker-daemon.log", "w"), reset_lang=True) log.debug("Running docker commands") script = AnacondaKSScript(self.content, inChroot=False, logfile="/tmp/docker-addon.log") script.run("/") # Kill the docker process log.debug("Shutting down docker daemon") docker_proc.kill() log.debug("Writing docker configs") with open(getSysroot()+"/etc/sysconfig/docker-storage", "w") as fp: fp.write('DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper ' '--storage-opt %s --storage-opt %s"\n' % (dm_fs, pool_name)) with open(getSysroot()+"/etc/sysconfig/docker-storage-setup", "a") as fp: fp.write("VG=%s\n" % self.vgname) # Rewrite the OPTIONS entry with the extra args, if requested. if self.extra_args and self.save_args: try: docker_cfg = SimpleConfigFile(getSysroot()+"/etc/sysconfig/docker") docker_cfg.read() options = docker_cfg.get("OPTIONS")+" " + " ".join(self.extra_args) docker_cfg.set(("OPTIONS", options)) docker_cfg.write() except IOError as e: log.error("Error updating OPTIONS in /etc/sysconfig/docker: %s", e) # Copy the log files to the system dstdir = "/var/log/anaconda/" os.makedirs(dstdir, exist_ok=True) for l in ["docker-daemon.log", "docker-addon.log"]: shutil.copy2("/tmp/"+l, dstdir+l)
def read_write__perms_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() # Change original file's permissions os.chmod(testconfig.name, 0o0764) scf = SimpleConfigFile() scf.read(testconfig.name) scf.write(testconfig.name) testconfig.flush() # Write uses a tmpfile and renames it in place # Make sure the permissions are still 0764 self.assertEqual(os.stat(testconfig.name).st_mode, 0o100764)
def write_new_keys_test(self): from pyanaconda.simpleconfig import SimpleConfigFile scf = SimpleConfigFile() scf.read(self.PATH) scf.set(("key1", "value1")) scf.write("/tmp/file") self.assertEqual(open("/tmp/file").read(), self.CONTENT+"KEY1=value1\n")
def test_write_new_keys(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(("key1", "value1")) scf.write(testconfig.name) testconfig.flush() assert open(testconfig.name).read() == self.TEST_CONFIG+"KEY1=value1\n"
def write_new_keys_test(self): with tempfile.NamedTemporaryFile() as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(("key1", "value1")) scf.write(testconfig.name) testconfig.flush() self.assertEqual(open(testconfig.name).read(), self.TEST_CONFIG+"KEY1=value1\n")
def test_write(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: scf = SimpleConfigFile() scf.set(('key1', 'value1')) scf.write(testconfig.name) testconfig.flush() assert open(testconfig.name).read() == 'KEY1=value1\n'
def write_test(self): with tempfile.NamedTemporaryFile() as testconfig: scf = SimpleConfigFile() scf.set(('key1', 'value1')) scf.write(testconfig.name) testconfig.flush() self.assertEqual(open(testconfig.name).read(), 'KEY1=value1\n')
def comment_test(self): with tempfile.NamedTemporaryFile() as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() config = SimpleConfigFile(testconfig.name) config.read() self.assertEqual(config.get("ESSID"), "Example Network #1") self.assertEqual(config.get("ESSID2"), "Network #2") self.assertEqual(config.get("COMMENT"), "Save this string") self.assertEqual(str(config), self.TEST_CONFIG)
def test_comment(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() config = SimpleConfigFile(testconfig.name) config.read() assert config.get("ESSID") == "Example Network #1" assert config.get("ESSID2") == "Network #2" assert config.get("COMMENT") == "Save this string" assert str(config) == self.TEST_CONFIG
def run(self): if self._selinux_mode == SELinuxMode.DEFAULT: log.debug("Use SELinux default configuration.") return if self._selinux_mode not in self.SELINUX_STATES: log.error("Unknown SELinux state for %s.", self._selinux_mode) return try: selinux_cfg = SimpleConfigFile(os.path.join(self._sysroot, self.SELINUX_CONFIG_PATH)) selinux_cfg.read() selinux_cfg.set(("SELINUX", self.SELINUX_STATES[self._selinux_mode])) selinux_cfg.write() except OSError as msg: log.error("SELinux configuration failed: %s", msg)
def write_new_keys_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(("key1", "value1")) scf.write(testconfig.name) testconfig.flush() self.assertEqual(open(testconfig.name).read(), self.TEST_CONFIG+"KEY1=value1\n")
def test_read_write(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) scf.write(testconfig.name) testconfig.flush() assert open(testconfig.name).read() == self.TEST_CONFIG
def read_write_test(self): with tempfile.NamedTemporaryFile() as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) scf.write(testconfig.name) testconfig.flush() self.assertEqual(open(testconfig.name).read(), self.TEST_CONFIG)
def no_use_tmp_test(self): with tempfile.NamedTemporaryFile(mode="w+t") as testconfig: # Write a starting file and keep the handle open testconfig.write("KEY1=value1\n") testconfig.flush() testconfig.seek(0) # Overwrite the value and write a new file scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(('key1', 'value2')) scf.write(testconfig.name, use_tmp=False) # Check the new contents self.assertEqual(open(testconfig.name).read(), 'KEY1=value2\n') # Check that the original file handle points to the replaced contents self.assertEqual(testconfig.read(), 'KEY1=value2\n')
def test_use_tmp(self): with tempfile.NamedTemporaryFile(mode="w+t") as testconfig: # Write a starting file and keep the handle open testconfig.write("KEY1=value1\n") testconfig.flush() testconfig.seek(0) # Overwrite the value and write a new file scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(('key1', 'value2')) scf.write(testconfig.name, use_tmp=True) # Check the new contents assert open(testconfig.name).read() == 'KEY1=value2\n' # Check that the original file handle still points to the old contents assert testconfig.read() == 'KEY1=value1\n'
def comment_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() config = SimpleConfigFile(testconfig.name) config.read() self.assertEqual(config.get("ESSID"), "Example Network #1") self.assertEqual(config.get("ESSID2"), "Network #2") self.assertEqual(config.get("COMMENT"), "Save this string") self.assertEqual(str(config), self.TEST_CONFIG)
def test_use_tmp_multifs(self): # Open a file on a non-default filesystem with tempfile.NamedTemporaryFile(dir='/dev/shm', mode='w+t') as testconfig: # Write a starting file and keep the handle open testconfig.write("KEY1=value1\n") testconfig.flush() testconfig.seek(0) # Overwrite the value and write a new file scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(('key1', 'value2')) scf.write(testconfig.name, use_tmp=True) # Check the new contents self.assertEqual(open(testconfig.name).read(), 'KEY1=value2\n') # Check that the original file handle still points to the old contents self.assertEqual(testconfig.read(), 'KEY1=value1\n')
def execute(self): security_proxy = SECURITY.get_proxy() selinux = security_proxy.SELinux if selinux == SELINUX_DEFAULT: selinux_log.debug("Use SELinux default configuration.") return if selinux not in self.SELINUX_STATES: selinux_log.error("Unknown SELinux state for %s.", selinux) return try: selinux_cfg = SimpleConfigFile(util.getSysroot() + "/etc/selinux/config") selinux_cfg.read() selinux_cfg.set(("SELINUX", self.SELINUX_STATES[selinux])) selinux_cfg.write() except IOError as msg: selinux_log.error("SELinux configuration failed: %s", msg)
def use_tmp_multifs_test(self): # Open a file on a non-default filesystem with tempfile.NamedTemporaryFile(dir='/dev/shm', mode='w+t') as testconfig: # Write a starting file and keep the handle open testconfig.write("KEY1=value1\n") testconfig.flush() testconfig.seek(0) # Overwrite the value and write a new file scf = SimpleConfigFile() scf.read(testconfig.name) scf.set(('key1', 'value2')) scf.write(testconfig.name, use_tmp=True) # Check the new contents self.assertEqual(open(testconfig.name).read(), 'KEY1=value2\n') # Check that the original file handle still points to the old contents self.assertEqual(testconfig.read(), 'KEY1=value1\n')
def remove_key_test(self): from pyanaconda.simpleconfig import SimpleConfigFile scf = SimpleConfigFile() scf.read(self.PATH) scf.unset("BOOT") scf.write("/tmp/file") scf.reset() scf.read("/tmp/file") self.assertEqual(scf.get("BOOT"), "")
def unset_test(self): scf = SimpleConfigFile() scf.set(('key1', 'value1')) scf.unset(('key1')) self.assertEqual(scf.get('key1'), '')
def set_and_get_test(self): """Setting and getting values""" scf = SimpleConfigFile() scf.set(('key1', 'value1')) self.assertEqual(scf.get('key1'), 'value1') scf.set(('KEY2', 'value2')) self.assertEqual(scf.get('key2'), 'value2') scf.set(('KEY3', 'value3')) self.assertEqual(scf.get('KEY3'), 'value3') scf.set(('key4', 'value4')) self.assertEqual(scf.get('KEY4'), 'value4')
def read_write_test(self): from pyanaconda.simpleconfig import SimpleConfigFile scf = SimpleConfigFile() scf.read(self.PATH) scf.write("/tmp/file") self.assertEqual(open("/tmp/file").read(), self.CONTENT)
def remove_key_test(self): with tempfile.NamedTemporaryFile() as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) self.assertEqual(scf.get("BOOT"), "always") scf.unset("BOOT") scf.write(testconfig.name) testconfig.flush() scf.reset() scf.read(testconfig.name) self.assertEqual(scf.get("BOOT"), "")
def remove_key_test(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) self.assertEqual(scf.get("BOOT"), "always") scf.unset("BOOT") scf.write(testconfig.name) testconfig.flush() scf.reset() scf.read(testconfig.name) self.assertEqual(scf.get("BOOT"), "")
def __init__(self, filename): SimpleConfigFile.__init__(self, always_quote=True, filename=filename) self._dirty = False
def read(self, filename=None): self.reset() ifcfglog.debug("IfcfFile.read %s", self.filename) SimpleConfigFile.read(self) self._dirty = False