Newer
Older
hard-panel / panel / backend / app / models.py
"""Pydantic-модели: ingest-пакет агента и запросы к servers API."""

from datetime import datetime

from pydantic import BaseModel, Field


# --- Пакет hard-monitor ------------------------------------------------------

class CpuInfo(BaseModel):
    percent: float = 0.0
    count: int = 0
    load: list[float] = Field(default_factory=lambda: [0.0, 0.0, 0.0])


class RamInfo(BaseModel):
    total: int = 0
    used: int = 0
    available: int = 0


class SwapInfo(BaseModel):
    total: int = 0
    used: int = 0


class MemoryInfo(BaseModel):
    ram: RamInfo = Field(default_factory=RamInfo)
    swap: SwapInfo = Field(default_factory=SwapInfo)


class DiskInfo(BaseModel):
    mount: str
    total: int = 0
    used: int = 0
    percent: float = 0.0


class NetIfaceInfo(BaseModel):
    iface: str
    bytes_sent: int = 0  # сырой счётчик с момента загрузки ОС
    bytes_recv: int = 0


class ProcessInfo(BaseModel):
    name: str = ""
    pid: int = 0
    cpu: float = 0.0
    mem: float = 0.0  # % RAM


class DockerContainerInfo(BaseModel):
    name: str
    image: str = ""
    status: str = ""


class IngestPayload(BaseModel):
    hostname: str
    os: str = ""
    kernel: str = ""
    ips: list[str] = Field(default_factory=list)
    interval: int = 30
    ts: datetime | None = None  # если нет — panel ставит своё время
    cpu: CpuInfo = Field(default_factory=CpuInfo)
    memory: MemoryInfo = Field(default_factory=MemoryInfo)
    disks: list[DiskInfo] = Field(default_factory=list)
    uptime: int = 0
    net: list[NetIfaceInfo] = Field(default_factory=list)
    processes: list[ProcessInfo] = Field(default_factory=list)
    docker: list[DockerContainerInfo] = Field(default_factory=list)
    extra: dict = Field(default_factory=dict)


# --- Servers API ------------------------------------------------------------

class ServerCreate(BaseModel):
    name: str
    hostname: str = ""
    interval: int = 30


class ServerUpdate(BaseModel):
    name: str | None = None
    note: str | None = None