summaryrefslogtreecommitdiff
path: root/module/ri-engine/src/main/java/io/trygvis
diff options
context:
space:
mode:
Diffstat (limited to 'module/ri-engine/src/main/java/io/trygvis')
-rw-r--r--module/ri-engine/src/main/java/io/trygvis/rules/engine/DbIo.java8
-rw-r--r--module/ri-engine/src/main/java/io/trygvis/rules/machine/Machine.java8
-rw-r--r--module/ri-engine/src/main/java/io/trygvis/rules/network/IpCalc.java45
-rw-r--r--module/ri-engine/src/main/java/io/trygvis/rules/network/Ipv4Cidr.java114
4 files changed, 121 insertions, 54 deletions
diff --git a/module/ri-engine/src/main/java/io/trygvis/rules/engine/DbIo.java b/module/ri-engine/src/main/java/io/trygvis/rules/engine/DbIo.java
index 7f946d9..3173109 100644
--- a/module/ri-engine/src/main/java/io/trygvis/rules/engine/DbIo.java
+++ b/module/ri-engine/src/main/java/io/trygvis/rules/engine/DbIo.java
@@ -2,6 +2,7 @@ package io.trygvis.rules.engine;
import ch.qos.logback.core.util.FileUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
@@ -12,6 +13,7 @@ import org.kie.api.runtime.rule.FactHandle;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.function.Function;
@@ -24,6 +26,7 @@ public class DbIo {
factory.enable(YAMLGenerator.Feature.USE_NATIVE_TYPE_ID);
factory.enable(YAMLGenerator.Feature.USE_NATIVE_OBJECT_ID);
mapper = new ObjectMapper(factory);
+ mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
var typeFactory = TypeFactory.defaultInstance()
.withClassLoader(new AcmeClassLoader(kieBase));
mapper.setTypeFactory(typeFactory);
@@ -40,8 +43,11 @@ public class DbIo {
try {
var type = mapper.getTypeFactory().findClass(object.type);
var x = mapper.treeToValue(object.data, type);
+ if (x == null) {
+ x = type.getDeclaredConstructor().newInstance();
+ }
items.add(x);
- } catch (ClassNotFoundException e) {
+ } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
// ignore
}
}
diff --git a/module/ri-engine/src/main/java/io/trygvis/rules/machine/Machine.java b/module/ri-engine/src/main/java/io/trygvis/rules/machine/Machine.java
index cc3f2ed..52721e1 100644
--- a/module/ri-engine/src/main/java/io/trygvis/rules/machine/Machine.java
+++ b/module/ri-engine/src/main/java/io/trygvis/rules/machine/Machine.java
@@ -10,4 +10,12 @@ public class Machine {
public Machine(String name) {
this.name = name;
}
+
+ public String getName() {
+ return name;
+ }
+
+ public String getFqdn() {
+ return fqdn;
+ }
}
diff --git a/module/ri-engine/src/main/java/io/trygvis/rules/network/IpCalc.java b/module/ri-engine/src/main/java/io/trygvis/rules/network/IpCalc.java
index e40e169..7ec344c 100644
--- a/module/ri-engine/src/main/java/io/trygvis/rules/network/IpCalc.java
+++ b/module/ri-engine/src/main/java/io/trygvis/rules/network/IpCalc.java
@@ -3,49 +3,4 @@ package io.trygvis.rules.network;
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 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;
- }
}
diff --git a/module/ri-engine/src/main/java/io/trygvis/rules/network/Ipv4Cidr.java b/module/ri-engine/src/main/java/io/trygvis/rules/network/Ipv4Cidr.java
index e69cd02..8e812ef 100644
--- a/module/ri-engine/src/main/java/io/trygvis/rules/network/Ipv4Cidr.java
+++ b/module/ri-engine/src/main/java/io/trygvis/rules/network/Ipv4Cidr.java
@@ -4,22 +4,35 @@ import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.checkerframework.checker.nullness.compatqual.NonNullType;
+import javax.annotation.Nonnull;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Pattern;
@JsonSerialize(using = Ipv4Cidr.Serializer.class)
-public class Ipv4Cidr {
+public class Ipv4Cidr implements Comparable<Ipv4Cidr> {
public final int network;
- public final int netmask;
- public final int size;
public final int bits;
- public Ipv4Cidr(int network, int netmask, int size, int bits) {
+ public Ipv4Cidr(int network, int bits) {
+ if (bits < 0 || bits > 32) {
+ throw new IllegalArgumentException("bits must be [0, 32]");
+ }
+
+ int hostBits = 32 - bits;
+ int netmask = (-1 >> hostBits) << hostBits;
+
+ int x = network & ~netmask;
+
+ if (x != 0) {
+ throw new IllegalArgumentException("The host part of the address must be 0.");
+ }
+
this.network = network;
- this.netmask = netmask;
- this.size = size;
this.bits = bits;
}
@@ -33,7 +46,29 @@ public class Ipv4Cidr {
bits);
}
- public Collection<Ipv4Address> addresses() {
+ private String formatIpv4(int address) {
+ return "%d.%d.%d.%d".formatted(address >> 24 & 0xff, address >> 16 & 0xff, address >> 8 & 0xff, address & 0xff);
+ }
+
+ public List<Ipv4Cidr> partition(int bits) {
+ if (bits <= 0 || bits <= this.bits || bits > 32) {
+ throw new IllegalArgumentException("Invalid new network size");
+ }
+
+ var list = new ArrayList<Ipv4Cidr>();
+
+ int count = 1 << (bits - this.bits);
+ for (int i = 0; i < count; i++) {
+ var network = this.network | (i << (32 - bits));
+
+ list.add(new Ipv4Cidr(network, bits));
+ }
+
+ return list;
+ }
+
+ public List<Ipv4Address> addresses() {
+ int size = 1 << 32 - bits;
var end = network + size;
var addresses = new ArrayList<Ipv4Address>(size);
for (int address = network; address < end; address++) {
@@ -43,6 +78,69 @@ public class Ipv4Cidr {
return addresses;
}
+ @Override
+ public int compareTo(Ipv4Cidr o) {
+ if (this == o) {
+ return 0;
+ }
+
+ var ret = network - o.network;
+ if (ret == 0) {
+ return ret;
+ }
+
+ return bits - o.bits;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Ipv4Cidr ipv4Cidr = (Ipv4Cidr) o;
+ return network == ipv4Cidr.network && bits == ipv4Cidr.bits;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(network, bits);
+ }
+
+ 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 Ipv4Cidr parseCidr(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);
+// System.out.printf("netmask = %08x%n", netmask);
+
+ return new Ipv4Cidr(network, bits);
+ }
+
+ private static int parse(String s) {
+ var i = Integer.parseInt(s);
+ if (i > 255) {
+ throw new IllegalArgumentException("Not a CIDR");
+ }
+
+ return i;
+ }
+
public static class Serializer extends JsonSerializer<Ipv4Cidr> {
@Override
public void serialize(Ipv4Cidr value, JsonGenerator gen, SerializerProvider serializers) throws IOException {