diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2021-01-06 12:05:23 +0100 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2021-01-06 12:05:23 +0100 |
commit | b8699860653e593271e50c8ba1b73f66fcb6287c (patch) | |
tree | a7029ee71f1539d269fda241a3f345255783dcf1 /module/ri-engine/src/main/java/io/trygvis/rules/acme/IpCalc.java | |
parent | 9eac79348242b5dc33f4cccdd86beda2a4ed4746 (diff) | |
download | rules-sandbox-b8699860653e593271e50c8ba1b73f66fcb6287c.tar.gz rules-sandbox-b8699860653e593271e50c8ba1b73f66fcb6287c.tar.bz2 rules-sandbox-b8699860653e593271e50c8ba1b73f66fcb6287c.tar.xz rules-sandbox-b8699860653e593271e50c8ba1b73f66fcb6287c.zip |
Starting on splitting up into different modules.
Diffstat (limited to 'module/ri-engine/src/main/java/io/trygvis/rules/acme/IpCalc.java')
-rw-r--r-- | module/ri-engine/src/main/java/io/trygvis/rules/acme/IpCalc.java | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/module/ri-engine/src/main/java/io/trygvis/rules/acme/IpCalc.java b/module/ri-engine/src/main/java/io/trygvis/rules/acme/IpCalc.java new file mode 100644 index 0000000..5369d62 --- /dev/null +++ b/module/ri-engine/src/main/java/io/trygvis/rules/acme/IpCalc.java @@ -0,0 +1,67 @@ +package io.trygvis.rules.acme; + +import io.trygvis.rules.network.Ipv4Cidr; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class IpCalc { + private static final Pattern pattern = Pattern.compile("([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})/([0-9]{1,3})"); + + public static class FirstLast { + public final int first; + public final int last; + + public FirstLast(int first, int last) { + this.first = first; + this.last = last; + } + } + + public static Ipv4Cidr cidr(String cidr) { + var matcher = pattern.matcher(cidr); + if (!matcher.matches()) { + throw new IllegalArgumentException("Not a CIDR: " + cidr); + } + + var b1 = matcher.group(1); + var b2 = matcher.group(2); + var b3 = matcher.group(3); + var b4 = matcher.group(4); + + int network = parse(b1) << 24 | + parse(b2) << 16 | + parse(b3) << 8 | + parse(b4); + +// System.out.printf("network = %x%n", network); + + var l = matcher.group(5); + var bits = Integer.parseInt(l); + var hostBits = 32 - bits; + int size = 1 << hostBits; + + int netmask = (-1 >> hostBits) << hostBits; +// System.out.printf("netmask = %08x%n", netmask); + + int x = network & ~netmask; + + if (x != 0) { + throw new IllegalArgumentException("Not a CIDR: " + cidr); + } + + return new Ipv4Cidr(network, netmask, size, bits); + } + + private static int parse(String s) { + var i = Integer.parseInt(s); + if (i > 255) { + throw new IllegalArgumentException("Not a CIDR"); + } + + return i; + } +} |