сделал перезапуск OVPN только если изменились подсети

This commit is contained in:
kirillius 2025-10-19 11:22:53 +03:00
parent 5bcc7d9549
commit aa06678220
1 changed files with 18 additions and 10 deletions

View File

@ -8,10 +8,10 @@ import ru.kirillius.java.utils.events.EventListener;
import ru.kirillius.json.JSONProperty; import ru.kirillius.json.JSONProperty;
import ru.kirillius.json.JSONSerializable; import ru.kirillius.json.JSONSerializable;
import ru.kirillius.json.rpc.Annotations.JRPCMethod; 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.External.API.ShellExecutor;
import ru.kirillius.pf.sdn.core.AbstractComponent; import ru.kirillius.pf.sdn.core.AbstractComponent;
import ru.kirillius.pf.sdn.core.Context; 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.NetworkResourceBundle;
import ru.kirillius.pf.sdn.core.Networking.NetworkingService; import ru.kirillius.pf.sdn.core.Networking.NetworkingService;
import ru.kirillius.pf.sdn.core.Util.IPv4Util; 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 ru.kirillius.utils.logging.SystemLogger;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
@ -27,9 +30,10 @@ import java.util.regex.Pattern;
*/ */
public final class OVPN extends AbstractComponent<OVPN.OVPNConfig> { public final class OVPN extends AbstractComponent<OVPN.OVPNConfig> {
private final static String CTX = OVPN.class.getSimpleName(); private final static String CTX = OVPN.class.getSimpleName();
private final EventListener<JSONRPCServlet> rpcEvent;
private final EventListener<NetworkResourceBundle> updateEvent; private final EventListener<NetworkResourceBundle> updateEvent;
private final List<IPv4Subnet> lastSubnets = new ArrayList<>();
/** /**
* Registers the component with the JSON-RPC servlet or defers until it becomes available. * Registers the component with the JSON-RPC servlet or defers until it becomes available.
*/ */
@ -37,7 +41,16 @@ public final class OVPN extends AbstractComponent<OVPN.OVPNConfig> {
super(context); super(context);
var eventsHandler = context.getEventsHandler(); var eventsHandler = context.getEventsHandler();
if (config.restartOnUpdate) { 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 { } else {
updateEvent = null; updateEvent = null;
} }
@ -46,11 +59,8 @@ public final class OVPN extends AbstractComponent<OVPN.OVPNConfig> {
var RPC = context.getServiceManager().getService(WebService.class).getJSONRPC(); var RPC = context.getServiceManager().getService(WebService.class).getJSONRPC();
if (RPC != null) { if (RPC != null) {
RPC.addTargetInstance(OVPN.class, this); 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<OVPN.OVPNConfig> {
@JRPCMethod @JRPCMethod
@ProtectedMethod @ProtectedMethod
public String restartSystemService() { public String restartSystemService() {
SystemLogger.message("Restarting OVPN service", CTX);
try (var shell = new ShellExecutor(config.shellConfig)) { try (var shell = new ShellExecutor(config.shellConfig)) {
return shell.executeCommand(config.restartCommand.split(Pattern.quote(" "))); return shell.executeCommand(config.restartCommand.split(Pattern.quote(" ")));
} catch (IOException e) { } catch (IOException e) {
@ -90,9 +101,6 @@ public final class OVPN extends AbstractComponent<OVPN.OVPNConfig> {
@Override @Override
public void close() { public void close() {
var eventsHandler = context.getEventsHandler(); var eventsHandler = context.getEventsHandler();
if (rpcEvent != null) {
eventsHandler.getRPCInitEvent().remove(rpcEvent);
}
if (updateEvent != null) { if (updateEvent != null) {
eventsHandler.getNetworkManagerUpdateEvent().remove(updateEvent); eventsHandler.getNetworkManagerUpdateEvent().remove(updateEvent);
} }