Files
MikrotikManager/backend/src/services/firewall-poll.ts
T

27 lines
1.5 KiB
TypeScript

import type { FirewallFamily, FirewallTable, RosFirewallFilter, RosFirewallAddressList } from "../types/server.js"
export type FirewallChunkFailure = { family: FirewallFamily; table: FirewallTable | "address-list"; error: string }
export async function pollFirewallChunks(client: {
getFirewallRules: (family: FirewallFamily, table: FirewallTable) => Promise<RosFirewallFilter[]>
getFirewallAddressList: (family: FirewallFamily) => Promise<RosFirewallAddressList[]>
}) {
const failures: FirewallChunkFailure[] = []
async function read<T>(family: FirewallFamily, table: FirewallChunkFailure["table"], fetch: () => Promise<T[]>): Promise<T[]> {
try {
const rows = await fetch()
if (!Array.isArray(rows)) throw new Error("RouterOS вернул некорректный список")
return rows
} catch (e) {
failures.push({ family, table, error: e instanceof Error ? e.message : "Ошибка опроса Firewall" })
return []
}
}
const families: FirewallFamily[] = ["ip", "ip6"]
const tables: FirewallTable[] = ["filter", "nat", "mangle", "raw"]
const [ruleChunks, listChunks] = await Promise.all([
Promise.all(families.flatMap(family => tables.map(async table => ({ family, table, raw: await read(family, table, () => client.getFirewallRules(family, table)) })))),
Promise.all(families.map(async family => ({ family, raw: await read(family, "address-list", () => client.getFirewallAddressList(family)) }))),
])
return { ruleChunks, listChunks, failures }
}