73 lines
1.6 KiB
Bash
73 lines
1.6 KiB
Bash
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
WIFI_IFACE="wlan0"
|
|
KNOWN_CONNECTIONS=(
|
|
"4pi:4pi"
|
|
"eskimue.de:netplan-wlan0-eskimue.de"
|
|
)
|
|
FALLBACK_AP_CONN="CUNO-AP"
|
|
SCAN_WAIT_SECONDS=10
|
|
|
|
get_active_connection() {
|
|
nmcli -t -f GENERAL.CONNECTION device show "$WIFI_IFACE" 2>/dev/null | head -n 1 | cut -d: -f2-
|
|
}
|
|
|
|
activate_connection() {
|
|
local connection_name="$1"
|
|
nmcli --wait 15 connection up "$connection_name" ifname "$WIFI_IFACE" >/dev/null 2>&1
|
|
}
|
|
|
|
is_known_connection() {
|
|
local active_connection="$1"
|
|
local entry
|
|
|
|
for entry in "${KNOWN_CONNECTIONS[@]}"; do
|
|
local connection_name="${entry#*:}"
|
|
if [[ "$active_connection" == "$connection_name" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
scan_for_known_connection() {
|
|
local visible_ssids
|
|
local entry
|
|
|
|
nmcli device wifi rescan ifname "$WIFI_IFACE" >/dev/null 2>&1 || true
|
|
sleep "$SCAN_WAIT_SECONDS"
|
|
visible_ssids="$(nmcli -t -f SSID device wifi list ifname "$WIFI_IFACE" 2>/dev/null || true)"
|
|
|
|
for entry in "${KNOWN_CONNECTIONS[@]}"; do
|
|
local ssid="${entry%%:*}"
|
|
local connection_name="${entry#*:}"
|
|
if printf '%s\n' "$visible_ssids" | grep -Fxq "$ssid"; then
|
|
echo "$connection_name"
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
activate_initial_connection() {
|
|
local active_connection
|
|
local selected_connection
|
|
|
|
active_connection="$(get_active_connection)"
|
|
if is_known_connection "$active_connection"; then
|
|
return 0
|
|
fi
|
|
|
|
if selected_connection="$(scan_for_known_connection)"; then
|
|
activate_connection "$selected_connection"
|
|
return 0
|
|
fi
|
|
|
|
activate_connection "$FALLBACK_AP_CONN" || true
|
|
}
|
|
|
|
activate_initial_connection
|