From 84b4f7e795773057f74ef0afe8e503aef71e5468 Mon Sep 17 00:00:00 2001 From: shats Date: Thu, 22 Jan 2026 20:20:48 +0700 Subject: [PATCH] refactor(NetworkConfigManager): remove unused IP generation and CIDR checking functions to streamline code and improve maintainability --- frontend/src/NetworkConfigManager.jsx | 137 -------------------------- 1 file changed, 137 deletions(-) diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 4bf10e3..b452537 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -922,143 +922,6 @@ function NetworkConfigManager() { 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 для интерфейса === const handleSuggestLocalIp = () => { const ipPoolId = editingInterface?.ipPoolId || null;