From 617a1d844f4ea564c1c141dcb02cd0f8d17cd9ae Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Wed, 7 Jan 2026 04:47:39 -0300 Subject: [PATCH] server: detach gadget on stop --- scripts/daemon/lesavka-core.sh | 60 +++++++++++++++++++++++++++++++++- scripts/install/server.sh | 4 +++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/scripts/daemon/lesavka-core.sh b/scripts/daemon/lesavka-core.sh index 9d3ae15..73fd0ac 100644 --- a/scripts/daemon/lesavka-core.sh +++ b/scripts/daemon/lesavka-core.sh @@ -6,6 +6,65 @@ set -euo pipefail log() { printf '[lesavka-core] %s\n' "$*"; } + +G=/sys/kernel/config/usb_gadget/lesavka + +find_udc() { + ls /sys/class/udc 2>/dev/null | head -n1 || true +} + +detach_gadget() { + local udc="" + udc="$(find_udc)" + if [[ -n $udc && -w /sys/class/udc/$udc/soft_connect ]]; then + echo 0 >"/sys/class/udc/$udc/soft_connect" 2>/dev/null || true + fi + if [[ -e $G/UDC ]]; then + echo "" >"$G/UDC" 2>/dev/null || true + fi + if [[ -n $udc && -f /sys/class/udc/$udc/state ]]; then + local state + state="$(cat "/sys/class/udc/$udc/state" 2>/dev/null || true)" + log "detached (state=${state:-unknown})" + else + log "detached (no UDC state)" + fi +} + +attach_gadget() { + if [[ ! -d $G ]]; then + log "gadget path missing; need full setup" + return 1 + fi + local udc="" + udc="$(find_udc)" + if [[ -z $udc ]]; then + log "UDC not found; need full setup" + return 1 + fi + if [[ -e $G/UDC ]]; then + echo "$udc" >"$G/UDC" 2>/dev/null || true + fi + log "attached to $udc" + return 0 +} + +case "${1:-}" in + --detach) + detach_gadget + exit 0 + ;; + --attach) + if attach_gadget; then + exit 0 + fi + ;; + --help|-h) + echo "Usage: $0 [--attach|--detach]" + exit 0 + ;; +esac + cleanup() { echo "" >"$G/UDC" 2>/dev/null || true; } DISABLE_UAC=${LESAVKA_DISABLE_UAC:-} @@ -100,7 +159,6 @@ log "✅ UDC detected: $UDC" # 3. (Re‑)create gadget #────────────────────────────────────────────────── mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config -G=/sys/kernel/config/usb_gadget/lesavka if [[ -d $G ]]; then echo '' >"$G/UDC" 2>/dev/null || true diff --git a/scripts/install/server.sh b/scripts/install/server.sh index 575d62e..e4307a9 100755 --- a/scripts/install/server.sh +++ b/scripts/install/server.sh @@ -166,7 +166,11 @@ Description=lesavka gRPC relay After=network.target lesavka-core.service [Service] +ExecStartPre=/usr/local/bin/lesavka-core.sh --attach ExecStart=/usr/local/bin/lesavka-server +ExecStopPre=/usr/local/bin/lesavka-core.sh --detach +TimeoutStopSec=10 +KillSignal=SIGTERM Restart=always Environment=RUST_LOG=lesavka_server=info,lesavka_server::audio=info,lesavka_server::video=debug,lesavka_server::gadget=info Environment=RUST_BACKTRACE=1