fix(ospf): показывать IPv6 маршруты и фактический шлюз
This commit is contained in:
1 parent
12ead0b6c2
commit
f6b9c6941d
19 files changed
+1424
-32
No files matched your search
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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 || "—",
|
||||
|
||||
Reference in new issue
Block a user