Files
homelab-infra/apps/dashboard/backend/app/models/sources.py
T

110 lines
2.7 KiB
Python

from __future__ import annotations
from datetime import datetime
from pydantic import Field
from app.models.common import APIModel, DockerContainerState, OverallStatus, SourceStatus
class BeszelDiskMetric(APIModel):
name: str
mount: str
used_gb: float
total_gb: float
free_gb: float
usage_percent: float
class BeszelSystemSnapshot(APIModel):
source_name: str = "beszel"
source_status: SourceStatus = "offline"
host_name: str = "unknown"
agent_name: str = "beszel-agent"
cpu_usage_percent: float = 0.0
cpu_cores: int = 0
load_1: float = 0.0
load_5: float = 0.0
load_15: float = 0.0
memory_used_gb: float = 0.0
memory_total_gb: float = 0.0
memory_available_gb: float = 0.0
memory_usage_percent: float = 0.0
primary_interface: str = "unknown"
network_rx_mbps: float = 0.0
network_tx_mbps: float = 0.0
uptime_seconds: int = 0
platform: str = "unknown"
kernel: str = "unknown"
disks: list[BeszelDiskMetric] = Field(default_factory=list)
class DockerContainerSummary(APIModel):
id: str
name: str
state: DockerContainerState
status_text: str
image: str
health: str | None = None
class DockerSnapshot(APIModel):
source_name: str = "docker"
source_status: SourceStatus = "offline"
running: int = 0
stopped: int = 0
unhealthy: int = 0
total: int = 0
containers: list[DockerContainerSummary] = Field(default_factory=list)
class UptimeKumaMonitor(APIModel):
id: str
name: str
status: OverallStatus
latency_ms: int | None = None
monitor_type: str | None = None
class UptimeKumaSnapshot(APIModel):
source_name: str = "uptime_kuma"
source_status: SourceStatus = "offline"
monitors_up: int = 0
monitors_down: int = 0
monitors_paused: int = 0
total: int = 0
monitors: list[UptimeKumaMonitor] = Field(default_factory=list)
class HomeAssistantSnapshot(APIModel):
source_name: str = "home_assistant"
status: SourceStatus = "offline"
label: str = "Home Assistant"
version: str | None = None
response_time_ms: int | None = None
last_checked: datetime | None = None
class AdGuardSnapshot(APIModel):
source_name: str = "adguard"
source_status: SourceStatus = "offline"
total_queries: int = 0
blocked_queries: int = 0
blocked_percent: float = 0.0
avg_processing_ms: float = 0.0
class ScrutinyDevice(APIModel):
name: str
model: str
status: str = "unknown" # "passed" | "failed" | "unknown"
class ScrutinySnapshot(APIModel):
source_name: str = "scrutiny"
source_status: SourceStatus = "offline"
overall_status: str = "offline"
devices: list[ScrutinyDevice] = Field(default_factory=list)
failed_count: int = 0
total_count: int = 0