refactor(setup-network): let netplan own the AP switch — update config and apply before wpa_cli

This commit is contained in:
Justin Oros
2026-04-23 12:16:40 -07:00
parent bbf1d8b79a
commit cbdbce7a41

View File

@@ -74,7 +74,7 @@ case "$NET_OPT" in
;;
4)
header "Change Wireless Network"
check_deps iw wpa_cli wpa_passphrase
check_deps iw netplan
WIFI_IFACE=$(iw dev 2>/dev/null | awk '/Interface/{print $2}' | head -1)
[ -n "$WIFI_IFACE" ] || die "No wireless interface found."
@@ -120,9 +120,6 @@ case "$NET_OPT" in
echo ""
[ -n "$NEW_PASS" ] || die "Password cannot be empty."
WPA_CONF=$(wpa_passphrase "$NEW_SSID" "$NEW_PASS") \
|| die "Failed to generate WPA config — check SSID and password."
NETPLAN_BACKUP_DIR="/root/.config/tinyboard/netplan-backups"
mkdir -p "$NETPLAN_BACKUP_DIR"
@@ -157,65 +154,6 @@ case "$NET_OPT" in
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" remove_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 "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" select_network "$NETWORK_ID" >/dev/null
info "Waiting for association..."
ASSOCIATED=false
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}')
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}, ssid: ${CONN_SSID:-none}"
done
if [ "$ASSOCIATED" = "false" ]; then
wpa_cli -i "$WIFI_IFACE" remove_network "$NETWORK_ID" >/dev/null 2>&1 || true
die "Failed to associate with '${NEW_SSID}'. Check the password and try again."
fi
wpa_cli -i "$WIFI_IFACE" save_config >/dev/null 2>&1 || true
info "Associated — renewing DHCP lease..."
if systemctl is-active --quiet "systemd-networkd"; then
networkctl reconfigure "$WIFI_IFACE" 2>/dev/null || true
fi
if command -v dhclient >/dev/null 2>&1; then
dhclient -r "$WIFI_IFACE" 2>/dev/null || true
dhclient "$WIFI_IFACE" 2>/dev/null || true
elif command -v udhcpc >/dev/null 2>&1; then
udhcpc -i "$WIFI_IFACE" -q 2>/dev/null || true
fi
sleep 3
NEW_IP=$(ip -o -4 addr show "$WIFI_IFACE" 2>/dev/null | awk '{print $4}' | head -1)
if [ -n "$NEW_IP" ]; then
info "IP address: ${NEW_IP}"
else
warn "No IP assigned yet — DHCP may still be in progress."
fi
if [ -n "$NETPLAN_FILE" ] && grep -q "access-points" "$NETPLAN_FILE" 2>/dev/null; then
BACKUP_FILE="$NETPLAN_BACKUP_DIR/$(basename "${NETPLAN_FILE}").$(date +%Y%m%d%H%M%S)"
cp "$NETPLAN_FILE" "$BACKUP_FILE"
@@ -233,12 +171,39 @@ txt = re.sub(
)
open(path, "w").write(txt)
PYEOF
info "Updated: $NETPLAN_FILE"
info "Changes will persist on next boot."
info "Netplan config updated."
elif [ -n "$NETPLAN_FILE" ]; then
warn "$NETPLAN_FILE has no access-points section — skipping."
fi
info "Applying netplan — device will switch to '${NEW_SSID}' now..."
netplan apply
info "Waiting for association..."
ASSOCIATED=false
for i in $(seq 1 15); do
sleep 2
CONN_SSID=$(wpa_cli -i "$WIFI_IFACE" status 2>/dev/null | awk -F= '/^ssid=/{print $2}')
STATUS=$(wpa_cli -i "$WIFI_IFACE" status 2>/dev/null | awk -F= '/^wpa_state=/{print $2}')
if [ "$STATUS" = "COMPLETED" ] && [ "$CONN_SSID" = "$NEW_SSID" ]; then
ASSOCIATED=true
break
fi
warn "Attempt $i/15 — state: ${STATUS:-unknown}, ssid: ${CONN_SSID:-none}"
done
if [ "$ASSOCIATED" = "false" ]; then
die "Failed to associate with '${NEW_SSID}'. Check the password and try again. Backup at: $BACKUP_FILE"
fi
sleep 3
NEW_IP=$(ip -o -4 addr show "$WIFI_IFACE" 2>/dev/null | awk '{print $4}' | head -1)
if [ -n "$NEW_IP" ]; then
info "IP address: ${NEW_IP}"
else
warn "No IP assigned yet — DHCP may still be in progress."
fi
info "Connected to '${NEW_SSID}' successfully."
exit 0
;;