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}
/>
+