12{lib}: let3 inherit (lib.trivial) isFunction;4 inherit (lib.options) mkOption mergeOneOption;5 inherit (lib.modules) mkOverride;6 inherit (lib.types) listOf submodule attrsOf mkOptionType;7 inherit (lib.strings) optionalString hasPrefix removePrefix;8in rec {9 types = {10 overlay = mkOptionType {11 name = "nixpkgs-overlay";12 description = "nixpkgs overlay";13 check = isFunction;14 merge = mergeOneOption;15 };16 listOfOverlay = listOf types.overlay;1718 mkHostsType = module: attrsOf (submodule module);19 mkDataType = module: submodule module;20 };2122 options = {23 mkHostsOption = module:24 mkOption {25 type = types.mkHostsType module;26 };27 mkDataOption = module:28 mkOption {29 type = types.mkDataType module;30 };31 };3233 inherit (options) mkHostsOption;3435 modules = {36 373839 mkFleetDefault = mkOverride 999;40 414243 mkFleetGeneratorDefault = mkOverride 1001;44 };4546 inherit (modules) mkFleetDefault mkFleetGeneratorDefault;4748 secrets = {49 5051525354555657585960 mkPassword = {size ? 32}: {61 coreutils,62 mkSecretGenerator,63 }:64 mkSecretGenerator {65 script = ''66 mkdir $out67 gh generate password -o $out/secret --size ${toString size}68 '';69 };7071 72737475767778798081828384 mkEd25519 = {85 noEmbedPublic ? false,86 encoding ? null,87 }: {mkSecretGenerator}:88 mkSecretGenerator {89 script = ''90 mkdir $out91 gh generate ed25519 -p $out/public -s $out/secret \92 ${optionalString noEmbedPublic "--no-embed-public"} \93 ${optionalString (encoding != null) "--encoding=${encoding}"}94 '';95 };9697 9899100101102103104105106107108 mkX25519 = {encoding ? null}: {mkSecretGenerator}:109 mkSecretGenerator {110 script = ''111 mkdir $out112 gh generate x25519 -p $out/public -s $out/secret \113 ${optionalString (encoding != null) "--encoding=${encoding}"}114 '';115 };116117 118119120121122123124125126127 mkRsa = {size ? 4096}: {128 openssl,129 mkSecretGenerator,130 }:131 mkSecretGenerator {132 script = ''133 mkdir $out134135 ${openssl}/bin/openssl genrsa -out rsa_private.key ${toString size}136 ${openssl}/bin/openssl rsa -in rsa_private.key -pubout -out rsa_public.key137138 cat rsa_private.key | gh private -o $out/secret139 cat rsa_public.key | gh public -o $out/public140 '';141 };142143 144145146147148149150151152153154155156157 mkBytes = {158 count ? 32,159 encoding,160 noNuls ? false,161 }: {mkSecretGenerator}:162 mkSecretGenerator {163 script = ''164 mkdir $out165 gh generate bytes --count=${toString count} --encoding=${encoding} -o $out/secret \166 ${optionalString noNuls "--no-nuls"}167 '';168 };169 170171172 mkHexBytes = {count ? 32}:173 mkBytes {174 inherit count;175 encoding = "hex";176 };177 178179180 mkBase64Bytes = {count ? 32}:181 mkBytes {182 inherit count;183 encoding = "base64";184 };185186 187 188 189 };190191 inherit (secrets) mkPassword mkEd25519 mkX25519 mkRsa mkBytes mkHexBytes mkBase64Bytes;192193 strings = let194 plaintextPrefix = "<PLAINTEXT>";195 plaintextNewlinePrefix = "<PLAINTEXT-NL>";196 in {197 198199200 decodeRawSecret = raw:201 if hasPrefix plaintextPrefix raw202 then removePrefix plaintextPrefix raw203 else if hasPrefix plaintextNewlinePrefix raw204 then removePrefix plaintextNewlinePrefix raw205 else throw "decodeRawSecret only works with plaintext-encoded secret public parts, got ${raw}";206 };207208 inherit (strings) decodeRawSecret;209}