diff --git a/scripts/install/server.sh b/scripts/install/server.sh index df269af..d145402 100755 --- a/scripts/install/server.sh +++ b/scripts/install/server.sh @@ -251,6 +251,44 @@ run_as_user() { sudo -u "$ORIG_USER" env HOME="$USER_HOME" SSH_AUTH_SOCK="${SSH_AUTH_SOCK:-}" "$@" } +CAPTURE_DISCOVERY_RELAY_PRESENT=0 +CAPTURE_DISCOVERY_RELAY_WAS_ACTIVE=0 +CAPTURE_DISCOVERY_POWER_BORROWED=0 + +prepare_capture_power_for_discovery() { + if ! systemctl list-unit-files | grep -q '^relay.service'; then + return 0 + fi + + CAPTURE_DISCOVERY_RELAY_PRESENT=1 + if systemctl is-active --quiet relay.service; then + CAPTURE_DISCOVERY_RELAY_WAS_ACTIVE=1 + return 0 + fi + + echo " ↪ borrowing relay GPIO power for capture discovery" + sudo systemctl start relay.service + CAPTURE_DISCOVERY_POWER_BORROWED=1 + sudo udevadm settle --timeout=10 || true + sleep 2 +} + +restore_capture_power_after_discovery() { + if [ "${CAPTURE_DISCOVERY_RELAY_PRESENT:-0}" -eq 0 ]; then + return 0 + fi + if [ "${CAPTURE_DISCOVERY_POWER_BORROWED:-0}" -eq 0 ]; then + return 0 + fi + if [ "${CAPTURE_DISCOVERY_RELAY_WAS_ACTIVE:-0}" -ne 0 ]; then + return 0 + fi + + echo " ↪ returning relay GPIO power control to Lesavka auto mode" + sudo systemctl stop relay.service || true + CAPTURE_DISCOVERY_POWER_BORROWED=0 +} + while [[ $# -gt 0 ]]; do case $1 in -r|--ref) REF="$2"; shift 2 ;; @@ -314,11 +352,8 @@ EOF prepare_hdmi_detection_boot_state echo "==> 2b. Predictable /dev names for each capture card" -# ensure relay (GPIO power) is on if present -if systemctl list-unit-files | grep -q '^relay.service'; then - sudo systemctl enable --now relay.service - sleep 2 -fi +prepare_capture_power_for_discovery +trap restore_capture_power_after_discovery EXIT discover_gc_capture_pairs() { for dev in /dev/video*; do @@ -378,6 +413,8 @@ EOF sudo udevadm settle fi fi +restore_capture_power_after_discovery +trap - EXIT echo "==> 3. Rust toolchain" sudo rustup default stable diff --git a/testing/tests/server_install_script_contract.rs b/testing/tests/server_install_script_contract.rs index 58ee426..97b4f51 100644 --- a/testing/tests/server_install_script_contract.rs +++ b/testing/tests/server_install_script_contract.rs @@ -74,6 +74,18 @@ fn server_install_builds_eye_links_from_capture_nodes_only() { SERVER_INSTALL.contains("for _ in {1..20}; do"), "install script should wait briefly for both GC311 capture nodes to finish enumerating" ); + assert!( + SERVER_INSTALL.contains("borrowing relay GPIO power for capture discovery"), + "install script should temporarily power capture cards for discovery when relay GPIO is available" + ); + assert!( + SERVER_INSTALL.contains("returning relay GPIO power control to Lesavka auto mode"), + "install script should restore relay power control after capture discovery" + ); + assert!( + SERVER_INSTALL.contains("trap restore_capture_power_after_discovery EXIT"), + "install script should restore borrowed capture power even if discovery exits early" + ); assert!( SERVER_INSTALL.contains("[ \"$LEFT_TAG\" = \"$RIGHT_TAG\" ]"), "install script should refuse duplicated path tags instead of assigning both eyes to one card"