From 83b34a1b92a08c6bdcae0c1785746f8173ffbb41 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Thu, 8 Jan 2026 00:59:14 -0300 Subject: [PATCH] server: split uvc helper service --- scripts/daemon/lesavka-uvc.sh | 10 ++++++++++ scripts/install/server.sh | 25 +++++++++++++++++++++++++ server/src/main.rs | 8 ++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 scripts/daemon/lesavka-uvc.sh diff --git a/scripts/daemon/lesavka-uvc.sh b/scripts/daemon/lesavka-uvc.sh new file mode 100644 index 0000000..25c3cd0 --- /dev/null +++ b/scripts/daemon/lesavka-uvc.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# scripts/daemon/lesavka-uvc.sh - launch UVC control helper as a standalone service +set -euo pipefail + +DEV=${LESAVKA_UVC_DEV:-/dev/v4l/by-path/platform-1000480000.usb-video-index0} +if [[ ! -e "$DEV" ]]; then + DEV=/dev/video0 +fi + +exec /usr/local/bin/lesavka-uvc --device "$DEV" diff --git a/scripts/install/server.sh b/scripts/install/server.sh index 73d3a0d..a09d703 100755 --- a/scripts/install/server.sh +++ b/scripts/install/server.sh @@ -137,6 +137,7 @@ echo "==> 5. Install binaries" sudo install -Dm755 "$SRC_DIR/server/target/release/lesavka-server" /usr/local/bin/lesavka-server sudo install -Dm755 "$SRC_DIR/server/target/release/lesavka-uvc" /usr/local/bin/lesavka-uvc sudo install -Dm755 "$SRC_DIR/scripts/daemon/lesavka-core.sh" /usr/local/bin/lesavka-core.sh +sudo install -Dm755 "$SRC_DIR/scripts/daemon/lesavka-uvc.sh" /usr/local/bin/lesavka-uvc.sh echo "==> 6a. Systemd units - lesavka-core" cat <<'UNIT' | sudo tee /etc/systemd/system/lesavka-core.service >/dev/null @@ -178,6 +179,7 @@ Environment=RUST_LOG=lesavka_server=info,lesavka_server::audio=info,lesavka_serv Environment=RUST_BACKTRACE=1 Environment=GST_DEBUG="*:2,alsasink:6,alsasrc:6" Environment=LESAVKA_UVC_CODEC=mjpeg +Environment=LESAVKA_UVC_EXTERNAL=1 Restart=always RestartSec=5 StandardError=append:/tmp/lesavka-server.stderr @@ -194,6 +196,29 @@ sudo systemctl enable --now lesavka-core sudo systemctl restart lesavka-core echo "✅ lesavka-core installed and restarted..." +cat <<'UNIT' | sudo tee /etc/systemd/system/lesavka-uvc.service >/dev/null +[Unit] +Description=lesavka UVC control helper +After=lesavka-core.service +Requires=lesavka-core.service + +[Service] +ExecStart=/usr/local/bin/lesavka-uvc.sh +Restart=always +RestartSec=2 +KillSignal=SIGTERM +TimeoutStopSec=10 +StandardError=append:/tmp/lesavka-uvc.stderr +User=root + +[Install] +WantedBy=multi-user.target +UNIT + +sudo systemctl enable --now lesavka-uvc +sudo systemctl restart lesavka-uvc +echo "✅ lesavka-uvc installed and restarted..." + sudo systemctl enable --now lesavka-server sudo systemctl restart lesavka-server echo "✅ lesavka-server installed and restarted..." diff --git a/server/src/main.rs b/server/src/main.rs index 8247301..a7f2e5e 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -476,8 +476,12 @@ async fn main() -> anyhow::Result<()> { let gadget = UsbGadget::new("lesavka"); if std::env::var("LESAVKA_DISABLE_UVC").is_err() { - let bin = uvc_ctrl_bin(); - tokio::spawn(supervise_uvc_control(bin)); + if std::env::var("LESAVKA_UVC_EXTERNAL").is_ok() { + info!("📷 UVC control helper external; not spawning"); + } else { + let bin = uvc_ctrl_bin(); + tokio::spawn(supervise_uvc_control(bin)); + } } else { info!("📷 UVC disabled (LESAVKA_DISABLE_UVC set)"); }