Refactor run_iperf function and improve test execution logging

This commit is contained in:
Yaro Kasear 2025-04-22 10:17:42 -05:00
parent d74aa8ba2c
commit 5c4cb2606e

View file

@ -75,6 +75,8 @@ run_iperf() {
tmp_json=$(mktemp) tmp_json=$(mktemp)
local result local result
sleep 1s
result=$(iperf3 "${args[@]}" -J >"$tmp_json" 2>"$tmp_err") result=$(iperf3 "${args[@]}" -J >"$tmp_json" 2>"$tmp_err")
parsed=$(jq -r ' parsed=$(jq -r '
@ -104,9 +106,8 @@ run_iperf() {
} }
# Start test email # Start test email
echo -e "Subject: Test ${BOOT_ID} Started\n\nThis is to inform you that the tests have commenced for test ${BOOT_ID}." | msmtp $RECIPIENT echo -e "Subject: Test ${BOOT_ID} Started\n\nThis is to inform you that the tests have commenced for test ${BOOT_ID}." | msmtp "$RECIPIENT"
COUNTER=0
FAILED_START=$(get_tx_failed) FAILED_START=$(get_tx_failed)
# Create CSV header if needed # Create CSV header if needed
@ -114,9 +115,8 @@ if [ ! -f "$TEST_FILE" ]; then
echo "StartTimestamp,EndTimestamp,Link,Level,Noise,BSSID,TX Bitrate,RX Bitrate,$(speedtest --csv-header),TX Failures,Channel,Frequency,Packet Loss,Jitter,LocalTCPUp,LocalTCPDown,LocalUDPUp,LocalUDPDown,RemoteTCPUp,RemoteTCPDown,RemoteUDPUp,RemoteUDPDown" >"$TEST_FILE" echo "StartTimestamp,EndTimestamp,Link,Level,Noise,BSSID,TX Bitrate,RX Bitrate,$(speedtest --csv-header),TX Failures,Channel,Frequency,Packet Loss,Jitter,LocalTCPUp,LocalTCPDown,LocalUDPUp,LocalUDPDown,RemoteTCPUp,RemoteTCPDown,RemoteUDPUp,RemoteUDPDown" >"$TEST_FILE"
fi fi
while [ "$COUNTER" -lt "$NUM_TESTS" ]; do for ((COUNTER = 1; COUNTER <= NUM_TESTS; COUNTER++)); do
COUNTER=$((COUNTER + 1)) echo "Executing test run $COUNTER of $NUM_TESTS..."
echo "Executing test $COUNTER of $NUM_TESTS..."
for ((i = 1; i <= NUM_SAMPLES; i++)); do for ((i = 1; i <= NUM_SAMPLES; i++)); do
echo " Gathering sample $i of $NUM_SAMPLES..." echo " Gathering sample $i of $NUM_SAMPLES..."
@ -124,45 +124,39 @@ while [ "$COUNTER" -lt "$NUM_TESTS" ]; do
# Wireless stats # Wireless stats
link_level_noise=$(awk 'NR==3 {gsub(/\./, "", $3); gsub(/\./, "", $4); gsub(/\./, "", $5); print $3","$4","$5}' /proc/net/wireless) link_level_noise=$(awk 'NR==3 {gsub(/\./, "", $3); gsub(/\./, "", $4); gsub(/\./, "", $5); print $3","$4","$5}' /proc/net/wireless)
bssid_and_bitrate=$(iw dev $INTERFACE link | awk '/Connected/ {bssid=$3} /tx bitrate/ {tx=$3} /rx bitrate/ {rx=$3} END {print bssid","tx","rx}') bssid_and_bitrate=$(iw dev "$INTERFACE" link | awk '/Connected/ {bssid=$3} /tx bitrate/ {tx=$3} /rx bitrate/ {rx=$3} END {print bssid","tx","rx}')
speed_results="" speed_results=""
for ((retry = 1; retry <= MAX_RETRIES; retry++)); do for ((retry = 1; retry <= MAX_RETRIES; retry++)); do
echo " Attempting speed test (try $retry)..." echo " Attempting speed test (try $retry)..."
speed_results=$(speedtest --secure --csv 2>/dev/null) speed_results=$(speedtest --secure --csv 2>/dev/null) || true
if [[ -n "$speed_results" ]]; then if [[ -n "$speed_results" ]]; then
break break
fi fi
echo " [!] Speedtest failed at $(date -Iseconds). Retrying in $RETRY_DELAY seconds..." echo " [!] Speedtest failed at $(date -Iseconds). Retrying in $RETRY_DELAY seconds..."
sleep $RETRY_DELAY sleep "$RETRY_DELAY"
done done
if [[ -z "$speed_results" ]]; then if [[ -z "$speed_results" ]]; then
TIMESTAMP=$(date -Iseconds) TIMESTAMP=$(date -Iseconds)
echo " [!] Speedtest permanently failed at $TIMESTAMP. Skipping sample $i of test $COUNTER." echo " [!] Speedtest permanently failed at $TIMESTAMP. Skipping sample $i of test $COUNTER."
# Optionally log failure to a sidecar file for later nerd rage
echo "$TIMESTAMP,Test $COUNTER,Sample $i" >>"${TEST_FILE%.csv}-failures.log" echo "$TIMESTAMP,Test $COUNTER,Sample $i" >>"${TEST_FILE%.csv}-failures.log"
continue
continue # Skip this sample
fi fi
# TX failure delta
FAILED_NOW=$(get_tx_failed) FAILED_NOW=$(get_tx_failed)
FAILED_DELTA=$((FAILED_NOW - FAILED_START)) FAILED_DELTA=$((FAILED_NOW - FAILED_START))
FAILED_START=$FAILED_NOW # Update for next sample FAILED_START=$FAILED_NOW
freq=$(iw dev $INTERFACE link | awk '/freq:/ {print $2}') freq=$(iw dev "$INTERFACE" link | awk '/freq:/ {print $2}')
channel=$(freq_to_channel "$freq") channel=$(freq_to_channel "$freq")
packet_loss=$(ping -c $PING_COUNT -q $PING_TARGET | grep -oP '\d+(?=% packet loss)') packet_loss=$(ping -c "$PING_COUNT" -q "$PING_TARGET" | grep -oP '\d+(?=% packet loss)')
jitter=$(ping -c $PING_COUNT $PING_TARGET | grep "time=" | awk '{print $(NF-1)}' | sed 's/time=//g' | awk '{sum+=$1; sumsq+=$1*$1} END {if (NR>1) print sqrt(sumsq/NR - (sum/NR)**2); else print 0}') jitter=$(ping -c "$PING_COUNT" "$PING_TARGET" | grep "time=" | awk '{print $(NF-1)}' | sed 's/time=//g' | awk '{sum+=$1; sumsq+=$1*$1} END {if (NR>1) print sqrt(sumsq/NR - (sum/NR)**2); else print 0}')
echo " Running iperf3 tests..." echo " Running iperf3 tests..."
# Run them all. These are in bits per second, convert as needed later.
LocalTCPUp=$(run_iperf "$IPERF_LOCAL_TARGET" tcp up) LocalTCPUp=$(run_iperf "$IPERF_LOCAL_TARGET" tcp up)
LocalTCPDown=$(run_iperf "$IPERF_LOCAL_TARGET" tcp down) LocalTCPDown=$(run_iperf "$IPERF_LOCAL_TARGET" tcp down)
LocalUDPUp=$(run_iperf "$IPERF_LOCAL_TARGET" udp up) LocalUDPUp=$(run_iperf "$IPERF_LOCAL_TARGET" udp up)
@ -175,15 +169,14 @@ while [ "$COUNTER" -lt "$NUM_TESTS" ]; do
END_TIME=$(date -Iseconds) END_TIME=$(date -Iseconds)
# Log everything
echo "$START_TIME,$END_TIME,$link_level_noise,$bssid_and_bitrate,$speed_results,$FAILED_DELTA,$channel,$freq,$packet_loss,$jitter,$LocalTCPUp,$LocalTCPDown,$LocalUDPUp,$LocalUDPDown,$RemoteTCPUp,$RemoteTCPDown,$RemoteUDPUp,$RemoteUDPDown" >>"$TEST_FILE" echo "$START_TIME,$END_TIME,$link_level_noise,$bssid_and_bitrate,$speed_results,$FAILED_DELTA,$channel,$freq,$packet_loss,$jitter,$LocalTCPUp,$LocalTCPDown,$LocalUDPUp,$LocalUDPDown,$RemoteTCPUp,$RemoteTCPDown,$RemoteUDPUp,$RemoteUDPDown" >>"$TEST_FILE"
done
if [ "$COUNTER" -lt "$NUM_TESTS" ]; then if [ "$COUNTER" -lt "$NUM_TESTS" ]; then
echo "Dozing off for $TIME_BETWEEN..." echo "Waiting $TIME_BETWEEN before the next test run..."
sleep $TIME_BETWEEN sleep "$TIME_BETWEEN"
fi fi
done done
done
echo "Stopping kismet..." echo "Stopping kismet..."