Idealerweise läuft eine Ubiquiti UniFi-Umgebung völlig unauffällig und stressfrei, allerdings kann es dennoch Situationen geben, die einen regelmäßigen Neustart der Access Points notwendig machen.
Ein Neustart sollte immer nur das letzte Mittel sein und nur angewendet werden, wenn man das Problem bzw. dessen Ursache nicht anders klären konnte. Eine Dauerlösung stellt dies ebenfalls nicht dar, eher ein Workaround oder ein vorübergehender Behelf.
Bei einer wenigen Monaten alten Kunden-Installation bestehend aus dem Controller (aka Network Application) und drei U6 Lite kommt es immer wieder vor, das sich die Clients nicht mit einem oder gar zwei Access Points mehr verbinden. Meist tritt dieses Verhalten nach mehreren Tagen oder Wochen Laufzeit auf. Nach einem Neustart der Access Points funktioniert dann alles wie es soll. Alle Optimierungsversuche und Updates haben bis dato leider nichts an der Situation verändert, daher bleibt bis auf weiteres nur der regelmäße Neustart.
Plan A – Neustart via ssh
Seitens des Herstellers ist an dieser Stelle keine Möglichkeit ab Werk vorhanden, irgendwelche Aufgaben oder Jobs ausführen zu lassen. Eine Möglichkeit besteht darin schlicht via ssh ein “reboot” auf den Geräten ausführen zu lassen. Am Beispiel von KiTTY (Portable) unter Windows kann eine Session mit Anmeldedaten und dem Befehl gespeichert und via Skript oder Aufgabe aufgerufen werden:
- KiTTY (oder PuTTY) starten.
- IP-Adresse und Session-Namen eintragen.
- Unter “Connection – Data” Benutzername, Kennwort und Befehl eintragen.
- Die Session speichern. Pro Access Point legt man eine Session an.
Wichtig: Einmal muss man die Session (ohne reboot) manuell aufrufen, um den ssh-Schlüssel zu bestätigen!
Die gespeicherte Session kann via CLI, Skript oder Aufgabe wie folgt aufgerufen werden:
kitty_portable.exe -load <Sessionname>
Diese Variante funktioniert grundsätzlich, aber erzeugt im Controller und einem daran ggf. angebundenen Monitoring einen Alarm, das der bzw. die Access Points getrennt wurden. Umgehen kann man dies mit einem (weiteren) Trick, in dem man vor dem Neustart den Controller-Dienst (Daemon) beendet. Wichtig ist dabei, das der Befehl in KiTTY so aussieht:
systemctl stop unifi.service && exit bzw. systemctl start unifi.service && exit
Das “&& exit” ist relevant, da sonst KiTTY mit der ssh-Session “hängen” bleibt und es so nicht weiter geht. Als Skript kann der Ablauf so aussehen:
rem UniFi Controller (Daemon) stoppen kitty_portable.exe -load Stop-UniFi rem Access Points neu starten kitty_portable.exe -load AP1 kitty_portable.exe -load AP2 kitty_portable.exe -load AP3 rem Pause timeout /t 60 /nobreak rem UniFi Controller (Daemon) starten kitty_portable.exe -load Start-UniFi
Wie man sieht ist vor dem (Neu-)Start des Dienstes eine Pause eingefügt, damit die Access Point ausreichend Zeit zum Durchstarten haben.
Plan B – Neustart via API
Löst man manuell via Controller einen Neustart aus, kommt es zu keinem Alarm, daher ist dieser Weg interessanter. Offenbar gibt es allerdings keine offiziell dokumentierte API vom Hersteller, um dies automatisiert und von extern ansprechen zu können. Dank der Community finden sich allerdings dennoch Mittel und Wege. Einer davon ist unificontrol, das mittels Python umgesetzt ist. Die Dokumentation liefert ein paar Hinweise und Beispiele wie eine Realisierung aussehen kann.
An dieser Stelle muss ich leider schreiben, das es mir bislang nicht gelungen ist, unificontrol nutzen zu können. Das mag zum einen daran liegen, das es mir an Python-Erfahrung fehlt und zum anderen, das in der Testumgebung das selbstsignierte Zertifikat des Controllers abgelaufen ist. Für letzteres findet sich zwar auf der GitHub-Projektseite in den Issues ein Eintrag, der allerdings beim Test nicht funktioniert:
No way to use the library at all with self-signed certificate on the UDM Pro
Das bislang zusammengesetzte Skript sieht so aus:
import unificontrol import ssl cert = ssl.get_server_certificate(("192.168.0.13", 8443)) client = unificontrol.UnifiClient(host="192.168.0.13", username="admin", password="<Kennwort>", site="default") restart = client.restart_ap("ab:cd:ef:gh:ij:kl")
Evtl. hilft das jemand anderem weiter oder es kann eine/r einen Tipp geben, wie man das Ganze dennoch richtig umsetzt und damit zum Laufen bekommt.
Eine andere Implementierung zum Ansprechen des Controllers ist in PHP realisiert:
GitHub – Art-of-WiFi/UniFi-API-client
Getestet habe ich das bislang nicht.
Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 10 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.
Hallo Andy,
Danke für Deinen hilfreichen und sorgfältig aufbereiteten Infos, die mir schon einige Male sehr nützlich waren.
Viele Grüße, Susanne