diff options
| author | tv <tv@krebsco.de> | 2018-12-11 22:49:14 +0100 | 
|---|---|---|
| committer | tv <tv@krebsco.de> | 2018-12-11 22:54:49 +0100 | 
| commit | a406dd55bf931d5de11280030bb8750f63b2c266 (patch) | |
| tree | a77f69ca1462bf56fb377834a71f93b47020d626 | |
| parent | 227cc9cab8b9ed6d6514b3fc48511b13803fa865 (diff) | |
lib.krebs.genipv6: use normalize-ip6-addr
| -rw-r--r-- | lib/krebs/genipv6.nix | 35 | 
1 files changed, 22 insertions, 13 deletions
| diff --git a/lib/krebs/genipv6.nix b/lib/krebs/genipv6.nix index 8e105ab..bf3ebab 100644 --- a/lib/krebs/genipv6.nix +++ b/lib/krebs/genipv6.nix @@ -3,18 +3,16 @@ with lib;  let {    body = netname: subnetname: suffixSpec: rec {      address = let -      suffix' = -        if hasEmptyGroup (parseAddress suffix) -          then suffix -          else joinAddress "::" suffix; +      suffix' = prependZeros suffixLength suffix;      in -      checkAddress addressLength (joinAddress subnetPrefix suffix'); +      normalize-ip6-addr +        (checkAddress addressLength (joinAddress subnetPrefix suffix'));      addressCIDR = "${address}/${toString addressLength}";      addressLength = 128;      inherit netname;      netCIDR = "${netAddress}/${toString netPrefixLength}"; -    netAddress = joinAddress netPrefix "::"; +    netAddress = appendZeros netPrefixLength netPrefix;      netHash = toString {        retiolum = 0;        wirelum = 1; @@ -27,22 +25,35 @@ let {      inherit subnetname;      subnetCIDR = "${subnetAddress}/${toString subnetPrefixLength}"; -    subnetAddress = joinAddress subnetPrefix "::"; -    subnetHash = simplify (hash 4 subnetname); +    subnetAddress = appendZeros subnetPrefixLength subnetPrefix; +    subnetHash = hash 4 subnetname;      subnetPrefix = joinAddress netPrefix subnetHash;      subnetPrefixLength = netPrefixLength + 16;      suffix = getAttr (typeOf suffixSpec) {        set = -        concatMapStringsSep +        concatStringsSep            ":" -          simplify -          (stringToGroupsOf 4 (hash (suffixLength / 8) suffixSpec.hostName)); +          (stringToGroupsOf 4 (hash (suffixLength / 4) suffixSpec.hostName));        string = suffixSpec;      };      suffixLength = addressLength - subnetPrefixLength;    }; +  appendZeros = n: s: let +    n' = n / 16; +    zeroCount = n' - length parsedaddr; +    parsedaddr = parseAddress s; +  in +    formatAddress (parsedaddr ++ map (const "0") (range 1 zeroCount)); + +  prependZeros = n: s: let +    n' = n / 16; +    zeroCount = n' - length parsedaddr; +    parsedaddr = parseAddress s; +  in +    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"] @@ -64,8 +75,6 @@ let {    in      filter (x: x != []) ([acc.chunk] ++ acc.chunks); -  simplify = s: head (match "0*(.+)" s); -    hash = n: s: substring 0 n (hashString "sha256" s);    dropLast = n: xs: reverseList (drop n (reverseList xs)); | 
