#!/usr/bin/env bash set -euo pipefail usage() { cat <<'EOF' Usage: ./scripts/cir/run_cir_replay_ours.sh \ --cir \ [--static-root | --raw-store-db ] \ --out-dir \ --reference-ccr \ [--keep-db] \ [--rpki-bin ] \ [--real-rsync-bin ] EOF } ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" CIR="" STATIC_ROOT="" POOL_DB="" RAW_STORE_DB="" OUT_DIR="" REFERENCE_CCR="" KEEP_DB=0 RPKI_BIN="$ROOT_DIR/target/release/rpki" CIR_MATERIALIZE_BIN="$ROOT_DIR/target/release/cir_materialize" CIR_EXTRACT_INPUTS_BIN="$ROOT_DIR/target/release/cir_extract_inputs" CCR_TO_COMPARE_VIEWS_BIN="$ROOT_DIR/target/release/ccr_to_compare_views" REAL_RSYNC_BIN="${REAL_RSYNC_BIN:-/usr/bin/rsync}" WRAPPER="$ROOT_DIR/scripts/cir/cir-rsync-wrapper" while [[ $# -gt 0 ]]; do case "$1" in --cir) CIR="$2"; shift 2 ;; --static-root) STATIC_ROOT="$2"; shift 2 ;; --raw-store-db) RAW_STORE_DB="$2"; shift 2 ;; --out-dir) OUT_DIR="$2"; shift 2 ;; --reference-ccr) REFERENCE_CCR="$2"; shift 2 ;; --keep-db) KEEP_DB=1; shift ;; --rpki-bin) RPKI_BIN="$2"; shift 2 ;; --real-rsync-bin) REAL_RSYNC_BIN="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) echo "unknown argument: $1" >&2; usage; exit 2 ;; esac done [[ -n "$CIR" && -n "$OUT_DIR" && -n "$REFERENCE_CCR" ]] || { usage >&2 exit 2 } backend_count=0 [[ -n "$STATIC_ROOT" ]] && backend_count=$((backend_count+1)) [[ -n "$RAW_STORE_DB" ]] && backend_count=$((backend_count+1)) [[ "$backend_count" -eq 1 ]] || { usage >&2; exit 2; } mkdir -p "$OUT_DIR" if [[ ! -x "$RPKI_BIN" || ! -x "$CIR_MATERIALIZE_BIN" || ! -x "$CIR_EXTRACT_INPUTS_BIN" || ! -x "$CCR_TO_COMPARE_VIEWS_BIN" ]]; then ( cd "$ROOT_DIR" cargo build --release --bin rpki --bin cir_materialize --bin cir_extract_inputs --bin ccr_to_compare_views ) fi TMP_ROOT="$OUT_DIR/.tmp" TALS_DIR="$TMP_ROOT/tals" META_JSON="$TMP_ROOT/meta.json" MIRROR_ROOT="$TMP_ROOT/mirror" DB_DIR="$TMP_ROOT/work-db" ACTUAL_CCR="$OUT_DIR/actual.ccr" ACTUAL_REPORT="$OUT_DIR/report.json" ACTUAL_VRPS="$OUT_DIR/actual-vrps.csv" ACTUAL_VAPS="$OUT_DIR/actual-vaps.csv" REF_VRPS="$OUT_DIR/reference-vrps.csv" REF_VAPS="$OUT_DIR/reference-vaps.csv" COMPARE_JSON="$OUT_DIR/compare-summary.json" RUN_LOG="$OUT_DIR/run.log" rm -rf "$TMP_ROOT" mkdir -p "$TMP_ROOT" "$CIR_EXTRACT_INPUTS_BIN" --cir "$CIR" --tals-dir "$TALS_DIR" --meta-json "$META_JSON" materialize_cmd=("$CIR_MATERIALIZE_BIN" --cir "$CIR" --mirror-root "$MIRROR_ROOT") if [[ -n "$STATIC_ROOT" ]]; then materialize_cmd+=(--static-root "$STATIC_ROOT") else materialize_cmd+=(--raw-store-db "$RAW_STORE_DB") fi if [[ "$KEEP_DB" -eq 1 ]]; then materialize_cmd+=(--keep-db) fi "${materialize_cmd[@]}" VALIDATION_TIME="$(python3 - <<'PY' "$META_JSON" import json,sys print(json.load(open(sys.argv[1]))["validationTime"]) PY )" FIRST_TAL="$(python3 - <<'PY' "$META_JSON" import json,sys print(json.load(open(sys.argv[1]))["talFiles"][0]["path"]) PY )" export CIR_MIRROR_ROOT="$(python3 - <<'PY' "$MIRROR_ROOT" from pathlib import Path import sys print(Path(sys.argv[1]).resolve()) PY )" export REAL_RSYNC_BIN="$REAL_RSYNC_BIN" export CIR_LOCAL_LINK_MODE=1 "$RPKI_BIN" \ --db "$DB_DIR" \ --tal-path "$FIRST_TAL" \ --disable-rrdp \ --rsync-command "$WRAPPER" \ --validation-time "$VALIDATION_TIME" \ --ccr-out "$ACTUAL_CCR" \ --report-json "$ACTUAL_REPORT" \ >"$RUN_LOG" 2>&1 "$CCR_TO_COMPARE_VIEWS_BIN" --ccr "$ACTUAL_CCR" --vrps-out "$ACTUAL_VRPS" --vaps-out "$ACTUAL_VAPS" --trust-anchor unknown "$CCR_TO_COMPARE_VIEWS_BIN" --ccr "$REFERENCE_CCR" --vrps-out "$REF_VRPS" --vaps-out "$REF_VAPS" --trust-anchor unknown python3 - <<'PY' "$ACTUAL_VRPS" "$REF_VRPS" "$ACTUAL_VAPS" "$REF_VAPS" "$COMPARE_JSON" import csv, json, sys def rows(path): with open(path, newline="") as f: return list(csv.reader(f))[1:] actual_vrps = {tuple(r) for r in rows(sys.argv[1])} ref_vrps = {tuple(r) for r in rows(sys.argv[2])} actual_vaps = {tuple(r) for r in rows(sys.argv[3])} ref_vaps = {tuple(r) for r in rows(sys.argv[4])} summary = { "vrps": { "actual": len(actual_vrps), "reference": len(ref_vrps), "only_in_actual": sorted(actual_vrps - ref_vrps)[:20], "only_in_reference": sorted(ref_vrps - actual_vrps)[:20], "match": actual_vrps == ref_vrps, }, "vaps": { "actual": len(actual_vaps), "reference": len(ref_vaps), "only_in_actual": sorted(actual_vaps - ref_vaps)[:20], "only_in_reference": sorted(ref_vaps - actual_vaps)[:20], "match": actual_vaps == ref_vaps, } } with open(sys.argv[5], "w") as f: json.dump(summary, f, indent=2) PY if [[ "$KEEP_DB" -ne 1 ]]; then rm -rf "$TMP_ROOT" fi echo "done: $OUT_DIR"