diff --git a/frontend/src/EasySwitchManager.jsx b/frontend/src/EasySwitchManager.jsx index 9f1add5..eced4f7 100644 --- a/frontend/src/EasySwitchManager.jsx +++ b/frontend/src/EasySwitchManager.jsx @@ -34,6 +34,8 @@ function EasySwitchManager() { const [servers, setServers] = useState([]); const [inventoryServers, setInventoryServers] = useState([]); const [communitiesDirectory, setCommunitiesDirectory] = useState([]); // Справочник communities + // Gateways и интерфейсы из /network-config (единый источник правды для шлюзов) + const [networkConfigGateways, setNetworkConfigGateways] = useState([]); // Поиск и фильтры const [searchQuery, setSearchQuery] = useState(''); @@ -62,9 +64,22 @@ function EasySwitchManager() { const invRes = await api.get(`/servers`); const inventory = Array.isArray(invRes.data) ? invRes.data : []; setInventoryServers(inventory); + + // Загружаем network-config (gateways и туннели) + let ncGateways = []; + try { + const ncRes = await api.get(`/network-config`); + const ncData = ncRes.data || {}; + ncGateways = Array.isArray(ncData.gateways) ? ncData.gateways : []; + } catch (e) { + // Если файла нет или ошибка - используем пустой массив (fallback на старую логику) + console.warn('EasySwitch: не удалось загрузить /network-config, используется fallback:', e?.message || e); + ncGateways = []; + } + setNetworkConfigGateways(ncGateways); // Загружаем данные серверов и фильтров - await loadDataWithParams(communities, inventory); + await loadDataWithParams(communities, inventory, ncGateways); } catch (e) { console.error('Error initializing data:', e); setError('Ошибка загрузки данных'); @@ -73,7 +88,7 @@ function EasySwitchManager() { initData(); }, []); - const loadDataWithParams = async (communities, inventory) => { + const loadDataWithParams = async (communities, inventory, ncGatewaysParam) => { setLoading(true); setError(''); @@ -90,36 +105,85 @@ function EasySwitchManager() { const filtersResponse = await api.get(`/server-filters/${server.id}`); const filters = Array.isArray(filtersResponse.data) ? filtersResponse.data : []; - // Получаем gateways сервера из inventory или server-configs - const matchedInventoryServer = inventory.find(srv => + // Получаем gateways сервера: + // 1) из /network-config (основной источник, как на странице фильтров) + // 2) fallback на inventory (/servers) + // 3) fallback на server-configs + const matchedInventoryServer = inventory.find((srv) => String(srv.dns || '').trim() === server.name || String(srv.hostName || '').trim() === server.name || String(srv.ip || '').trim() === server.name ); - + + const serverDns = matchedInventoryServer?.dns || matchedInventoryServer?.hostName || server.name || ''; + const serverId = + matchedInventoryServer?.id || + matchedInventoryServer?.ip || + server.id || + server.name || + ''; + const serverCountry = matchedInventoryServer?.country || server.country || ''; + const serverProvider = matchedInventoryServer?.provider || server.provider || ''; + let serverGateways = []; - - // Берем gateways из inventory - if (matchedInventoryServer && Array.isArray(matchedInventoryServer.gateways)) { + + // ПРИОРИТЕТ 1: Gateways из /network-config (совпадают со страницей фильтров) + const allNetworkGateways = Array.isArray(ncGatewaysParam) + ? ncGatewaysParam + : networkConfigGateways; + + if (allNetworkGateways.length > 0) { + const networkGatewaysForServer = allNetworkGateways.filter((gw) => { + if (!gw.serverId) return false; + return ( + gw.serverId === serverId || + gw.serverId === matchedInventoryServer?.ip || + gw.serverId === matchedInventoryServer?.dns || + gw.serverId === server.name || + gw.serverId === serverDns + ); + }); + + networkGatewaysForServer.forEach((gw) => { + if (!gw.ip) return; // Пропускаем gateway без IP + serverGateways.push({ + // Используем IP как имя, чтобы совпадало с FilterManager и значением gateway в фильтрах + name: gw.ip, + ip: gw.ip, + comment: gw.description || '', + primary: false, + country: gw.country || serverCountry, + provider: gw.provider || serverProvider, + }); + }); + } + + // ПРИОРИТЕТ 2: Fallback на старые gateways из inventoryServers (если нет в network-config) + if (serverGateways.length === 0 && matchedInventoryServer && Array.isArray(matchedInventoryServer.gateways)) { serverGateways = matchedInventoryServer.gateways - .filter(gw => gw.name && gw.name !== server.name) - .map(gw => ({ + // Пропускаем шлюзы, у которых имя совпадает с названием сервера (fallback) + .filter((gw) => gw.name && gw.name !== serverDns && gw.name !== server.name) + .map((gw) => ({ name: gw.name, ip: gw.ip || '', comment: gw.comment || '', - primary: gw.primary || false + primary: gw.primary || false, + country: gw.country || serverCountry, + provider: gw.provider || serverProvider, })); } - - // Если нет в inventory, берем из server-configs + + // ПРИОРИТЕТ 3: Fallback на gateways из server-configs if (serverGateways.length === 0 && Array.isArray(server.gateways)) { serverGateways = server.gateways - .filter(gw => gw.name && gw.name !== server.name) - .map(gw => ({ + .filter((gw) => gw.name && gw.name !== serverDns && gw.name !== server.name) + .map((gw) => ({ name: gw.name, ip: gw.ip || '', comment: gw.comment || '', - primary: gw.primary || false + primary: gw.primary || false, + country: gw.country || serverCountry, + provider: gw.provider || serverProvider, })); } @@ -391,9 +455,21 @@ function EasySwitchManager() { const invRes = await api.get(`/servers`); const inventory = Array.isArray(invRes.data) ? invRes.data : []; setInventoryServers(inventory); + + // Загружаем network-config (gateways и туннели) + let ncGateways = []; + try { + const ncRes = await api.get(`/network-config`); + const ncData = ncRes.data || {}; + ncGateways = Array.isArray(ncData.gateways) ? ncData.gateways : []; + } catch (e) { + console.warn('EasySwitch: не удалось обновить /network-config, используется fallback:', e?.message || e); + ncGateways = []; + } + setNetworkConfigGateways(ncGateways); - // Загружаем данные серверов и фильтров - await loadDataWithParams(communities, inventory); + // Загружаем данные серверов и фильтров с учетом network-config gateways + await loadDataWithParams(communities, inventory, ncGateways); } catch (e) { console.error('Error refreshing data:', e); setError('Ошибка обновления данных');