Skip to content

Commit 7657772

Browse files
committed
harden live compare preflight
1 parent 8d393b9 commit 7657772

File tree

1 file changed

+48
-7
lines changed

1 file changed

+48
-7
lines changed

scripts/run_live_network_compare.sh

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ PASSWORD="${PASSWORD:-sayaganteng}"
2424
HTTP_HOST_OVERRIDE="${HTTP_HOST:-}"
2525
MQTT_HOST_OVERRIDE="${MQTT_HOST:-}"
2626
HOST_IP_OVERRIDE="${HOST_IP:-}"
27+
HTTP_TARGET_PORT="${HTTP_TARGET_PORT:-${HTTP_PORT}}"
28+
MQTT_TARGET_PORT="${MQTT_TARGET_PORT:-${MQTT_PORT}}"
29+
HTTP_BIND_PORT="${HTTP_BIND_PORT:-}"
30+
MQTT_BIND_PORT="${MQTT_BIND_PORT:-}"
2731
HTTP_CAPTURE_SECONDS="${HTTP_CAPTURE_SECONDS:-14}"
2832
CAPTURE_START_DELAY="${CAPTURE_START_DELAY:-2}"
2933
MQTT_CAPTURE_COUNT="${MQTT_CAPTURE_COUNT:-50}"
@@ -32,6 +36,26 @@ MQTT_SUB_PID=""
3236

3337
mkdir -p "${WORK_DIR}"
3438

39+
find_free_port() {
40+
local start_port="$1"
41+
python3 - "$start_port" <<'PY'
42+
import socket
43+
import sys
44+
45+
start = int(sys.argv[1])
46+
for port in range(start, start + 64):
47+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
48+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
49+
try:
50+
sock.bind(("127.0.0.1", port))
51+
except OSError:
52+
continue
53+
print(port)
54+
raise SystemExit(0)
55+
raise SystemExit(1)
56+
PY
57+
}
58+
3559
if [[ ! -x "${ARDUINO_CLI}" ]]; then
3660
echo "arduino-cli not found at ${ARDUINO_CLI}" >&2
3761
exit 1
@@ -42,6 +66,13 @@ if ! command -v docker >/dev/null 2>&1; then
4266
exit 1
4367
fi
4468

69+
if [[ -z "${HTTP_BIND_PORT}" ]]; then
70+
HTTP_BIND_PORT="$(find_free_port "${HTTP_PORT}")"
71+
fi
72+
if [[ -z "${MQTT_BIND_PORT}" ]]; then
73+
MQTT_BIND_PORT="$(find_free_port "${MQTT_PORT}")"
74+
fi
75+
4576
case "${BOARD}" in
4677
esp32)
4778
PORT="${PORT_OVERRIDE:-/dev/ttyUSB0}"
@@ -91,6 +122,13 @@ if [[ -z "${HTTP_HOST_OVERRIDE}" && -z "${MQTT_HOST_OVERRIDE}" && -n "${ACTIVE_W
91122
echo "warning: set HOST_IP/HTTP_HOST/MQTT_HOST explicitly or join the laptop to the target SSID for true end-to-end validation." >&2
92123
fi
93124

125+
if command -v nmcli >/dev/null 2>&1; then
126+
if ! nmcli -t -f SSID dev wifi list 2>/dev/null | rg -Fxq "${SSID}"; then
127+
echo "warning: target SSID '${SSID}' is not visible in the current local Wi-Fi scan." >&2
128+
echo "warning: the SSID may be hidden, out of range, 5 GHz only, or otherwise unsuitable for the board." >&2
129+
fi
130+
fi
131+
94132
write_secrets() {
95133
local target="$1"
96134
cat >"${target}" <<EOF
@@ -100,10 +138,10 @@ write_secrets() {
100138
static const char* kWiFiSsid = "${SSID}";
101139
static const char* kWiFiPassword = "${PASSWORD}";
102140
static const char* kHttpHost = "${HTTP_HOST_VALUE}";
103-
static const uint16_t kHttpPort = ${HTTP_PORT};
141+
static const uint16_t kHttpPort = ${HTTP_TARGET_PORT};
104142
static const char* kHttpPath = "/api/data";
105143
static const char* kMqttHost = "${MQTT_HOST_VALUE}";
106-
static const uint16_t kMqttPort = ${MQTT_PORT};
144+
static const uint16_t kMqttPort = ${MQTT_TARGET_PORT};
107145
static const char* kMqttTopic = "${MQTT_TOPIC}";
108146
109147
#endif
@@ -126,15 +164,15 @@ write_secrets "${ROOT_DIR}/examples/LiveNetworkNode/LocalSecrets.h"
126164

127165
python3 "${ROOT_DIR}/scripts/live_http_receiver.py" \
128166
--host 0.0.0.0 \
129-
--port "${HTTP_PORT}" \
167+
--port "${HTTP_BIND_PORT}" \
130168
--status-file "${HTTP_STATUS_FILE}" \
131169
>"${HTTP_LOG}" 2>&1 &
132170
HTTP_SERVER_PID=$!
133171
sleep 1
134172

135173
MQTT_CONFIG="${WORK_DIR}/mosquitto.conf"
136174
cat >"${MQTT_CONFIG}" <<EOF
137-
listener ${MQTT_PORT} 0.0.0.0
175+
listener ${MQTT_BIND_PORT} 0.0.0.0
138176
allow_anonymous true
139177
persistence false
140178
EOF
@@ -146,7 +184,7 @@ docker run -d --name zerokernel-mqtt-broker --network host \
146184
sleep 2
147185

148186
docker run --rm --network host eclipse-mosquitto:2 \
149-
mosquitto_sub -h 127.0.0.1 -p "${MQTT_PORT}" -t "${MQTT_TOPIC}" -v \
187+
mosquitto_sub -h 127.0.0.1 -p "${MQTT_BIND_PORT}" -t "${MQTT_TOPIC}" -v \
150188
>"${MQTT_LOG}" 2>&1 &
151189
MQTT_SUB_PID=$!
152190

@@ -211,7 +249,10 @@ raise SystemExit(1)
211249
PY
212250
}
213251

214-
echo "Using host targets HTTP=${HTTP_HOST_VALUE}:${HTTP_PORT} MQTT=${MQTT_HOST_VALUE}:${MQTT_PORT}"
252+
echo "Using host targets HTTP=${HTTP_HOST_VALUE}:${HTTP_TARGET_PORT} MQTT=${MQTT_HOST_VALUE}:${MQTT_TARGET_PORT}"
253+
if [[ "${HTTP_BIND_PORT}" != "${HTTP_TARGET_PORT}" || "${MQTT_BIND_PORT}" != "${MQTT_TARGET_PORT}" ]]; then
254+
echo "Using local bind ports HTTP=${HTTP_BIND_PORT} MQTT=${MQTT_BIND_PORT} for validation helpers"
255+
fi
215256

216257
echo "Running live baseline on ${BOARD} (${PORT})"
217258
compile_and_upload "${ROOT_DIR}/examples/LiveNetworkBaseline" "${BASELINE_BUILD_LOG}"
@@ -226,7 +267,7 @@ NODE_LINE="$(parse_last_line "LIVE_NETMODULES window_ms=" "${NODE_LOG}")"
226267
echo "${NODE_LINE}"
227268

228269
sleep 1
229-
HTTP_STATUS="$(curl -m 3 -fsS "http://127.0.0.1:${HTTP_PORT}/api/status")"
270+
HTTP_STATUS="$(curl -m 3 -fsS "http://127.0.0.1:${HTTP_BIND_PORT}/api/status")"
230271
MQTT_MESSAGES="$(wc -l < "${MQTT_LOG}" | tr -d ' ')"
231272

232273
restore_safe

0 commit comments

Comments
 (0)