diff --git a/kiosk/src/main.rs b/kiosk/src/main.rs index 818be9d..f183ca2 100644 --- a/kiosk/src/main.rs +++ b/kiosk/src/main.rs @@ -28,6 +28,8 @@ pub enum ServerMsg { }, /// Server-pushed "go check for a firmware update now". FirmwareCheck, + /// Server-pushed "go check for an OS update now". + OsCheck, /// Show terminal auth code on screen (overlay). ShowTerminalCode(String), /// Dismiss the terminal code overlay. diff --git a/kiosk/src/ui.rs b/kiosk/src/ui.rs index 8d6fee8..ce85cc8 100644 --- a/kiosk/src/ui.rs +++ b/kiosk/src/ui.rs @@ -265,6 +265,9 @@ fn activate(app: &Application) { ServerMsg::FirmwareCheck => { maybe_apply_firmware_update(&server_for_reload, &key_for_reload); } + ServerMsg::OsCheck => { + maybe_apply_os_update(&server_for_reload, &key_for_reload); + } ServerMsg::ShowTerminalCode(code) => { let _ = tx_for_reload.send(WorkerMsg::ShowTerminalCode(code)); } diff --git a/kiosk/src/ws_client.rs b/kiosk/src/ws_client.rs index a750932..5e51a52 100644 --- a/kiosk/src/ws_client.rs +++ b/kiosk/src/ws_client.rs @@ -173,6 +173,8 @@ async fn handle_message( } } else if text.contains("\"type\":\"firmware_check\"") { let _ = tx.send(ServerMsg::FirmwareCheck); + } else if text.contains("\"type\":\"os_check\"") { + let _ = tx.send(ServerMsg::OsCheck); } else if text.contains("\"type\":\"fan\"") { let Ok(msg) = serde_json::from_str::(text) else { return }; let pwm = if msg.get("mode").and_then(|v| v.as_str()) == Some("auto") { diff --git a/server/src/plugins/service-admin-http/routes-os-updates.ts b/server/src/plugins/service-admin-http/routes-os-updates.ts index 0b5b596..6e0f4d5 100644 --- a/server/src/plugins/service-admin-http/routes-os-updates.ts +++ b/server/src/plugins/service-admin-http/routes-os-updates.ts @@ -63,6 +63,14 @@ export function registerOsUpdateRoutes(app: H3, deps: AdminDeps): void { return htmlFragment(KioskOsUpdatePanel({ kiosk: k, releases })); }); + // Push OS update now: server pings the kiosk via WS coordinator. + app.post("/admin/kiosks/:id/os-update/push", (event) => { + const id = Number(getRouterParam(event, "id")); + const { getCoordinator } = require("../../shared/coordinator-registry.js"); + const dispatched = getCoordinator().sendToKiosk(id, { type: "os_check" }); + return { ok: true, dispatched }; + }); + // ---- Rollouts ----------------------------------------------------------- app.get("/admin/os-updates/rollouts", (event) => { const user = event.context.user!; diff --git a/server/src/web-templates/admin-pages.tsx b/server/src/web-templates/admin-pages.tsx index 4b0d638..47730f6 100644 --- a/server/src/web-templates/admin-pages.tsx +++ b/server/src/web-templates/admin-pages.tsx @@ -3827,8 +3827,16 @@ export function KioskOsUpdatePanel(props: KioskOsUpdatePanelProps) { ))} -
+
+