Files
mai-bot/scripts/verify_a_memorix_webui.sh

84 lines
2.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DASHBOARD_ROOT="$REPO_ROOT/dashboard"
OUTPUT_DIR="${MAIBOT_UI_SNAPSHOT_DIR:-$REPO_ROOT/tmp/ui-snapshots/a_memorix-electron}"
PYTHON_BIN="${MAIBOT_PYTHON_BIN:-$REPO_ROOT/../../.venv/bin/python}"
ELECTRON_BIN="${MAIBOT_ELECTRON_BIN:-$DASHBOARD_ROOT/node_modules/electron/dist/Electron.app/Contents/MacOS/Electron}"
DRIVER_SCRIPT="$DASHBOARD_ROOT/scripts/a_memorix_electron_validate.cjs"
BACKEND_SCRIPT="$REPO_ROOT/scripts/run_a_memorix_webui_backend.py"
BACKEND_HOST="${MAIBOT_WEBUI_HOST:-127.0.0.1}"
BACKEND_PORT="${MAIBOT_WEBUI_PORT:-8001}"
DASHBOARD_HOST="${MAIBOT_DASHBOARD_HOST:-127.0.0.1}"
DASHBOARD_PORT="${MAIBOT_DASHBOARD_PORT:-7999}"
BACKEND_URL="http://${BACKEND_HOST}:${BACKEND_PORT}"
DASHBOARD_URL="http://${DASHBOARD_HOST}:${DASHBOARD_PORT}"
REUSE_SERVICES="${MAIBOT_UI_REUSE_SERVICES:-0}"
BACKEND_PID=""
DASHBOARD_PID=""
mkdir -p "$OUTPUT_DIR"
cleanup() {
local exit_code=$?
if [[ -n "$DASHBOARD_PID" ]] && kill -0 "$DASHBOARD_PID" >/dev/null 2>&1; then
kill "$DASHBOARD_PID" >/dev/null 2>&1 || true
wait "$DASHBOARD_PID" >/dev/null 2>&1 || true
fi
if [[ -n "$BACKEND_PID" ]] && kill -0 "$BACKEND_PID" >/dev/null 2>&1; then
kill "$BACKEND_PID" >/dev/null 2>&1 || true
wait "$BACKEND_PID" >/dev/null 2>&1 || true
fi
exit "$exit_code"
}
trap cleanup EXIT
wait_for_url() {
local url="$1"
local label="$2"
local timeout="${3:-60}"
local started_at
started_at="$(date +%s)"
while true; do
if env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY NO_PROXY=127.0.0.1,localhost \
curl -fsS "$url" >/dev/null 2>&1; then
return 0
fi
if (( "$(date +%s)" - started_at >= timeout )); then
echo "Timed out waiting for ${label}: ${url}" >&2
return 1
fi
sleep 1
done
}
if [[ "$REUSE_SERVICES" != "1" ]]; then
if ! env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY NO_PROXY=127.0.0.1,localhost \
curl -fsS "${BACKEND_URL}/api/webui/health" >/dev/null 2>&1; then
(
cd "$REPO_ROOT"
WEBUI_HOST="$BACKEND_HOST" WEBUI_PORT="$BACKEND_PORT" "$PYTHON_BIN" "$BACKEND_SCRIPT"
) >"$OUTPUT_DIR/backend.log" 2>&1 &
BACKEND_PID="$!"
wait_for_url "${BACKEND_URL}/api/webui/health" "MaiBot WebUI backend" 120
fi
if ! env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY NO_PROXY=127.0.0.1,localhost \
curl -fsS "${DASHBOARD_URL}/auth" >/dev/null 2>&1; then
(
cd "$DASHBOARD_ROOT"
npm run dev -- --host "$DASHBOARD_HOST" --port "$DASHBOARD_PORT"
) >"$OUTPUT_DIR/dashboard.log" 2>&1 &
DASHBOARD_PID="$!"
wait_for_url "${DASHBOARD_URL}/auth" "dashboard dev server" 120
fi
fi
env -u ELECTRON_RUN_AS_NODE \
MAIBOT_DASHBOARD_URL="$DASHBOARD_URL" \
MAIBOT_UI_SNAPSHOT_DIR="$OUTPUT_DIR" \
"$ELECTRON_BIN" "$DRIVER_SCRIPT"