diff --git a/examples/specs/5-amd64-g.spec b/examples/specs/5-amd64-g.spec index dbfa883..d8b07f0 100644 --- a/examples/specs/5-amd64-g.spec +++ b/examples/specs/5-amd64-g.spec @@ -30,6 +30,11 @@ destination_chroot: /sabayon # Extra mirror (r)sync parameters extra_rsync_parameters: --one-file-system --exclude proc/* +# Inner "source" chroot script command, to be executed inside source chroot +# before copying to destination chroot. In this way you can commit automatic +# and persistent updates to your chroot +# inner_source_chroot_script: /path/to/inner_source_chroot_executable_hook + # Outer chroot script command, to be executed outside destination chroot before packing it # - amd64-archscript.sh - setup kernel bins outer_chroot_script: /sabayon/scripts/remaster_pre.sh diff --git a/examples/specs/5-amd64-k.spec b/examples/specs/5-amd64-k.spec index 0783a77..6169538 100644 --- a/examples/specs/5-amd64-k.spec +++ b/examples/specs/5-amd64-k.spec @@ -30,6 +30,11 @@ destination_chroot: /sabayon # Extra mirror (r)sync parameters extra_rsync_parameters: --one-file-system --exclude proc/* +# Inner "source" chroot script command, to be executed inside source chroot +# before copying to destination chroot. In this way you can commit automatic +# and persistent updates to your chroot +# inner_source_chroot_script: /path/to/inner_source_chroot_executable_hook + # Outer chroot script command, to be executed outside destination chroot before packing it # - amd64-archscript.sh - setup kernel bins outer_chroot_script: /sabayon/scripts/remaster_pre.sh diff --git a/examples/specs/5-x86-g.spec b/examples/specs/5-x86-g.spec index b95831e..70e0200 100644 --- a/examples/specs/5-x86-g.spec +++ b/examples/specs/5-x86-g.spec @@ -30,6 +30,11 @@ destination_chroot: /sabayon # Extra mirror (r)sync parameters extra_rsync_parameters: --one-file-system --exclude proc/* +# Inner "source" chroot script command, to be executed inside source chroot +# before copying to destination chroot. In this way you can commit automatic +# and persistent updates to your chroot +# inner_source_chroot_script: /path/to/inner_source_chroot_executable_hook + # Outer chroot script command, to be executed outside destination chroot before packing it # - x86-archscript.sh - setup kernel bins outer_chroot_script: /sabayon/scripts/remaster_pre.sh diff --git a/examples/specs/5-x86-k.spec b/examples/specs/5-x86-k.spec index 91147d8..61bea33 100644 --- a/examples/specs/5-x86-k.spec +++ b/examples/specs/5-x86-k.spec @@ -30,6 +30,11 @@ destination_chroot: /sabayon # Extra mirror (r)sync parameters extra_rsync_parameters: --one-file-system --exclude proc/* +# Inner "source" chroot script command, to be executed inside source chroot +# before copying to destination chroot. In this way you can commit automatic +# and persistent updates to your chroot +# inner_source_chroot_script: /path/to/inner_source_chroot_executable_hook + # Outer chroot script command, to be executed outside destination chroot before packing it # - x86-archscript.sh - setup kernel bins outer_chroot_script: /sabayon/scripts/remaster_pre.sh diff --git a/molecule/specs/plugins/builtin.py b/molecule/specs/plugins/builtin.py index 1eaf36e..476a954 100644 --- a/molecule/specs/plugins/builtin.py +++ b/molecule/specs/plugins/builtin.py @@ -38,7 +38,7 @@ class BuiltinHandler: if cdroot_dir: os.environ['CDROOT_DIR'] = cdroot_dir self.Output.updateProgress("[%s|%s] %s: %s" % ( - blue("MirrorHandler"),darkred(self.spec_name), + blue("BuiltinHandler"),darkred(self.spec_name), _("spawning"), error_script, ) ) @@ -49,6 +49,35 @@ class BuiltinHandler: except KeyError: continue + def _exec_inner_script(self, exec_script, dest_chroot): + + while 1: + tmp_dir = os.path.join(dest_chroot, + str(molecule.utils.get_random_number())) + if not os.path.lexists(tmp_dir): + break + + os.makedirs(tmp_dir) + tmp_exec = os.path.join(tmp_dir, "inner_exec") + shutil.copy2(exec_script[0], tmp_exec) + os.chmod(tmp_exec, 0755) + dest_exec = tmp_exec[len(dest_chroot):] + if not dest_exec.startswith("/"): + dest_exec = "/%s" % (dest_exec,) + + rc = molecule.utils.exec_chroot_cmd([dest_exec] + exec_script[1:], + dest_chroot, self.metadata.get('prechroot',[])) + os.remove(tmp_exec) + os.rmdir(tmp_dir) + + if rc != 0: + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("BuiltinHandler"),darkred(self.spec_name), + _("inner chroot hook failed"),rc, + ) + ) + return rc + class MirrorHandler(GenericExecutionStep, BuiltinHandler): def __init__(self, *args, **kwargs): @@ -70,6 +99,27 @@ class MirrorHandler(GenericExecutionStep, BuiltinHandler): _("executing pre_run"), ) ) + + exec_script = self.metadata.get('inner_source_chroot_script') + if exec_script: + if os.path.isfile(exec_script[0]) and \ + os.access(exec_script[0], os.R_OK): + rc = self._exec_inner_script(exec_script, self.source_dir) + if rc != 0: + self.Output.updateProgress("[%s|%s] %s: %s" % ( + blue("MirrorHandler"), darkred(self.spec_name), + _("inner_source_chroot_script failed"), rc, + ) + ) + return rc + + + self.Output.updateProgress("[%s|%s] %s" % ( + blue("MirrorHandler"),darkred(self.spec_name), + _("pre_run completed successfully"), + ) + ) + return 0 def post_run(self): @@ -269,35 +319,6 @@ class ChrootHandler(GenericExecutionStep, BuiltinHandler): ) return 0 - def _exec_inner_script(self, exec_script): - - while 1: - tmp_dir = os.path.join(self.dest_dir, - str(molecule.utils.get_random_number())) - if not os.path.lexists(tmp_dir): - break - - os.makedirs(tmp_dir) - tmp_exec = os.path.join(tmp_dir, "inner_exec") - shutil.copy2(exec_script[0], tmp_exec) - os.chmod(tmp_exec, 0755) - dest_exec = tmp_exec[len(self.dest_dir):] - if not dest_exec.startswith("/"): - dest_exec = "/%s" % (dest_exec,) - - rc = molecule.utils.exec_chroot_cmd([dest_exec] + exec_script[1:], - self.dest_dir, self.metadata.get('prechroot',[])) - os.remove(tmp_exec) - os.rmdir(tmp_dir) - - if rc != 0: - self.Output.updateProgress("[%s|%s] %s: %s" % ( - blue("ChrootHandler"),darkred(self.spec_name), - _("inner chroot hook failed"),rc, - ) - ) - return rc - def run(self): self.Output.updateProgress("[%s|%s] %s" % ( @@ -310,7 +331,7 @@ class ChrootHandler(GenericExecutionStep, BuiltinHandler): exec_script = self.metadata.get('inner_chroot_script') if exec_script: if os.path.isfile(exec_script[0]) and os.access(exec_script[0], os.R_OK): - rc = self._exec_inner_script(exec_script) + rc = self._exec_inner_script(exec_script, self.dest_dir) if rc != 0: return rc @@ -626,6 +647,10 @@ class LivecdSpec(GenericSpec): 'cb': self.valid_exec_first_list_item, 've': self.ve_string_splitter, }, + 'inner_source_chroot_script': { + 'cb': self.valid_path_string_first_list_item, + 've': self.ve_string_splitter, + }, 'inner_chroot_script': { 'cb': self.valid_path_string_first_list_item, 've': self.ve_string_splitter,