91 lines
2.9 KiB
Bash
Executable File
91 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
CONFIG_FILE="${INTER_RP_SYNC_CONFIG:-./inter-rp-sync.env}"
|
|
if [[ -f "$CONFIG_FILE" ]]; then
|
|
# shellcheck disable=SC1090
|
|
source "$CONFIG_FILE"
|
|
fi
|
|
|
|
REMOTE200="${REMOTE200:-root@43.110.128.200}"
|
|
REMOTE200_ROOT="${REMOTE200_ROOT:-/root/inter-rp-runners}"
|
|
PEER_ROOT="${PEER_ROOT:-/root/inter-rp-aggregator/synced-from-200}"
|
|
SYNC_INTERVAL_SECS="${SYNC_INTERVAL_SECS:-60}"
|
|
MAX_SYNCS="${MAX_SYNCS:--1}"
|
|
RPS="${RPS:-routinator rpki-client}"
|
|
|
|
mkdir -p "$PEER_ROOT"
|
|
|
|
write_status() {
|
|
local success="$1"
|
|
local message="$2"
|
|
export SYNC_SUCCESS="$success"
|
|
export SYNC_MESSAGE="$message"
|
|
export SYNC_REMOTE200="$REMOTE200"
|
|
export SYNC_REMOTE200_ROOT="$REMOTE200_ROOT"
|
|
python3 - <<'PY' >"$PEER_ROOT/sync-status.json"
|
|
import json, socket, datetime
|
|
print(json.dumps({
|
|
"schemaVersion": 1,
|
|
"success": __import__("os").environ["SYNC_SUCCESS"] == "true",
|
|
"lastSyncAtRfc3339Utc": datetime.datetime.now(datetime.UTC).replace(microsecond=0).isoformat().replace('+00:00', 'Z'),
|
|
"remoteHost": __import__("os").environ["SYNC_REMOTE200"],
|
|
"remoteRoot": __import__("os").environ["SYNC_REMOTE200_ROOT"],
|
|
"localHost": socket.gethostname(),
|
|
"message": __import__("os").environ["SYNC_MESSAGE"],
|
|
}, indent=2))
|
|
PY
|
|
}
|
|
|
|
sync_once() {
|
|
local rp_name
|
|
local temp_root="$PEER_ROOT/.sync-tmp-$$"
|
|
rm -rf "$temp_root"
|
|
mkdir -p "$temp_root"
|
|
for rp_name in $RPS; do
|
|
mkdir -p "$temp_root/$rp_name"
|
|
if ! rsync -aL --delete \
|
|
--include='run-meta.json' \
|
|
--include='result.ccr' \
|
|
--include='vrps.csv' \
|
|
--include='vaps.csv' \
|
|
--include='stdout.log' \
|
|
--include='stderr.log' \
|
|
--exclude='*' \
|
|
"$REMOTE200:$REMOTE200_ROOT/$rp_name/latest/" "$temp_root/$rp_name/latest/"; then
|
|
echo "sync failed for $rp_name; clearing stale local latest" >&2
|
|
rm -rf "$PEER_ROOT/$rp_name/latest" "$PEER_ROOT/$rp_name/latest.next" "$PEER_ROOT/$rp_name/latest.prev"
|
|
return 1
|
|
fi
|
|
if [[ ! -d "$temp_root/$rp_name/latest" ]]; then
|
|
echo "missing synced latest directory for $rp_name" >&2
|
|
rm -rf "$PEER_ROOT/$rp_name/latest" "$PEER_ROOT/$rp_name/latest.next" "$PEER_ROOT/$rp_name/latest.prev"
|
|
return 1
|
|
fi
|
|
rm -rf "$PEER_ROOT/$rp_name/latest.next" "$PEER_ROOT/$rp_name/latest.prev"
|
|
mkdir -p "$PEER_ROOT/$rp_name"
|
|
mv "$temp_root/$rp_name/latest" "$PEER_ROOT/$rp_name/latest.next"
|
|
if [[ -e "$PEER_ROOT/$rp_name/latest" ]]; then
|
|
mv "$PEER_ROOT/$rp_name/latest" "$PEER_ROOT/$rp_name/latest.prev"
|
|
fi
|
|
mv "$PEER_ROOT/$rp_name/latest.next" "$PEER_ROOT/$rp_name/latest"
|
|
rm -rf "$PEER_ROOT/$rp_name/latest.prev"
|
|
done
|
|
rm -rf "$temp_root"
|
|
}
|
|
|
|
completed="0"
|
|
while true; do
|
|
if sync_once; then
|
|
write_status true "ok"
|
|
else
|
|
rm -rf "$PEER_ROOT/.sync-tmp-$$"
|
|
write_status false "rsync failed"
|
|
fi
|
|
completed=$((completed + 1))
|
|
if [[ "$MAX_SYNCS" =~ ^[0-9]+$ ]] && (( completed >= MAX_SYNCS )); then
|
|
break
|
|
fi
|
|
sleep "$SYNC_INTERVAL_SECS"
|
|
done
|