02cd9d519c
Lint & Test / test (push) Successful in 1m56s
- Rename Python package: wled_controller -> ledgrab - Rename env var prefix: WLED_ -> LEDGRAB_ (with auto-migration for old vars) - Rename localStorage key: wled_api_key -> ledgrab_api_key (with migration) - Rename HA integration domain: wled_screen_controller -> ledgrab - Update all imports, build scripts, Docker, installer, config, docs - Remove HA integration (moved to ledgrab-haos-integration repo) - Remove hacs.json (belongs in HA repo now) - Add startup warning for users with old WLED_ env vars - All tests pass (715/715), ruff clean, tsc clean, frontend builds
91 lines
2.7 KiB
Python
91 lines
2.7 KiB
Python
"""API routes for the auto-update system."""
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from fastapi.responses import JSONResponse
|
|
|
|
from ledgrab.api.auth import AuthRequired
|
|
from ledgrab.api.dependencies import get_update_service
|
|
from ledgrab.api.schemas.update import (
|
|
DismissRequest,
|
|
UpdateSettingsRequest,
|
|
UpdateSettingsResponse,
|
|
UpdateStatusResponse,
|
|
)
|
|
from ledgrab.core.update.update_service import UpdateService
|
|
from ledgrab.utils import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
router = APIRouter(prefix="/api/v1/system/update", tags=["update"])
|
|
|
|
|
|
@router.get("/status", response_model=UpdateStatusResponse)
|
|
async def get_update_status(
|
|
_: AuthRequired,
|
|
service: UpdateService = Depends(get_update_service),
|
|
):
|
|
return service.get_status()
|
|
|
|
|
|
@router.post("/check", response_model=UpdateStatusResponse)
|
|
async def check_for_updates(
|
|
_: AuthRequired,
|
|
service: UpdateService = Depends(get_update_service),
|
|
):
|
|
return await service.check_now()
|
|
|
|
|
|
@router.post("/dismiss")
|
|
async def dismiss_update(
|
|
_: AuthRequired,
|
|
body: DismissRequest,
|
|
service: UpdateService = Depends(get_update_service),
|
|
):
|
|
service.dismiss(body.version)
|
|
return {"ok": True}
|
|
|
|
|
|
@router.post("/apply")
|
|
async def apply_update(
|
|
_: AuthRequired,
|
|
service: UpdateService = Depends(get_update_service),
|
|
):
|
|
"""Download (if needed) and apply the available update."""
|
|
status = service.get_status()
|
|
if not status["has_update"]:
|
|
return JSONResponse(status_code=400, content={"detail": "No update available"})
|
|
if not status["can_auto_update"]:
|
|
return JSONResponse(
|
|
status_code=400,
|
|
content={
|
|
"detail": f"Auto-update not supported for install type: {status['install_type']}"
|
|
},
|
|
)
|
|
try:
|
|
await service.apply_update()
|
|
return {"ok": True, "message": "Update applied, server shutting down"}
|
|
except Exception as exc:
|
|
logger.error("Failed to apply update: %s", exc, exc_info=True)
|
|
return JSONResponse(status_code=500, content={"detail": "Internal server error"})
|
|
|
|
|
|
@router.get("/settings", response_model=UpdateSettingsResponse)
|
|
async def get_update_settings(
|
|
_: AuthRequired,
|
|
service: UpdateService = Depends(get_update_service),
|
|
):
|
|
return service.get_settings()
|
|
|
|
|
|
@router.put("/settings", response_model=UpdateSettingsResponse)
|
|
async def update_update_settings(
|
|
_: AuthRequired,
|
|
body: UpdateSettingsRequest,
|
|
service: UpdateService = Depends(get_update_service),
|
|
):
|
|
return await service.update_settings(
|
|
enabled=body.enabled,
|
|
check_interval_hours=body.check_interval_hours,
|
|
include_prerelease=body.include_prerelease,
|
|
)
|