lib: import generally useful stuff from genipv6
This commit is contained in:
parent
e55b540928
commit
474e3e2e45
@ -112,6 +112,33 @@ let
|
|||||||
(if test ".*::.*" a
|
(if test ".*::.*" a
|
||||||
then a
|
then a
|
||||||
else group-zeros (drop-leading-zeros a));
|
else group-zeros (drop-leading-zeros a));
|
||||||
|
|
||||||
|
hashToLength = n: s: substring 0 n (hashString "sha256" s);
|
||||||
|
|
||||||
|
dropLast = n: xs: reverseList (drop n (reverseList xs));
|
||||||
|
takeLast = n: xs: reverseList (take n (reverseList xs));
|
||||||
|
|
||||||
|
# Split string into list of chunks where each chunk is at most n chars long.
|
||||||
|
# The leftmost chunk might shorter.
|
||||||
|
# Example: stringToGroupsOf "123456" -> ["12" "3456"]
|
||||||
|
stringToGroupsOf = n: s: let
|
||||||
|
acc =
|
||||||
|
foldl'
|
||||||
|
(acc: c: if stringLength acc.chunk < n then {
|
||||||
|
chunk = acc.chunk + c;
|
||||||
|
chunks = acc.chunks;
|
||||||
|
} else {
|
||||||
|
chunk = c;
|
||||||
|
chunks = acc.chunks ++ [acc.chunk];
|
||||||
|
})
|
||||||
|
{
|
||||||
|
chunk = "";
|
||||||
|
chunks = [];
|
||||||
|
}
|
||||||
|
(stringToCharacters s);
|
||||||
|
in
|
||||||
|
filter (x: x != []) ([acc.chunk] ++ acc.chunks);
|
||||||
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ let {
|
|||||||
inherit subnetname;
|
inherit subnetname;
|
||||||
subnetCIDR = "${subnetAddress}/${toString subnetPrefixLength}";
|
subnetCIDR = "${subnetAddress}/${toString subnetPrefixLength}";
|
||||||
subnetAddress = appendZeros subnetPrefixLength subnetPrefix;
|
subnetAddress = appendZeros subnetPrefixLength subnetPrefix;
|
||||||
subnetHash = hash 4 subnetname;
|
subnetHash = hashToLength 4 subnetname;
|
||||||
subnetPrefix = joinAddress netPrefix subnetHash;
|
subnetPrefix = joinAddress netPrefix subnetHash;
|
||||||
subnetPrefixLength = netPrefixLength + 16;
|
subnetPrefixLength = netPrefixLength + 16;
|
||||||
|
|
||||||
@ -34,7 +34,9 @@ let {
|
|||||||
set =
|
set =
|
||||||
concatStringsSep
|
concatStringsSep
|
||||||
":"
|
":"
|
||||||
(stringToGroupsOf 4 (hash (suffixLength / 4) suffixSpec.hostName));
|
(stringToGroupsOf
|
||||||
|
4
|
||||||
|
(hashToLength (suffixLength / 4) suffixSpec.hostName));
|
||||||
string = suffixSpec;
|
string = suffixSpec;
|
||||||
};
|
};
|
||||||
suffixLength = addressLength - subnetPrefixLength;
|
suffixLength = addressLength - subnetPrefixLength;
|
||||||
@ -54,32 +56,6 @@ let {
|
|||||||
in
|
in
|
||||||
formatAddress (map (const "0") (range 1 zeroCount) ++ parsedaddr);
|
formatAddress (map (const "0") (range 1 zeroCount) ++ parsedaddr);
|
||||||
|
|
||||||
# Split string into list of chunks where each chunk is at most n chars long.
|
|
||||||
# The leftmost chunk might shorter.
|
|
||||||
# Example: stringToGroupsOf "123456" -> ["12" "3456"]
|
|
||||||
stringToGroupsOf = n: s: let
|
|
||||||
acc =
|
|
||||||
foldl'
|
|
||||||
(acc: c: if stringLength acc.chunk < n then {
|
|
||||||
chunk = acc.chunk + c;
|
|
||||||
chunks = acc.chunks;
|
|
||||||
} else {
|
|
||||||
chunk = c;
|
|
||||||
chunks = acc.chunks ++ [acc.chunk];
|
|
||||||
})
|
|
||||||
{
|
|
||||||
chunk = "";
|
|
||||||
chunks = [];
|
|
||||||
}
|
|
||||||
(stringToCharacters s);
|
|
||||||
in
|
|
||||||
filter (x: x != []) ([acc.chunk] ++ acc.chunks);
|
|
||||||
|
|
||||||
hash = n: s: substring 0 n (hashString "sha256" s);
|
|
||||||
|
|
||||||
dropLast = n: xs: reverseList (drop n (reverseList xs));
|
|
||||||
takeLast = n: xs: reverseList (take n (reverseList xs));
|
|
||||||
|
|
||||||
hasEmptyPrefix = xs: take 2 xs == ["" ""];
|
hasEmptyPrefix = xs: take 2 xs == ["" ""];
|
||||||
hasEmptySuffix = xs: takeLast 2 xs == ["" ""];
|
hasEmptySuffix = xs: takeLast 2 xs == ["" ""];
|
||||||
hasEmptyInfix = xs: any (x: x == "") (trimEmpty 2 xs);
|
hasEmptyInfix = xs: any (x: x == "") (trimEmpty 2 xs);
|
||||||
|
Loading…
Reference in New Issue
Block a user