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