From 9cc3bdbc9f61f6d73b71f0e420d5948f6af6c00e Mon Sep 17 00:00:00 2001 From: lassulus Date: Fri, 13 Dec 2024 18:30:54 +0100 Subject: [PATCH] vars: eval finalScript lazy --- nixosModules/clanCore/vars/default.nix | 1 - nixosModules/clanCore/vars/generator.nix | 50 ++++++++++--------- nixosModules/clanCore/vars/interface.nix | 2 +- .../clanCore/vars/secret/on-machine.nix | 25 ++++++++++ pkgs/clan-cli/clan_cli/machines/machines.py | 6 ++- pkgs/clan-cli/clan_cli/vars/generate.py | 14 ++++-- 6 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 nixosModules/clanCore/vars/secret/on-machine.nix diff --git a/nixosModules/clanCore/vars/default.nix b/nixosModules/clanCore/vars/default.nix index 3a7fe5db2..0c8042e7b 100644 --- a/nixosModules/clanCore/vars/default.nix +++ b/nixosModules/clanCore/vars/default.nix @@ -41,7 +41,6 @@ in inherit (generator) name dependencies - finalScript validationHash migrateFact prompts diff --git a/nixosModules/clanCore/vars/generator.nix b/nixosModules/clanCore/vars/generator.nix index cbd50a4f0..c3ee1033a 100644 --- a/nixosModules/clanCore/vars/generator.nix +++ b/nixosModules/clanCore/vars/generator.nix @@ -24,35 +24,37 @@ let filePromptNames = attrNames (filterAttrs (_name: prompt: prompt.createFile) config.prompts); in { - finalScript = mkOptionDefault '' - set -eu -o pipefail + finalScript = mkOptionDefault ( + pkgs.writeScript "generator-${config.name}" '' + set -eu -o pipefail - export PATH="${makeBinPath config.runtimeInputs}:${pkgs.coreutils}/bin" + export PATH="${makeBinPath config.runtimeInputs}:${pkgs.coreutils}/bin" - ${optionalString (pkgs.stdenv.hostPlatform.isLinux) '' - # prepare sandbox user on platforms where this is supported - mkdir -p /etc + ${optionalString (pkgs.stdenv.hostPlatform.isLinux) '' + # prepare sandbox user on platforms where this is supported + mkdir -p /etc - cat > /etc/group < /etc/group < /etc/passwd < /etc/passwd < /etc/hosts < /etc/hosts < str: diff --git a/pkgs/clan-cli/clan_cli/vars/generate.py b/pkgs/clan-cli/clan_cli/vars/generate.py index f1830a02b..fffd3f73c 100644 --- a/pkgs/clan-cli/clan_cli/vars/generate.py +++ b/pkgs/clan-cli/clan_cli/vars/generate.py @@ -40,7 +40,6 @@ class Generator: files: list[Var] = field(default_factory=list) share: bool = False validation: str | None = None - final_script: str = "" prompts: list[Prompt] = field(default_factory=list) dependencies: list[str] = field(default_factory=list) @@ -62,7 +61,6 @@ class Generator: return cls( name=data["name"], share=data["share"], - final_script=data["finalScript"], files=[Var.from_json(data["name"], f) for f in data["files"].values()], validation=data["validationHash"], dependencies=data["dependencies"], @@ -70,6 +68,14 @@ class Generator: prompts=[Prompt.from_json(p) for p in data["prompts"].values()], ) + @property + def final_script(self) -> Path: + assert self._machine is not None + final_script = self._machine.build_nix( + f"config.clan.core.vars.generators.{self.name}.finalScript" + ) + return final_script + def bubblewrap_cmd(generator: str, tmpdir: Path) -> list[str]: # fmt: off @@ -188,7 +194,7 @@ def execute_generator( prompt_file.write_text(value) if sys.platform == "linux": - cmd = bubblewrap_cmd(generator.final_script, tmpdir) + cmd = bubblewrap_cmd(str(generator.final_script), tmpdir) else: cmd = ["bash", "-c", generator.final_script] run(cmd, RunOpts(env=env)) @@ -201,7 +207,7 @@ def execute_generator( secret_file = tmpdir_out / file.name if not secret_file.is_file(): msg = f"did not generate a file for '{file.name}' when running the following command:\n" - msg += generator.final_script + msg += str(generator.final_script) raise ClanError(msg) if file.secret: file_path = secret_vars_store.set(