refactor(NetworkConfigManager): remove unused IP generation and CIDR checking functions to streamline code and improve maintainability
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m40s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m40s
This commit is contained in:
@@ -922,143 +922,6 @@ function NetworkConfigManager() {
|
|||||||
return (networkNum & mask) === (ipNum & mask);
|
return (networkNum & mask) === (ipNum & mask);
|
||||||
};
|
};
|
||||||
|
|
||||||
// === Генерация IP из пула ===
|
|
||||||
const generateIpFromPool = (cidr, usedIps, excludeIp = null, forRemote = false, pairedLocalIp = null) => {
|
|
||||||
// Парсим CIDR (например, "10.10.0.0/24")
|
|
||||||
const [network, prefixLength] = cidr.split('/');
|
|
||||||
if (!network || !prefixLength) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const prefix = parseInt(prefixLength);
|
|
||||||
if (isNaN(prefix) || prefix < 0 || prefix > 32) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const networkParts = network.split('.');
|
|
||||||
if (networkParts.length !== 4) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const [a, b, c, d] = networkParts.map(Number);
|
|
||||||
if (networkParts.some(p => isNaN(Number(p)))) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Вычисляем количество хостов в сети
|
|
||||||
const hostBits = 32 - prefix;
|
|
||||||
const totalHosts = Math.pow(2, hostBits);
|
|
||||||
|
|
||||||
// Если подбираем Remote IP и есть Local IP, генерируем парный IP в той же сети /30
|
|
||||||
if (forRemote && pairedLocalIp) {
|
|
||||||
const localIpParts = pairedLocalIp.trim().split('.');
|
|
||||||
if (localIpParts.length === 4) {
|
|
||||||
const baseOctet = parseInt(localIpParts[3]);
|
|
||||||
const networkBase = Math.floor(baseOctet / 4) * 4;
|
|
||||||
const localOffset = baseOctet - networkBase;
|
|
||||||
|
|
||||||
let remoteOffset;
|
|
||||||
if (localOffset === 1) {
|
|
||||||
remoteOffset = 2;
|
|
||||||
} else if (localOffset === 2) {
|
|
||||||
remoteOffset = 1;
|
|
||||||
} else {
|
|
||||||
remoteOffset = localOffset === 0 ? 2 : (localOffset === 3 ? 1 : 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
const remoteOctet = networkBase + remoteOffset;
|
|
||||||
if (remoteOctet >= 0 && remoteOctet <= 255) {
|
|
||||||
const remoteIp = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${remoteOctet}`;
|
|
||||||
// Проверяем, что IP входит в диапазон пула
|
|
||||||
if (isIpInCidr(remoteIp, cidr) && !usedIps.has(remoteIp)) {
|
|
||||||
return remoteIp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Генерируем IP адреса из пула
|
|
||||||
// Для /30 сетей используем шаг 4
|
|
||||||
const step = prefix >= 30 ? 4 : 1;
|
|
||||||
|
|
||||||
// Определяем диапазон для перебора в зависимости от префикса
|
|
||||||
let startOctet = 0;
|
|
||||||
let endOctet = 255;
|
|
||||||
|
|
||||||
if (prefix >= 24) {
|
|
||||||
// /24 - /32: меняем только последний октет
|
|
||||||
startOctet = d;
|
|
||||||
endOctet = Math.min(d + totalHosts - 1, 255);
|
|
||||||
} else if (prefix >= 16) {
|
|
||||||
// /16 - /23: меняем третий и четвертый октеты
|
|
||||||
const thirdOctetRange = Math.pow(2, Math.max(0, 24 - prefix));
|
|
||||||
for (let cVal = c; cVal < c + thirdOctetRange && cVal <= 255; cVal++) {
|
|
||||||
const dStart = (cVal === c) ? d : 0;
|
|
||||||
const dEnd = (cVal === c + thirdOctetRange - 1) ? Math.min(d + totalHosts - 1, 255) : 255;
|
|
||||||
for (let dVal = dStart; dVal <= dEnd; dVal += step) {
|
|
||||||
if (prefix >= 30 && dVal % 4 !== 0) continue; // Для /30 только кратные 4
|
|
||||||
const ip = `${a}.${b}.${cVal}.${dVal + 1}`; // Local IP = базовый + 1
|
|
||||||
if (isIpInCidr(ip, cidr) && !usedIps.has(ip)) {
|
|
||||||
return ip;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
// /0 - /15: слишком большой диапазон, используем упрощенную логику
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Перебираем IP в диапазоне
|
|
||||||
for (let dVal = startOctet; dVal <= endOctet; dVal += step) {
|
|
||||||
if (prefix >= 30 && dVal % 4 !== 0) continue; // Для /30 только кратные 4
|
|
||||||
|
|
||||||
// Local IP = базовый + 1, Remote IP = базовый + 2
|
|
||||||
const localIp = `${a}.${b}.${c}.${dVal + 1}`;
|
|
||||||
const remoteIp = `${a}.${b}.${c}.${dVal + 2}`;
|
|
||||||
|
|
||||||
// Проверяем, что IP входит в диапазон пула
|
|
||||||
if (!isIpInCidr(localIp, cidr)) continue;
|
|
||||||
|
|
||||||
// Проверяем, свободны ли оба IP (для /30)
|
|
||||||
if (prefix >= 30) {
|
|
||||||
if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) {
|
|
||||||
return forRemote ? remoteIp : localIp;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Для других префиксов просто проверяем один IP
|
|
||||||
if (!usedIps.has(localIp)) {
|
|
||||||
return localIp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
// === Проверка, входит ли IP в CIDR ===
|
|
||||||
const isIpInCidr = (ip, cidr) => {
|
|
||||||
const [network, prefixLength] = cidr.split('/');
|
|
||||||
if (!network || !prefixLength) return false;
|
|
||||||
|
|
||||||
const prefix = parseInt(prefixLength);
|
|
||||||
if (isNaN(prefix)) return false;
|
|
||||||
|
|
||||||
const networkParts = network.split('.').map(Number);
|
|
||||||
const ipParts = ip.split('.').map(Number);
|
|
||||||
|
|
||||||
if (networkParts.length !== 4 || ipParts.length !== 4) return false;
|
|
||||||
|
|
||||||
// Вычисляем маску сети
|
|
||||||
const mask = (0xFFFFFFFF << (32 - prefix)) >>> 0;
|
|
||||||
|
|
||||||
// Преобразуем IP в число
|
|
||||||
const networkNum = (networkParts[0] << 24) | (networkParts[1] << 16) | (networkParts[2] << 8) | networkParts[3];
|
|
||||||
const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
|
|
||||||
|
|
||||||
return (networkNum & mask) === (ipNum & mask);
|
|
||||||
};
|
|
||||||
|
|
||||||
// === Подбор IP для интерфейса ===
|
// === Подбор IP для интерфейса ===
|
||||||
const handleSuggestLocalIp = () => {
|
const handleSuggestLocalIp = () => {
|
||||||
const ipPoolId = editingInterface?.ipPoolId || null;
|
const ipPoolId = editingInterface?.ipPoolId || null;
|
||||||
|
|||||||
Reference in New Issue
Block a user