fix:更新自动化测试peer+server+relay server转发+peer

This commit is contained in:
nnbcccscdscdsc
2026-03-29 19:46:27 +08:00
parent 9cc7123683
commit c4ef88c1b6

View File

@@ -6,13 +6,19 @@ script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
repo_dir="$(cd "$script_dir/.." && pwd)" repo_dir="$(cd "$script_dir/.." && pwd)"
script_name="$(basename "$0")" script_name="$(basename "$0")"
run_mode="direct"
server_ssh="" server_ssh=""
peerb_ssh="" peerb_ssh=""
relay_ssh=""
server_addr="" server_addr=""
relay_addr=""
relay_remote=""
log_prefix="" log_prefix=""
listen_addr="0.0.0.0:10909" listen_addr="0.0.0.0:10909"
relay_listen_addr="0.0.0.0:10909"
server_workdir="$repo_dir" server_workdir="$repo_dir"
peerb_workdir="$repo_dir" peerb_workdir="$repo_dir"
relay_workdir="$repo_dir"
local_workdir="$repo_dir" local_workdir="$repo_dir"
ready_timeout=60 ready_timeout=60
send_interval=1 send_interval=1
@@ -22,24 +28,37 @@ repeat_count=1
declare -a peerb_files=() declare -a peerb_files=()
server_started=0 server_started=0
relay_started=0
peer_b_started=0 peer_b_started=0
peer_a_pid="" peer_a_pid=""
usage() { usage() {
printf 'Usage:\n' printf 'Usage:\n'
printf ' %s --server-ssh <ssh-target> --peerb-ssh <ssh-target> --server-addr <host:port> \\\n' "$script_name" printf ' %s --mode <direct|relay> --server-ssh <ssh-target> --peerb-ssh <ssh-target> \\\n' "$script_name"
printf ' --log-prefix <prefix> --file <peer-b-path> [--file <peer-b-path> ...] [options]\n' printf ' --server-addr <ip> --log-prefix <prefix> --file <peer-b-path> [options]\n'
printf '\n'
printf 'Modes:\n'
printf ' direct peer-a -> hub(server) <- peer-b (default)\n'
printf ' relay peer-a -> relay(C) -> hub(D) <- peer-b\n'
printf '\n' printf '\n'
printf 'Required arguments:\n' printf 'Required arguments:\n'
printf ' --server-ssh <ssh-target> SSH target for the server machine\n' printf ' --server-ssh <ssh-target> SSH target for the hub server machine\n'
printf ' --peerb-ssh <ssh-target> SSH target for the peer-b machine\n' printf ' --peerb-ssh <ssh-target> SSH target for the peer-b machine\n'
printf ' --server-addr <host:port> Server address used by peer-a and peer-b\n' printf ' --server-addr <ip> Hub server IP (combined with listen port for peers)\n'
printf ' --log-prefix <prefix> Log directory prefix; logs go under <prefix>logs/\n' printf ' --log-prefix <prefix> Log directory prefix; logs go under <prefix>logs/\n'
printf ' --file <peer-b-path> Existing file path on peer-b; repeat for multiple files\n' printf ' --file <peer-b-path> Existing file path on peer-b; repeat for multiple files\n'
printf '\n' printf '\n'
printf 'Relay mode arguments (required when --mode=relay):\n'
printf ' --relay-ssh <ssh-target> SSH target for the relay server machine\n'
printf ' --relay-addr <ip> Relay server IP (combined with relay listen port for peer-a)\n'
printf ' --relay-remote <host:port> Hub address from relay perspective (relay -relay-remote)\n'
printf '\n'
printf 'Options:\n' printf 'Options:\n'
printf ' --listen-addr <addr> Server listen address (default: %s)\n' "$listen_addr" printf ' --mode <direct|relay> Run mode (default: %s)\n' "$run_mode"
printf ' --server-workdir <dir> Server-side workdir (default: %s)\n' "$server_workdir" printf ' --listen-addr <addr> Hub server listen address (default: %s)\n' "$listen_addr"
printf ' --relay-listen-addr <addr> Relay server listen address (default: %s)\n' "$relay_listen_addr"
printf ' --server-workdir <dir> Hub server-side workdir (default: %s)\n' "$server_workdir"
printf ' --relay-workdir <dir> Relay server-side workdir (default: %s)\n' "$relay_workdir"
printf ' --peerb-workdir <dir> Peer-b-side workdir (default: %s)\n' "$peerb_workdir" printf ' --peerb-workdir <dir> Peer-b-side workdir (default: %s)\n' "$peerb_workdir"
printf ' --local-workdir <dir> Local peer-a workdir (default: %s)\n' "$local_workdir" printf ' --local-workdir <dir> Local peer-a workdir (default: %s)\n' "$local_workdir"
printf ' --ready-timeout <seconds> Startup wait timeout (default: %s)\n' "$ready_timeout" printf ' --ready-timeout <seconds> Startup wait timeout (default: %s)\n' "$ready_timeout"
@@ -48,15 +67,28 @@ usage() {
printf ' --drain-wait <seconds> Wait after the last file before quit (default: %s)\n' "$drain_wait" printf ' --drain-wait <seconds> Wait after the last file before quit (default: %s)\n' "$drain_wait"
printf ' -h, --help Show this help\n' printf ' -h, --help Show this help\n'
printf '\n' printf '\n'
printf 'Example:\n' printf 'Example (direct mode):\n'
printf ' %s \\\n' "$script_name" printf ' %s \\\n' "$script_name"
printf ' --mode direct \\\n'
printf ' --server-ssh root@server-host \\\n' printf ' --server-ssh root@server-host \\\n'
printf ' --peerb-ssh root@peer-b-host \\\n' printf ' --peerb-ssh root@peer-b-host \\\n'
printf ' --server-addr 203.0.113.10:10909 \\\n' printf ' --server-addr 203.0.113.10 \\\n'
printf ' --log-prefix case01- \\\n' printf ' --log-prefix case01- \\\n'
printf ' --repeat 30 \\\n' printf ' --repeat 30 \\\n'
printf ' --file /tmp/test125.bin \\\n' printf ' --file /tmp/test125.bin\n'
printf ' --file /tmp/test5.bin\n' printf '\n'
printf 'Example (relay mode):\n'
printf ' %s \\\n' "$script_name"
printf ' --mode relay \\\n'
printf ' --server-ssh root@hub-host \\\n'
printf ' --relay-ssh root@relay-host \\\n'
printf ' --peerb-ssh root@peer-b-host \\\n'
printf ' --server-addr 152.136.164.246 \\\n'
printf ' --relay-addr 139.199.57.110 \\\n'
printf ' --relay-remote 172.21.0.13:10909 \\\n'
printf ' --log-prefix case01- \\\n'
printf ' --repeat 30 \\\n'
printf ' --file /tmp/test125.bin\n'
} }
log() { log() {
@@ -217,6 +249,9 @@ clean_log_directories() {
remove_local_log_dir remove_local_log_dir
remove_remote_log_dir "$server_ssh" "$server_log_dir" "server" "$server_pid_file" remove_remote_log_dir "$server_ssh" "$server_log_dir" "server" "$server_pid_file"
remove_remote_log_dir "$peerb_ssh" "$peerb_log_dir" "peer-b" remove_remote_log_dir "$peerb_ssh" "$peerb_log_dir" "peer-b"
if [[ "$run_mode" == "relay" ]]; then
remove_remote_log_dir "$relay_ssh" "$relay_log_dir" "relay" "$relay_pid_file"
fi
} }
truncate_local_file() { truncate_local_file() {
@@ -260,11 +295,8 @@ reset_logs_after_probe() {
} }
fetch_remote_peer_b_logs() { fetch_remote_peer_b_logs() {
log "copying peer-b logs from $peerb_ssh:$peerb_log_dir to $local_log_dir" log "copying peer-b latency log from $peerb_ssh:$peerb_latency_log to $local_peer_b_latency_log"
copy_remote_file_to_local "$peerb_ssh:$peerb_stdout_log" "$local_peer_b_stdout_log"
copy_remote_file_to_local "$peerb_ssh:$peerb_latency_log" "$local_peer_b_latency_log" copy_remote_file_to_local "$peerb_ssh:$peerb_latency_log" "$local_peer_b_latency_log"
copy_remote_file_to_local "$peerb_ssh:$peerb_ts_debug_log" "$local_peer_b_ts_debug_log"
copy_remote_file_to_local "$peerb_ssh:$peerb_session_stats_log" "$local_peer_b_session_stats_log"
} }
run_local_latency_summary() { run_local_latency_summary() {
@@ -308,6 +340,7 @@ start_remote_server() {
local script="" local script=""
script="$(cat <<'EOF' script="$(cat <<'EOF'
export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin"
set -euo pipefail set -euo pipefail
cd "$SERVER_WORKDIR" cd "$SERVER_WORKDIR"
@@ -322,14 +355,14 @@ if [[ -f "$PID_FILE" ]]; then
fi fi
: > "$STDOUT_LOG" : > "$STDOUT_LOG"
nohup ./kcpserver \ setsid go run ./cmd/kcpserver/ \
-listen "$LISTEN_ADDR" \ -listen "$LISTEN_ADDR" \
>>"$STDOUT_LOG" 2>&1 </dev/null & >>"$STDOUT_LOG" 2>&1 </dev/null &
echo "$!" > "$PID_FILE" echo "$!" > "$PID_FILE"
EOF EOF
)" )"
log "starting remote kcpserver on $server_ssh" log "starting remote kcpserver (hub) on $server_ssh"
run_remote_script "$server_ssh" "$script" \ run_remote_script "$server_ssh" "$script" \
"SERVER_WORKDIR=$server_workdir" \ "SERVER_WORKDIR=$server_workdir" \
"LOG_DIR=$server_log_dir" \ "LOG_DIR=$server_log_dir" \
@@ -341,7 +374,7 @@ EOF
} }
wait_for_remote_server_ready() { wait_for_remote_server_ready() {
local pattern="kcp server listening" local pattern="kcp hub listening"
local script="" local script=""
local start_time="$SECONDS" local start_time="$SECONDS"
local status=0 local status=0
@@ -365,16 +398,17 @@ EOF
)" )"
while (( SECONDS - start_time < ready_timeout )); do while (( SECONDS - start_time < ready_timeout )); do
if run_remote_script "$server_ssh" "$script" \ status=0
run_remote_script "$server_ssh" "$script" \
"LOG_FILE=$server_stdout_log" \ "LOG_FILE=$server_stdout_log" \
"READY_PATTERN=$pattern" \ "READY_PATTERN=$pattern" \
"PID_FILE=$server_pid_file"; then "PID_FILE=$server_pid_file" || status=$?
log "remote server is ready"
return 0
fi
status=$?
case "$status" in case "$status" in
0)
log "remote server is ready"
return 0
;;
10) 10)
sleep 1 sleep 1
;; ;;
@@ -412,12 +446,8 @@ if [[ -z "$pid" ]]; then
exit 0 exit 0
fi fi
if ! kill -0 "$pid" 2>/dev/null; then # Kill the entire process group (setsid creates a new group with pid == pgid).
rm -f "$PID_FILE" kill -- -"$pid" 2>/dev/null || kill "$pid" 2>/dev/null || true
exit 0
fi
kill "$pid" 2>/dev/null || true
for _ in 1 2 3 4 5; do for _ in 1 2 3 4 5; do
if ! kill -0 "$pid" 2>/dev/null; then if ! kill -0 "$pid" 2>/dev/null; then
rm -f "$PID_FILE" rm -f "$PID_FILE"
@@ -426,7 +456,7 @@ for _ in 1 2 3 4 5; do
sleep 1 sleep 1
done done
kill -9 "$pid" 2>/dev/null || true kill -9 -- -"$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true
rm -f "$PID_FILE" rm -f "$PID_FILE"
EOF EOF
)" )"
@@ -434,21 +464,158 @@ EOF
run_remote_script "$server_ssh" "$script" "PID_FILE=$server_pid_file" run_remote_script "$server_ssh" "$script" "PID_FILE=$server_pid_file"
} }
start_remote_relay() {
local script=""
script="$(cat <<'EOF'
export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin"
set -euo pipefail
cd "$RELAY_WORKDIR"
mkdir -p "$LOG_DIR"
if [[ -f "$PID_FILE" ]]; then
existing_pid="$(<"$PID_FILE")"
if [[ -n "$existing_pid" ]] && kill -0 "$existing_pid" 2>/dev/null; then
printf >&2 'relay already running with pid %s\n' "$existing_pid"
exit 1
fi
fi
: > "$STDOUT_LOG"
setsid go run ./cmd/kcpserver/ \
-mode=relay \
-listen "$LISTEN_ADDR" \
-relay-remote "$RELAY_REMOTE" \
>>"$STDOUT_LOG" 2>&1 </dev/null &
echo "$!" > "$PID_FILE"
EOF
)"
log "starting remote relay on $relay_ssh"
run_remote_script "$relay_ssh" "$script" \
"RELAY_WORKDIR=$relay_workdir" \
"LOG_DIR=$relay_log_dir" \
"PID_FILE=$relay_pid_file" \
"STDOUT_LOG=$relay_stdout_log" \
"LISTEN_ADDR=$relay_listen_addr" \
"RELAY_REMOTE=$relay_remote"
relay_started=1
}
wait_for_remote_relay_ready() {
local pattern="udp relay listening"
local script=""
local start_time="$SECONDS"
local status=0
script="$(cat <<'EOF'
set -euo pipefail
if [[ -f "$LOG_FILE" ]] && grep -Fq -- "$READY_PATTERN" "$LOG_FILE"; then
exit 0
fi
if [[ -f "$PID_FILE" ]]; then
pid="$(<"$PID_FILE")"
if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then
exit 10
fi
fi
exit 20
EOF
)"
while (( SECONDS - start_time < ready_timeout )); do
status=0
run_remote_script "$relay_ssh" "$script" \
"LOG_FILE=$relay_stdout_log" \
"READY_PATTERN=$pattern" \
"PID_FILE=$relay_pid_file" || status=$?
case "$status" in
0)
log "remote relay is ready"
return 0
;;
10)
sleep 1
;;
20)
log "remote relay exited before readiness"
dump_remote_log_head "$relay_ssh" "$relay_stdout_log" "relay"
return 1
;;
*)
log "remote relay readiness check failed with status $status"
dump_remote_log_head "$relay_ssh" "$relay_stdout_log" "relay"
return 1
;;
esac
done
log "timed out waiting for remote relay readiness after ${ready_timeout}s"
dump_remote_log_head "$relay_ssh" "$relay_stdout_log" "relay"
return 1
}
stop_remote_relay() {
local script=""
script="$(cat <<'EOF'
set -euo pipefail
if [[ ! -f "$PID_FILE" ]]; then
exit 0
fi
pid="$(<"$PID_FILE")"
if [[ -z "$pid" ]]; then
rm -f "$PID_FILE"
exit 0
fi
kill -- -"$pid" 2>/dev/null || kill "$pid" 2>/dev/null || true
for _ in 1 2 3 4 5; do
if ! kill -0 "$pid" 2>/dev/null; then
rm -f "$PID_FILE"
exit 0
fi
sleep 1
done
kill -9 -- -"$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true
rm -f "$PID_FILE"
EOF
)"
run_remote_script "$relay_ssh" "$script" "PID_FILE=$relay_pid_file"
}
start_local_peer_a() { start_local_peer_a() {
log "starting local peer-a" log "starting local peer-a"
mkdir -p "$local_log_dir" "$local_peer_a_inbox" mkdir -p "$local_log_dir" "$local_peer_a_inbox"
: > "$local_peer_a_stdout_log" : > "$local_peer_a_stdout_log"
local peer_a_args=(
-id peer-a
-server "$server_connect_addr"
-inbox-dir "$local_peer_a_inbox"
-latency-log "$local_peer_a_latency_log"
-kcp-ts-debug-log "$local_peer_a_ts_debug_log"
-kcp-session-stats-log "$local_peer_a_session_stats_log"
-interactive=false
)
if [[ "$run_mode" == "relay" ]]; then
peer_a_args+=(-relay-via "$relay_connect_addr")
fi
( (
cd "$local_workdir" cd "$local_workdir"
exec go run ./cmd/kcppeer \ exec go run ./cmd/kcppeer "${peer_a_args[@]}" \
-id peer-a \
-server "$server_addr" \
-inbox-dir "$local_peer_a_inbox" \
-latency-log "$local_peer_a_latency_log" \
-kcp-ts-debug-log "$local_peer_a_ts_debug_log" \
-kcp-session-stats-log "$local_peer_a_session_stats_log" \
-interactive=false \
>>"$local_peer_a_stdout_log" 2>&1 >>"$local_peer_a_stdout_log" 2>&1
) & ) &
@@ -456,7 +623,7 @@ start_local_peer_a() {
} }
wait_for_local_peer_a_ready() { wait_for_local_peer_a_ready() {
local pattern="connected to $server_addr as peer-a (KCP)" local pattern="opened KCP session as peer-a"
local start_time="$SECONDS" local start_time="$SECONDS"
while (( SECONDS - start_time < ready_timeout )); do while (( SECONDS - start_time < ready_timeout )); do
@@ -498,6 +665,7 @@ start_remote_peer_b() {
local script="" local script=""
script="$(cat <<'EOF' script="$(cat <<'EOF'
export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin"
set -euo pipefail set -euo pipefail
cd "$PEERB_WORKDIR" cd "$PEERB_WORKDIR"
@@ -515,7 +683,7 @@ fi
: > "$COMMAND_FILE" : > "$COMMAND_FILE"
peer_b_cmd="$(cat <<'INNER' peer_b_cmd="$(cat <<'INNER'
tail -n +1 -f "$COMMAND_FILE" | exec ./bin/kcppeer \ tail -n +1 -f "$COMMAND_FILE" | exec go run ./cmd/kcppeer/ \
-id peer-b \ -id peer-b \
-server "$SERVER_ADDR" \ -server "$SERVER_ADDR" \
-inbox-dir "$INBOX_DIR" \ -inbox-dir "$INBOX_DIR" \
@@ -525,7 +693,7 @@ fi
INNER INNER
)" )"
nohup bash -lc "$peer_b_cmd" >>"$STDOUT_LOG" 2>&1 </dev/null & nohup setsid bash -lc "$peer_b_cmd" >>"$STDOUT_LOG" 2>&1 </dev/null &
echo "$!" > "$PID_FILE" echo "$!" > "$PID_FILE"
EOF EOF
)" )"
@@ -538,7 +706,7 @@ EOF
"STDOUT_LOG=$peerb_stdout_log" \ "STDOUT_LOG=$peerb_stdout_log" \
"COMMAND_FILE=$peerb_command_file" \ "COMMAND_FILE=$peerb_command_file" \
"PID_FILE=$peerb_pid_file" \ "PID_FILE=$peerb_pid_file" \
"SERVER_ADDR=$server_addr" \ "SERVER_ADDR=$server_connect_addr" \
"LATENCY_LOG=$peerb_latency_log" \ "LATENCY_LOG=$peerb_latency_log" \
"TS_DEBUG_LOG=$peerb_ts_debug_log" \ "TS_DEBUG_LOG=$peerb_ts_debug_log" \
"SESSION_STATS_LOG=$peerb_session_stats_log" "SESSION_STATS_LOG=$peerb_session_stats_log"
@@ -547,7 +715,7 @@ EOF
} }
wait_for_remote_peer_b_ready() { wait_for_remote_peer_b_ready() {
local pattern="connected to $server_addr as peer-b (KCP)" local pattern="opened KCP session as peer-b"
local script="" local script=""
local start_time="$SECONDS" local start_time="$SECONDS"
local status=0 local status=0
@@ -571,16 +739,17 @@ EOF
)" )"
while (( SECONDS - start_time < ready_timeout )); do while (( SECONDS - start_time < ready_timeout )); do
if run_remote_script "$peerb_ssh" "$script" \ status=0
run_remote_script "$peerb_ssh" "$script" \
"LOG_FILE=$peerb_stdout_log" \ "LOG_FILE=$peerb_stdout_log" \
"READY_PATTERN=$pattern" \ "READY_PATTERN=$pattern" \
"PID_FILE=$peerb_pid_file"; then "PID_FILE=$peerb_pid_file" || status=$?
log "remote peer-b is ready"
return 0
fi
status=$?
case "$status" in case "$status" in
0)
log "remote peer-b is ready"
return 0
;;
10) 10)
sleep 1 sleep 1
;; ;;
@@ -739,7 +908,7 @@ if kill -0 "$pid" 2>/dev/null; then
fi fi
sleep 1 sleep 1
done done
kill "$pid" 2>/dev/null || true kill -- -"$pid" 2>/dev/null || kill "$pid" 2>/dev/null || true
for _ in 1 2 3 4 5; do for _ in 1 2 3 4 5; do
if ! kill -0 "$pid" 2>/dev/null; then if ! kill -0 "$pid" 2>/dev/null; then
rm -f "$PID_FILE" "$COMMAND_FILE" rm -f "$PID_FILE" "$COMMAND_FILE"
@@ -747,7 +916,7 @@ if kill -0 "$pid" 2>/dev/null; then
fi fi
sleep 1 sleep 1
done done
kill -9 "$pid" 2>/dev/null || true kill -9 -- -"$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true
fi fi
rm -f "$PID_FILE" "$COMMAND_FILE" rm -f "$PID_FILE" "$COMMAND_FILE"
@@ -774,6 +943,11 @@ cleanup() {
stop_remote_peer_b || true stop_remote_peer_b || true
fi fi
if (( relay_started == 1 )); then
log "stopping remote relay on $relay_ssh"
stop_remote_relay || true
fi
if (( server_started == 1 )); then if (( server_started == 1 )); then
log "stopping remote server on $server_ssh" log "stopping remote server on $server_ssh"
stop_remote_server || true stop_remote_server || true
@@ -794,6 +968,11 @@ handle_terminate() {
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case "$1" in case "$1" in
--mode)
[[ $# -ge 2 ]] || die "--mode requires a value"
run_mode="$2"
shift 2
;;
--server-ssh) --server-ssh)
[[ $# -ge 2 ]] || die "--server-ssh requires a value" [[ $# -ge 2 ]] || die "--server-ssh requires a value"
server_ssh="$2" server_ssh="$2"
@@ -804,11 +983,26 @@ while [[ $# -gt 0 ]]; do
peerb_ssh="$2" peerb_ssh="$2"
shift 2 shift 2
;; ;;
--relay-ssh)
[[ $# -ge 2 ]] || die "--relay-ssh requires a value"
relay_ssh="$2"
shift 2
;;
--server-addr) --server-addr)
[[ $# -ge 2 ]] || die "--server-addr requires a value" [[ $# -ge 2 ]] || die "--server-addr requires a value"
server_addr="$2" server_addr="$2"
shift 2 shift 2
;; ;;
--relay-addr)
[[ $# -ge 2 ]] || die "--relay-addr requires a value"
relay_addr="$2"
shift 2
;;
--relay-remote)
[[ $# -ge 2 ]] || die "--relay-remote requires a value"
relay_remote="$2"
shift 2
;;
--log-prefix) --log-prefix)
[[ $# -ge 2 ]] || die "--log-prefix requires a value" [[ $# -ge 2 ]] || die "--log-prefix requires a value"
log_prefix="$2" log_prefix="$2"
@@ -819,11 +1013,21 @@ while [[ $# -gt 0 ]]; do
listen_addr="$2" listen_addr="$2"
shift 2 shift 2
;; ;;
--relay-listen-addr)
[[ $# -ge 2 ]] || die "--relay-listen-addr requires a value"
relay_listen_addr="$2"
shift 2
;;
--server-workdir) --server-workdir)
[[ $# -ge 2 ]] || die "--server-workdir requires a value" [[ $# -ge 2 ]] || die "--server-workdir requires a value"
server_workdir="$2" server_workdir="$2"
shift 2 shift 2
;; ;;
--relay-workdir)
[[ $# -ge 2 ]] || die "--relay-workdir requires a value"
relay_workdir="$2"
shift 2
;;
--peerb-workdir) --peerb-workdir)
[[ $# -ge 2 ]] || die "--peerb-workdir requires a value" [[ $# -ge 2 ]] || die "--peerb-workdir requires a value"
peerb_workdir="$2" peerb_workdir="$2"
@@ -869,12 +1073,19 @@ while [[ $# -gt 0 ]]; do
esac esac
done done
[[ "$run_mode" == "direct" || "$run_mode" == "relay" ]] || die "--mode must be 'direct' or 'relay', got: $run_mode"
[[ -n "$server_ssh" ]] || die "--server-ssh is required" [[ -n "$server_ssh" ]] || die "--server-ssh is required"
[[ -n "$peerb_ssh" ]] || die "--peerb-ssh is required" [[ -n "$peerb_ssh" ]] || die "--peerb-ssh is required"
[[ -n "$server_addr" ]] || die "--server-addr is required" [[ -n "$server_addr" ]] || die "--server-addr is required"
[[ -n "$log_prefix" ]] || die "--log-prefix is required" [[ -n "$log_prefix" ]] || die "--log-prefix is required"
(( ${#peerb_files[@]} > 0 )) || die "at least one --file is required" (( ${#peerb_files[@]} > 0 )) || die "at least one --file is required"
if [[ "$run_mode" == "relay" ]]; then
[[ -n "$relay_ssh" ]] || die "--relay-ssh is required in relay mode"
[[ -n "$relay_addr" ]] || die "--relay-addr is required in relay mode"
[[ -n "$relay_remote" ]] || die "--relay-remote is required in relay mode"
fi
validate_positive_integer "--ready-timeout" "$ready_timeout" validate_positive_integer "--ready-timeout" "$ready_timeout"
validate_positive_integer "--repeat" "$repeat_count" validate_positive_integer "--repeat" "$repeat_count"
validate_sleep_value "--send-interval" "$send_interval" validate_sleep_value "--send-interval" "$send_interval"
@@ -882,6 +1093,16 @@ validate_sleep_value "--drain-wait" "$drain_wait"
check_local_dependencies check_local_dependencies
# Extract ports and build peer connection addresses.
server_port="${listen_addr##*:}"
server_connect_addr="${server_addr}:${server_port}"
relay_connect_addr=""
if [[ "$run_mode" == "relay" ]]; then
relay_port="${relay_listen_addr##*:}"
relay_connect_addr="${relay_addr}:${relay_port}"
fi
log_dir_name="${log_prefix}logs" log_dir_name="${log_prefix}logs"
inbox_dir_name="${log_prefix}inbox" inbox_dir_name="${log_prefix}inbox"
@@ -902,6 +1123,15 @@ server_log_dir="$(join_path "$server_workdir" "$log_dir_name")"
server_pid_file="$(join_path "$server_log_dir" "server.pid")" server_pid_file="$(join_path "$server_log_dir" "server.pid")"
server_stdout_log="$(join_path "$server_log_dir" "server.stdout.log")" server_stdout_log="$(join_path "$server_log_dir" "server.stdout.log")"
relay_log_dir=""
relay_pid_file=""
relay_stdout_log=""
if [[ "$run_mode" == "relay" ]]; then
relay_log_dir="$(join_path "$relay_workdir" "$log_dir_name")"
relay_pid_file="$(join_path "$relay_log_dir" "relay.pid")"
relay_stdout_log="$(join_path "$relay_log_dir" "relay.stdout.log")"
fi
peerb_log_dir="$(join_path "$peerb_workdir" "$log_dir_name")" peerb_log_dir="$(join_path "$peerb_workdir" "$log_dir_name")"
peerb_inbox_dir="$(join_path "$peerb_workdir" "$inbox_dir_name/peer-b")" peerb_inbox_dir="$(join_path "$peerb_workdir" "$inbox_dir_name/peer-b")"
peerb_stdout_log="$(join_path "$peerb_log_dir" "peer-b.stdout.log")" peerb_stdout_log="$(join_path "$peerb_log_dir" "peer-b.stdout.log")"
@@ -919,13 +1149,23 @@ clean_log_directories
mkdir -p "$local_log_dir" "$local_peer_a_inbox" mkdir -p "$local_log_dir" "$local_peer_a_inbox"
log "run mode: $run_mode"
log "local peer-a logs: $local_log_dir" log "local peer-a logs: $local_log_dir"
log "remote server logs: $server_log_dir" log "remote server logs: $server_log_dir"
if [[ "$run_mode" == "relay" ]]; then
log "remote relay logs: $relay_log_dir"
fi
log "remote peer-b logs: $peerb_log_dir" log "remote peer-b logs: $peerb_log_dir"
check_remote_peerb_files check_remote_peerb_files
start_remote_server start_remote_server
wait_for_remote_server_ready wait_for_remote_server_ready
if [[ "$run_mode" == "relay" ]]; then
start_remote_relay
wait_for_remote_relay_ready
fi
start_local_peer_a start_local_peer_a
start_remote_peer_b start_remote_peer_b
wait_for_local_peer_a_ready wait_for_local_peer_a_ready
@@ -940,6 +1180,15 @@ if [[ -n "$peer_a_pid" ]]; then
stop_local_peer_a stop_local_peer_a
fi fi
if (( relay_started == 1 )); then
log "stopping remote relay on $relay_ssh after batch"
if stop_remote_relay; then
relay_started=0
else
log "failed to stop remote relay cleanly; cleanup will retry"
fi
fi
if (( server_started == 1 )); then if (( server_started == 1 )); then
log "stopping remote server on $server_ssh after batch" log "stopping remote server on $server_ssh after batch"
if stop_remote_server; then if stop_remote_server; then