Files
44r0n7 0265afa054 chore: bootstrap lean sysadmin-chronicles repo
Import the runnable game code, content, docs, scripts, and repo guidance while leaving local agent state, dependency installs, build output, and backup copies out of the published tree.
2026-05-02 11:49:07 -04:00

100 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# start-game.sh — Start the redesign server and open the workstation display.
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SERVER_DIR="$PROJECT_ROOT/server"
FRONTEND_DIR="$PROJECT_ROOT/frontend"
DOMAIN="${SC_WORKSTATION_DOMAIN:-sc-workstation}"
PORT="${PORT:-3000}"
LIBVIRT_URI="${LIBVIRT_DEFAULT_URI:-qemu:///system}"
export PORT
export LIBVIRT_DEFAULT_URI="$LIBVIRT_URI"
source "$PROJECT_ROOT/tools/lib/internal-https.sh"
sc_ensure_internal_certs "$PROJECT_ROOT"
sc_export_internal_https_env
if ! command -v virsh >/dev/null 2>&1; then
echo "ERROR: virsh is required." >&2
exit 1
fi
if ! command -v node >/dev/null 2>&1; then
echo "ERROR: node is required. Install Node.js 18+." >&2
exit 1
fi
# Ensure server dependencies are installed
if [ ! -d "$SERVER_DIR/node_modules" ]; then
echo "Installing server dependencies..."
(cd "$SERVER_DIR" && npm install --silent)
fi
# Ensure frontend is built
if [ ! -f "$FRONTEND_DIR/dist/index.html" ]; then
echo "Building frontend..."
if [ ! -d "$FRONTEND_DIR/node_modules" ]; then
(cd "$FRONTEND_DIR" && npm install --silent)
fi
(cd "$FRONTEND_DIR" && npm run build --silent)
fi
if ! virsh --connect "$LIBVIRT_URI" dominfo "$DOMAIN" >/dev/null 2>&1; then
echo "ERROR: missing workstation domain: $DOMAIN" >&2
echo "Run: bash tools/vm/build-workstation.sh --force" >&2
exit 1
fi
_ensure_server_port() {
local pids=""
pids="$(sc_listen_pids "$PORT" || true)"
if [ -z "$pids" ]; then
return 0
fi
local pid
for pid in $pids; do
if ! sc_pid_is_repo_server "$pid" "$PROJECT_ROOT"; then
echo "ERROR: port $PORT is already in use by an unrelated process (pid $pid)." >&2
echo "Stop that process or set PORT to a free port before launching." >&2
exit 1
fi
if sc_pid_has_internal_tls "$pid"; then
return 1
fi
done
echo "Restarting existing Sysadmin Chronicles server on port $PORT with HTTPS enabled..."
for pid in $pids; do
sc_stop_pid "$pid"
done
return 0
}
if _ensure_server_port; then
(
cd "$SERVER_DIR"
node src/index.js
) &
SERVER_PID=$!
trap 'kill "$SERVER_PID" >/dev/null 2>&1 || true' EXIT
sleep 1
fi
state="$(virsh --connect "$LIBVIRT_URI" domstate "$DOMAIN" 2>/dev/null || true)"
if [ "$state" != "running" ]; then
virsh --connect "$LIBVIRT_URI" start "$DOMAIN" >/dev/null
fi
if command -v remote-viewer >/dev/null 2>&1; then
spice_uri="$(virsh --connect "$LIBVIRT_URI" domdisplay "$DOMAIN" 2>/dev/null | grep spice | head -n1 || true)"
if [ -n "$spice_uri" ]; then
exec remote-viewer "$spice_uri"
fi
fi
exec bash "$PROJECT_ROOT/runtime/viewer/launch-spice-viewer.sh" "$DOMAIN"