forked from finn/tinyboard
fix(setup-network): collect all user input before switching AP to prevent SSH session drop mid-prompt
This commit is contained in:
@@ -123,14 +123,31 @@ case "$NET_OPT" in
|
|||||||
WPA_CONF=$(wpa_passphrase "$NEW_SSID" "$NEW_PASS") \
|
WPA_CONF=$(wpa_passphrase "$NEW_SSID" "$NEW_PASS") \
|
||||||
|| die "Failed to generate WPA config — check SSID and password."
|
|| 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=$(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:]')
|
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" ssid "\"${NEW_SSID}\"" >/dev/null
|
||||||
wpa_cli -i "$WIFI_IFACE" set_network "$NETWORK_ID" psk "${PSK}" >/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
|
wpa_cli -i "$WIFI_IFACE" select_network "$NETWORK_ID" >/dev/null
|
||||||
|
|
||||||
info "Waiting for association..."
|
info "Waiting for association..."
|
||||||
@@ -138,11 +155,12 @@ case "$NET_OPT" in
|
|||||||
for i in $(seq 1 10); do
|
for i in $(seq 1 10); do
|
||||||
sleep 2
|
sleep 2
|
||||||
STATUS=$(wpa_cli -i "$WIFI_IFACE" status 2>/dev/null | awk -F= '/^wpa_state=/{print $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
|
ASSOCIATED=true
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
warn "Attempt $i/10 — state: ${STATUS:-unknown}"
|
warn "Attempt $i/10 — state: ${STATUS:-unknown}, ssid: ${CONN_SSID:-none}"
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$ASSOCIATED" = "false" ]; then
|
if [ "$ASSOCIATED" = "false" ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user