From 91cbe7bd6f9879f40ebc46e2b8df9bb210dd48f1 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Thu, 21 Jul 2011 13:56:03 +0200 Subject: [PATCH] [molecule.specs] always make sure to kill processes running inside chroots if failing --- molecule/specs/plugins/builtin_plugin.py | 14 ++++++-- molecule/specs/plugins/image_plugin.py | 22 +++++++++---- molecule/specs/plugins/remaster_plugin.py | 39 +++++++++++++++++------ 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/molecule/specs/plugins/builtin_plugin.py b/molecule/specs/plugins/builtin_plugin.py index 013018f..ca6e45e 100644 --- a/molecule/specs/plugins/builtin_plugin.py +++ b/molecule/specs/plugins/builtin_plugin.py @@ -73,11 +73,19 @@ class BuiltinHandlerMixin: if not dest_exec.startswith("/"): dest_exec = "/%s" % (dest_exec,) - rc = molecule.utils.exec_chroot_cmd([dest_exec] + exec_script[1:], - dest_chroot, pre_chroot = self.metadata.get('prechroot', [])) - os.remove(tmp_exec) + rc = 0 + try: + rc = molecule.utils.exec_chroot_cmd([dest_exec] + exec_script[1:], + dest_chroot, pre_chroot = self.metadata.get('prechroot', [])) + except: + # kill all the pids inside chroot, no matter what just happened + molecule.utils.kill_chroot_pids(dest_chroot, sleep = True) + raise + finally: + os.remove(tmp_exec) if rc != 0: + molecule.utils.kill_chroot_pids(dest_chroot, sleep = True) self._output.output("[%s|%s] %s: %s" % ( blue("BuiltinHandler"), darkred(self.spec_name), _("inner chroot hook failed"), rc, diff --git a/molecule/specs/plugins/image_plugin.py b/molecule/specs/plugins/image_plugin.py index 0b1f569..4c460e1 100644 --- a/molecule/specs/plugins/image_plugin.py +++ b/molecule/specs/plugins/image_plugin.py @@ -323,9 +323,10 @@ class ImageHandler(GenericExecutionStep, BuiltinHandlerMixin): self._tmp_loop_device_fd = None if not success: + env = os.environ.copy() + env["LOOP_DEVICE"] = self.loop_device + self._run_error_script(None, None, None, env = env) self._kill_loop_device() - self._run_error_script(None, None, None) - return 0 @@ -396,7 +397,7 @@ class ImageIsoUnpackHandler(RemasterIsoUnpackHandler): return 0 -class ChrootHandler(RemasterChrootHandler): +class ImageChrootHandler(RemasterChrootHandler): def setup(self): # to make superclass working @@ -405,10 +406,19 @@ class ChrootHandler(RemasterChrootHandler): return 0 def kill(self, success = True): - # ImageHandler sets this + self._output.output("[%s|%s] %s" % ( + blue("ImageChrootHandler"), + darkred(self.spec_name), _("executing kill"), + ) + ) if not success: + env = os.environ.copy() + loop_device = self.metadata.get('ImageHandler_loop_device') + if loop_device is not None: + env["LOOP_DEVICE"] = loop_device + self._run_error_script(self.source_dir, self.dest_dir, None, + env = env) self.metadata['ImageHandler_kill_loop_device']() - RemasterChrootHandler.kill(self, success = success) return 0 @@ -669,5 +679,5 @@ class IsoToImageSpec(GenericSpec): } def get_execution_steps(self): - return [ImageHandler, ImageIsoUnpackHandler, ChrootHandler, + return [ImageHandler, ImageIsoUnpackHandler, ImageChrootHandler, FinalImageHandler] diff --git a/molecule/specs/plugins/remaster_plugin.py b/molecule/specs/plugins/remaster_plugin.py index da8e909..b8b1c7e 100644 --- a/molecule/specs/plugins/remaster_plugin.py +++ b/molecule/specs/plugins/remaster_plugin.py @@ -245,10 +245,17 @@ class ChrootHandler(BuiltinChrootHandler): if do_update == 'yes': update_cmd = self.metadata.get('repositories_update_cmd', self._config['pkgs_updater']) - rc = molecule.utils.exec_chroot_cmd(update_cmd, - self.source_dir, - pre_chroot = self.metadata.get('prechroot', [])) + try: + rc = molecule.utils.exec_chroot_cmd(update_cmd, + self.source_dir, + pre_chroot = self.metadata.get('prechroot', [])) + except: + molecule.utils.kill_chroot_pids(self.source_dir, + sleep = True) + raise if rc != 0: + molecule.utils.kill_chroot_pids(self.source_dir, + sleep = True) return rc rc = BuiltinChrootHandler.run(self) @@ -267,10 +274,17 @@ class ChrootHandler(BuiltinChrootHandler): add_cmd = self.metadata.get('custom_packages_add_cmd', self._config['pkgs_adder']) args = add_cmd + packages_to_add - rc = molecule.utils.exec_chroot_cmd(args, - self.source_dir, - pre_chroot = self.metadata.get('prechroot', [])) + try: + rc = molecule.utils.exec_chroot_cmd(args, + self.source_dir, + pre_chroot = self.metadata.get('prechroot', [])) + except: + molecule.utils.kill_chroot_pids(self.source_dir, + sleep = True) + raise if rc != 0: + molecule.utils.kill_chroot_pids(self.source_dir, + sleep = True) return rc packages_to_remove = self.metadata.get('packages_to_remove', []) @@ -278,10 +292,17 @@ class ChrootHandler(BuiltinChrootHandler): rm_cmd = self.metadata.get('custom_packages_remove_cmd', self._config['pkgs_remover']) args = rm_cmd + packages_to_remove - rc = molecule.utils.exec_chroot_cmd(args, - self.source_dir, - pre_chroot = self.metadata.get('prechroot', [])) + try: + rc = molecule.utils.exec_chroot_cmd(args, + self.source_dir, + pre_chroot = self.metadata.get('prechroot', [])) + except: + molecule.utils.kill_chroot_pids(self.source_dir, + sleep = True) + raise if rc != 0: + molecule.utils.kill_chroot_pids(self.source_dir, + sleep = True) return rc # run inner chroot script after pkgs handling