fix(api): показывать ошибки строгого OSPF-каталога
This commit is contained in:
1 parent
72a63b4a4f
commit
a89cefcbf2
6 files changed
+92
-4
No files matched your search
@@ -0,0 +1,29 @@
|
||||
import type { MikrotikClient } from "./mikrotik.js"
|
||||
import type { OspfNeighborRead, OspfInterfaceRead, OspfInstanceRead, BfdSessionRead, OspfRouteRead } from "../types/server.js"
|
||||
export interface OspfCatalogCollections {
|
||||
neighbors: OspfNeighborRead[]; interfaces: OspfInterfaceRead[]; instances: OspfInstanceRead[];
|
||||
bfdSessions: BfdSessionRead[]; routes: OspfRouteRead[];
|
||||
}
|
||||
export const emptyOspfCatalog = (): OspfCatalogCollections => ({ neighbors: [], interfaces: [], instances: [], bfdSessions: [], routes: [] })
|
||||
export async function readOspfCatalogRaw(client: Pick<MikrotikClient, "getOspfNeighbors" | "getOspfAreas" | "getOspfInterfaceTemplates" | "getOspfInstances" | "getBfdSessions" | "getIpRoutes">) {
|
||||
const [neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes] = await Promise.all([
|
||||
client.getOspfNeighbors(), client.getOspfAreas(), client.getOspfInterfaceTemplates(), client.getOspfInstances(), client.getBfdSessions(), client.getIpRoutes(),
|
||||
])
|
||||
if ([neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes].some(rows => !Array.isArray(rows))) throw new Error("Некорректный ответ RouterOS OSPF")
|
||||
return { neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes }
|
||||
}
|
||||
export async function pollOspfCatalog<S extends { id: number; name: string }>(devices: readonly S[], read: (device: S) => Promise<OspfCatalogCollections>) {
|
||||
const results = await Promise.all(devices.map(async device => {
|
||||
try {
|
||||
const collections = await read(device)
|
||||
for (const rows of Object.values(collections)) {
|
||||
if (!Array.isArray(rows) || rows.some(row => row.serverId !== device.id || typeof row.id !== "string" || !row.id.trim())) throw new Error("Некорректный контекст OSPF-каталога")
|
||||
if (new Set(rows.map(row => row.id)).size !== rows.length) throw new Error("Повторяющиеся ID OSPF-каталога")
|
||||
}
|
||||
return { ...collections, failures: [] }
|
||||
} catch (error) {
|
||||
return { ...emptyOspfCatalog(), failures: [{ serverId: device.id, serverName: device.name, error: error instanceof Error ? error.message : "Ошибка опроса OSPF" }] }
|
||||
}
|
||||
}))
|
||||
return { neighbors: results.flatMap(r => r.neighbors), interfaces: results.flatMap(r => r.interfaces), instances: results.flatMap(r => r.instances), bfdSessions: results.flatMap(r => r.bfdSessions), routes: results.flatMap(r => r.routes), failures: results.flatMap(r => r.failures) }
|
||||
}
|
||||
Reference in new issue
Block a user