From 93c6b838a7362ac5d28b15931998d98079aae044 Mon Sep 17 00:00:00 2001 From: Daniel Maksymilian Syrnicki Date: Sat, 18 Apr 2026 15:26:10 +0200 Subject: [PATCH] fix(smoke): capture arp-scan output instead of piping into awk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When host-networking finally gave arp-scan a real LAN to scan, the first MAC-match emitted a line, awk hit its `exit` clause, closed the pipe, and arp-scan died from SIGPIPE (exit 141). With `set -o pipefail` active, that killed the whole smoke-vm.sh run immediately after "==> starting VM" — no IP discovery, no curl, no prune. Fix: capture arp-scan's output into a variable first, then let awk parse a here-string. Same treatment for the `ip neigh show` fallback. No pipe, no pipefail cascade. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/smoke-vm.sh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/smoke-vm.sh b/scripts/smoke-vm.sh index f04df4d..b7fee34 100755 --- a/scripts/smoke-vm.sh +++ b/scripts/smoke-vm.sh @@ -153,14 +153,19 @@ MAC_LOWER="$(echo "$MAC" | tr 'A-Z' 'a-z')" IP="" deadline=$((SECONDS + 150)) while (( SECONDS < deadline )); do + # Capture-then-parse instead of piping directly into awk. `awk '... exit'` + # exits on first match, which SIGPIPEs the upstream arp-scan (exit 141). + # With `set -o pipefail` active that kills the whole script — exactly what + # happened the first time host-networking gave arp-scan real matches. + SCAN="" if command -v arp-scan >/dev/null 2>&1; then - IP="$(sudo arp-scan --localnet --quiet --ignoredups 2>/dev/null \ - | awk -v m="$MAC_LOWER" 'tolower($2) == m { print $1; exit }')" + SCAN="$(sudo arp-scan --localnet --quiet --ignoredups 2>/dev/null || true)" + IP="$(awk -v m="$MAC_LOWER" 'tolower($2) == m { print $1; exit }' <<<"$SCAN")" fi if [[ -z "$IP" ]] && command -v nmap >/dev/null 2>&1; then sudo nmap -sn -T4 192.168.178.0/24 >/dev/null 2>&1 || true - IP="$(ip neigh show \ - | awk -v m="$MAC_LOWER" 'tolower($5) == m && $1 ~ /^[0-9]/ { print $1; exit }')" + NEIGH="$(ip neigh show)" + IP="$(awk -v m="$MAC_LOWER" 'tolower($5) == m && $1 ~ /^[0-9]/ { print $1; exit }' <<<"$NEIGH")" fi [[ -n "$IP" ]] && break sleep 5