Zum Inhalt springen

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!

9 Gedanken zu „Unifi Controller – Firmware Upgrade hinter Proxy Server“

  1. @ 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

  2. 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.

    1. 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

  3. 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

    1. 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

Schreibe einen Kommentar zu Jan Antworten abbrechen

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