feat(ping): implement dynamic ping target selection from UI settings or default value
This commit is contained in:
@@ -18,6 +18,18 @@ const { createRosClient, applyBlock } = require('../services/mikrotikApplyServic
|
|||||||
|
|
||||||
const IPSEC_PASSWORDS_KEY = 'network-config/ipsec-passwords.json';
|
const IPSEC_PASSWORDS_KEY = 'network-config/ipsec-passwords.json';
|
||||||
const NETWORK_CONFIG_KEY = 'network-config.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 */
|
/** Загрузить network-config из S3 */
|
||||||
async function loadNetworkConfig() {
|
async function loadNetworkConfig() {
|
||||||
@@ -287,11 +299,11 @@ async function applyMikrotikConfig(req, res) {
|
|||||||
*/
|
*/
|
||||||
async function pingViaInterface(req, res) {
|
async function pingViaInterface(req, res) {
|
||||||
try {
|
try {
|
||||||
const {
|
let {
|
||||||
serverId,
|
serverId,
|
||||||
gatewayIp,
|
gatewayIp,
|
||||||
interfaceName,
|
interfaceName,
|
||||||
target = 'www.gstatic.com',
|
target,
|
||||||
count = 5,
|
count = 5,
|
||||||
} = req.body || {};
|
} = req.body || {};
|
||||||
|
|
||||||
@@ -299,6 +311,15 @@ async function pingViaInterface(req, res) {
|
|||||||
return sendError(res, 400, 'serverId is required', 'E_BAD_REQUEST');
|
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 servers = await readServersFromS3();
|
||||||
const server = servers.find((s) => (s.id || s.dns || s.ip) === serverId);
|
const server = servers.find((s) => (s.id || s.dns || s.ip) === serverId);
|
||||||
if (!server || server.type !== 'jumphost') {
|
if (!server || server.type !== 'jumphost') {
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ function EasySwitchManager() {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Загрузить реальные пинги для комбинаций (сервер, gateway).
|
* Загрузить реальные пинги для комбинаций (сервер, gateway).
|
||||||
* Пингуем хост www.gstatic.com через соответствующий MikroTik jumphost.
|
* Цель пинга берётся из настроек интерфейса («Домен для пинга») или по умолчанию.
|
||||||
*/
|
*/
|
||||||
const prefetchPings = async (serversList, inventory) => {
|
const prefetchPings = async (serversList, inventory) => {
|
||||||
try {
|
try {
|
||||||
@@ -291,7 +291,6 @@ function EasySwitchManager() {
|
|||||||
.post('/mikrotik/ping', {
|
.post('/mikrotik/ping', {
|
||||||
serverId: routerId,
|
serverId: routerId,
|
||||||
gatewayIp: ip,
|
gatewayIp: ip,
|
||||||
target: 'www.gstatic.com',
|
|
||||||
count: 5,
|
count: 5,
|
||||||
})
|
})
|
||||||
.then(({ data }) => {
|
.then(({ data }) => {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ export default function SettingsModal({ open, onClose }) {
|
|||||||
const [dohServer, setDohServer] = useState('');
|
const [dohServer, setDohServer] = useState('');
|
||||||
const [wsUrl, setWsUrl] = useState('');
|
const [wsUrl, setWsUrl] = useState('');
|
||||||
const [baseAS, setBaseAS] = useState('65001');
|
const [baseAS, setBaseAS] = useState('65001');
|
||||||
|
const [pingDomain, setPingDomain] = useState('');
|
||||||
const [ptrZoneReplaceFrom, setPtrZoneReplaceFrom] = useState('');
|
const [ptrZoneReplaceFrom, setPtrZoneReplaceFrom] = useState('');
|
||||||
const [ptrZoneReplaceTo, setPtrZoneReplaceTo] = useState('');
|
const [ptrZoneReplaceTo, setPtrZoneReplaceTo] = useState('');
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ export default function SettingsModal({ open, onClose }) {
|
|||||||
setDohServer(String(data?.dohServer || ''));
|
setDohServer(String(data?.dohServer || ''));
|
||||||
setWsUrl(String(data?.wsUpdateUrl || ''));
|
setWsUrl(String(data?.wsUpdateUrl || ''));
|
||||||
setBaseAS(String(data?.baseAS || '65001'));
|
setBaseAS(String(data?.baseAS || '65001'));
|
||||||
|
setPingDomain(String(data?.pingDomain || '').trim());
|
||||||
setPtrZoneReplaceFrom(String(data?.ptrZoneReplaceFrom || ''));
|
setPtrZoneReplaceFrom(String(data?.ptrZoneReplaceFrom || ''));
|
||||||
setPtrZoneReplaceTo(String(data?.ptrZoneReplaceTo || ''));
|
setPtrZoneReplaceTo(String(data?.ptrZoneReplaceTo || ''));
|
||||||
const e = res?.headers?.etag || res?.headers?.ETag || '';
|
const e = res?.headers?.etag || res?.headers?.ETag || '';
|
||||||
@@ -97,6 +99,7 @@ export default function SettingsModal({ open, onClose }) {
|
|||||||
dohServer: String(dohServer || '').trim(),
|
dohServer: String(dohServer || '').trim(),
|
||||||
wsUpdateUrl: String(wsUrl || '').trim(),
|
wsUpdateUrl: String(wsUrl || '').trim(),
|
||||||
baseAS: String(baseAS || '65001').trim(),
|
baseAS: String(baseAS || '65001').trim(),
|
||||||
|
pingDomain: String(pingDomain || '').trim(),
|
||||||
ptrZoneReplaceFrom: String(ptrZoneReplaceFrom || '').trim(),
|
ptrZoneReplaceFrom: String(ptrZoneReplaceFrom || '').trim(),
|
||||||
ptrZoneReplaceTo: String(ptrZoneReplaceTo || '').trim(),
|
ptrZoneReplaceTo: String(ptrZoneReplaceTo || '').trim(),
|
||||||
};
|
};
|
||||||
@@ -198,6 +201,17 @@ export default function SettingsModal({ open, onClose }) {
|
|||||||
disabled={loading || saving}
|
disabled={loading || saving}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
label="Домен для пинга"
|
||||||
|
name="pingDomain"
|
||||||
|
type="text"
|
||||||
|
value={pingDomain}
|
||||||
|
onChange={setPingDomain}
|
||||||
|
placeholder="8.8.8.8 или ya.ru"
|
||||||
|
helpText="Домен или IP для проверки пинга через MikroTik (например, 8.8.8.8, ya.ru). Если не задан, используется значение по умолчанию."
|
||||||
|
disabled={loading || saving}
|
||||||
|
/>
|
||||||
|
|
||||||
<div className="mt-4 pt-3 border-top">
|
<div className="mt-4 pt-3 border-top">
|
||||||
<h6 className="mb-3">Настройка PTR зоны</h6>
|
<h6 className="mb-3">Настройка PTR зоны</h6>
|
||||||
<div className="row g-3">
|
<div className="row g-3">
|
||||||
|
|||||||
Reference in New Issue
Block a user