From 5234411c9dbc61a8a15368744bf348bc5f75c1d7 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Fri, 9 Jan 2026 09:41:47 +0000 Subject: [PATCH] update --- ecoos_daemon/ts/daemon/index.ts | 7 +++- ecoos_daemon/ts/daemon/process-manager.ts | 39 ++++++++---------- ecoos_daemon/ts/ui/server.ts | 38 ++++++++++++++++- ecoos_daemon/ts/version.ts | 1 + .../includes.chroot/opt/eco/bin/eco-daemon | Bin 86937008 -> 86940210 bytes isotest/run-test.sh | 16 +++---- package.json | 3 +- 7 files changed, 71 insertions(+), 33 deletions(-) create mode 100644 ecoos_daemon/ts/version.ts diff --git a/ecoos_daemon/ts/daemon/index.ts b/ecoos_daemon/ts/daemon/index.ts index 239f7b7..e2b051d 100644 --- a/ecoos_daemon/ts/daemon/index.ts +++ b/ecoos_daemon/ts/daemon/index.ts @@ -31,6 +31,7 @@ export class EcoDaemon { private logs: string[] = []; private swayStatus: ServiceStatus = { state: 'stopped' }; private chromiumStatus: ServiceStatus = { state: 'stopped' }; + private manualRestartUntil: number = 0; // Timestamp until which auto-restart is disabled constructor(config?: Partial) { this.config = { @@ -94,6 +95,9 @@ export class EcoDaemon { return { success: false, message: 'Cannot restart Chromium: Sway is not running' }; } + // Disable auto-restart for 15 seconds to prevent restart loop + this.manualRestartUntil = Date.now() + 15000; + try { // Stop existing Chromium await this.processManager.stopBrowser(); @@ -313,8 +317,9 @@ export class EcoDaemon { } // If Sway is running but Chromium died, restart Chromium + // Skip if manual restart is in progress (prevents restart loop) if (this.swayStatus.state === 'running' && this.chromiumStatus.state === 'running' - && !this.processManager.isBrowserRunning()) { + && !(await this.processManager.isBrowserRunning()) && Date.now() > this.manualRestartUntil) { this.log('Chromium process died, attempting restart...'); this.chromiumStatus = { state: 'starting', lastAttempt: new Date().toISOString() }; try { diff --git a/ecoos_daemon/ts/daemon/process-manager.ts b/ecoos_daemon/ts/daemon/process-manager.ts index dd59388..ba9b9bc 100644 --- a/ecoos_daemon/ts/daemon/process-manager.ts +++ b/ecoos_daemon/ts/daemon/process-manager.ts @@ -193,33 +193,23 @@ for_window [app_id="chromium-browser"] fullscreen enable }; // Chromium arguments for kiosk mode on Wayland + // Hardware acceleration is enabled where available but falls back gracefully const browserArgs = [ + // Wayland/Ozone configuration '--ozone-platform=wayland', '--enable-features=UseOzonePlatform', + // Kiosk mode settings '--kiosk', '--no-first-run', '--disable-infobars', '--disable-session-crashed-bubble', '--disable-restore-session-state', + '--noerrdialogs', + // Disable unnecessary features for kiosk '--disable-background-networking', '--disable-sync', '--disable-translate', - '--noerrdialogs', - // Required for VM/headless/sandboxed environments - '--no-sandbox', - '--disable-setuid-sandbox', - '--disable-dev-shm-usage', - // GPU/rendering flags for VM environments - '--disable-gpu', - '--disable-gpu-compositing', - '--disable-gpu-sandbox', - '--disable-software-rasterizer', - '--disable-accelerated-2d-canvas', - '--disable-accelerated-video-decode', - '--use-gl=swiftshader', - '--in-process-gpu', - // Disable features that may cause issues in kiosk mode - '--disable-features=TranslateUI,VizDisplayCompositor', + '--disable-features=TranslateUI', '--disable-hang-monitor', '--disable-breakpad', '--disable-component-update', @@ -281,8 +271,15 @@ for_window [app_id="chromium-browser"] fullscreen enable return this.swayProcess !== null; } - isBrowserRunning(): boolean { - return this.browserProcess !== null; + async isBrowserRunning(): Promise { + // Check if any chromium process is running (Chromium forks, so we can't just track the parent) + try { + const cmd = new Deno.Command('pgrep', { args: ['-f', 'chromium'], stdout: 'null', stderr: 'null' }); + const result = await cmd.output(); + return result.success; + } catch { + return false; + } } async stopSway(): Promise { @@ -335,12 +332,12 @@ for_window [app_id="chromium-browser"] fullscreen enable } })(); - // Monitor process exit + // Monitor process exit - only nullify if still the same process (prevents race condition on restart) process.status.then((status) => { console.log(`[${name}] Process exited with code ${status.code}`); - if (name === 'sway') { + if (name === 'sway' && this.swayProcess === process) { this.swayProcess = null; - } else if (name === 'chromium') { + } else if (name === 'chromium' && this.browserProcess === process) { this.browserProcess = null; } }); diff --git a/ecoos_daemon/ts/ui/server.ts b/ecoos_daemon/ts/ui/server.ts index bd1f576..468c206 100644 --- a/ecoos_daemon/ts/ui/server.ts +++ b/ecoos_daemon/ts/ui/server.ts @@ -5,6 +5,7 @@ */ import type { EcoDaemon } from '../daemon/index.ts'; +import { VERSION } from '../version.ts'; export class UIServer { private port: number; @@ -137,7 +138,19 @@ export class UIServer { padding: 20px; } .container { max-width: 1200px; margin: 0 auto; } - h1 { font-size: 24px; margin-bottom: 20px; } + .header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + } + h1 { font-size: 24px; margin: 0; } + .clock { + font-size: 18px; + font-weight: 500; + color: var(--text); + font-variant-numeric: tabular-nums; + } .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); @@ -240,7 +253,10 @@ export class UIServer {
-

EcoOS Management

+
+

EcoOS Management v${VERSION}

+
+

Services

@@ -528,6 +544,24 @@ export class UIServer { updateStatus(JSON.parse(e.data)); } catch {} }; + + // Clock update + function updateClock() { + const now = new Date(); + const options = { + weekday: 'short', + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false + }; + document.getElementById('clock').textContent = now.toLocaleString('en-US', options); + } + updateClock(); + setInterval(updateClock, 1000); `; diff --git a/ecoos_daemon/ts/version.ts b/ecoos_daemon/ts/version.ts new file mode 100644 index 0000000..6fa18df --- /dev/null +++ b/ecoos_daemon/ts/version.ts @@ -0,0 +1 @@ +export const VERSION = "0.1.1"; diff --git a/isobuild/config/includes.chroot/opt/eco/bin/eco-daemon b/isobuild/config/includes.chroot/opt/eco/bin/eco-daemon index 7016f6e697051c325f5e7b9817d7afedff88850b..ceb084a50f2d8f6a63b102d306492fae8b34d373 100755 GIT binary patch delta 8488 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 X7sM-v&fRRYi_~VDee`1I|1JIl$D1CC delta 5986 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 VrvLWqtaGWZv(D@%WS!N|e*sY<6Bhsg diff --git a/isotest/run-test.sh b/isotest/run-test.sh index d564a20..d3c478f 100755 --- a/isotest/run-test.sh +++ b/isotest/run-test.sh @@ -48,28 +48,28 @@ else echo "KVM not available, using software emulation (slower)" fi -# Start QEMU headless with VNC and serial console +# Start QEMU with VirtIO-GPU (VirGL OpenGL acceleration) and serial console > "$SERIAL_LOG" # Clear old log qemu-system-x86_64 \ $KVM_OPTS \ -m 4G \ - -smp 2 \ + -smp 4 \ -bios /usr/share/qemu/OVMF.fd \ -drive file="$ISO_PATH",media=cdrom \ -drive file="$DISK_PATH",format=qcow2,if=virtio \ - -vga qxl \ + -device virtio-vga \ -display none \ - -vnc :0 \ + -spice port=5930,disable-ticketing=on \ -serial unix:"$SERIAL_SOCK",server,nowait \ -monitor unix:"$MONITOR_SOCK",server,nowait \ -nic user,model=virtio-net-pci,hostfwd=tcp::3006-:3006,hostfwd=tcp::2222-:22 \ - -daemonize \ - -pidfile "$PID_FILE" + -pidfile "$PID_FILE" & echo "" +sleep 1 echo "=== EcoOS Test VM Started ===" -echo "PID: $(cat $PID_FILE)" -echo "VNC: localhost:5900" +echo "PID: $(cat $PID_FILE 2>/dev/null || echo 'running')" +echo "SPICE: spicy -h localhost -p 5930" echo "Serial Log: $SERIAL_LOG" echo "Management UI: http://localhost:3006" echo "" diff --git a/package.json b/package.json index 28835a4..a9db80d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,9 @@ { "name": "@ecobridge/eco-os", + "version": "0.1.1", "private": true, "scripts": { - "build": "pnpm run daemon:bundle && cp ecoos_daemon/bundle/eco-daemon isobuild/config/includes.chroot/opt/eco/bin/ && mkdir -p .nogit/iso && docker build --no-cache -t ecoos-builder -f isobuild/Dockerfile . && docker run --rm --privileged -v $(pwd)/.nogit/iso:/output ecoos-builder", + "build": "npm version patch --no-git-tag-version && node -e \"const v=require('./package.json').version; require('fs').writeFileSync('ecoos_daemon/ts/version.ts', 'export const VERSION = \\\"'+v+'\\\";\\n');\" && pnpm run daemon:bundle && cp ecoos_daemon/bundle/eco-daemon isobuild/config/includes.chroot/opt/eco/bin/ && mkdir -p .nogit/iso && docker build --no-cache -t ecoos-builder -f isobuild/Dockerfile . && docker run --rm --privileged -v $(pwd)/.nogit/iso:/output ecoos-builder", "daemon:dev": "cd ecoos_daemon && deno run --allow-all --watch mod.ts", "daemon:start": "cd ecoos_daemon && deno run --allow-all mod.ts", "daemon:bundle": "cd ecoos_daemon && deno compile --allow-all --output bundle/eco-daemon mod.ts",