79 lines
2.2 KiB
Bash
Executable File
79 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
PORT="${WEB_UI_PORT:-8765}"
|
|
LABEL="com.james.autotrain.web-ui"
|
|
PLIST="$HOME/Library/LaunchAgents/$LABEL.plist"
|
|
LOG_FILE="$ROOT_DIR/work/web_ui.log"
|
|
PID_FILE="$ROOT_DIR/work/web_ui.pid"
|
|
LAUNCHD_TARGET="gui/$(id -u)/$LABEL"
|
|
PYTHON_BIN="$(python3 -c 'import sys; print(sys.executable)')"
|
|
|
|
mkdir -p "$ROOT_DIR/work" "$HOME/Library/LaunchAgents"
|
|
|
|
echo "[web-ui] project: $ROOT_DIR"
|
|
echo "[web-ui] python: $PYTHON_BIN"
|
|
echo "[web-ui] installing launch agent: $PLIST"
|
|
|
|
launchctl bootout "gui/$(id -u)" "$PLIST" >/dev/null 2>&1 || true
|
|
|
|
PIDS="$(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null || true)"
|
|
if [[ -n "$PIDS" ]]; then
|
|
echo "[web-ui] stopping old listener on :$PORT -> $PIDS"
|
|
kill $PIDS 2>/dev/null || true
|
|
sleep 1
|
|
fi
|
|
|
|
cat > "$PLIST" <<PLIST
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>Label</key>
|
|
<string>$LABEL</string>
|
|
<key>ProgramArguments</key>
|
|
<array>
|
|
<string>$PYTHON_BIN</string>
|
|
<string>-u</string>
|
|
<string>$ROOT_DIR/scripts/web_ui.py</string>
|
|
</array>
|
|
<key>WorkingDirectory</key>
|
|
<string>$ROOT_DIR</string>
|
|
<key>RunAtLoad</key>
|
|
<true/>
|
|
<key>KeepAlive</key>
|
|
<true/>
|
|
<key>StandardOutPath</key>
|
|
<string>$LOG_FILE</string>
|
|
<key>StandardErrorPath</key>
|
|
<string>$LOG_FILE</string>
|
|
<key>EnvironmentVariables</key>
|
|
<dict>
|
|
<key>PYTHONUNBUFFERED</key>
|
|
<string>1</string>
|
|
</dict>
|
|
</dict>
|
|
</plist>
|
|
PLIST
|
|
|
|
launchctl bootstrap "gui/$(id -u)" "$PLIST"
|
|
launchctl kickstart -k "$LAUNCHD_TARGET"
|
|
|
|
for _ in {1..30}; do
|
|
if curl -fsS --max-time 2 "http://127.0.0.1:$PORT/" >/dev/null; then
|
|
PID="$(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null | head -n 1 || true)"
|
|
[[ -n "$PID" ]] && echo "$PID" > "$PID_FILE"
|
|
echo "[web-ui] ready: http://127.0.0.1:$PORT"
|
|
echo "[web-ui] managed by: $LABEL"
|
|
echo "[web-ui] pid: ${PID:-unknown}"
|
|
echo "[web-ui] log: $LOG_FILE"
|
|
exit 0
|
|
fi
|
|
sleep 0.2
|
|
done
|
|
|
|
echo "[web-ui] launch agent startup timeout. log: $LOG_FILE" >&2
|
|
tail -80 "$LOG_FILE" >&2 || true
|
|
exit 1
|