feat: USDA-dash now uses encrypted .env files
All checks were successful
CI / Format Check (push) Successful in 2s
CI / Flake Check (push) Successful in 1m42s
CI / Evaluate Key Configurations (nix-builder) (push) Successful in 14s
CI / Evaluate Key Configurations (nix-desktop1) (push) Successful in 8s
CI / Evaluate Key Configurations (nix-laptop1) (push) Successful in 9s
CI / Evaluate Artifacts (installer-iso-nix-laptop1) (push) Successful in 20s
CI / Evaluate Artifacts (lxc-nix-builder) (push) Successful in 13s
CI / Build and Publish Documentation (push) Successful in 10s

This commit is contained in:
UGA Innovation Factory
2026-01-30 23:19:38 +00:00
parent 7e6e8d5e0f
commit 7c07727150
4 changed files with 53 additions and 81 deletions

View File

@@ -62,7 +62,9 @@ in
''; '';
example = "32G"; example = "32G";
}; };
}; }; }; };
};
};
config = lib.mkMerge [ config = lib.mkMerge [
{ {

View File

@@ -54,27 +54,10 @@ let
in in
lenStr >= lenSuffix && lib.substring (lenStr - lenSuffix) lenSuffix str == suffix; lenStr >= lenSuffix && lib.substring (lenStr - lenSuffix) lenSuffix str == suffix;
hasPrefix =
prefix: str:
let
lenPrefix = lib.stringLength prefix;
in
lib.stringLength str >= lenPrefix && lib.substring 0 lenPrefix str == prefix;
nameValuePair = name: value: { inherit name value; }; nameValuePair = name: value: { inherit name value; };
secretsPath = ./secrets; secretsPath = ./secrets;
# Helper to convert SSH public key content to age public key
sshToAge =
sshPubKey:
let
# This is a simple check - in practice, use ssh-to-age tool
# For now, we'll just use the keys as-is if they look like age keys
trimmed = lib.replaceStrings [ "\n" ] [ "" ] sshPubKey;
in
if lib.substring 0 4 trimmed == "age1" then trimmed else null; # Will need manual conversion with ssh-to-age
# Read all directories in secrets/ # Read all directories in secrets/
secretDirs = if lib.pathExists secretsPath then lib.readDir secretsPath else { }; secretDirs = if lib.pathExists secretsPath then lib.readDir secretsPath else { };
@@ -181,22 +164,23 @@ let
# Generate wildcard rules for each directory to allow creating new secrets # Generate wildcard rules for each directory to allow creating new secrets
wildcardRules = lib.listToAttrs ( wildcardRules = lib.listToAttrs (
lib.concatMap ( lib.concatMap (dir: [
dir:
[
# Match with and without .age extension for ragenix compatibility # Match with and without .age extension for ragenix compatibility
(nameValuePair "secrets/${dir}/*" { (nameValuePair "secrets/${dir}/*" {
publicKeys = let publicKeys =
let
recipients = getRecipients "secrets/${dir}/dummy.age"; recipients = getRecipients "secrets/${dir}/dummy.age";
in unique (lib.filter (k: k != null && k != "") recipients); in
unique (lib.filter (k: k != null && k != "") recipients);
}) })
(nameValuePair "secrets/${dir}/*.age" { (nameValuePair "secrets/${dir}/*.age" {
publicKeys = let publicKeys =
let
recipients = getRecipients "secrets/${dir}/dummy.age"; recipients = getRecipients "secrets/${dir}/dummy.age";
in unique (lib.filter (k: k != null && k != "") recipients); in
unique (lib.filter (k: k != null && k != "") recipients);
}) })
] ]) (lib.filter (d: d != "admins") directories)
) (lib.filter (d: d != "admins") directories)
); );
in in

View File

@@ -54,27 +54,10 @@ let
in in
lenStr >= lenSuffix && lib.substring (lenStr - lenSuffix) lenSuffix str == suffix; lenStr >= lenSuffix && lib.substring (lenStr - lenSuffix) lenSuffix str == suffix;
hasPrefix =
prefix: str:
let
lenPrefix = lib.stringLength prefix;
in
lib.stringLength str >= lenPrefix && lib.substring 0 lenPrefix str == prefix;
nameValuePair = name: value: { inherit name value; }; nameValuePair = name: value: { inherit name value; };
secretsPath = ./secrets; secretsPath = ./secrets;
# Helper to convert SSH public key content to age public key
sshToAge =
sshPubKey:
let
# This is a simple check - in practice, use ssh-to-age tool
# For now, we'll just use the keys as-is if they look like age keys
trimmed = lib.replaceStrings [ "\n" ] [ "" ] sshPubKey;
in
if lib.substring 0 4 trimmed == "age1" then trimmed else null; # Will need manual conversion with ssh-to-age
# Read all directories in secrets/ # Read all directories in secrets/
secretDirs = if lib.pathExists secretsPath then lib.readDir secretsPath else { }; secretDirs = if lib.pathExists secretsPath then lib.readDir secretsPath else { };

View File

@@ -195,7 +195,10 @@ in
# This is needed because age can't reliably use OpenSSH private keys directly # This is needed because age can't reliably use OpenSSH private keys directly
# Must run before agenix tries to decrypt secrets # Must run before agenix tries to decrypt secrets
system.activationScripts.convertSshToAge = { system.activationScripts.convertSshToAge = {
deps = [ "users" "groups" ]; deps = [
"users"
"groups"
];
text = '' text = ''
mkdir -p /etc/age mkdir -p /etc/age
if [ -f /etc/ssh/ssh_host_ed25519_key ]; then if [ -f /etc/ssh/ssh_host_ed25519_key ]; then