forked from finn/tinyboard
refactor(setup-network): let netplan own the AP switch — update config and apply before wpa_cli
This commit is contained in:
@@ -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
|
||||
;;
|
||||
|
||||
Reference in New Issue
Block a user