#!/usr/bin/env bash set -u set -o pipefail repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" remote_source="boll@175.178.116.187:/home/boll/LMJWork/OmniSocketGo/peer-b-latency.jsonl" local_peer_a="$repo_dir/peer-a-latency.jsonl" local_peer_b="$repo_dir/peer-b-latency.jsonl" summary_output="$repo_dir/latency-summary.jsonl" chart_output="$repo_dir/latency-summary.html" latency_binary="$repo_dir/bin/latencysummary" go_cache_dir="${GOCACHE:-/tmp/omnisocketgo-go-build}" poll_interval_seconds=1 remote_tmp="" summary_tmp="" chart_tmp="" log() { printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" } cleanup_temp_file() { local path="$1" if [[ -n "$path" && -e "$path" ]]; then rm -f "$path" fi } cleanup() { cleanup_temp_file "$remote_tmp" cleanup_temp_file "$summary_tmp" cleanup_temp_file "$chart_tmp" } handle_interrupt() { log "received interrupt signal, stopping refresh loop" cleanup exit 130 } handle_terminate() { log "received terminate signal, stopping refresh loop" cleanup exit 143 } trap cleanup EXIT trap handle_interrupt INT trap handle_terminate TERM cd "$repo_dir" || exit 1 mkdir -p "$repo_dir/bin" mkdir -p "$go_cache_dir" if ! GOCACHE="$go_cache_dir" go build -o "$latency_binary" ./cmd/latencysummary; then log "build failed; exiting" exit 1 fi log "starting 1-second refresh loop" while true; do remote_tmp="$(mktemp "$repo_dir/peer-b-latency.jsonl.tmp.XXXXXX")" || exit 1 if scp -P 10022 "$remote_source" "$remote_tmp"; then if mv -f "$remote_tmp" "$local_peer_b"; then remote_tmp="" else status=$? log "failed to replace $(basename "$local_peer_b") after scp (exit $status)" cleanup_temp_file "$remote_tmp" remote_tmp="" sleep "$poll_interval_seconds" continue fi else status=$? log "scp refresh failed (exit $status)" cleanup_temp_file "$remote_tmp" remote_tmp="" sleep "$poll_interval_seconds" continue fi summary_tmp="$(mktemp "$repo_dir/latency-summary.tmp.XXXXXX.jsonl")" || exit 1 chart_tmp="${summary_tmp%.jsonl}.html" if "$latency_binary" \ -input "$local_peer_a" \ -input "$local_peer_b" \ -shared-max-offset 1 \ -output "$summary_tmp"; then if [[ ! -f "$summary_tmp" || ! -f "$chart_tmp" ]]; then log "summary succeeded but temporary outputs are incomplete" cleanup_temp_file "$summary_tmp" cleanup_temp_file "$chart_tmp" summary_tmp="" chart_tmp="" sleep "$poll_interval_seconds" continue fi if ! mv -f "$summary_tmp" "$summary_output"; then status=$? log "failed to replace $(basename "$summary_output") (exit $status)" cleanup_temp_file "$summary_tmp" cleanup_temp_file "$chart_tmp" summary_tmp="" chart_tmp="" sleep "$poll_interval_seconds" continue fi summary_tmp="" if ! mv -f "$chart_tmp" "$chart_output"; then status=$? log "failed to replace $(basename "$chart_output") (exit $status)" cleanup_temp_file "$chart_tmp" chart_tmp="" sleep "$poll_interval_seconds" continue fi chart_tmp="" else status=$? log "latency summary refresh failed (exit $status)" cleanup_temp_file "$summary_tmp" cleanup_temp_file "$chart_tmp" summary_tmp="" chart_tmp="" sleep "$poll_interval_seconds" continue fi sleep "$poll_interval_seconds" done