BASH
#!/usr/bin/env bash
SSID1="Vodafone Hotspot"
SSID2="Vodafone Homespot"
INTERFACE="wlan0"
CHECK_URL="http://connectivitycheck.gstatic.com/generate_204"
MAX_FAILS=3
FAIL_COUNT=0
log_msg() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - [Hotspot-Watchdog] $1"
}
get_current_conn() {
nmcli -t -f GENERAL.CONNECTION device show "$INTERFACE" 2>/dev/null | cut -d: -f2
}
nmcli_connect() {
local ssid="$1"
log_msg "Versuche Verbindung zu '$ssid' ..."
if nmcli dev wifi connect "$ssid" ifname "$INTERFACE" >/dev/null 2>&1; then
log_msg "Erfolgreich mit '$ssid' verbunden."
return 0
else
log_msg "FEHLER: Konnte keine Verbindung zu '$ssid' herstellen."
return 1
fi
}
force_switch() {
local current="$1"
local target=""
if [[ "$current" == "$SSID1" ]]; then
target="$SSID2"
else
target="$SSID1"
fi
log_msg "!!! Verbindung tot. Versuche Wechsel zu '$target' !!!"
# 1. Erst die Internet-Verbindung herstellen
nmcli device disconnect "$INTERFACE" >/dev/null 2>&1
sleep 2
if nmcli_connect "$target"; then
# 2. JETZT den Hotspot neu starten, da wlan0 nun auf dem neuen Kanal ist
log_msg "Verbindung zu '$target' steht. Starte Hotspot-Dienst neu für Kanal-Sync..."
sudo systemctl restart start_hotspot.service
sleep 45
FAIL_COUNT=0
return
fi
log_msg "Wechsel zu '$target' fehlgeschlagen. Versuche Rückkehr zu '$current' ..."
if nmcli_connect "$current"; then
sleep 45
FAIL_COUNT=0
return
fi
log_msg "Weder '$current' noch '$target' erreichbar. Warte 60s und versuche erneut."
FAIL_COUNT=0
}
try_connect_any() {
for ssid in "$SSID1" "$SSID2"; do
nmcli_connect "$ssid" && { sleep 45; return 0; }
sleep 5
done
return 1
}
log_msg "Watchdog gestartet. Überwache '$SSID1' und '$SSID2'..."
while true; do
CURRENT_CONN=$(get_current_conn)
if [[ "$CURRENT_CONN" == "$SSID1" || "$CURRENT_CONN" == "$SSID2" ]]; then
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 6 "$CHECK_URL")
if [[ "$HTTP_CODE" -eq 204 ]]; then
if [[ $FAIL_COUNT -gt 0 ]]; then
log_msg "Verbindung hat sich erholt (HTTP 204)."
fi
FAIL_COUNT=0
else
((FAIL_COUNT++))
log_msg "Erreiche kein Internet (HTTP: $HTTP_CODE). Fehlversuch $FAIL_COUNT/$MAX_FAILS auf '$CURRENT_CONN'"
if [[ $FAIL_COUNT -ge $MAX_FAILS ]]; then
force_switch "$CURRENT_CONN"
fi
fi
else
FAIL_COUNT=0
# Prüfen ob wlan0 überhaupt ein Profil aktiv hat
if [[ -z "$CURRENT_CONN" ]]; then
log_msg "Keine Verbindung auf $INTERFACE. Versuche '$SSID1' oder '$SSID2' ..."
try_connect_any
else
# wlan0 ist mit einem anderen Netz verbunden -> nichts tun
sleep 10
continue
fi
fi
sleep 10
done