File: //workspace/rollout/apply-mission-control-fix.sh
#!/usr/bin/env bash
set -euo pipefail
if [[ "${I_UNDERSTAND_THIS_RESTARTS_SERVICES:-}" != "YES" ]]; then
cat >&2 <<'MSG'
Refusing to run without explicit confirmation.
Re-run with:
I_UNDERSTAND_THIS_RESTARTS_SERVICES=YES ./apply-mission-control-fix.sh
MSG
exit 1
fi
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
REPO=/home/altaira.panomity.com/openclaw-mission-control
FRONTEND_DIR="$REPO/frontend"
VHOST=/usr/local/lsws/conf/vhosts/altaira.panomity.com/vhost.conf
SNIPPET="$SCRIPT_DIR/mission-control-litespeed-snippet.conf"
PATCH="$SCRIPT_DIR/mission-control-frontend.patch"
EXPECTED_NEXT="$SCRIPT_DIR/frontend-next.config.ts.expected"
EXPECTED_ROUTE="$SCRIPT_DIR/frontend-route.ts.expected"
STAMP=$(date -u +%Y%m%d-%H%M%S)
BACKUP="$VHOST.bak.$STAMP"
frontend_fix_present() {
cmp -s "$FRONTEND_DIR/next.config.ts" "$EXPECTED_NEXT" \
&& cmp -s "$FRONTEND_DIR/src/app/api/[...path]/route.ts" "$EXPECTED_ROUTE"
}
cd "$REPO"
echo "[1/6] Applying frontend patch if needed"
if git apply --check "$PATCH" 2>/dev/null; then
git apply --index --reject "$PATCH"
echo "Frontend patch applied."
elif frontend_fix_present; then
echo "Frontend fix already present in working tree; skipping apply."
else
if git apply --reverse --check "$PATCH" 2>/dev/null; then
echo "Frontend patch already present; skipping apply."
else
echo "Frontend patch does not apply cleanly and the expected frontend fix is not present." >&2
exit 1
fi
fi
echo "[2/6] Building frontend"
cd "$FRONTEND_DIR"
npm run build
cd "$REPO"
echo "[3/6] Backing up LiteSpeed vhost to $BACKUP"
cp "$VHOST" "$BACKUP"
echo "[4/6] Inserting LiteSpeed Mission Control carve-out snippet"
SNIPPET="$SNIPPET" python3 - <<'PY'
import os
from pathlib import Path
vhost = Path('/usr/local/lsws/conf/vhosts/altaira.panomity.com/vhost.conf')
snippet = Path(os.environ['SNIPPET']).read_text().rstrip() + '\n\n'
text = vhost.read_text()
marker = 'context /mc {\n'
if snippet.strip() in text:
print('Snippet already present; leaving vhost unchanged.')
else:
idx = text.find(marker)
if idx == -1:
raise SystemExit('Could not find context /mc block in vhost.conf')
text = text[:idx] + snippet + text[idx:]
vhost.write_text(text)
print('Inserted snippet before context /mc block.')
PY
echo "[5/6] Restarting frontend service"
systemctl restart openclaw-mc-frontend.service
echo "[6/6] Reloading LiteSpeed"
/usr/local/lsws/bin/lswsctrl reload
echo
echo "Done. Verify with:"
echo " curl -i -H 'Authorization: Bearer ztbHKAe1UYI66HCFvSAyo4wrAAD6frNCyAZ67aKVeSE' https://altaira.panomity.com/mc/healthz"
echo " curl -i -H 'Authorization: Bearer ztbHKAe1UYI66HCFvSAyo4wrAAD6frNCyAZ67aKVeSE' https://altaira.panomity.com/mc/api/v1/agent/boards"
echo " curl -i https://altaira.panomity.com/mc/openapi.json"