feat(EasySwitchManager): integrate network-config gateways into server data loading and filtering logic for improved accuracy
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 3m4s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 3m4s
This commit is contained in:
@@ -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('Ошибка обновления данных');
|
||||
|
||||
Reference in New Issue
Block a user