forked from zentralwerk/network
63 lines
1.6 KiB
Nix
63 lines
1.6 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 =
|
||
|
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
|