diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 3619f0a..dc46ccc 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -138,6 +138,8 @@ function NetworkConfigManager() { const [templateServer2, setTemplateServer2] = useState(''); const [templateType, setTemplateType] = useState('GRE'); const [templateNamePrefix, setTemplateNamePrefix] = useState(''); + const [templateName1, setTemplateName1] = useState(''); // Опциональное имя для сервера 1 + const [templateName2, setTemplateName2] = useState(''); // Опциональное имя для сервера 2 // === MikroTik Code Generation === const [mikrotikCodeModalOpen, setMikrotikCodeModalOpen] = useState(false); @@ -441,12 +443,44 @@ function NetworkConfigManager() { }; // === Генерация имени интерфейса на основе серверов === - const generateInterfaceName = (server1, server2, type, prefix = '') => { - const server1Name = server1?.dns?.split('.')[0] || server1?.ip?.split('.').join('-') || 'server1'; - const server2Name = server2?.dns?.split('.')[0] || server2?.ip?.split('.').join('-') || 'server2'; - const typeLower = type.toLowerCase(); + // Для сервера 1: берем часть из DNS сервера 2 (например, msk) и имя хоста сервера 2 (ihor) + // Для сервера 2: берем часть из DNS сервера 1 (например, swe) и имя хоста сервера 1 (hiphost) + const generateInterfaceName = (currentServer, otherServer, type, prefix = '') => { + // Парсим DNS имена + const parseDnsParts = (dns) => { + if (!dns) return null; + const parts = dns.split('.'); + if (parts.length >= 2) { + return { + hostname: parts[0], // первая часть (имя хоста) + location: parts[1] // вторая часть (локация, например msk, swe) + }; + } + return null; + }; + + const currentParts = parseDnsParts(currentServer?.dns); + const otherParts = parseDnsParts(otherServer?.dns); + + let name; + + if (currentParts && otherParts) { + // Используем локацию из другого сервера и имя хоста из другого сервера + // Например: для сервера 1 (hiphost.swe.shx.su) с сервером 2 (ihor.msk.rt.shx.su) + // Имя на сервере 1: msk-ihor + name = `${otherParts.location}-${otherParts.hostname}`; + } else if (currentServer?.dns) { + // Fallback: используем первую часть DNS + name = currentServer.dns.split('.')[0]; + } else if (currentServer?.ip) { + // Fallback: используем IP + name = currentServer.ip.split('.').join('-'); + } else { + name = 'server'; + } + const prefixPart = prefix ? `${prefix}-` : ''; - return `${prefixPart}${typeLower}-${server1Name}-${server2Name}`; + return `${prefixPart}${name}`; }; // === Создание интерфейса из шаблона === @@ -469,9 +503,9 @@ function NetworkConfigManager() { return; } - // Генерируем имена интерфейсов - const name1 = generateInterfaceName(server1, server2, templateType, templateNamePrefix); - const name2 = generateInterfaceName(server2, server1, templateType, templateNamePrefix); + // Генерируем имена интерфейсов (используем опциональные имена если указаны) + const name1 = templateName1.trim() || generateInterfaceName(server1, server2, templateType, templateNamePrefix); + const name2 = templateName2.trim() || generateInterfaceName(server2, server1, templateType, templateNamePrefix); // Генерируем IP адреса const localIp = generateFreePrivateIp(null, false, null); @@ -518,6 +552,8 @@ function NetworkConfigManager() { setTemplateServer2(''); setTemplateType('GRE'); setTemplateNamePrefix(''); + setTemplateName1(''); + setTemplateName2(''); }; // === CRUD для Interfaces === @@ -2749,6 +2785,8 @@ function NetworkConfigManager() { setTemplateServer2(''); setTemplateType('GRE'); setTemplateNamePrefix(''); + setTemplateName1(''); + setTemplateName2(''); }} onSubmit={handleCreateInterfaceFromTemplate} title="Создать интерфейс из шаблона" @@ -2819,38 +2857,70 @@ function NetworkConfigManager() { const server2 = getServerInfo(templateServer2); if (!server1 || !server2) return null; - const previewName1 = generateInterfaceName(server1, server2, templateType, templateNamePrefix); - const previewName2 = generateInterfaceName(server2, server1, templateType, templateNamePrefix); + const autoName1 = generateInterfaceName(server1, server2, templateType, templateNamePrefix); + const autoName2 = generateInterfaceName(server2, server1, templateType, templateNamePrefix); + const previewName1 = templateName1.trim() || autoName1; + const previewName2 = templateName2.trim() || autoName2; const previewLocalIp = generateFreePrivateIp(null, false, null); const previewRemoteIp = previewLocalIp ? generateFreePrivateIp(null, true, previewLocalIp) : null; return ( -
{previewName1}{previewLocalIp || '—'}{previewName2}{previewRemoteIp || '—'}{previewName1}{previewLocalIp || '—'}{previewName2}{previewRemoteIp || '—'}