Categories: Linux

Unifi Controller – Firmware Upgrade hinter Proxy Server

Mit dem Unifi Controller lässt sich Unifi Hardware wunderbar managen, das Ding läuft auch unter Linux sehr gut und integriert die Netzwerkverwaltung an einer Stelle – eigentlich alles wunderbar. Einzig hinter einem Proxy Server mit restriktiven Einstellungen bei der Firewall hat das Ding seine Probleme – hier hat die Firma Ubiquiti aus unbekannten Gründen keine Proxy Unterstützung integriert.

Im Controller kann man unter Maintenance für alle Firmware Versionen die Dateien cachen – ein Klick auf den „Cache“ Button sollte eigentlich im Hintergrund einen Download starten.

Sobald kein direkter Zugriff auf das Internet möglich ist erscheinen im unifi Logfile folgende Meldungen:

<webapi-126> ERROR system – Error in downloading https://dl.ubnt.com/unifi/firmware/US24P250/3.9.6.7613/firmware.bin

Da auch unser Controller ohne Proxy nicht auf’s Internet zugreifen darf klappt auch das Cachen der Firmware Dateien auf dem Controller nicht.

<webapi-88> WARN system – failed to get firmware update info: connect timed out

Mein Ansatz das Problem zu lösen bzw. zu umgehen ist folgender:

Ich übernehme den Download der Firmware Dateien und lege sie dort ab wo sie der Controller anschließend laden kann, dafür überarbeite ich die „bundles.json“ Datei in der der Pfad der Firmware Datei für den Download hinterlegt ist.

Folgendes Bash-Script erledigt dies:

#!/bin/bash

# versio 0.1

export https_proxy="http://proxy.server:8080/"

# unifi firmware download folder
P=/usr/lib/unifi/dl/firmware
# download folder from local webserver to serve it to the unifi controller
P2=/var/www/html/firmware
# local webserver url
DLSERVER="192.168.99.100"
cd $P

IFS="
"

CPB=$(grep 'dl.ubnt.com' bundles.json)

if [ "$CPB" ]; then
 # new bundles.json
 cp bundles.json bundles.json.orig
fi

if [ -f "bundles.json.new" ]; then
 # check bundles.json with our bundles.json.new file
 # remove if new bundles.json
 BN=$(md5sum bundles.json.new)
 BO=$(md5sum bundles.json)
 if [ "$BN" != "$BO" ]; then
  rm bundles.json.new
  NEWDL=1
 fi
fi

if [ ! -f "bundles.json.new" ]; then
 # create new bundles.json file with our server for firmwar downloads...
 cp bundles.json bundles.json.new
 sed -i -e "s/https:\/\/dl.ubnt.com\/unifi\//http:\/\/$DLSERVER\//g" bundles.json.new
 cp bundles.json.new bundles.json
fi

for U in $(awk -F '}' 'BEGIN{RS=",";}{print $1}' bundles.json.orig |grep url); do

 # extract download url from original json file
 URL=$(echo $U|awk '{print $2}'|sed -e "s/\"//g")

 if [ "$URL" ]; then

  CHECK=${URL: -11}
  OUTFILE=$(echo $URL|awk -F'/firmware/' '{print $2}')
  if [ "$CHECK" == "upgrade.tar" ]; then
   OUTDIR=$(echo $OUTFILE|awk -F'upgrade.tar' '{print $1}')
  else
   OUTDIR=$(echo $OUTFILE|awk -F'firmware.bin' '{print $1}')
  fi
  #echo "$P2/$OUTFILE"

  # create directory for downloads if not exists
  if [ ! -d "$P2/$OUTDIR" ]; then
   mkdir -p "$P2/$OUTDIR"
  fi

  # download firmware file to local webserver
  if [ ! -f "$P2/$OUTFILE" ]; then
   wget -q -O "$P2/$OUTFILE" $URL
  fi

 fi

done

if [ "X$NEWDL" == "X1" ]; then
 # in case of new downloaded files restart unifi controller
 systemctl restart unifi
fi

Einfach herunterladen, unter get_unifi_firmware.sh abspeichern und mittels „chmod +x get_unifi_firmware.sh“ ausführbar machen.

Für den Download habe ich einfach am Controller einen nginx Server installiert und die Dateien in dessen Default Ordner abgelegt. Die Pfad müssen im Script entsprechend angepasst werden, ebenso der Proxy Server.

Nach dem Ausführen des Scriptes sollten die Firmware Dateien im angegebenen Ordner zu finden sein und über die Server URL erreichbar sein.

Die bundles.json Datei wurde nach dem Download mit den lokalen Pfaden versorgt, der Controller sollte am Ende des Scripts automatisch neu gestartet worden sein. Im Controller Webinterface kann man sich jetzt neu anmelden und unter Maintenance den Cache der Firmware Dateien aktualisieren.

Nach nur wenigen Klicks sollte die Firmware im Cache geladen sein und die Unifi Endgeräte können direkt darauf zugreifen und das Firmware Upgrade einspielen…

Was mich etwas nachdenklich macht ist dass Unifi es seit längerer Zeit nicht für nötig befunden hat ihren Controller Proxy tauglich zu machen – für Unternehmen sollte ein direkter Internet Zugriff ohne Kontrolle eigentlich tabu sein!

Manfred

View Comments

  • Danke für das Script! Stellt sich mir die Frage, woher man die aktuellste bundles.json her bekommt.

    • Mit jeder neuen Version vom Controller bekommt man die aktuellsten Firmware Daten installiert, die bundles.json kommt da immer mit...

  • @ Henry, die bundles.json Datei kann man auch manuell anpassen:
    1) passende firmware.bin von ubiquiti.com herunterladen und Versionsnummer notieren, z.B. 3.9.3.7537
    2) auf einem unix/linux-System den MD5-Hash ermitteln zur Firmware: md5sum , z.B. cbe99db75e656d78111f3783bc804ed2
    3) bundles.json Datei in einem formatfreien Texteditor bearbeiten wie folgt hier am Beispiel einer U7HD-Firmware. Es können mehrere Einträge zum gleichen Modell vorhanden sein. Es wird stets die aktuellste Version genommen:
    { ... "U7HD": {
    "base_model": "U7HD", "bundled": false, "display": "UniFi AP-AC-HD", "md5sum": "cbe99db75e656d78111f3783bc804ed2", "url": "http:///firmware/U7HD/3.9.3.7537/firmware.bin", "version": "3.9.3.7537",
    } ... }
    4) UniFi-Controller Service neustarten

  • Moin,

    keine Ahnung, ob du das hier noch liest. Ich sitze hier aber vor genau dem selben Problem und würde meine APs gern updaten..

    Leider erhalte ich beim Aufruf des Scripts folgende Meldung:
    awk: cmd. line:1: fatal: cannot open file `bundles.json.orig' for reading (No such file or directory)

    Ich vermute, dass es an der durchsuchten URL liegt. unter dl.ubnt.com erhalte ich nur noch ein 404.

    • Hallo, natürlich lese ich das noch! :-)
      Allerdings bin ich nicht immer nicht sehr schnell beim Antworten...

      Du kannst die passende URL ja aus dem Logfile vom Controller auslesen, der steht in der Fehlermeldung und müsste dann entsprechend im Script angepasst werden.
      Das besagte Problem existiert so bei mir nicht mehr, ich habe den Controller dann irgendwann so auf der Firewall freigeschaltet dass er ohne Proxy direkt zugreifen kann - ist unterm Strich die bessere und dauerhaftere Lösung. Unifi scheint die Existenz von Proxy Servern einfach zu ignorieren. :-)

      Schöne Grüße
      Manfred

  • Hallo,

    vielen Dank für die ausführliche Anleitung.
    Allerding finde im Serverlog die nicht die "neue" Download Adresse.
    Kann mir da jemand weiterhelfen?

    Besten Dank
    Oliver

    • Hallo Oliver,

      inzwischen hat sich da einiges geändert - statt der bundles.json schaut man sich jetzt besser die /var/lib/unifi/firmware/firmware.json Datei an!
      Ich habe meine Controller alle so freigeschaltet dass sie ohne Proxy arbeiten können, das ist unterm Strich die einfachere Lösung - auf die Änderungen in der Software von Unifi hat man keinen Einfluss, auf die Firewall Einstellungen schon! :-)

      Schöne Grüße
      Manfred

Recent Posts

VM – ZFS Partition online vergrößern

Man macht es nicht jeden Tag, darum schadet es nicht sich's kurz zu notieren... Hier…

9 Monaten ago

Samba Password History für einen User löschen

Meine Suche bei Google hatte mal wieder keinen vernünftigen Treffer gelandet, das Problem - ich…

9 Monaten ago

HP Eine Firma von der ich nicht mal geschenkte Drucker nehmen würde!!!

Ich muss mal eben etwas Druck ablassen, ein Kunde von mir setzt einen Drucker von…

12 Monaten ago

IRMC Console Redirection ohne Lizenz

Wer beim Server bestellen vergessen hat die erweiterte IRMC Lizenz zu ordern, der steht vor…

1 Jahr ago

WOL im BIOS aktivieren reicht nicht immer

Ich nutze seit langer Zeit ein System für meine Backups welches in der Nacht von…

1 Jahr ago

Apache Guacamole mit TOPT – funktioniert nicht

Es scheint wohl eine noch nicht so häufig genutzte Kombination zu sein - Apache Guacamole…

1 Jahr ago