asusmini: resolve agenix rules explicitly during cutover

This commit is contained in:
Anish Lakhwara committed 2026-11-01 22:37:35 -07:00
1 parent e3d4ae696d
commit 3edfcf5656
3 files changed
+53 -1

No files matched your search

+2 -1
View File
@@ -151,7 +151,8 @@ trap 'exit 143' TERM
umask 077
runtime=$(mktemp -d "$runtime_template")
agenix -d "$repo/secrets/knot-env.age" -i "$ssh_key" > "$runtime/knot.env"
AGENIX_RULES="$repo/secrets/secrets.nix" \
agenix -d knot-env.age -i "$ssh_key" > "$runtime/knot.env"
chmod 0400 "$runtime/knot.env"
master_key=""
export -n master_key
+47
View File
@@ -0,0 +1,47 @@
import os
import shutil
import subprocess
import tempfile
import unittest
from pathlib import Path
@unittest.skipUnless(
all(shutil.which(tool) for tool in ("agenix", "age", "ssh-keygen")),
"requires agenix, age, and ssh-keygen on PATH",
)
class AgenixRulesTests(unittest.TestCase):
def test_decrypt_from_outside_rules_directory(self):
with tempfile.TemporaryDirectory(prefix="agenix-rules-test-") as raw:
root = Path(raw)
secrets = root / "secrets"
secrets.mkdir()
elsewhere = root / "elsewhere"
elsewhere.mkdir()
key = root / "identity"
subprocess.run(
["ssh-keygen", "-q", "-t", "ed25519", "-N", "", "-f", str(key)],
check=True,
)
public_key = key.with_suffix(".pub").read_text().strip()
rules = secrets / "secrets.nix"
rules.write_text(
'{ "knot-env.age".publicKeys = [ "' + public_key + '" ]; }\n'
)
plaintext = b"KNOT_MASTER_KEY=" + b"A" * 43 + b"=\n"
encrypted = subprocess.run(
["age", "-r", public_key], input=plaintext, capture_output=True, check=True
)
(secrets / "knot-env.age").write_bytes(encrypted.stdout)
result = subprocess.run(
["agenix", "-d", "knot-env.age", "-i", str(key)],
cwd=elsewhere,
env={**os.environ, "AGENIX_RULES": str(rules)},
capture_output=True,
check=True,
)
self.assertEqual(result.stdout, plaintext)
if __name__ == "__main__":
unittest.main()
+4
View File
@@ -97,6 +97,9 @@ elif name == "ssh-keyscan":
elif name == "nix-env":
pass
elif name == "agenix":
rules = os.environ.get("AGENIX_RULES", "")
if not Path(rules).is_file() or args[:2] != ["-d", "knot-env.age"]:
raise SystemExit("agenix needs explicit rules and a rules-relative secret name")
value = (b"KNOT_MASTER_KEY=" + (b"B" * 43 + b"=\n" if not fail("BAD_KEY") else b"bad\n"))
sys.stdout.buffer.write(value)
target = os.environ.get("AGENIX_TARGET")
@@ -195,6 +198,7 @@ class UpgradeKnotTests(unittest.TestCase):
self.repo = self.tmp / "repo"
(self.repo / "secrets").mkdir(parents=True)
(self.repo / "secrets" / "knot-env.age").write_text("not a secret used by fixture\n")
(self.repo / "secrets" / "secrets.nix").write_text("{}\n")
self.source = self.tmp / "git"
self.source.mkdir()
(self.source / "knotserver.db").write_text("fixture db\n")