daemon.err hostapd – Kleines Script für den automatischen Fix

Einige OpenWrt-Router haben das Problem, dass WLAN scheinbar nicht mehr sauber funktioniert.
Das merkt man schnell daran, dass sich ein Endgerät gar nicht mit dem WLAN verbinden möchte und wenn, dann nur mit einer bestimmten Frequenz.
So ist es z.B. bei mir der Fall, dass das 5GHz Band nicht mehr nutzbar ist, weil Endgeräte es nicht schaffen, eine Verbindung herzustellen.
Nur einige wenige Geräte scheinen dieses Problem umschiffen zu können.
Startet man den Router neu, tritt das Problem fast direkt wieder auf.
Auch ein Neustart des WLAN-Adapters (z.B. per Luci) reicht auch nicht.

Schaut man in das Systemprotokoll des Routers, findet man dort ganz oft folgenden Eintrag:
daemon.err hostapd: Failed to set beacon parameters

Das Problem existiert wenn man im Internet danach sucht schon länger.
Eine wirkliche Lösung, gibt es leider nicht.
Doch der kleine Fix für das Problem ist ganz simpel.
Wir müssen nur alle WLAN-SSIDs der betroffenen Frequenz deaktivieren und reaktivieren.
Weil mir das von Hand zu erledigen ziemlich zu dumm ist, habe ich mir hier ein Script erstellt.

Was tut es?
Es prüft, ob im Systemprotokoll gerade die betroffene Zeile mit dem Fehler auftritt.
Dann prüft es, welche WLAN-SSIDs von Radio1 (5GHz-Band bei mir) gerade aktiv sind und merkt sich diese.
Anschließend werden alle SSIDs deaktiviert, kurz 10 Sekunden gewartet und dann alle wieder reaktiviert, die bisher auch online waren.
Problem gelöst.

Lässt man das Script automatisch alle 30 Minuten mal drüber laufen, sollte das WLAN immer wenn du es brauchst funktionieren.


#!/bin/sh

# Funktion zum Loggen
log_message() {
    logger -t wlan_reset "$1"
}

log_message "WLAN Reset-Script gestartet, prüfe auf hostapd-Fehler"

# Prüfe auf den Fehler im Log
if logread -l 20 | grep -q "daemon.err hostapd: Failed to set beacon parameters"; then
    log_message "Hostapd-Fehler erkannt, starte WLAN-Reset Prozedur"
    
    # Schritt 2: Prüfe aktive WLANs auf Radio1 und speichere sie
    log_message "Prüfe aktive WLANs auf Radio1"
    
    # Temporäre Datei zur Speicherung der aktiven SSIDs
    ACTIVE_SSIDS_FILE="/tmp/active_ssids.tmp"
    > "$ACTIVE_SSIDS_FILE"  # Datei leeren
    
    # Finde alle Wireless-Interfaces für radio1
    for SECTION in $(uci show wireless | grep "device='radio1'" | sed -e "s/wireless\.\(.*\)\.device=.*/\1/"); do
        # Vollständiger Section-Name
        IFACE="wireless.$SECTION"
        
        # Prüfe, ob das Interface aktiviert ist
        IS_DISABLED=$(uci -q get $IFACE.disabled || echo "0")
        IFNAME=$(uci -q get $IFACE.ifname || echo "unbekannt")
        
        if [ "$IS_DISABLED" != "1" ]; then
            # Interface ist aktiv, speichere es
            echo "$IFACE" >> "$ACTIVE_SSIDS_FILE"
            log_message "Aktives WLAN gefunden: $IFACE ($IFNAME)"
        fi
    done
    
    # Prüfe, ob aktive SSIDs gefunden wurden
    if [ ! -s "$ACTIVE_SSIDS_FILE" ]; then
        log_message "Keine aktiven WLANs auf Radio1 gefunden. Beende Reset-Prozedur."
        rm -f "$ACTIVE_SSIDS_FILE"
        exit 0
    fi
    
    # Schritt 3: Deaktiviere alle aktiven WLANs auf Radio1
    log_message "Deaktiviere aktive WLANs auf Radio1"
    
    while read -r IFACE; do
        uci set $IFACE.disabled=1
        log_message "Deaktiviere WLAN: $IFACE"
    done < "$ACTIVE_SSIDS_FILE"
    
    # Kommitiere Änderungen
    uci commit wireless
    wifi reload radio1
    
    # Schritt 4: Warte 10 Sekunden
    log_message "Warte 10 Sekunden"
    sleep 10
    
    # Schritt 5: Aktiviere die zuvor aktiven WLANs
    log_message "Reaktiviere zuvor aktive WLANs"
    
    while read -r IFACE; do
        uci set $IFACE.disabled=0
        log_message "Reaktiviere WLAN: $IFACE"
    done < "$ACTIVE_SSIDS_FILE"
    
    # Kommitiere Änderungen
    uci commit wireless
    wifi reload radio1
    
    log_message "WLAN-Reset abgeschlossen"
    
    # Lösche temporäre Datei
    rm -f "$ACTIVE_SSIDS_FILE"
    
    log_message "Script beendet"
    exit 0
else
    log_message "Kein Hostapd-Fehler gefunden. Script beendet."
    exit 0
fi

Um es laufen lassen zu können, musst du es ausführbar machen:

# chmod +x /root/wlan_reset.sh

Auch muss es dann automatisch ausgeführt werden.
Per Luci: System -> Geplante Aufgaben

*/30 * * * * /root/wlan_reset.sh > /dev/null 2>&1

2 Kommentare

  1. Sehr coole Ideen.
    Mein OpenWRT Netzwerk ist erst im „entstehen „, aber falls das Problem entsteht, hast du eine super Lösung erstellt!
    Danke.

    • Hi!
      Dann viel Spaß beim Aufbauen!
      Das Problem habe ich nur bei ein paar Modellen nun gefunden und mit dem Script gefixt.
      Ein Muster konnte ich noch nicht feststellen.
      Ich hoffe, dass es bei dir nicht auftritt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..