ScuttleBot
| 5ac549c… | lmata | 1 | #!/usr/bin/env bash |
| 5ac549c… | lmata | 2 | # run.sh — scuttlebot dev helper |
| 5ac549c… | lmata | 3 | # Usage: ./run.sh [command] |
| 5ac549c… | lmata | 4 | # (no args) build and start scuttlebot |
| 5ac549c… | lmata | 5 | # stop kill running scuttlebot |
| 5ac549c… | lmata | 6 | # restart stop + build + start |
| 5ac549c… | lmata | 7 | # token print the current API token |
| 5ac549c… | lmata | 8 | # log tail the log (if logging to file is configured) |
| 5ac549c… | lmata | 9 | # test run Go unit tests |
| 5ac549c… | lmata | 10 | # e2e run Playwright e2e tests (requires scuttlebot running) |
| 5ac549c… | lmata | 11 | # clean remove built binaries |
| 5ac549c… | lmata | 12 | |
| 5ac549c… | lmata | 13 | set -euo pipefail |
| 5ac549c… | lmata | 14 | |
| 5ac549c… | lmata | 15 | BINARY=bin/scuttlebot |
| 5ac549c… | lmata | 16 | CONFIG=${SCUTTLEBOT_CONFIG:-scuttlebot.yaml} |
| 5ac549c… | lmata | 17 | TOKEN_FILE=data/ergo/api_token |
| 5ac549c… | lmata | 18 | PID_FILE=.scuttlebot.pid |
| 5ac549c… | lmata | 19 | LOG_FILE=.scuttlebot.log |
| 5ac549c… | lmata | 20 | cmd=${1:-start} |
| 5ac549c… | lmata | 21 | |
| 5ac549c… | lmata | 22 | _pid() { cat "$PID_FILE" 2>/dev/null || echo ""; } |
| 5ac549c… | lmata | 23 | |
| 5ac549c… | lmata | 24 | _running() { |
| 5ac549c… | lmata | 25 | local pid; pid=$(_pid) |
| 5ac549c… | lmata | 26 | [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null |
| 5ac549c… | lmata | 27 | } |
| 5ac549c… | lmata | 28 | |
| 5ac549c… | lmata | 29 | _stop() { |
| 5ac549c… | lmata | 30 | if _running; then |
| 5ac549c… | lmata | 31 | local pid; pid=$(_pid) |
| 5ac549c… | lmata | 32 | kill "$pid" && rm -f "$PID_FILE" |
| 5ac549c… | lmata | 33 | echo "stopped (pid $pid)" |
| 5ac549c… | lmata | 34 | else |
| 5ac549c… | lmata | 35 | echo "not running" |
| 5ac549c… | lmata | 36 | fi |
| 5ac549c… | lmata | 37 | # Kill any stale ergo processes holding IRC/API ports. |
| 5ac549c… | lmata | 38 | pkill -f "data/ergo/ergo" 2>/dev/null && sleep 1 || true |
| 5ac549c… | lmata | 39 | } |
| 5ac549c… | lmata | 40 | |
| 5ac549c… | lmata | 41 | _build() { |
| 5ac549c… | lmata | 42 | echo "building..." |
| 5ac549c… | lmata | 43 | go build -o "$BINARY" ./cmd/scuttlebot |
| 5ac549c… | lmata | 44 | echo "ok → $BINARY" |
| 5ac549c… | lmata | 45 | } |
| 5ac549c… | lmata | 46 | |
| 5ac549c… | lmata | 47 | _start() { |
| 5ac549c… | lmata | 48 | if _running; then |
| 5ac549c… | lmata | 49 | echo "already running (pid $(_pid)) — use ./run.sh restart" |
| 5ac549c… | lmata | 50 | exit 0 |
| 5ac549c… | lmata | 51 | fi |
| 5ac549c… | lmata | 52 | |
| 5ac549c… | lmata | 53 | if [[ ! -f "$CONFIG" ]]; then |
| 5ac549c… | lmata | 54 | echo "no $CONFIG found — copying from example" |
| 5ac549c… | lmata | 55 | cp deploy/standalone/scuttlebot.yaml.example "$CONFIG" |
| 5ac549c… | lmata | 56 | echo "edit $CONFIG if needed, then re-run" |
| 5ac549c… | lmata | 57 | fi |
| 5ac549c… | lmata | 58 | |
| 5ac549c… | lmata | 59 | mkdir -p bin data/ergo |
| 5ac549c… | lmata | 60 | |
| 5ac549c… | lmata | 61 | "$BINARY" -config "$CONFIG" >"$LOG_FILE" 2>&1 & |
| 5ac549c… | lmata | 62 | echo $! >"$PID_FILE" |
| 5ac549c… | lmata | 63 | local pid; pid=$(_pid) |
| 5ac549c… | lmata | 64 | echo "started (pid $pid) — logs: $LOG_FILE" |
| 5ac549c… | lmata | 65 | |
| 5ac549c… | lmata | 66 | # wait briefly and print token so it's handy |
| 5ac549c… | lmata | 67 | sleep 1 |
| 5ac549c… | lmata | 68 | if [[ -f "$TOKEN_FILE" ]]; then |
| 5ac549c… | lmata | 69 | echo "token: $(cat "$TOKEN_FILE")" |
| 5ac549c… | lmata | 70 | fi |
| 5ac549c… | lmata | 71 | |
| 5ac549c… | lmata | 72 | echo "ui: http://localhost:8080/ui/" |
| 5ac549c… | lmata | 73 | } |
| 5ac549c… | lmata | 74 | |
| 5ac549c… | lmata | 75 | _token() { |
| 5ac549c… | lmata | 76 | if [[ -f "$TOKEN_FILE" ]]; then |
| 5ac549c… | lmata | 77 | cat "$TOKEN_FILE" |
| 5ac549c… | lmata | 78 | else |
| 5ac549c… | lmata | 79 | echo "no token file found (is scuttlebot running?)" >&2 |
| 5ac549c… | lmata | 80 | exit 1 |
| 5ac549c… | lmata | 81 | fi |
| 5ac549c… | lmata | 82 | } |
| 5ac549c… | lmata | 83 | |
| 5ac549c… | lmata | 84 | |
| 5ac549c… | lmata | 85 | case "$cmd" in |
| 5ac549c… | lmata | 86 | start) |
| 5ac549c… | lmata | 87 | _build |
| 5ac549c… | lmata | 88 | _start |
| 5ac549c… | lmata | 89 | ;; |
| 5ac549c… | lmata | 90 | stop) |
| 5ac549c… | lmata | 91 | _stop |
| 5ac549c… | lmata | 92 | ;; |
| 5ac549c… | lmata | 93 | restart) |
| 5ac549c… | lmata | 94 | _stop || true |
| 5ac549c… | lmata | 95 | _build |
| 5ac549c… | lmata | 96 | _start |
| 5ac549c… | lmata | 97 | ;; |
| 5ac549c… | lmata | 98 | build) |
| 5ac549c… | lmata | 99 | _build |
| 5ac549c… | lmata | 100 | ;; |
| 5ac549c… | lmata | 101 | token) |
| 5ac549c… | lmata | 102 | _token |
| 5ac549c… | lmata | 103 | ;; |
| 5ac549c… | lmata | 104 | log|logs) |
| 5ac549c… | lmata | 105 | tail -f "$LOG_FILE" |
| 5ac549c… | lmata | 106 | ;; |
| 5ac549c… | lmata | 107 | test) |
| 5ac549c… | lmata | 108 | go test ./... |
| 5ac549c… | lmata | 109 | ;; |
| 5ac549c… | lmata | 110 | e2e) |
| 5ac549c… | lmata | 111 | SB_TOKEN=$(cat "$TOKEN_FILE" 2>/dev/null) \ |
| 5ac549c… | lmata | 112 | SB_USERNAME=${SB_USERNAME:-admin} \ |
| 5ac549c… | lmata | 113 | SB_PASSWORD=${SB_PASSWORD:-} \ |
| 5ac549c… | lmata | 114 | npx --prefix tests/e2e playwright test "${@:2}" |
| 5ac549c… | lmata | 115 | ;; |
| 5ac549c… | lmata | 116 | clean) |
| 5ac549c… | lmata | 117 | _stop || true |
| 5ac549c… | lmata | 118 | rm -f "$BINARY" bin/scuttlectl "$LOG_FILE" "$PID_FILE" |
| 5ac549c… | lmata | 119 | echo "clean" |
| 5ac549c… | lmata | 120 | ;; |
| 5ac549c… | lmata | 121 | *) |
| 10b6d92… | lmata | 122 | echo "usage: $0 {start|stop|restart|build|token|log|test|e2e|clean}" |
| 5ac549c… | lmata | 123 | exit 1 |
| 5ac549c… | lmata | 124 | ;; |
| 5ac549c… | lmata | 125 | esac |