159 lines
3.4 KiB
Bash
Executable File
159 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
GORI_AGENT_HOME="${GORI_AGENT_HOME:-$ROOT_DIR}"
|
|
STATE_DIR="$GORI_AGENT_HOME/state"
|
|
LOG_DIR="$GORI_AGENT_HOME/logs"
|
|
CONFIG_FILE="${GORI_GATEWAY_CONFIG:-$ROOT_DIR/config.json}"
|
|
PID_FILE="$STATE_DIR/gori-agent.pid"
|
|
LOG_FILE="$LOG_DIR/gori-agent.log"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $0 <command> [--config path]
|
|
|
|
Commands:
|
|
setup Run interactive setup
|
|
start Start gateway in foreground
|
|
start-daemon Start gateway in background
|
|
stop Stop background gateway
|
|
restart Restart background gateway
|
|
status Show gateway status
|
|
doctor Check configuration, roles, and ACP backends
|
|
logs Follow gateway log
|
|
discover-backends List detected ACP backends
|
|
discover-agents Deprecated alias for discover-backends
|
|
|
|
Environment:
|
|
GORI_GATEWAY_CONFIG Config path, default: $CONFIG_FILE
|
|
EOF
|
|
}
|
|
|
|
ensure_build() {
|
|
if [[ ! -f "$ROOT_DIR/dist/cli.js" ]]; then
|
|
echo "dist/cli.js not found; building..."
|
|
npm run build --prefix "$ROOT_DIR"
|
|
fi
|
|
}
|
|
|
|
ensure_state() {
|
|
mkdir -p "$STATE_DIR" "$LOG_DIR"
|
|
}
|
|
|
|
is_running() {
|
|
[[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null
|
|
}
|
|
|
|
start_daemon() {
|
|
ensure_build
|
|
ensure_state
|
|
if is_running; then
|
|
echo "gori-agent already running, pid $(cat "$PID_FILE")"
|
|
exit 0
|
|
fi
|
|
nohup node "$ROOT_DIR/dist/cli.js" start --config "$CONFIG_FILE" >>"$LOG_FILE" 2>&1 &
|
|
echo $! >"$PID_FILE"
|
|
echo "gori-agent started, pid $(cat "$PID_FILE")"
|
|
echo "log: $LOG_FILE"
|
|
}
|
|
|
|
stop_daemon() {
|
|
if ! is_running; then
|
|
rm -f "$PID_FILE"
|
|
echo "gori-agent is not running"
|
|
return 0
|
|
fi
|
|
local pid
|
|
pid="$(cat "$PID_FILE")"
|
|
kill "$pid"
|
|
local waited=0
|
|
while kill -0 "$pid" 2>/dev/null && [[ $waited -lt 100 ]]; do
|
|
sleep 0.1
|
|
waited=$((waited + 1))
|
|
done
|
|
if kill -0 "$pid" 2>/dev/null; then
|
|
echo "gori-agent did not stop gracefully within 10 seconds, pid $pid" >&2
|
|
return 1
|
|
fi
|
|
rm -f "$PID_FILE"
|
|
echo "gori-agent stopped, pid $pid"
|
|
}
|
|
|
|
if [[ $# -lt 1 ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
COMMAND="$1"
|
|
shift
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--config)
|
|
CONFIG_FILE="$2"
|
|
shift 2
|
|
;;
|
|
--help|-h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown argument: $1" >&2
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
case "$COMMAND" in
|
|
setup)
|
|
ensure_build
|
|
exec node "$ROOT_DIR/dist/cli.js" setup --config "$CONFIG_FILE"
|
|
;;
|
|
start)
|
|
ensure_build
|
|
exec node "$ROOT_DIR/dist/cli.js" start --config "$CONFIG_FILE"
|
|
;;
|
|
start-daemon)
|
|
start_daemon
|
|
;;
|
|
stop)
|
|
stop_daemon
|
|
;;
|
|
restart)
|
|
stop_daemon
|
|
start_daemon
|
|
;;
|
|
status)
|
|
ensure_build
|
|
if is_running; then
|
|
echo "gori-agent process: running, pid $(cat "$PID_FILE")"
|
|
else
|
|
echo "gori-agent process: not running"
|
|
fi
|
|
exec node "$ROOT_DIR/dist/cli.js" status --config "$CONFIG_FILE"
|
|
;;
|
|
doctor)
|
|
ensure_build
|
|
exec node "$ROOT_DIR/dist/cli.js" doctor --config "$CONFIG_FILE"
|
|
;;
|
|
discover-backends|discover-agents)
|
|
ensure_build
|
|
exec node "$ROOT_DIR/dist/cli.js" "$COMMAND" --config "$CONFIG_FILE"
|
|
;;
|
|
logs)
|
|
ensure_state
|
|
touch "$LOG_FILE"
|
|
exec tail -f "$LOG_FILE"
|
|
;;
|
|
--help|-h|help)
|
|
usage
|
|
;;
|
|
*)
|
|
echo "Unknown command: $COMMAND" >&2
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|