fix: enhance AP and client mode switching with NetworkManager support

This commit is contained in:
Timothy Hofland
2026-03-16 08:50:26 +01:00
parent 4ad82a1a66
commit 12ff47207e
3 changed files with 100 additions and 17 deletions

View File

@ -11,6 +11,7 @@ AP_ADDRESS="192.168.4.1/24"
AP_GATEWAY="192.168.4.1"
AP_DHCP_RANGE_START="192.168.4.20"
AP_DHCP_RANGE_END="192.168.4.150"
AP_CONNECTION_NAME="MPVJ-AP"
set_wifi_country() {
if command -v raspi-config > /dev/null 2>&1; then
@ -59,7 +60,69 @@ EOF
fi
}
configure_access_point_stack() {
cleanup_legacy_access_point_stack() {
rm -f /etc/NetworkManager/conf.d/99-mpvj-unmanage-wlan0.conf
rm -f /etc/systemd/system/mpvj-ap-mode.service
systemctl disable mpvj-ap-mode.service hostapd.service dnsmasq.service 2>/dev/null || true
systemctl stop mpvj-ap-mode.service hostapd.service dnsmasq.service 2>/dev/null || true
if [ -f /etc/dhcpcd.conf ]; then
sed -i '/# BEGIN MPVJ AP/,/# END MPVJ AP/d' /etc/dhcpcd.conf
fi
}
configure_networkmanager_access_point() {
mkdir -p /etc/systemd/system /etc/NetworkManager/conf.d
cleanup_legacy_access_point_stack
cat <<EOF > /etc/NetworkManager/conf.d/90-mpvj-wifi-powersave.conf
[connection]
wifi.powersave = 2
EOF
cat <<EOF > /etc/sysctl.d/90-mpvj-ap.conf
net.ipv4.ip_forward=1
EOF
systemctl enable NetworkManager.service
systemctl restart NetworkManager.service
nmcli radio wifi on || true
nmcli connection delete "$AP_CONNECTION_NAME" 2>/dev/null || true
nmcli device set wlan0 managed yes || true
nmcli device set wlan0 autoconnect yes || true
nmcli device disconnect wlan0 2>/dev/null || true
nmcli connection add type wifi ifname wlan0 con-name "$AP_CONNECTION_NAME" autoconnect yes ssid "$WIFI_SSID"
nmcli connection modify "$AP_CONNECTION_NAME" connection.interface-name wlan0
nmcli connection modify "$AP_CONNECTION_NAME" connection.autoconnect yes connection.autoconnect-priority 100
nmcli connection modify "$AP_CONNECTION_NAME" 802-11-wireless.mode ap 802-11-wireless.band bg 802-11-wireless.powersave 2
nmcli connection modify "$AP_CONNECTION_NAME" ipv4.method shared ipv4.addresses "$AP_ADDRESS" ipv6.method disabled
nmcli connection modify "$AP_CONNECTION_NAME" wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$WIFI_PASS"
cat <<EOF > /etc/systemd/system/mpvj-nm-ap.service
[Unit]
Description=Bring up MPVJ NetworkManager hotspot on boot
After=NetworkManager.service
Wants=NetworkManager.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/bash -lc 'nmcli radio wifi on || true; nmcli device set wlan0 managed yes || true; nmcli device set wlan0 autoconnect yes || true; nmcli connection up "$AP_CONNECTION_NAME" ifname wlan0 || (nmcli connection reload && nmcli connection up "$AP_CONNECTION_NAME" ifname wlan0)'
ExecStop=/usr/bin/bash -lc 'nmcli connection down "$AP_CONNECTION_NAME" 2>/dev/null || true'
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable mpvj-nm-ap.service avahi-daemon.service
systemctl restart mpvj-nm-ap.service
}
configure_legacy_access_point_stack() {
mkdir -p /etc/hostapd /etc/systemd/system /etc/NetworkManager/conf.d
cat <<EOF > /etc/hostapd/hostapd.conf
@ -132,6 +195,16 @@ EOF
systemctl disable wpa_supplicant.service wpa_supplicant@wlan0.service 2>/dev/null || true
}
configure_access_point_stack() {
if command -v nmcli > /dev/null 2>&1 && systemctl list-unit-files NetworkManager.service --no-legend 2>/dev/null | grep -q '^NetworkManager\.service'; then
echo "Using NetworkManager hotspot configuration for wlan0..."
configure_networkmanager_access_point
else
echo "Using hostapd/dnsmasq hotspot configuration for wlan0..."
configure_legacy_access_point_stack
fi
}
if [ -z "$REPO_URL" ]; then
echo "Usage: $0 <REPO_URL>"
exit 1

View File

@ -5,15 +5,21 @@ set -euo pipefail
echo "Switching to AP mode..."
rfkill unblock wlan || true
systemctl stop wpa_supplicant.service wpa_supplicant@wlan0.service 2>/dev/null || true
if command -v nmcli > /dev/null 2>&1 && nmcli connection show MPVJ-AP > /dev/null 2>&1; then
nmcli radio wifi on || true
nmcli device set wlan0 managed yes || true
nmcli device set wlan0 autoconnect yes || true
nmcli connection up MPVJ-AP ifname wlan0
else
systemctl stop wpa_supplicant.service wpa_supplicant@wlan0.service 2>/dev/null || true
ip link set wlan0 down || true
ip addr flush dev wlan0 || true
ip link set wlan0 up
ip address add 192.168.4.1/24 dev wlan0
systemctl start mpvj-ap-mode.service
systemctl restart hostapd.service
systemctl restart dnsmasq.service
fi
echo "AP mode active on wlan0 at 192.168.4.1"

View File

@ -4,12 +4,16 @@ set -euo pipefail
echo "Switching to client mode..."
if command -v nmcli > /dev/null 2>&1 && nmcli connection show MPVJ-AP > /dev/null 2>&1; then
nmcli connection down MPVJ-AP 2>/dev/null || true
nmcli device set wlan0 autoconnect yes || true
nmcli device connect wlan0 2>/dev/null || true
else
systemctl stop mpvj-ap-mode.service 2>/dev/null || true
systemctl stop hostapd.service dnsmasq.service
ip addr flush dev wlan0 || true
ip link set wlan0 up || true
systemctl start wpa_supplicant.service || systemctl start wpa_supplicant@wlan0.service
fi
echo "Client mode active. wlan0 returned to wpa_supplicant."