diff --git a/spoke/setup-network.sh b/spoke/setup-network.sh index 450143c..dcc72eb 100755 --- a/spoke/setup-network.sh +++ b/spoke/setup-network.sh @@ -123,14 +123,31 @@ case "$NET_OPT" in WPA_CONF=$(wpa_passphrase "$NEW_SSID" "$NEW_PASS") \ || die "Failed to generate WPA config — check SSID and password." + info "Currently connected to: ${CURRENT_SSID:-none}" + info "Switching to: ${NEW_SSID}" + warn "Your SSH session will drop. Reconnect once the device joins '${NEW_SSID}'." + echo "" + read -rp "Proceed? [Y/n]: " CONFIRM + CONFIRM="${CONFIRM:-y}" + [[ "${CONFIRM,,}" == "y" ]] || { info "Aborted."; exit 0; } + + EXISTING_IDS=$(wpa_cli -i "$WIFI_IFACE" list_networks 2>/dev/null | awk 'NR>1 {print $1}') + if [[ -z "$EXISTING_IDS" ]] && ! wpa_cli -i "$WIFI_IFACE" status >/dev/null 2>&1; then + die "wpa_supplicant is not running on ${WIFI_IFACE}. Start it first." + fi + + for EID in $EXISTING_IDS; do + wpa_cli -i "$WIFI_IFACE" disable_network "$EID" >/dev/null 2>&1 || true + done + NETWORK_ID=$(wpa_cli -i "$WIFI_IFACE" add_network 2>/dev/null | tr -d '[:space:]') - [[ "$NETWORK_ID" =~ ^[0-9]+$ ]] || die "wpa_supplicant is not running on ${WIFI_IFACE}. Start it first." + [[ "$NETWORK_ID" =~ ^[0-9]+$ ]] || die "Failed to add network — wpa_supplicant may not be running." PSK=$(echo "$WPA_CONF" | awk -F= '/^\s*psk=/{print $2}' | grep -v '"' | tr -d '[:space:]') wpa_cli -i "$WIFI_IFACE" set_network "$NETWORK_ID" ssid "\"${NEW_SSID}\"" >/dev/null wpa_cli -i "$WIFI_IFACE" set_network "$NETWORK_ID" psk "${PSK}" >/dev/null - wpa_cli -i "$WIFI_IFACE" enable_network "$NETWORK_ID" >/dev/null + wpa_cli -i "$WIFI_IFACE" set_network "$NETWORK_ID" freq_list "2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462" >/dev/null wpa_cli -i "$WIFI_IFACE" select_network "$NETWORK_ID" >/dev/null info "Waiting for association..." @@ -138,11 +155,12 @@ case "$NET_OPT" in for i in $(seq 1 10); do sleep 2 STATUS=$(wpa_cli -i "$WIFI_IFACE" status 2>/dev/null | awk -F= '/^wpa_state=/{print $2}') - if [ "$STATUS" = "COMPLETED" ]; then + CONN_SSID=$(wpa_cli -i "$WIFI_IFACE" status 2>/dev/null | awk -F= '/^ssid=/{print $2}') + if [ "$STATUS" = "COMPLETED" ] && [ "$CONN_SSID" = "$NEW_SSID" ]; then ASSOCIATED=true break fi - warn "Attempt $i/10 — state: ${STATUS:-unknown}" + warn "Attempt $i/10 — state: ${STATUS:-unknown}, ssid: ${CONN_SSID:-none}" done if [ "$ASSOCIATED" = "false" ]; then