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_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 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 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 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 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 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 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 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 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(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 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 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 test_remove_key(self): with tempfile.NamedTemporaryFile(mode="wt") as testconfig: testconfig.write(self.TEST_CONFIG) testconfig.flush() scf = SimpleConfigFile() scf.read(testconfig.name) assert scf.get("BOOT") == "always" scf.unset("BOOT") scf.write(testconfig.name) testconfig.flush() scf.reset() scf.read(testconfig.name) assert scf.get("BOOT") == ""
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 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 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 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 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 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 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 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)