Files
MikrotikManager/backend/src/services/probe-interface-read.ts
T

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)
}