26 lines
1.6 KiB
TypeScript
26 lines
1.6 KiB
TypeScript
import { MikrotikClient } from "./mikrotik.js"
|
|
import { buildProbeInterfaces } from "./probe-interface-model.js"
|
|
import { readInternetPathRows } from "./internet-path-snapshot.js"
|
|
import { observedBoolean } from "./ospf-observed-values.js"
|
|
import type { ServerRow } from "../modules/servers/repository/servers-repository.js"
|
|
|
|
export async function readProbeInterfacesForServer(server: ServerRow, withAddresses = false) {
|
|
if (!server.enabled) throw Object.assign(new Error("Сервер отключён: включите его перед опросом интерфейсов"), { statusCode: 409 })
|
|
const client = MikrotikClient.fromServer(server)
|
|
const [raw, addresses] = await Promise.all([client.getInterfaces(), withAddresses ? client.getIpAddresses() : undefined])
|
|
const rows = readInternetPathRows(raw, "probe interfaces", [".id", "name"])
|
|
if (rows.length > 1000) throw new Error("Каталог интерфейсов превышает предел проверки")
|
|
let cursor = 0
|
|
const missing = rows.filter(row => row.disabled === undefined && observedBoolean(row.running) === true)
|
|
await Promise.all(Array.from({ length: Math.min(4, missing.length) }, async () => {
|
|
while (cursor < missing.length) {
|
|
const row = missing[cursor++]!
|
|
try {
|
|
const result = await client.post<{ ret?: string }>("/interface/get", { ".id": row[".id"], "value-name": "disabled" })
|
|
if (typeof result?.ret === "string") row.disabled = result.ret
|
|
} catch { /* Preserve an unknown flag; it cannot become an eligible interface. */ }
|
|
}
|
|
}))
|
|
return buildProbeInterfaces(rows, addresses)
|
|
}
|