lesavka/scripts/manual/run_hevc_remote_reentry_check.sh

130 lines
4.0 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Manual: HEVC remote re-entry check for operator-driven lab recovery; not part of CI.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
STAMP="$(date +%Y%m%d-%H%M%S)"
REMOTE_HOST="${LESAVKA_HEVC_REENTRY_HOST:-theia}"
REMOTE_REPO="${LESAVKA_HEVC_REENTRY_REMOTE_REPO:-/home/theia/Development/lesavka-codex}"
MODE="${LESAVKA_HEVC_REENTRY_MODE:-1280x720@30}"
CODEC="${LESAVKA_HEVC_REENTRY_CODEC:-hevc}"
SYNC_REPO="${LESAVKA_HEVC_REENTRY_SYNC:-0}"
BUILD_RELEASE="${LESAVKA_HEVC_REENTRY_BUILD:-0}"
DEPLOY="${LESAVKA_HEVC_REENTRY_DEPLOY:-0}"
RECONFIGURE="${LESAVKA_HEVC_REENTRY_RECONFIGURE:-0}"
OUTPUT_DIR="${LESAVKA_HEVC_REENTRY_OUTPUT_DIR:-/tmp/lesavka-hevc-reentry-${STAMP}}"
RUN_LOG="${OUTPUT_DIR}/hevc-reentry.log"
WAIT_SECONDS="${LESAVKA_HEVC_REENTRY_WAIT_SECONDS:-0}"
WAIT_INTERVAL_SECONDS="${LESAVKA_HEVC_REENTRY_WAIT_INTERVAL_SECONDS:-15}"
SSH_OPTS=${SSH_OPTS:-"-o BatchMode=yes -o ConnectTimeout=8"}
mkdir -p "${OUTPUT_DIR}"
echo "==> HEVC remote re-entry check"
echo " ↪ host=${REMOTE_HOST}"
echo " ↪ remote_repo=${REMOTE_REPO}"
echo " ↪ mode=${MODE} codec=${CODEC}"
echo " ↪ sync=${SYNC_REPO} build=${BUILD_RELEASE} deploy=${DEPLOY} reconfigure=${RECONFIGURE}"
echo " ↪ wait_seconds=${WAIT_SECONDS} wait_interval_seconds=${WAIT_INTERVAL_SECONDS}"
echo " ↪ run_log=${RUN_LOG}"
echo " ↪ sudo is non-interactive only; this script will not prompt for passwords"
run_ssh() {
# shellcheck disable=SC2086
ssh ${SSH_OPTS} "${REMOTE_HOST}" "$@"
}
sync_repo_to_remote() {
if command -v rsync >/dev/null 2>&1 && run_ssh 'command -v rsync >/dev/null 2>&1'; then
rsync -az --delete \
--exclude .git \
--exclude target \
--exclude '*.profraw' \
"${REPO_ROOT}/" "${REMOTE_HOST}:${REMOTE_REPO}/"
return
fi
echo " ↪ rsync unavailable on one side; falling back to git-file tar-over-SSH sync without remote delete"
if command -v git >/dev/null 2>&1; then
(
cd "${REPO_ROOT}"
git ls-files -z --cached --others --exclude-standard \
| tar --null -T - -czf -
) | run_ssh "mkdir -p '${REMOTE_REPO}' && tar -xzf - -C '${REMOTE_REPO}'"
return
fi
echo " ↪ git unavailable locally; using strict source tar excludes"
(
cd "${REPO_ROOT}"
tar \
--exclude './.git' \
--exclude './target' \
--exclude './target/*' \
--exclude '*/target' \
--exclude '*/target/*' \
--exclude '*.profraw' \
-czf - .
) | run_ssh "mkdir -p '${REMOTE_REPO}' && tar -xzf - -C '${REMOTE_REPO}'"
}
wait_for_remote() {
local deadline now attempt
if [[ "${WAIT_SECONDS}" == "0" ]]; then
run_ssh 'date -Is'
return
fi
deadline=$((SECONDS + WAIT_SECONDS))
attempt=1
while true; do
echo "== remote reachability attempt ${attempt} =="
if run_ssh 'date -Is'; then
return
fi
now="${SECONDS}"
if (( now >= deadline )); then
echo "remote host did not become reachable within ${WAIT_SECONDS}s" >&2
return 1
fi
sleep "${WAIT_INTERVAL_SECONDS}"
attempt=$((attempt + 1))
done
}
(
echo "== remote reachability =="
wait_for_remote
echo "== lesavka helper status =="
run_ssh 'sudo -n /usr/local/sbin/lesavka-dev-install status'
if [[ "${SYNC_REPO}" == "1" ]]; then
echo "== syncing local repo to remote workspace =="
sync_repo_to_remote
fi
if [[ "${BUILD_RELEASE}" == "1" ]]; then
echo "== remote release build =="
run_ssh "cd '${REMOTE_REPO}' && cargo build --release --bin lesavka-server --bin lesavka-uvc"
fi
if [[ "${DEPLOY}" == "1" ]]; then
echo "== remote deploy =="
run_ssh 'sudo -n /usr/local/sbin/lesavka-dev-install deploy'
fi
if [[ "${RECONFIGURE}" == "1" ]]; then
echo "== remote HEVC reconfigure =="
run_ssh "sudo -n /usr/local/sbin/lesavka-dev-install reconfigure '${MODE}' '${CODEC}'"
fi
echo "== final status =="
run_ssh 'sudo -n /usr/local/sbin/lesavka-dev-install status'
) 2>&1 | tee "${RUN_LOG}"
echo "==> done"
echo "artifact_dir: ${OUTPUT_DIR}"
echo "run_log: ${RUN_LOG}"