fix(ospf): показывать IPv6 маршруты и фактический шлюз

This commit is contained in:
Denozordec committed 2026-10-11 23:05:19 +07:00
1 parent 12ead0b6c2
commit f6b9c6941d
19 files changed
+1424 -32

No files matched your search

+4
View File
@@ -683,6 +683,10 @@ export class MikrotikClient {
return this.get<RosIpRoute[]>("/ip/route")
}
async getIpv6Routes(): Promise<RosIpRoute[]> {
return this.get<RosIpRoute[]>("/ipv6/route")
}
async getFirewallFilters(): Promise<RosFirewallFilter[]> {
return this.getFirewallRules("ip", "filter")
}
+5 -4
View File
@@ -11,11 +11,12 @@ export interface OspfCatalogCollections {
bfdSessions: CatalogBfdSession[]; routes: CatalogRoute[];
}
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(),
export async function readOspfCatalogRaw(client: Pick<MikrotikClient, "getOspfNeighbors" | "getOspfAreas" | "getOspfInterfaceTemplates" | "getOspfInstances" | "getBfdSessions" | "getIpRoutes" | "getIpv6Routes">) {
const [neighbors, areas, ifaceTemplates, instances, bfdSessions, v4Routes, v6Routes] = await Promise.all([
client.getOspfNeighbors(), client.getOspfAreas(), client.getOspfInterfaceTemplates(), client.getOspfInstances(), client.getBfdSessions(), client.getIpRoutes(), client.getIpv6Routes(),
])
if ([neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes].some(rows => !Array.isArray(rows))) throw new Error("Некорректный ответ RouterOS OSPF")
if ([neighbors, areas, ifaceTemplates, instances, bfdSessions, v4Routes, v6Routes].some(rows => !Array.isArray(rows))) throw new Error("Некорректный ответ RouterOS OSPF")
const ipRoutes = [...v4Routes, ...v6Routes.map((route, index) => ({ ...route, ".id": `ipv6:${route[".id"] ?? index}` }))]
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>) {
@@ -20,6 +20,9 @@ assert.deepEqual(parseOspfGateway(route({ gateway: "10.200.0.1%gre-msk-spb" })),
})
console.log("ospf-route-parse.test.ts: ok")
assert.deepEqual(parseOspfGateway(route({ gateway: "configured-gateway", "immediate-gw": "fe80::2%gre-own" })), { nextHop: "fe80::2", via: "gre-own" })
assert.deepEqual(parseOspfGateway(route({ gateway: "", "immediate-gw": "198.18.154.2%gre-own" })), { nextHop: "198.18.154.2", via: "gre-own" })
assert.deepEqual(parseOspfGateway(route({ gateway: "198.18.154.2%gre-own", "immediate-gw": "" })), { nextHop: "198.18.154.2", via: "gre-own" })
assert.equal(parseOspfCatalogRouteType(route({ ospf: "true" })), "Unknown")
assert.equal(parseOspfCatalogRouteType(route({ ospf: "true", "ospf-type": "future-type" })), "Unknown")
+1 -1
View File
@@ -19,7 +19,7 @@ export function parseOspfRouteType(r: RosIpRoute): OspfRouteKind | null {
}
export function parseOspfGateway(r: RosIpRoute): { nextHop: string; via: string } {
const gw = (r.gateway ?? r["immediate-gw"] ?? "").trim()
const gw = r["immediate-gw"]?.trim() || r.gateway?.trim() || ""
const [ip, iface = ""] = gw.split("%")
return {
nextHop: ip || gw || "—",