From aa066782202f28b3658ecc31ad0e61341067fd09 Mon Sep 17 00:00:00 2001 From: kirillius Date: Sun, 19 Oct 2025 11:22:53 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20OVPN?= =?UTF-8?q?=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B5=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pf/sdn/External/API/Components/OVPN.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/ru/kirillius/pf/sdn/External/API/Components/OVPN.java b/app/src/main/java/ru/kirillius/pf/sdn/External/API/Components/OVPN.java index 5213832..dc98426 100644 --- a/app/src/main/java/ru/kirillius/pf/sdn/External/API/Components/OVPN.java +++ b/app/src/main/java/ru/kirillius/pf/sdn/External/API/Components/OVPN.java @@ -8,10 +8,10 @@ import ru.kirillius.java.utils.events.EventListener; import ru.kirillius.json.JSONProperty; import ru.kirillius.json.JSONSerializable; import ru.kirillius.json.rpc.Annotations.JRPCMethod; -import ru.kirillius.json.rpc.Servlet.JSONRPCServlet; import ru.kirillius.pf.sdn.External.API.ShellExecutor; import ru.kirillius.pf.sdn.core.AbstractComponent; import ru.kirillius.pf.sdn.core.Context; +import ru.kirillius.pf.sdn.core.Networking.IPv4Subnet; import ru.kirillius.pf.sdn.core.Networking.NetworkResourceBundle; import ru.kirillius.pf.sdn.core.Networking.NetworkingService; import ru.kirillius.pf.sdn.core.Util.IPv4Util; @@ -20,6 +20,9 @@ import ru.kirillius.pf.sdn.web.WebService; import ru.kirillius.utils.logging.SystemLogger; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; import java.util.regex.Pattern; /** @@ -27,9 +30,10 @@ import java.util.regex.Pattern; */ public final class OVPN extends AbstractComponent { private final static String CTX = OVPN.class.getSimpleName(); - private final EventListener rpcEvent; private final EventListener updateEvent; + private final List lastSubnets = new ArrayList<>(); + /** * Registers the component with the JSON-RPC servlet or defers until it becomes available. */ @@ -37,7 +41,16 @@ public final class OVPN extends AbstractComponent { super(context); var eventsHandler = context.getEventsHandler(); if (config.restartOnUpdate) { - updateEvent = eventsHandler.getNetworkManagerUpdateEvent().add(bundle -> restartSystemService()); + updateEvent = eventsHandler.getNetworkManagerUpdateEvent().add(bundle -> { + var subnets = new HashSet<>(bundle.getSubnets()); + synchronized (lastSubnets) { + if (lastSubnets.size() != subnets.size() || !subnets.containsAll(lastSubnets)) { + restartSystemService(); + lastSubnets.clear(); + lastSubnets.addAll(subnets); + } + } + }); } else { updateEvent = null; } @@ -46,11 +59,8 @@ public final class OVPN extends AbstractComponent { var RPC = context.getServiceManager().getService(WebService.class).getJSONRPC(); if (RPC != null) { RPC.addTargetInstance(OVPN.class, this); - rpcEvent = null; - return; + } - rpcEvent = eventsHandler.getRPCInitEvent() - .add(servlet -> servlet.addTargetInstance(OVPN.class, OVPN.this)); //TODO поисследовать. Возможно событие уже не нужно } /** @@ -59,6 +69,7 @@ public final class OVPN extends AbstractComponent { @JRPCMethod @ProtectedMethod public String restartSystemService() { + SystemLogger.message("Restarting OVPN service", CTX); try (var shell = new ShellExecutor(config.shellConfig)) { return shell.executeCommand(config.restartCommand.split(Pattern.quote(" "))); } catch (IOException e) { @@ -90,9 +101,6 @@ public final class OVPN extends AbstractComponent { @Override public void close() { var eventsHandler = context.getEventsHandler(); - if (rpcEvent != null) { - eventsHandler.getRPCInitEvent().remove(rpcEvent); - } if (updateEvent != null) { eventsHandler.getNetworkManagerUpdateEvent().remove(updateEvent); }