130 lines
4.0 KiB
Bash
Executable File
130 lines
4.0 KiB
Bash
Executable File
#!/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}"
|