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
Publish Fast Tabler Docker image / build-and-push-fast (push) Has been cancelled
This commit is contained in:
@@ -146,6 +146,8 @@ const getEmptyInterface = () => ({
|
|||||||
ipsecPasswordId: '', // ID IPSec пароля (опционально, только для IPSec)
|
ipsecPasswordId: '', // ID IPSec пароля (опционально, только для IPSec)
|
||||||
ipPoolId: '', // ID IP пула для выбора IP адресов (опционально)
|
ipPoolId: '', // ID IP пула для выбора IP адресов (опционально)
|
||||||
mtu: '', // MTU (опционально)
|
mtu: '', // MTU (опционально)
|
||||||
|
ptrZoneReplaceFrom: '', // Что заменить в DNS домене для PTR зоны (например, "rt.shx")
|
||||||
|
ptrZoneReplaceTo: '', // На что заменить (например, "shrt")
|
||||||
});
|
});
|
||||||
|
|
||||||
const getEmptyIpPool = () => ({
|
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 адресов ===
|
// === Получение реестра всех используемых IP адресов ===
|
||||||
const ipRegistry = useMemo(() => {
|
const ipRegistry = useMemo(() => {
|
||||||
const registry = [];
|
const registry = [];
|
||||||
@@ -1495,7 +1509,7 @@ function NetworkConfigManager() {
|
|||||||
interfaceName: iface.name || iface.id,
|
interfaceName: iface.name || iface.id,
|
||||||
server: server, // localIp привязан к serverId
|
server: server, // localIp привязан к serverId
|
||||||
serverName: server?.dns || server?.ip || iface.serverId || '—',
|
serverName: server?.dns || server?.ip || iface.serverId || '—',
|
||||||
ptrZone: server?.dns || '—' // PTR зона = доменное имя сервера
|
ptrZone: generatePtrZone(server?.dns, iface) // PTR зона с учетом замены
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (iface.remoteIp && iface.remoteIp.trim()) {
|
if (iface.remoteIp && iface.remoteIp.trim()) {
|
||||||
@@ -1507,7 +1521,7 @@ function NetworkConfigManager() {
|
|||||||
interfaceName: iface.name || iface.id,
|
interfaceName: iface.name || iface.id,
|
||||||
server: server2, // remoteIp привязан к serverId2
|
server: server2, // remoteIp привязан к serverId2
|
||||||
serverName: server2?.dns || server2?.ip || iface.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>
|
</div>
|
||||||
) : null;
|
) : 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>
|
</div>
|
||||||
)}
|
)}
|
||||||
</FormModal>
|
</FormModal>
|
||||||
|
|||||||
Reference in New Issue
Block a user