From 1651700609a07862d91821495b7ef38875cc89ee Mon Sep 17 00:00:00 2001 From: shats Date: Wed, 11 Feb 2026 11:45:37 +0700 Subject: [PATCH] feat(ping): implement dynamic ping target selection from UI settings or default value --- backend/routes/mikrotikConfigRoutes.js | 25 +++++++++++++++++++++-- frontend/src/EasySwitchManager.jsx | 3 +-- frontend/src/components/SettingsModal.jsx | 14 +++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/backend/routes/mikrotikConfigRoutes.js b/backend/routes/mikrotikConfigRoutes.js index 9824726..bd958f7 100644 --- a/backend/routes/mikrotikConfigRoutes.js +++ b/backend/routes/mikrotikConfigRoutes.js @@ -18,6 +18,18 @@ const { createRosClient, applyBlock } = require('../services/mikrotikApplyServic const IPSEC_PASSWORDS_KEY = 'network-config/ipsec-passwords.json'; const NETWORK_CONFIG_KEY = 'network-config.json'; +const UI_SETTINGS_KEY = 'bgp_data/rt_ui_settings.json'; + +/** Загрузить UI-настройки из S3 (для pingDomain и др.) */ +async function loadUiSettings() { + try { + const data = await readS3TextObject(UI_SETTINGS_KEY).catch(() => ({ body: '{}' })); + const parsed = JSON.parse(data?.body || '{}'); + return parsed && typeof parsed === 'object' ? parsed : {}; + } catch (_) { + return {}; + } +} /** Загрузить network-config из S3 */ async function loadNetworkConfig() { @@ -287,11 +299,11 @@ async function applyMikrotikConfig(req, res) { */ async function pingViaInterface(req, res) { try { - const { + let { serverId, gatewayIp, interfaceName, - target = 'www.gstatic.com', + target, count = 5, } = req.body || {}; @@ -299,6 +311,15 @@ async function pingViaInterface(req, res) { return sendError(res, 400, 'serverId is required', 'E_BAD_REQUEST'); } + // Цель пинга: из тела запроса, иначе из настроек интерфейса (Домен для пинга), иначе по умолчанию + if (target == null || String(target).trim() === '') { + const uiSettings = await loadUiSettings(); + const pingDomain = (uiSettings.pingDomain && String(uiSettings.pingDomain).trim()) || ''; + target = pingDomain || 'www.gstatic.com'; + } else { + target = String(target).trim(); + } + const servers = await readServersFromS3(); const server = servers.find((s) => (s.id || s.dns || s.ip) === serverId); if (!server || server.type !== 'jumphost') { diff --git a/frontend/src/EasySwitchManager.jsx b/frontend/src/EasySwitchManager.jsx index e305102..d7147f4 100644 --- a/frontend/src/EasySwitchManager.jsx +++ b/frontend/src/EasySwitchManager.jsx @@ -256,7 +256,7 @@ function EasySwitchManager() { /** * Загрузить реальные пинги для комбинаций (сервер, gateway). - * Пингуем хост www.gstatic.com через соответствующий MikroTik jumphost. + * Цель пинга берётся из настроек интерфейса («Домен для пинга») или по умолчанию. */ const prefetchPings = async (serversList, inventory) => { try { @@ -291,7 +291,6 @@ function EasySwitchManager() { .post('/mikrotik/ping', { serverId: routerId, gatewayIp: ip, - target: 'www.gstatic.com', count: 5, }) .then(({ data }) => { diff --git a/frontend/src/components/SettingsModal.jsx b/frontend/src/components/SettingsModal.jsx index b0b4bf8..8ce7715 100644 --- a/frontend/src/components/SettingsModal.jsx +++ b/frontend/src/components/SettingsModal.jsx @@ -18,6 +18,7 @@ export default function SettingsModal({ open, onClose }) { const [dohServer, setDohServer] = useState(''); const [wsUrl, setWsUrl] = useState(''); const [baseAS, setBaseAS] = useState('65001'); + const [pingDomain, setPingDomain] = useState(''); const [ptrZoneReplaceFrom, setPtrZoneReplaceFrom] = useState(''); const [ptrZoneReplaceTo, setPtrZoneReplaceTo] = useState(''); @@ -35,6 +36,7 @@ export default function SettingsModal({ open, onClose }) { setDohServer(String(data?.dohServer || '')); setWsUrl(String(data?.wsUpdateUrl || '')); setBaseAS(String(data?.baseAS || '65001')); + setPingDomain(String(data?.pingDomain || '').trim()); setPtrZoneReplaceFrom(String(data?.ptrZoneReplaceFrom || '')); setPtrZoneReplaceTo(String(data?.ptrZoneReplaceTo || '')); const e = res?.headers?.etag || res?.headers?.ETag || ''; @@ -97,6 +99,7 @@ export default function SettingsModal({ open, onClose }) { dohServer: String(dohServer || '').trim(), wsUpdateUrl: String(wsUrl || '').trim(), baseAS: String(baseAS || '65001').trim(), + pingDomain: String(pingDomain || '').trim(), ptrZoneReplaceFrom: String(ptrZoneReplaceFrom || '').trim(), ptrZoneReplaceTo: String(ptrZoneReplaceTo || '').trim(), }; @@ -198,6 +201,17 @@ export default function SettingsModal({ open, onClose }) { disabled={loading || saving} /> + +
Настройка PTR зоны