From 474e3e2e4513a5d2df89789885725b176e7ec532 Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Tue, 11 Dec 2018 23:21:42 +0100
Subject: [PATCH] lib: import generally useful stuff from genipv6

---
 lib/default.nix       | 27 +++++++++++++++++++++++++++
 lib/krebs/genipv6.nix | 32 ++++----------------------------
 2 files changed, 31 insertions(+), 28 deletions(-)

diff --git a/lib/default.nix b/lib/default.nix
index e352c7be9..64b2d48ab 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -112,6 +112,33 @@ let
             (if test ".*::.*" a
               then 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
 
diff --git a/lib/krebs/genipv6.nix b/lib/krebs/genipv6.nix
index bf3ebab38..af1df6d0e 100644
--- a/lib/krebs/genipv6.nix
+++ b/lib/krebs/genipv6.nix
@@ -26,7 +26,7 @@ let {
     inherit subnetname;
     subnetCIDR = "${subnetAddress}/${toString subnetPrefixLength}";
     subnetAddress = appendZeros subnetPrefixLength subnetPrefix;
-    subnetHash = hash 4 subnetname;
+    subnetHash = hashToLength 4 subnetname;
     subnetPrefix = joinAddress netPrefix subnetHash;
     subnetPrefixLength = netPrefixLength + 16;
 
@@ -34,7 +34,9 @@ let {
       set =
         concatStringsSep
           ":"
-          (stringToGroupsOf 4 (hash (suffixLength / 4) suffixSpec.hostName));
+          (stringToGroupsOf
+            4
+            (hashToLength (suffixLength / 4) suffixSpec.hostName));
       string = suffixSpec;
     };
     suffixLength = addressLength - subnetPrefixLength;
@@ -54,32 +56,6 @@ let {
   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"]
-  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 == ["" ""];
   hasEmptySuffix = xs: takeLast 2 xs == ["" ""];
   hasEmptyInfix = xs: any (x: x == "") (trimEmpty 2 xs);