From cbdbce7a41b81e394f022a9863d653ab3130a125 Mon Sep 17 00:00:00 2001 From: Justin Oros Date: Thu, 23 Apr 2026 12:16:40 -0700 Subject: [PATCH] =?UTF-8?q?refactor(setup-network):=20let=20netplan=20own?= =?UTF-8?q?=20the=20AP=20switch=20=E2=80=94=20update=20config=20and=20appl?= =?UTF-8?q?y=20before=20wpa=5Fcli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spoke/setup-network.sh | 95 +++++++++++++----------------------------- 1 file changed, 30 insertions(+), 65 deletions(-) diff --git a/spoke/setup-network.sh b/spoke/setup-network.sh index ba8e4d2..10442b8 100755 --- a/spoke/setup-network.sh +++ b/spoke/setup-network.sh @@ -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 ;;