feat(NetworkConfigManager): add IP normalization function to enhance gateway IP generation, ensuring correct handling of full and partial IP inputs
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m44s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m44s
This commit is contained in:
@@ -543,6 +543,19 @@ function NetworkConfigManager() {
|
|||||||
setGatewayTemplateModalOpen(true);
|
setGatewayTemplateModalOpen(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Нормализация базового IP: если введен полный IP (4 октета), берем только первые 3 октета
|
||||||
|
const normalizeBaseIp = (baseIp) => {
|
||||||
|
if (!baseIp || !baseIp.trim()) return '';
|
||||||
|
const trimmed = baseIp.trim();
|
||||||
|
const parts = trimmed.split('.');
|
||||||
|
// Если 4 октета, возвращаем первые 3
|
||||||
|
if (parts.length === 4) {
|
||||||
|
return parts.slice(0, 3).join('.');
|
||||||
|
}
|
||||||
|
// Если 3 октета или меньше, возвращаем как есть
|
||||||
|
return trimmed;
|
||||||
|
};
|
||||||
|
|
||||||
const handleSelectTemplate = (template) => {
|
const handleSelectTemplate = (template) => {
|
||||||
setSelectedTemplate(template);
|
setSelectedTemplate(template);
|
||||||
// Инициализируем gateways из шаблона
|
// Инициализируем gateways из шаблона
|
||||||
@@ -557,8 +570,11 @@ function NetworkConfigManager() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Для рекурсивных gateways генерируем из базового IP
|
// Для рекурсивных gateways генерируем из базового IP
|
||||||
else if (gw.type === 'recursive' && templateBaseIp && templateBaseIp.trim().split('.').length >= 3 && gw.ipTemplate) {
|
else if (gw.type === 'recursive' && templateBaseIp && gw.ipTemplate) {
|
||||||
ip = gw.ipTemplate.replace('{baseIp}', templateBaseIp.trim());
|
const normalizedBaseIp = normalizeBaseIp(templateBaseIp);
|
||||||
|
if (normalizedBaseIp && normalizedBaseIp.split('.').length >= 3) {
|
||||||
|
ip = gw.ipTemplate.replace('{baseIp}', normalizedBaseIp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -587,16 +603,19 @@ function NetworkConfigManager() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Для рекурсивных gateways генерируем из базового IP
|
// Для рекурсивных gateways генерируем из базового IP
|
||||||
else if (gw.type === 'recursive' && templateBaseIp && templateBaseIp.trim().split('.').length >= 3 && originalTemplate && originalTemplate.ipTemplate) {
|
else if (gw.type === 'recursive' && templateBaseIp && originalTemplate && originalTemplate.ipTemplate) {
|
||||||
const templateIp = originalTemplate.ipTemplate.replace('{baseIp}', templateBaseIp.trim());
|
const normalizedBaseIp = normalizeBaseIp(templateBaseIp);
|
||||||
// Обновляем IP только если он соответствует шаблону (последний октет совпадает) или пустой
|
if (normalizedBaseIp && normalizedBaseIp.split('.').length >= 3) {
|
||||||
const currentIpParts = gw.ip ? gw.ip.split('.') : [];
|
const templateIp = originalTemplate.ipTemplate.replace('{baseIp}', normalizedBaseIp);
|
||||||
const templateIpParts = templateIp.split('.');
|
// Обновляем IP только если он соответствует шаблону (последний октет совпадает) или пустой
|
||||||
|
const currentIpParts = gw.ip ? gw.ip.split('.') : [];
|
||||||
// Если IP пустой или последний октет совпадает с шаблоном, обновляем
|
const templateIpParts = templateIp.split('.');
|
||||||
if (!gw.ip || (currentIpParts.length === 4 && templateIpParts.length === 4 &&
|
|
||||||
currentIpParts[3] === templateIpParts[3])) {
|
// Если IP пустой или последний октет совпадает с шаблоном, обновляем
|
||||||
return { ...gw, ip: templateIp };
|
if (!gw.ip || (currentIpParts.length === 4 && templateIpParts.length === 4 &&
|
||||||
|
currentIpParts[3] === templateIpParts[3])) {
|
||||||
|
return { ...gw, ip: templateIp };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return gw;
|
return gw;
|
||||||
@@ -626,8 +645,9 @@ function NetworkConfigManager() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Генерируем IP адреса из шаблонов
|
// Нормализуем базовый IP (берем первые 3 октета, если введен полный IP)
|
||||||
const baseIpParts = templateBaseIp.trim().split('.');
|
const normalizedBaseIp = normalizeBaseIp(templateBaseIp);
|
||||||
|
const baseIpParts = normalizedBaseIp.split('.');
|
||||||
if (baseIpParts.length < 3) {
|
if (baseIpParts.length < 3) {
|
||||||
notify.error('Базовый IP должен содержать минимум 3 октета (например, 10.9.9)');
|
notify.error('Базовый IP должен содержать минимум 3 октета (например, 10.9.9)');
|
||||||
return;
|
return;
|
||||||
@@ -651,7 +671,10 @@ function NetworkConfigManager() {
|
|||||||
}
|
}
|
||||||
// Для рекурсивных gateways генерируем из базового IP
|
// Для рекурсивных gateways генерируем из базового IP
|
||||||
else if (gwTemplate.type === 'recursive' && !ip && selectedTemplate.gateways[index]?.ipTemplate) {
|
else if (gwTemplate.type === 'recursive' && !ip && selectedTemplate.gateways[index]?.ipTemplate) {
|
||||||
ip = selectedTemplate.gateways[index].ipTemplate.replace('{baseIp}', templateBaseIp.trim());
|
const normalizedBaseIp = normalizeBaseIp(templateBaseIp);
|
||||||
|
if (normalizedBaseIp && normalizedBaseIp.split('.').length >= 3) {
|
||||||
|
ip = selectedTemplate.gateways[index].ipTemplate.replace('{baseIp}', normalizedBaseIp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Если IP все еще пустой, пропускаем
|
// Если IP все еще пустой, пропускаем
|
||||||
@@ -5109,8 +5132,11 @@ function NetworkConfigManager() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Для рекурсивных gateways генерируем из базового IP
|
// Для рекурсивных gateways генерируем из базового IP
|
||||||
if (gw.type === 'recursive' && templateBaseIp && templateBaseIp.trim().split('.').length >= 3 && gw.ipTemplate) {
|
if (gw.type === 'recursive' && templateBaseIp && gw.ipTemplate) {
|
||||||
return gw.ipTemplate.replace('{baseIp}', templateBaseIp.trim());
|
const normalizedBaseIp = normalizeBaseIp(templateBaseIp);
|
||||||
|
if (normalizedBaseIp && normalizedBaseIp.split('.').length >= 3) {
|
||||||
|
return gw.ipTemplate.replace('{baseIp}', normalizedBaseIp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return '—';
|
return '—';
|
||||||
});
|
});
|
||||||
@@ -5189,10 +5215,10 @@ function NetworkConfigManager() {
|
|||||||
className="form-control"
|
className="form-control"
|
||||||
value={templateBaseIp}
|
value={templateBaseIp}
|
||||||
onChange={(e) => setTemplateBaseIp(e.target.value)}
|
onChange={(e) => setTemplateBaseIp(e.target.value)}
|
||||||
placeholder="10.9.9 или 45.8.248 (минимум 3 октета)"
|
placeholder="10.9.9 или 10.9.9.1 (минимум 3 октета, полный IP будет нормализован)"
|
||||||
/>
|
/>
|
||||||
<div className="form-text">
|
<div className="form-text">
|
||||||
Базовый IP для генерации адресов рекурсивных gateways. Например, для "10.9.9" будут созданы IP: 10.9.9.1, 10.9.9.2, 10.9.9.3 и т.д. Прямые gateways будут использовать IP адрес выбранного сервера.
|
Базовый IP для генерации адресов рекурсивных gateways. Можно ввести 3 октета (например, "10.9.9") или полный IP (например, "10.9.9.1") - система автоматически возьмет первые 3 октета. Для "10.9.9" будут созданы IP: 10.9.9.1, 10.9.9.2, 10.9.9.3 и т.д. Прямые gateways будут использовать IP адрес выбранного сервера.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -5245,7 +5271,7 @@ function NetworkConfigManager() {
|
|||||||
placeholder={
|
placeholder={
|
||||||
gw.type === 'direct' && templateServerId
|
gw.type === 'direct' && templateServerId
|
||||||
? (getServerInfo(templateServerId)?.ip || 'IP сервера')
|
? (getServerInfo(templateServerId)?.ip || 'IP сервера')
|
||||||
: (gw.ipTemplate ? gw.ipTemplate.replace('{baseIp}', templateBaseIp || 'X.X.X') : 'IP адрес')
|
: (gw.ipTemplate ? gw.ipTemplate.replace('{baseIp}', normalizeBaseIp(templateBaseIp) || 'X.X.X') : 'IP адрес')
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
<div className="form-text small">
|
<div className="form-text small">
|
||||||
|
|||||||
Reference in New Issue
Block a user