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 [servers, setServers] = useState([]);
|
||||||
const [inventoryServers, setInventoryServers] = useState([]);
|
const [inventoryServers, setInventoryServers] = useState([]);
|
||||||
const [communitiesDirectory, setCommunitiesDirectory] = useState([]); // Справочник communities
|
const [communitiesDirectory, setCommunitiesDirectory] = useState([]); // Справочник communities
|
||||||
|
// Gateways и интерфейсы из /network-config (единый источник правды для шлюзов)
|
||||||
|
const [networkConfigGateways, setNetworkConfigGateways] = useState([]);
|
||||||
|
|
||||||
// Поиск и фильтры
|
// Поиск и фильтры
|
||||||
const [searchQuery, setSearchQuery] = useState('');
|
const [searchQuery, setSearchQuery] = useState('');
|
||||||
@@ -63,8 +65,21 @@ function EasySwitchManager() {
|
|||||||
const inventory = Array.isArray(invRes.data) ? invRes.data : [];
|
const inventory = Array.isArray(invRes.data) ? invRes.data : [];
|
||||||
setInventoryServers(inventory);
|
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) {
|
} catch (e) {
|
||||||
console.error('Error initializing data:', e);
|
console.error('Error initializing data:', e);
|
||||||
setError('Ошибка загрузки данных');
|
setError('Ошибка загрузки данных');
|
||||||
@@ -73,7 +88,7 @@ function EasySwitchManager() {
|
|||||||
initData();
|
initData();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const loadDataWithParams = async (communities, inventory) => {
|
const loadDataWithParams = async (communities, inventory, ncGatewaysParam) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError('');
|
setError('');
|
||||||
|
|
||||||
@@ -90,36 +105,85 @@ function EasySwitchManager() {
|
|||||||
const filtersResponse = await api.get(`/server-filters/${server.id}`);
|
const filtersResponse = await api.get(`/server-filters/${server.id}`);
|
||||||
const filters = Array.isArray(filtersResponse.data) ? filtersResponse.data : [];
|
const filters = Array.isArray(filtersResponse.data) ? filtersResponse.data : [];
|
||||||
|
|
||||||
// Получаем gateways сервера из inventory или server-configs
|
// Получаем gateways сервера:
|
||||||
const matchedInventoryServer = inventory.find(srv =>
|
// 1) из /network-config (основной источник, как на странице фильтров)
|
||||||
|
// 2) fallback на inventory (/servers)
|
||||||
|
// 3) fallback на server-configs
|
||||||
|
const matchedInventoryServer = inventory.find((srv) =>
|
||||||
String(srv.dns || '').trim() === server.name ||
|
String(srv.dns || '').trim() === server.name ||
|
||||||
String(srv.hostName || '').trim() === server.name ||
|
String(srv.hostName || '').trim() === server.name ||
|
||||||
String(srv.ip || '').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 = [];
|
let serverGateways = [];
|
||||||
|
|
||||||
// Берем gateways из inventory
|
// ПРИОРИТЕТ 1: Gateways из /network-config (совпадают со страницей фильтров)
|
||||||
if (matchedInventoryServer && Array.isArray(matchedInventoryServer.gateways)) {
|
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
|
serverGateways = matchedInventoryServer.gateways
|
||||||
.filter(gw => gw.name && gw.name !== server.name)
|
// Пропускаем шлюзы, у которых имя совпадает с названием сервера (fallback)
|
||||||
.map(gw => ({
|
.filter((gw) => gw.name && gw.name !== serverDns && gw.name !== server.name)
|
||||||
|
.map((gw) => ({
|
||||||
name: gw.name,
|
name: gw.name,
|
||||||
ip: gw.ip || '',
|
ip: gw.ip || '',
|
||||||
comment: gw.comment || '',
|
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)) {
|
if (serverGateways.length === 0 && Array.isArray(server.gateways)) {
|
||||||
serverGateways = server.gateways
|
serverGateways = server.gateways
|
||||||
.filter(gw => gw.name && gw.name !== server.name)
|
.filter((gw) => gw.name && gw.name !== serverDns && gw.name !== server.name)
|
||||||
.map(gw => ({
|
.map((gw) => ({
|
||||||
name: gw.name,
|
name: gw.name,
|
||||||
ip: gw.ip || '',
|
ip: gw.ip || '',
|
||||||
comment: gw.comment || '',
|
comment: gw.comment || '',
|
||||||
primary: gw.primary || false
|
primary: gw.primary || false,
|
||||||
|
country: gw.country || serverCountry,
|
||||||
|
provider: gw.provider || serverProvider,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,8 +456,20 @@ function EasySwitchManager() {
|
|||||||
const inventory = Array.isArray(invRes.data) ? invRes.data : [];
|
const inventory = Array.isArray(invRes.data) ? invRes.data : [];
|
||||||
setInventoryServers(inventory);
|
setInventoryServers(inventory);
|
||||||
|
|
||||||
// Загружаем данные серверов и фильтров
|
// Загружаем network-config (gateways и туннели)
|
||||||
await loadDataWithParams(communities, inventory);
|
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);
|
||||||
|
|
||||||
|
// Загружаем данные серверов и фильтров с учетом network-config gateways
|
||||||
|
await loadDataWithParams(communities, inventory, ncGateways);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Error refreshing data:', e);
|
console.error('Error refreshing data:', e);
|
||||||
setError('Ошибка обновления данных');
|
setError('Ошибка обновления данных');
|
||||||
|
|||||||
Reference in New Issue
Block a user