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!
Man macht es nicht jeden Tag, darum schadet es nicht sich's kurz zu notieren... Hier…
Meine Suche bei Google hatte mal wieder keinen vernünftigen Treffer gelandet, das Problem - ich…
Ich muss mal eben etwas Druck ablassen, ein Kunde von mir setzt einen Drucker von…
Wer beim Server bestellen vergessen hat die erweiterte IRMC Lizenz zu ordern, der steht vor…
Ich nutze seit langer Zeit ein System für meine Backups welches in der Nacht von…
Es scheint wohl eine noch nicht so häufig genutzte Kombination zu sein - Apache Guacamole…
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...
Ja aber es gibt häufiger FW Updates als Controller Updates. :)
@ 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
Hallo Jan, danke für die Info bzw. den Tip! :-)
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