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.
This commit is contained in:
Executable
+99
@@ -0,0 +1,99 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user