27 lines
1.5 KiB
TypeScript
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 }
|
|
}
|