"""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