Files
MikrotikManager/backend/src/services/wireguard-ros.ts
T
DenozordecandCursor 1e9312acbd
Docker images / prepare-release (push) Successful in 8s
Docker images / backend-image (push) Successful in 2m1s
Docker images / frontend-image (push) Successful in 3m56s
Docker images / notify-webhook (push) Skipped
Docker images / updater-image (push) Successful in 46s
Docker images / publish-release (push) Successful in 12s
feat(traffic): добавить приём Traffic Flow с jump-host
Чтобы видеть «кто с кем», а не только объём порта: IPFIX внутри WG на хосте Docker MM, REST-счётчики не трогаем.

Co-authored-by: Cursor <[email protected]>
2026-09-06 21:54:30 +07:00

51 lines
1.4 KiB
TypeScript

import type { MikrotikClient } from "./mikrotik.js"
/** Общие PUT iface / peer / address для `/wireguard` и traffic-flow overlay. */
export function toRosBody(obj: Record<string, string | undefined>): Record<string, string> {
const out: Record<string, string> = {}
for (const [k, v] of Object.entries(obj)) {
if (v !== undefined && v !== "") out[k] = v
}
return out
}
export function asRosArray<T>(raw: unknown): T[] {
if (Array.isArray(raw)) return raw as T[]
if (raw && typeof raw === "object") return [raw as T]
return []
}
export function rosRowId(row: Record<string, unknown>): string {
return String(row[".id"] ?? row.id ?? "")
}
export async function putWireguardInterface(
client: MikrotikClient,
fields: Record<string, string | undefined>,
): Promise<void> {
await client.put("/interface/wireguard", toRosBody(fields))
}
export async function putIpAddress(
client: MikrotikClient,
address: string,
iface: string,
): Promise<void> {
await client.put("/ip/address", { address, interface: iface })
}
export async function putWireguardPeer(
client: MikrotikClient,
fields: Record<string, string | undefined>,
): Promise<void> {
await client.put("/interface/wireguard/peers", toRosBody(fields))
}
export async function patchRosPath(
client: MikrotikClient,
path: string,
fields: Record<string, string | undefined>,
): Promise<void> {
await client.patch(path, toRosBody(fields))
}