From 2ee43d0538342dbd147c02123f9b4dc4f48d2852 Mon Sep 17 00:00:00 2001 From: shats Date: Sun, 25 Jan 2026 21:21:39 +0700 Subject: [PATCH] feat(NetworkConfigManager): implement PTR zone replacement functionality, allowing dynamic DNS adjustments for improved server configuration and user experience --- frontend/src/NetworkConfigManager.jsx | 71 ++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 4bafa7c..5514324 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -146,6 +146,8 @@ const getEmptyInterface = () => ({ ipsecPasswordId: '', // ID IPSec пароля (опционально, только для IPSec) ipPoolId: '', // ID IP пула для выбора IP адресов (опционально) mtu: '', // MTU (опционально) + ptrZoneReplaceFrom: '', // Что заменить в DNS домене для PTR зоны (например, "rt.shx") + ptrZoneReplaceTo: '', // На что заменить (например, "shrt") }); const getEmptyIpPool = () => ({ @@ -1480,6 +1482,18 @@ function NetworkConfigManager() { } }; + // Функция для генерации PTR зоны с учетом замены + const generatePtrZone = (serverDns, iface) => { + if (!serverDns) return '—'; + + // Если указана замена PTR зоны, применяем её + if (iface?.ptrZoneReplaceFrom && iface?.ptrZoneReplaceTo) { + return serverDns.replace(iface.ptrZoneReplaceFrom, iface.ptrZoneReplaceTo); + } + + return serverDns; + }; + // === Получение реестра всех используемых IP адресов === const ipRegistry = useMemo(() => { const registry = []; @@ -1495,7 +1509,7 @@ function NetworkConfigManager() { interfaceName: iface.name || iface.id, server: server, // localIp привязан к serverId serverName: server?.dns || server?.ip || iface.serverId || '—', - ptrZone: server?.dns || '—' // PTR зона = доменное имя сервера + ptrZone: generatePtrZone(server?.dns, iface) // PTR зона с учетом замены }); } if (iface.remoteIp && iface.remoteIp.trim()) { @@ -1507,7 +1521,7 @@ function NetworkConfigManager() { interfaceName: iface.name || iface.id, server: server2, // remoteIp привязан к serverId2 serverName: server2?.dns || server2?.ip || iface.serverId2 || '—', - ptrZone: server2?.dns || '—' // PTR зона = доменное имя сервера + ptrZone: generatePtrZone(server2?.dns, iface) // PTR зона с учетом замены }); } }); @@ -4228,6 +4242,59 @@ function NetworkConfigManager() { ) : null; })()} + + {/* Поля для замены PTR зоны */} +
+
+
Настройка PTR зоны
+
+
+ setEditingInterface({ ...editingInterface, ptrZoneReplaceFrom: val })} + placeholder="rt.shx" + /> +
+ Часть DNS домена, которую нужно заменить (например, "rt.shx") +
+
+
+ setEditingInterface({ ...editingInterface, ptrZoneReplaceTo: val })} + placeholder="shrt" + /> +
+ На что заменить (например, "shrt"). Результат: DNS "selectel.msk.rt.shx.su" → PTR "selectel.msk.shrt.su" +
+
+ {editingInterface.serverId && editingInterface.ptrZoneReplaceFrom && editingInterface.ptrZoneReplaceTo && (() => { + const server = getServerInfo(editingInterface.serverId); + const originalDns = server?.dns || ''; + const ptrZone = generatePtrZone(originalDns, editingInterface); + return originalDns ? ( +
+
+
+
+
+ DNS: {originalDns} +
+
+ PTR зона: {ptrZone} +
+
+
+
+
+ ) : null; + })()} +
+
)}