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 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(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_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_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 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 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 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 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 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_set_and_get(self): """Setting and getting values""" scf = SimpleConfigFile() scf.set(('key1', 'value1')) assert scf.get('key1') == 'value1' scf.set(('KEY2', 'value2')) assert scf.get('key2') == 'value2' scf.set(('KEY3', 'value3')) assert scf.get('KEY3') == 'value3' scf.set(('key4', 'value4')) assert scf.get('KEY4') == 'value4'
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 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 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 test_unset(self): scf = SimpleConfigFile() scf.set(('key1', 'value1')) scf.unset(('key1')) assert scf.get('key1') == ''
def unset_test(self): scf = SimpleConfigFile() scf.set(('key1', 'value1')) scf.unset(('key1')) self.assertEqual(scf.get('key1'), '')