network/nix/lib/salt-support/salt-pillar.nix

67 lines
1.7 KiB
Nix

{ pkgs ? import <nixpkgs> {}
, ...
}@args:
hostName:
let
loadSls = import ./load-sls.nix args;
pillarBase = (loadSls ../../../salt-pillar/top.sls).base;
globToRegex = builtins.replaceStrings ["*"] [".*"];
baseMatches =
if hostName == "*"
then
builtins.attrNames pillarBase
else
builtins.filter (patterns:
pkgs.lib.any (pattern:
builtins.match (globToRegex pattern) hostName != null
) (
builtins.filter builtins.isString (
builtins.split " or " patterns
)
)
) (builtins.attrNames pillarBase);
fileIds = builtins.foldl' (result: matchName:
result ++ pillarBase.${matchName}
) [] baseMatches;
allFilePaths = pkgs.lib.filesystem.listFilesRecursive ../../../salt-pillar;
files = map (fileId:
let
parts = builtins.filter builtins.isString (
builtins.split "\\." fileId
);
matches = builtins.filter (filePath:
let
suffix1 = builtins.concatStringsSep "/" (parts ++ [ "init.sls" ]);
suffix2 = (builtins.concatStringsSep "/" parts) + ".sls";
check = suffix:
endsWith suffix (builtins.toString filePath);
in
check suffix1 || check suffix2
) allFilePaths;
matchesLength = builtins.length matches;
in
if matchesLength == 0
then throw "No pillar file for ${fileId}"
else if matchesLength > 1
then throw "Ambiguous choice of files for ${fileId}"
else builtins.head matches
) fileIds;
endsWith = suffix: s:
let
suffixLen = builtins.stringLength suffix;
sLen = builtins.stringLength s;
in
builtins.substring (sLen - suffixLen) suffixLen s == suffix;
in
loadSls files