93 lines
2.7 KiB
Bash
Executable File
93 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Container entrypoint: run rpki_query_service (watch mode) and nginx in one
|
|
# container. nginx serves the explorer SPA and proxies /api/v1/ to the query
|
|
# service. If either process exits, the container exits and the compose
|
|
# restart policy brings it back.
|
|
set -euo pipefail
|
|
|
|
RUNS_DIR="${RUNS_DIR:-/soak/runs}"
|
|
REPO_BYTES_DB="${REPO_BYTES_DB:-/soak/db/repo-bytes.db}"
|
|
QUERY_DB="${QUERY_DB:-/data/query-db}"
|
|
RETAIN_RUNS="${RETAIN_RUNS:-10}"
|
|
WATCH_INTERVAL_SECS="${WATCH_INTERVAL_SECS:-10}"
|
|
QUERY_LISTEN="${QUERY_LISTEN:-127.0.0.1:9557}"
|
|
|
|
log() { echo "[entrypoint] $*"; }
|
|
|
|
latest_completed_seq() {
|
|
local latest=0 dir base n
|
|
shopt -s nullglob
|
|
for dir in "$RUNS_DIR"/run_*/; do
|
|
[ -f "${dir}report.json" ] || continue
|
|
base="${dir%/}"
|
|
n="${base##*/run_}"
|
|
case "$n" in
|
|
*[!0-9]* | "") continue ;;
|
|
esac
|
|
if [ "$n" -gt "$latest" ]; then
|
|
latest="$n"
|
|
fi
|
|
done
|
|
echo "$latest"
|
|
}
|
|
|
|
mkdir -p "$(dirname "$QUERY_DB")"
|
|
|
|
ARGS=(
|
|
--query-db "$QUERY_DB"
|
|
--listen "$QUERY_LISTEN"
|
|
--watch-run-root "$RUNS_DIR"
|
|
--watch-interval-secs "$WATCH_INTERVAL_SECS"
|
|
--retain-indexed-runs "$RETAIN_RUNS"
|
|
)
|
|
|
|
if [ -e "$REPO_BYTES_DB" ]; then
|
|
ARGS+=(--repo-bytes-db "$REPO_BYTES_DB")
|
|
else
|
|
log "WARNING: repo-bytes db not found at $REPO_BYTES_DB; parsed/raw/export features will be unavailable"
|
|
fi
|
|
|
|
# Decide the watcher start point:
|
|
# - explicit WATCH_MIN_RUN_SEQ always wins;
|
|
# - on first boot (query-db does not exist yet) backfill the latest
|
|
# RETAIN_RUNS completed runs;
|
|
# - on later boots the existing query-db drives continuation
|
|
# (max(min_run_seq, latest_ready+1)), so no flag is needed.
|
|
if [ -n "${WATCH_MIN_RUN_SEQ:-}" ]; then
|
|
ARGS+=(--watch-min-run-seq "$WATCH_MIN_RUN_SEQ")
|
|
log "using explicit WATCH_MIN_RUN_SEQ=$WATCH_MIN_RUN_SEQ"
|
|
elif [ ! -e "$QUERY_DB" ]; then
|
|
latest="$(latest_completed_seq)"
|
|
if [ "$latest" -gt "$RETAIN_RUNS" ]; then
|
|
min_seq=$((latest - RETAIN_RUNS + 1))
|
|
else
|
|
min_seq=1
|
|
fi
|
|
log "first boot: latest completed run seq=$latest -> --watch-min-run-seq $min_seq (backfill $RETAIN_RUNS runs)"
|
|
ARGS+=(--watch-min-run-seq "$min_seq")
|
|
else
|
|
log "existing query-db at $QUERY_DB; resuming from indexed state"
|
|
fi
|
|
|
|
log "starting rpki_query_service ${ARGS[*]}"
|
|
rpki_query_service "${ARGS[@]}" &
|
|
QS_PID=$!
|
|
|
|
log "starting nginx"
|
|
nginx -g 'daemon off;' &
|
|
NGINX_PID=$!
|
|
|
|
shutdown() {
|
|
log "shutting down (qs=$QS_PID nginx=$NGINX_PID)"
|
|
kill -TERM "$QS_PID" 2>/dev/null || true
|
|
kill -TERM "$NGINX_PID" 2>/dev/null || true
|
|
}
|
|
trap shutdown TERM INT
|
|
|
|
wait -n "$QS_PID" "$NGINX_PID"
|
|
EXIT_CODE=$?
|
|
log "a process exited (code=$EXIT_CODE); stopping the remaining one"
|
|
shutdown
|
|
wait "$QS_PID" "$NGINX_PID" 2>/dev/null || true
|
|
exit "$EXIT_CODE"
|