{ pkgs, lib, ... }: rec { calc = (import ((builtins.fetchTarball { url = "https://gist.github.com/duairc/5c9bb3c922e5d501a1edb9e7b3b845ba/archive/3885f7cd9ed0a746a9d675da6f265d41e9fd6704.tar.gz"; sha256 = "sha256:0s17g6jdkfnsqxwh1k9arhn4r2aa3rknpnhpkppw1sbzjix36c4b"; }) + "/net.nix" ) { inherit lib; }).lib.net; regex.ipv4 = let compRegex = "(25[0-5]|(2[0-4]|10|1?[1-9])?[0-9])"; in "(${compRegex}\\.){3}${compRegex}"; regex.cidr4 = "${regex.ipv4}/(3[0-2]|[1-2]?[0-9])"; regex.ipOrCidr4 = "(${regex.ipv4}|${regex.cidr4})"; ipv4ToInt = ip: with builtins; with lib; let octets = match ''^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$'' ip; in if octets == null then throw "Invalid IPv4 address: ${ip}" else let a = toInt (elemAt octets 0); b = toInt (elemAt octets 1); c = toInt (elemAt octets 2); d = toInt (elemAt octets 3); in if a > 255 || b > 255 || c > 255 || d > 255 then throw "Invalid IPv4 octet > 255: ${ip}" else (a * 256 * 256 * 256) + (b * 256 * 256) + (c * 256) + d; intToIpv4 = n: let a = n / (256 * 256 * 256); b = builtins.mod (n / (256 * 256)) 256; c = builtins.mod (n / 256) 256; d = builtins.mod n 256; in "${toString a}.${toString b}.${toString c}.${toString d}"; }