bcc488993d
Adds optional live status checking per service (not just per node), requested as a follow-up to issue #196. Backend: - New check_service / check_services: HTTP(S) GET for web services, TCP connect otherwise; UDP and port-less non-web services stay 'unknown'. - New scheduler job 'service_checks', independent interval (default 300s), added/removed live via set_service_checks_enabled. - Settings gain service_check_enabled + service_check_interval (>=30s), persisted to scan_config.json. New WS message type 'service_status'. Frontend: - Live per-service status overlay in canvasStore (not persisted, so it never round-trips through canvas save), fed by the WS message. - DetailPanel + canvas node service rows: offline service turns red (#f85149), otherwise keeps its category colour. - SettingsModal: toggle + interval input (default 300s / 5 min). Off by default — no behaviour change until enabled. ha-relevant: yes
43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
"""App-level settings (status checker interval, etc.)."""
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel, Field
|
|
|
|
from app.api.deps import get_current_user
|
|
from app.core.config import settings
|
|
from app.core.scheduler import reschedule_service_checks, set_service_checks_enabled
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class AppSettings(BaseModel):
|
|
interval_seconds: int
|
|
service_check_enabled: bool = False
|
|
service_check_interval: int = Field(default=300, ge=30)
|
|
|
|
|
|
@router.get("", response_model=AppSettings)
|
|
async def get_settings(_: str = Depends(get_current_user)) -> AppSettings:
|
|
return AppSettings(
|
|
interval_seconds=settings.status_checker_interval,
|
|
service_check_enabled=settings.service_check_enabled,
|
|
service_check_interval=settings.service_check_interval,
|
|
)
|
|
|
|
|
|
@router.post("", response_model=AppSettings)
|
|
async def update_settings(
|
|
payload: AppSettings, _: str = Depends(get_current_user)
|
|
) -> AppSettings:
|
|
try:
|
|
settings.status_checker_interval = payload.interval_seconds
|
|
settings.service_check_enabled = payload.service_check_enabled
|
|
settings.service_check_interval = payload.service_check_interval
|
|
settings.save_overrides()
|
|
# Apply the service-check schedule live.
|
|
set_service_checks_enabled(payload.service_check_enabled)
|
|
if payload.service_check_enabled:
|
|
reschedule_service_checks(payload.service_check_interval)
|
|
return payload
|
|
except Exception as exc:
|
|
raise HTTPException(status_code=500, detail=str(exc)) from exc
|