diff --git a/scripts/manual/run_server_to_rc_mode_matrix.sh b/scripts/manual/run_server_to_rc_mode_matrix.sh index ec61d41..42072d8 100755 --- a/scripts/manual/run_server_to_rc_mode_matrix.sh +++ b/scripts/manual/run_server_to_rc_mode_matrix.sh @@ -52,6 +52,7 @@ LESAVKA_SERVER_RC_RECONFIGURE_SETTLE_SECONDS=${LESAVKA_SERVER_RC_RECONFIGURE_SET LESAVKA_SERVER_RC_RECONFIGURE_VERBOSE=${LESAVKA_SERVER_RC_RECONFIGURE_VERBOSE:-0} LESAVKA_SERVER_RC_PROMPT_SUDO_EARLY=${LESAVKA_SERVER_RC_PROMPT_SUDO_EARLY:-1} LESAVKA_SERVER_RC_REMOTE_SUDO_PASSWORD=${LESAVKA_SERVER_RC_REMOTE_SUDO_PASSWORD:-} +LESAVKA_SERVER_RC_START_DELAY_SECONDS=${LESAVKA_SERVER_RC_START_DELAY_SECONDS:-0} LESAVKA_SERVER_RC_WAIT_TETHYS_READY=${LESAVKA_SERVER_RC_WAIT_TETHYS_READY:-1} LESAVKA_SERVER_RC_TETHYS_READY_TIMEOUT_SECONDS=${LESAVKA_SERVER_RC_TETHYS_READY_TIMEOUT_SECONDS:-60} LESAVKA_SERVER_RC_TETHYS_SETTLE_SECONDS=${LESAVKA_SERVER_RC_TETHYS_SETTLE_SECONDS:-6} @@ -508,6 +509,17 @@ true REMOTE_SUDO_PRIME } +sleep_start_delay() { + [[ "${LESAVKA_SERVER_RC_START_DELAY_SECONDS}" != "0" ]] || return 0 + if [[ ! "${LESAVKA_SERVER_RC_START_DELAY_SECONDS}" =~ ^[0-9]+([.][0-9]+)?$ ]]; then + printf 'LESAVKA_SERVER_RC_START_DELAY_SECONDS must be a non-negative number, got %s\n' "${LESAVKA_SERVER_RC_START_DELAY_SECONDS}" >&2 + exit 64 + fi + echo "==> delaying server-to-RC matrix start for ${LESAVKA_SERVER_RC_START_DELAY_SECONDS}s" + echo " ↪ remote sudo has already been primed; sleeping before prebuild/reconfigure/capture" + sleep "${LESAVKA_SERVER_RC_START_DELAY_SECONDS}" +} + prebuild_probe_tools() { [[ "${LESAVKA_SERVER_RC_PROBE_PREBUILD}" != "0" ]] || return 0 echo "==> prebuilding relay control/analyzer once for the mode matrix" @@ -1357,9 +1369,11 @@ echo " ↪ tune_delays=${LESAVKA_SERVER_RC_TUNE_DELAYS} confirm=${LESAVKA_SERV echo " ↪ freshness_limit_ms=${LESAVKA_SERVER_RC_FRESHNESS_MAX_AGE_MS} min_pairs=${LESAVKA_SERVER_RC_FRESHNESS_MIN_PAIRS}" echo " ↪ reconfigure=${LESAVKA_SERVER_RC_RECONFIGURE} strategy=${LESAVKA_SERVER_RC_RECONFIGURE_STRATEGY} allow_gadget_reset=${LESAVKA_SERVER_RC_ALLOW_GADGET_RESET}" echo " ↪ tethys_ready=${LESAVKA_SERVER_RC_WAIT_TETHYS_READY} settle=${LESAVKA_SERVER_RC_TETHYS_SETTLE_SECONDS}s timeout=${LESAVKA_SERVER_RC_TETHYS_READY_TIMEOUT_SECONDS}s preroll_discard=${LESAVKA_SERVER_RC_PREROLL_DISCARD_SECONDS}s" +echo " ↪ start_delay=${LESAVKA_SERVER_RC_START_DELAY_SECONDS}s" echo " ↪ artifact_dir=${MATRIX_REPORT_DIR}" prime_remote_sudo +sleep_start_delay prebuild_probe_tools IFS=',' read -r -a modes <<<"${LESAVKA_SERVER_RC_MODES}" diff --git a/testing/tests/client_manual_sync_script_contract.rs b/testing/tests/client_manual_sync_script_contract.rs index 41e8857..cdc376a 100644 --- a/testing/tests/client_manual_sync_script_contract.rs +++ b/testing/tests/client_manual_sync_script_contract.rs @@ -363,6 +363,7 @@ fn server_rc_mode_matrix_validates_advertised_uvc_profiles() { "LESAVKA_SERVER_RC_ALLOW_GADGET_RESET=${LESAVKA_SERVER_RC_ALLOW_GADGET_RESET:-1}", "LESAVKA_SERVER_RC_RECONFIGURE_VERBOSE=${LESAVKA_SERVER_RC_RECONFIGURE_VERBOSE:-0}", "LESAVKA_SERVER_RC_PROMPT_SUDO_EARLY=${LESAVKA_SERVER_RC_PROMPT_SUDO_EARLY:-1}", + "LESAVKA_SERVER_RC_START_DELAY_SECONDS=${LESAVKA_SERVER_RC_START_DELAY_SECONDS:-0}", "LESAVKA_SERVER_RC_WAIT_TETHYS_READY=${LESAVKA_SERVER_RC_WAIT_TETHYS_READY:-1}", "LESAVKA_SERVER_RC_TETHYS_READY_TIMEOUT_SECONDS=${LESAVKA_SERVER_RC_TETHYS_READY_TIMEOUT_SECONDS:-60}", "LESAVKA_SERVER_RC_TETHYS_SETTLE_SECONDS=${LESAVKA_SERVER_RC_TETHYS_SETTLE_SECONDS:-6}", @@ -376,6 +377,11 @@ fn server_rc_mode_matrix_validates_advertised_uvc_profiles() { "LESAVKA_SERVER_RC_TUNE_MIN_CHANGE_US=${LESAVKA_SERVER_RC_TUNE_MIN_CHANGE_US:-5000}", "Theia sudo password for %s", "==> priming remote sudo on ${LESAVKA_SERVER_HOST}", + "sleep_start_delay", + "==> delaying server-to-RC matrix start for ${LESAVKA_SERVER_RC_START_DELAY_SECONDS}s", + "remote sudo has already been primed; sleeping before prebuild/reconfigure/capture", + "LESAVKA_SERVER_RC_START_DELAY_SECONDS must be a non-negative number", + "start_delay=${LESAVKA_SERVER_RC_START_DELAY_SECONDS}s", "==> prebuilding relay control/analyzer once for the mode matrix", "LESAVKA_SERVER_RC_MODES=auto", "discover_local_webcam_modes", @@ -451,6 +457,16 @@ fn server_rc_mode_matrix_validates_advertised_uvc_profiles() { "server-to-RC mode matrix script should contain {expected}" ); } + let prime = SERVER_RC_MODE_MATRIX_SCRIPT + .find("prime_remote_sudo\nsleep_start_delay\nprebuild_probe_tools") + .expect("matrix should prime remote sudo before delayed start and prebuild"); + let prompt = SERVER_RC_MODE_MATRIX_SCRIPT + .find("Theia sudo password for %s") + .expect("matrix should contain the immediate Theia password prompt"); + assert!( + prompt < prime, + "password prompt machinery should be defined before the matrix startup sequence" + ); } #[test]