mirror of
https://github.com/gensokyo-zone/infrastructure.git
synced 2026-02-09 20:39:18 -08:00
117 lines
4.2 KiB
Nix
117 lines
4.2 KiB
Nix
{
|
|
inputs,
|
|
tree,
|
|
systems,
|
|
}: let
|
|
nixlib = inputs.nixpkgs.lib;
|
|
inherit (nixlib.modules) mkOrder mkOverride defaultOverridePriority;
|
|
inherit (nixlib.strings) splitString toLower;
|
|
inherit (nixlib.lists) imap0 elemAt findFirst foldl;
|
|
inherit (nixlib.attrsets) mapAttrs listToAttrs nameValuePair;
|
|
inherit (nixlib.strings) hasPrefix hasInfix removePrefix substring fixedWidthString replaceStrings concatMapStringsSep stringToCharacters match toInt;
|
|
inherit (nixlib.trivial) flip toHexString bitOr;
|
|
|
|
toHexStringLower = v: toLower (toHexString v);
|
|
|
|
hexCharToInt = let
|
|
hexChars = ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f"];
|
|
pairs = imap0 (flip nameValuePair) hexChars;
|
|
idx = listToAttrs pairs;
|
|
in
|
|
char: idx.${char};
|
|
hexToInt = str: foldl (value: chr: value * 16 + hexCharToInt chr) 0 (stringToCharacters (toLower str));
|
|
|
|
eui64 = mac: let
|
|
parts = map toLower (splitString ":" mac);
|
|
part = elemAt parts;
|
|
part0 = part: let
|
|
nibble1' = hexCharToInt (substring 1 1 part);
|
|
nibble1 = bitOr 2 nibble1';
|
|
nibble0 = substring 0 1 part;
|
|
in
|
|
nibble0 + (fixedWidthString 1 "0" (toHexStringLower nibble1));
|
|
in "${part0 (part 0)}${part 1}:${part 2}ff:fe${part 3}:${part 4}${part 5}";
|
|
|
|
parseUrl = url: let
|
|
parts = match ''^([^:]+)://(\[[0-9a-fA-F:]+]|[^/:\[]+)(|:[0-9]+)(|/.*)$'' url;
|
|
port' = elemAt parts 2;
|
|
in assert parts != null; rec {
|
|
inherit url parts;
|
|
scheme = elemAt parts 0;
|
|
host = elemAt parts 1;
|
|
port = if port' != "" then toInt (removePrefix ":" port') else null;
|
|
hostport = host + port';
|
|
path = elemAt parts 3;
|
|
};
|
|
|
|
userIs = group: user: builtins.elem group (user.extraGroups ++ [user.group]);
|
|
|
|
mkWinPath = replaceStrings ["/"] ["\\"];
|
|
mkBaseDn = domain: concatMapStringsSep "," (part: "dc=${part}") (splitString "." domain);
|
|
mkAddress6 = addr: if hasInfix ":" addr && ! hasPrefix "[" addr then "[${addr}]" else addr;
|
|
|
|
coalesce = findFirst (v: v != null) null;
|
|
mapListToAttrs = f: l: listToAttrs (map f l);
|
|
|
|
overrideOptionDefault = 1500;
|
|
overrideAlmostOptionDefault = 1400;
|
|
overrideDefault = 1000;
|
|
overrideAlmostDefault = 900;
|
|
overrideNone = defaultOverridePriority; # 100
|
|
overrideAlmostForce = 75;
|
|
overrideForce = 50;
|
|
overrideVM = 10;
|
|
mkAlmostOptionDefault = mkOverride overrideAlmostOptionDefault;
|
|
mkAlmostDefault = mkOverride overrideAlmostDefault;
|
|
mkAlmostForce = mkOverride overrideAlmostForce;
|
|
orderJustBefore = 400;
|
|
orderBefore = 500;
|
|
orderAlmostBefore = 600;
|
|
orderNone = 1000;
|
|
orderAlmostAfter = 1400;
|
|
orderAfter = 1500;
|
|
orderJustAfter = 1600;
|
|
mkJustBefore = mkOrder orderJustBefore;
|
|
mkAlmostBefore = mkOrder orderAlmostBefore;
|
|
mkAlmostAfter = mkOrder orderAlmostAfter;
|
|
mkJustAfter = mkOrder orderJustAfter;
|
|
mapOverride = priority: mapAttrs (_: mkOverride priority);
|
|
mapOptionDefaults = mapOverride overrideOptionDefault;
|
|
mapAlmostOptionDefaults = mapOverride overrideAlmostOptionDefault;
|
|
mapDefaults = mapOverride overrideDefault;
|
|
|
|
treeToModulesOutput = modules:
|
|
{
|
|
${
|
|
if modules ? __functor
|
|
then "default"
|
|
else null
|
|
} =
|
|
modules.__functor modules;
|
|
}
|
|
// builtins.removeAttrs modules ["__functor"];
|
|
in {
|
|
inherit tree nixlib inputs systems;
|
|
meta = tree.impure;
|
|
std = inputs.self.lib.Std.Std.compat;
|
|
Std = inputs.std-fl.lib;
|
|
lib = {
|
|
domain = "gensokyo.zone";
|
|
inherit treeToModulesOutput userIs
|
|
eui64 parseUrl mkWinPath mkBaseDn mkAddress6
|
|
toHexStringLower hexToInt hexCharToInt
|
|
mapListToAttrs coalesce
|
|
mkAlmostOptionDefault mkAlmostDefault mkAlmostForce mapOverride mapOptionDefaults mapAlmostOptionDefaults mapDefaults
|
|
overrideOptionDefault overrideAlmostOptionDefault overrideDefault overrideAlmostDefault overrideNone overrideAlmostForce overrideForce overrideVM
|
|
orderJustBefore orderBefore orderAlmostBefore orderNone orderAfter orderAlmostAfter orderJustAfter
|
|
mkJustBefore mkAlmostBefore mkAlmostAfter mkJustAfter;
|
|
inherit (inputs.arcexprs.lib) unmerged json;
|
|
};
|
|
gensokyo-zone = {
|
|
inherit inputs;
|
|
inherit (inputs) self;
|
|
inherit (inputs.self) overlays;
|
|
inherit (inputs.self.lib) tree meta lib systems;
|
|
};
|
|
generate = import ./generate.nix {inherit inputs tree;};
|
|
}
|