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)
|
4)
|
||||||
header "Change Wireless Network"
|
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)
|
WIFI_IFACE=$(iw dev 2>/dev/null | awk '/Interface/{print $2}' | head -1)
|
||||||
[ -n "$WIFI_IFACE" ] || die "No wireless interface found."
|
[ -n "$WIFI_IFACE" ] || die "No wireless interface found."
|
||||||
@@ -120,9 +120,6 @@ case "$NET_OPT" in
|
|||||||
echo ""
|
echo ""
|
||||||
[ -n "$NEW_PASS" ] || die "Password cannot be empty."
|
[ -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"
|
NETPLAN_BACKUP_DIR="/root/.config/tinyboard/netplan-backups"
|
||||||
mkdir -p "$NETPLAN_BACKUP_DIR"
|
mkdir -p "$NETPLAN_BACKUP_DIR"
|
||||||
|
|
||||||
@@ -157,65 +154,6 @@ case "$NET_OPT" in
|
|||||||
CONFIRM="${CONFIRM:-y}"
|
CONFIRM="${CONFIRM:-y}"
|
||||||
[[ "${CONFIRM,,}" == "y" ]] || { info "Aborted."; exit 0; }
|
[[ "${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
|
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)"
|
BACKUP_FILE="$NETPLAN_BACKUP_DIR/$(basename "${NETPLAN_FILE}").$(date +%Y%m%d%H%M%S)"
|
||||||
cp "$NETPLAN_FILE" "$BACKUP_FILE"
|
cp "$NETPLAN_FILE" "$BACKUP_FILE"
|
||||||
@@ -233,12 +171,39 @@ txt = re.sub(
|
|||||||
)
|
)
|
||||||
open(path, "w").write(txt)
|
open(path, "w").write(txt)
|
||||||
PYEOF
|
PYEOF
|
||||||
info "Updated: $NETPLAN_FILE"
|
info "Netplan config updated."
|
||||||
info "Changes will persist on next boot."
|
|
||||||
elif [ -n "$NETPLAN_FILE" ]; then
|
elif [ -n "$NETPLAN_FILE" ]; then
|
||||||
warn "$NETPLAN_FILE has no access-points section — skipping."
|
warn "$NETPLAN_FILE has no access-points section — skipping."
|
||||||
fi
|
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."
|
info "Connected to '${NEW_SSID}' successfully."
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
Reference in New Issue
Block a user