65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
|
|
"""Unraid servers status router."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import logging
|
||
|
|
from typing import Any, Dict, List
|
||
|
|
|
||
|
|
from fastapi import APIRouter
|
||
|
|
|
||
|
|
from server.cache import cache
|
||
|
|
from server.config import settings
|
||
|
|
from server.services.unraid_service import ServerConfig, fetch_all_servers
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/api", tags=["servers"])
|
||
|
|
|
||
|
|
CACHE_KEY = "servers"
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/servers")
|
||
|
|
async def get_servers() -> Dict[str, Any]:
|
||
|
|
"""Return status information for all configured Unraid servers.
|
||
|
|
|
||
|
|
Response shape::
|
||
|
|
|
||
|
|
{
|
||
|
|
"servers": [ ... server dicts ... ]
|
||
|
|
}
|
||
|
|
"""
|
||
|
|
|
||
|
|
# --- cache hit? -----------------------------------------------------------
|
||
|
|
cached = await cache.get(CACHE_KEY)
|
||
|
|
if cached is not None:
|
||
|
|
return cached
|
||
|
|
|
||
|
|
# --- cache miss -----------------------------------------------------------
|
||
|
|
server_configs: List[ServerConfig] = [
|
||
|
|
ServerConfig(
|
||
|
|
name=srv.name,
|
||
|
|
host=srv.host,
|
||
|
|
api_key=srv.api_key,
|
||
|
|
port=srv.port,
|
||
|
|
)
|
||
|
|
for srv in settings.unraid_servers
|
||
|
|
]
|
||
|
|
|
||
|
|
servers_data: List[Dict[str, Any]] = []
|
||
|
|
try:
|
||
|
|
servers_data = await fetch_all_servers(server_configs)
|
||
|
|
except Exception as exc:
|
||
|
|
logger.exception("Failed to fetch Unraid server data")
|
||
|
|
return {
|
||
|
|
"servers": [],
|
||
|
|
"error": True,
|
||
|
|
"message": str(exc),
|
||
|
|
}
|
||
|
|
|
||
|
|
payload: Dict[str, Any] = {
|
||
|
|
"servers": servers_data,
|
||
|
|
}
|
||
|
|
|
||
|
|
await cache.set(CACHE_KEY, payload, settings.unraid_cache_ttl)
|
||
|
|
return payload
|