Ubiquiti UniFi: Access Points automatisch neu starten lassen

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.