Files
MikrotikManager/lib/scheduler-run-snapshot.ts
T
DenozordecandCursor 5f31bb47fb chore: synchronize pending app/backend updates and repository hygiene
Includes current frontend and backend work in progress and removes generated artifacts from tracking to keep the repository clean for дальнейшая разработка.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 12:29:04 +07:00

180 lines
3.8 KiB
TypeScript

/**
* Снимок прогона планировщика (JSON из `scheduler_runs.result_json`).
* Дублирует контракт `backend/src/types/scheduler-run-snapshot.ts` для UI.
*/
export interface ServerRestPingSnapshot {
serverId: number
name: string
host: string
ok: boolean
latencyMs?: number | null
error?: string
}
export interface ServersRestPingRunSnapshot {
v: number
job: "servers_rest_ping"
sampledAt: string
skipped?: boolean
fatalError?: string
servers: ServerRestPingSnapshot[]
}
export type AlertEngineRuleDiagSnapshot = {
ruleId: string
inGroup: boolean
evalHit: boolean
stabilityOk: boolean
cooldownOk: boolean
telegramOk: boolean
blocked?:
| "no_hit"
| "stability"
| "cooldown"
| "no_telegram"
| "dedupe_positive"
| "in_group"
}
/** Сводка прогона движка оповещений (JSON из `scheduler_runs` для job `alert_engine`). */
export interface AlertEngineRunSnapshot {
v: number
job: "alert_engine"
sampledAt: string
rulesChecked: number
standaloneFires: number
groupFires: number
skippedNoTelegram: boolean
errors?: string[]
ruleDiag?: AlertEngineRuleDiagSnapshot[]
}
export interface GreBgpSnapshotRunSnapshot {
v: number
job: "gre_bgp"
sampledAt: string
skipped?: boolean
fatalError?: string
greWritten: number
bgpWritten: number
errors?: string[]
}
export type SchedulerRunSnapshot =
| TrafficRunSnapshot
| ResourcesRunSnapshot
| PingRunSnapshot
| SpeedScheduledRunSnapshot
| ServersRestPingRunSnapshot
| GreBgpSnapshotRunSnapshot
| AlertEngineRunSnapshot
export interface TrafficServerSnapshot {
serverId: number
name: string
host: string
ok: boolean
error?: string
interfaces?: number
sumRxMbps?: number
sumTxMbps?: number
}
export interface TrafficRunSnapshot {
v: number
job: "traffic"
sampledAt: string
skipped?: boolean
fatalError?: string
servers: TrafficServerSnapshot[]
}
export interface ResourceServerSnapshot {
serverId: number
name: string
host: string
status: "online" | "offline"
error?: string
cpuLoadPct?: number
memUsedMb?: number
memTotalMb?: number
memUsedPct?: number
diskFreeMb?: number
diskTotalMb?: number
uptimeSeconds?: number
boardName?: string
rosVersion?: string
}
export interface ResourcesRunSnapshot {
v: number
job: "uptime_resources"
sampledAt: string
skipped?: boolean
fatalError?: string
servers: ResourceServerSnapshot[]
}
export interface PingProbeSnapshot {
probeId: string
name: string
target: string
srcServerId: number
srcServerName: string
srcInterface: string
ok: boolean
rttMs: number | null
lossPct: number
status: "up" | "warn" | "down"
error?: string
}
export interface PingRunSnapshot {
v: number
job: "uptime_ping"
sampledAt: string
skipped?: boolean
fatalError?: string
probes: PingProbeSnapshot[]
skippedByInterval?: number
}
export interface SpeedRunSnapshot {
probeId: string
srcServerId: number
srcServerName: string
dstServerId: number
dstServerName: string
srcInterface: string
dstInterface: string
protocol: string
direction: string
durationSec: number
ok: boolean
txAvgMbps?: number | null
rxAvgMbps?: number | null
pingRttMs?: number | null
pingLossPct?: number | null
pingError?: string | null
error?: string
}
export interface SpeedScheduledRunSnapshot {
v: number
job: "uptime_speed"
sampledAt: string
runs: SpeedRunSnapshot[]
}
export function parseSchedulerRunSnapshot(raw: string | null | undefined): SchedulerRunSnapshot | null {
if (raw == null || raw.trim() === "") return null
try {
const o = JSON.parse(raw) as { v?: unknown; job?: string }
if (o?.v !== 1 || typeof o.job !== "string") return null
return o as SchedulerRunSnapshot
} catch {
return null
}
}