feat(NetworkConfigManager): implement PTR zone replacement functionality, allowing dynamic DNS adjustments for improved server configuration and user experience
Publish Fast Tabler Docker image / build-and-push-fast (push) Has been cancelled

This commit is contained in:
2026-01-25 21:21:39 +07:00
parent c7ebe0943b
commit 2ee43d0538
+69 -2
View File
@@ -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() {
</div>
) : null;
})()}
{/* Поля для замены PTR зоны */}
<div className="col-12">
<hr />
<h6 className="mb-3">Настройка PTR зоны</h6>
<div className="row g-3">
<div className="col-md-6">
<FormField
label="Заменить в DNS домене"
name="ptrZoneReplaceFrom"
value={editingInterface.ptrZoneReplaceFrom || ''}
onChange={(val) => setEditingInterface({ ...editingInterface, ptrZoneReplaceFrom: val })}
placeholder="rt.shx"
/>
<div className="form-text">
Часть DNS домена, которую нужно заменить (например, "rt.shx")
</div>
</div>
<div className="col-md-6">
<FormField
label="Заменить на"
name="ptrZoneReplaceTo"
value={editingInterface.ptrZoneReplaceTo || ''}
onChange={(val) => setEditingInterface({ ...editingInterface, ptrZoneReplaceTo: val })}
placeholder="shrt"
/>
<div className="form-text">
На что заменить (например, "shrt"). Результат: DNS "selectel.msk.rt.shx.su" PTR "selectel.msk.shrt.su"
</div>
</div>
{editingInterface.serverId && editingInterface.ptrZoneReplaceFrom && editingInterface.ptrZoneReplaceTo && (() => {
const server = getServerInfo(editingInterface.serverId);
const originalDns = server?.dns || '';
const ptrZone = generatePtrZone(originalDns, editingInterface);
return originalDns ? (
<div className="col-12">
<div className="card card-sm border-info">
<div className="card-body p-2">
<div className="small">
<div className="mb-1">
<strong>DNS:</strong> <code>{originalDns}</code>
</div>
<div>
<strong>PTR зона:</strong> <code className="text-info">{ptrZone}</code>
</div>
</div>
</div>
</div>
</div>
) : null;
})()}
</div>
</div>
</div>
)}
</FormModal>