From 47b8620013b846feaf62fa6a7a3552df0438f8ce Mon Sep 17 00:00:00 2001 From: kirillius Date: Thu, 18 Dec 2025 13:35:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8=D0=B2=D1=8B=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=20=D0=B2=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pf/sdn/web/RPC/SubscriptionManager.java | 42 ++++++++++++++----- webui/src/pages/Subscriptions.js | 11 +++++ webui/src/pages/UnlockSite.js | 3 +- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/ru/kirillius/pf/sdn/web/RPC/SubscriptionManager.java b/app/src/main/java/ru/kirillius/pf/sdn/web/RPC/SubscriptionManager.java index 73b01d4..572091d 100644 --- a/app/src/main/java/ru/kirillius/pf/sdn/web/RPC/SubscriptionManager.java +++ b/app/src/main/java/ru/kirillius/pf/sdn/web/RPC/SubscriptionManager.java @@ -2,6 +2,7 @@ package ru.kirillius.pf.sdn.web.RPC; import org.json.JSONArray; import org.json.JSONObject; +import org.json.JSONTokener; import ru.kirillius.json.DefaultPropertySerializer; import ru.kirillius.json.JSONUtility; import ru.kirillius.json.rpc.Annotations.JRPCArgument; @@ -88,7 +89,8 @@ public class SubscriptionManager implements RPC { @JRPCArgument(name = "subnets") JSONArray subnets, @JRPCArgument(name = "addresses") JSONArray addresses, @JRPCArgument(name = "storage") String storage, - @JRPCArgument(name = "subscribe") boolean subscribe) throws IOException { + @JRPCArgument(name = "subscribe") boolean subscribe, + @JRPCArgument(name = "append") boolean append) throws IOException { var repositoryConfig = findLocalRepo(storage); var directory = new File(repositoryConfig.getSource()); if (!directory.exists()) { @@ -96,25 +98,43 @@ public class SubscriptionManager implements RPC { } var domainList = new ArrayList(); + var targetFile = new File(directory, name + ".json"); + var bundle = new NetworkResourceBundle(); - domains.forEach(d->domainList.add(d.toString())); + if (append) { + if (targetFile.exists()) { + try (var stream = new FileInputStream(targetFile)) { + var json = new JSONObject(new JSONTokener(stream)); + bundle.add( + JSONUtility.deserializeStructure(json, NetworkResourceBundle.class) + ); + } + } + } - try (var writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(directory, name + ".json"))))) { + domains.forEach(d -> domainList.add(d.toString())); + + + try (var writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(targetFile)))) { var merged = JSONUtility.deserializeCollection(subnets, IPv4Subnet.class, null).collect(Collectors.toList()); addresses.forEach(address -> { merged.add(new IPv4Subnet(address.toString(), 32)); }); + + //noinspection rawtypes @SuppressWarnings("unchecked") var asnList = (List) JSONUtility.deserializeCollection(ASN, Integer.class, (Class) DefaultPropertySerializer.class).toList(); - writer.write(JSONUtility.serializeStructure( - NetworkResourceBundle.builder() - .ASN(asnList) - .subnets(merged) - .domains(domainList) - .description(description) - .build() - ).toString(2)); + + bundle.add(NetworkResourceBundle.builder() + .ASN(asnList) + .subnets(merged) + .domains(domainList) + .description(description) + .build()); + + + writer.write(JSONUtility.serializeStructure(bundle).toString(2)); } if (subscribe) { var subscribedResources = context.getConfig().getSubscribedResources(); diff --git a/webui/src/pages/Subscriptions.js b/webui/src/pages/Subscriptions.js index aec1f9e..62f16d8 100644 --- a/webui/src/pages/Subscriptions.js +++ b/webui/src/pages/Subscriptions.js @@ -53,6 +53,12 @@ function renderSubscriptionList() { }).join(''); const html = ` +
+ +
    ${listHtml}
@@ -63,6 +69,11 @@ function renderSubscriptionList() { } function attachEventHandlers() { + $('#select-all-checkbox').on('change', function() { + const isChecked = $(this).is(':checked'); + $('.subscription-checkbox').prop('checked', isChecked); + }); + $('#save-subscriptions-btn').on('click', async function () { const $btn = $(this); const $message = $('#subscription-status-message'); diff --git a/webui/src/pages/UnlockSite.js b/webui/src/pages/UnlockSite.js index 8b38b1b..03de7e8 100644 --- a/webui/src/pages/UnlockSite.js +++ b/webui/src/pages/UnlockSite.js @@ -308,7 +308,8 @@ function handleAdd() { selectedSubnets, selectedAddresses, storage, - true + true, + false ).then(() => { setStatus('Ресурсы успешно добавлены.', 'success'); }).catch(error => {