From c1dbaa5bfc66f91414ea8fbef7b80bd507927b23 Mon Sep 17 00:00:00 2001 From: kirillius Date: Sun, 17 May 2026 13:40:33 +0300 Subject: [PATCH] WIP: auto resolver --- .../Networking/NetworkResourceBundle.java | 5 +++ .../core/Networking/NetworkingService.java | 32 +++++++++++++++++-- .../Subscription/SubscriptionService.java | 21 +++++++----- .../pf/sdn/core/Util/IPv4UtilTest.java | 21 ++++++++++++ 4 files changed, 68 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkResourceBundle.java b/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkResourceBundle.java index 7992d3b..58bf40e 100644 --- a/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkResourceBundle.java +++ b/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkResourceBundle.java @@ -34,6 +34,11 @@ public class NetworkResourceBundle { @JSONArrayProperty(type = String.class) private List domains = new ArrayList<>(); + @Getter + @Setter + @JSONProperty(required = false) + private boolean resolveDomains = false; + @Override public boolean equals(Object o) { if (!(o instanceof NetworkResourceBundle that)) return false; diff --git a/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkingService.java b/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkingService.java index b06a1d3..77a7592 100644 --- a/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkingService.java +++ b/core/src/main/java/ru/kirillius/pf/sdn/core/Networking/NetworkingService.java @@ -38,8 +38,7 @@ public class NetworkingService extends AppService { private final NetworkResourceBundle inputResources = new NetworkResourceBundle(); @Getter private final NetworkResourceBundle outputResources = new NetworkResourceBundle(); - @Getter - private final List autoResolveDomains = new ArrayList<>(); + private final Map> prefixCache = new ConcurrentHashMap<>(); private final Map domainCache = new ConcurrentHashMap<>(); @@ -84,6 +83,33 @@ public class NetworkingService extends AppService { SystemLogger.error("Failed to load domain cache file " + asCacheFile.getPath(), CTX, e); } } + + executor.execute(this::autoResolverWorker); + } + + private void autoResolverWorker() { + var current = new HashSet(); + domainCache.forEach((host, entry) -> current.addAll(entry.getAddresses().keySet())); + + resolveDomains(List.copyOf(context.getServiceManager().getService(SubscriptionService.class).getAutoResolvingDomains())); + + var resolved = new HashSet(); + domainCache.forEach((host, entry) -> resolved.addAll(entry.getAddresses().keySet())); + + if (resolved.size() != current.size()) { + rebuildInputs(); + } else { + var updated = false; + for (var subnet : resolved) { + if (!current.contains(subnet)) { + updated = true; + break; + } + } + if (updated) { + rebuildInputs(); + } + } } private void rebuildInputs() { @@ -154,7 +180,7 @@ public class NetworkingService extends AppService { } } - resolveDomains(autoResolveDomains); + resolveDomains(List.copyOf(context.getServiceManager().getService(SubscriptionService.class).getAutoResolvingDomains())); if (config.isCachingDomains()) { try (var os = new FileOutputStream(domainCacheFile)) { diff --git a/core/src/main/java/ru/kirillius/pf/sdn/core/Subscription/SubscriptionService.java b/core/src/main/java/ru/kirillius/pf/sdn/core/Subscription/SubscriptionService.java index 138bcae..a9178e8 100644 --- a/core/src/main/java/ru/kirillius/pf/sdn/core/Subscription/SubscriptionService.java +++ b/core/src/main/java/ru/kirillius/pf/sdn/core/Subscription/SubscriptionService.java @@ -8,11 +8,9 @@ import ru.kirillius.utils.logging.SystemLogger; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; /** @@ -21,14 +19,14 @@ import java.util.concurrent.atomic.AtomicReference; public class SubscriptionService extends AppService { private final ExecutorService executor = Executors.newSingleThreadExecutor(); - private final Map, SubscriptionProvider> providerCache = new ConcurrentHashMap<>(); - private final AtomicReference> updateProcess = new AtomicReference<>(); @Getter private final NetworkResourceBundle outputResources = new NetworkResourceBundle(); + @Getter + private final List autoResolvingDomains = new CopyOnWriteArrayList<>(); public SubscriptionService(Context context) { super(context); @@ -45,7 +43,6 @@ public class SubscriptionService extends AppService { @Getter private final Map availableResources = new ConcurrentHashMap<>(); - @SuppressWarnings("unchecked") private T getProvider(Class providerType) { if (!providerCache.containsKey(providerType)) { @@ -62,6 +59,9 @@ public class SubscriptionService extends AppService { return; } updateProcess.set(executor.submit(() -> { + + + var available = new HashMap(); var bundle = new NetworkResourceBundle(); @@ -90,6 +90,12 @@ public class SubscriptionService extends AppService { availableResources.putAll(available); outputResources.clear(); outputResources.add(bundle); + + available.values().forEach(b -> { + if (b.isResolveDomains()) { + autoResolvingDomains.addAll(b.getDomains()); + } + }); try { context.getEventsHandler().getSubscriptionsUpdateEvent().invoke(outputResources); } catch (Exception e) { @@ -100,7 +106,6 @@ public class SubscriptionService extends AppService { private final static String CTX = SubscriptionService.class.getSimpleName(); - /** * Shuts down the executor used for update tasks. */ diff --git a/core/src/test/java/ru/kirillius/pf/sdn/core/Util/IPv4UtilTest.java b/core/src/test/java/ru/kirillius/pf/sdn/core/Util/IPv4UtilTest.java index 5497db2..63ef41b 100644 --- a/core/src/test/java/ru/kirillius/pf/sdn/core/Util/IPv4UtilTest.java +++ b/core/src/test/java/ru/kirillius/pf/sdn/core/Util/IPv4UtilTest.java @@ -31,6 +31,27 @@ class IPv4UtilTest { + //subnets.forEach(System.out::println); + + var merged = IPv4Util.summarySubnets(subnets, 51).getResult(); + + merged.forEach(System.out::println); + + assertThat(merged).isNotNull(); + } + + @Test + void summarySubnetsShishanyaCase() { + var subnets = new ArrayList(); + + + + + + subnets.add(new IPv4Subnet("8.6.112.0/32")); + subnets.add(new IPv4Subnet("8.6.112.0/24")); + + //subnets.forEach(System.out::println); var merged = IPv4Util.summarySubnets(subnets, 51).getResult();