Firmware-Update von der Linux-Shell (ohne Browser)

McNetic

Mitglied
Mitglied seit
7 Feb 2007
Beiträge
674
Punkte für Reaktionen
0
Punkte
16
Hallo,

Fertige Lösung siehe Ende des Posts

ich habe mich heute ein bisschen damit beschäftigt, wie man mittels wget und curl aus der Linux-Shell ein Firmware-Update machen kann, und bin dabei auf ein Problem gestoßen, aus dem ich nicht ganz schlau werde. Vielleicht fällt ja jemandem was dazu ein. Wenn das Ganze funktioniert, kann man daraus ein Script bauen, was das Ganze mit einem einzigen Befehl erledigt - vor allem praktisch, wenn man seine Firmware auf einer Linux-Kiste ohne GUI baut.

Hier mal meine Vorgehensweise:
  • Anmelden am Webinterface der Fritzbox
    Code:
    wget -O /dev/null --post-data=login%3Acommand%2Fpassword=<password> http://fritz.box/cgi-bin/webcm
    Hier muss das Web-Passwort angegeben werden. So weit kein Problem.
  • Upload des Firmware-Images
    Code:
    curl -o /dev/null -F "upgrade=Update" -F "UploadFile=@<path_to_image_file>;filename=\\firmware.image" http://fritz.box/cgi-bin/firmwarecfg
    Mit wget könnte man zwar auch eine Datei hochladen, aber leider kann wget anscheinend nicht automatisch eine Datei in ein entsprechendes multipart/form-data umwandeln, man müsste das von Hand oder mit einem anderen Tool machen. Curl macht das automatisch, wenn man den Dateinamen angibt. Das filename=\\firmware.image ist *nicht* der eigentliche Dateiname, sondern der, der dem CGI-Script übergeben wird. Hier fängt das Problem an. Wenn es sich um eine Original-FW handelt (nicht getestet), oder wenn die Box noch keine Überprüfung macht (ältere Boxen), dann sollte jetzt das Update schon durchlaufen. Zumindest werden in jedem Fall die Dienste gestoppt und das Image hochgeladen und entpackt. Andrenfalls:
  • Update bestätigen (wenn keine Original-AVM-FW)
    Code:
    wget -O /dev/null --post-data="install=Update%20fortsetzen" http://fritz.box/cgi-bin/firmwarecfg
    Theoretisch sollte mit diesem Befehl das Update bestätigt werden, wenn die Box nachfragt, weil es sich nicht um eine Original-FW handelt. Bei mir gab es jetzt verschiedene Probleme. Manchmal ist der DNS-Server schon nicht mehr erreichbar. Dann wird fritz.box nicht mehr aufgelöst. Man kann es dann durch die IP-Adresse ersetzen. Trotzdem funktioniert es bei mir dann nicht. Es dauert eine Zeit lang, dann gibt es den Fehler "Internal communication error (login -1). Exiting.".

Ich fürchte, dass ich irgendwas übersehe. Sieht jemand vielleicht das Problem oder hat eine Erklärung, oder will es selbst mal probieren? Wenn man bei den Kommandos jeweils das /dev/null durch einen Dateinamen ersetzt, wird das Ergebnis der Abfrage in dieser Datei gespeichert. So kann man sich den Ablauf ansehen.

Fertige Lösung:

Script aus dem Anhang auspacken und ausführen.

Ich selbst habe es nur mit meiner 7170 getestet. Mit einem funktionierenden Image funktioniert es ohne Probleme. Es gibt auch eine Behandlung des Fehlers, der auftritt, wenn die angebene Datei kein korrektes Image ist, dies funktioniert aber nicht immer korrekt, zumindest bei mir. Ich bekomme das gleiche Ergebnis raus, wie bei einem richtigen Image. Wer eine Lösung weiss, bitte her damit.

Weiters ist der Codeteil ungetestet, der auf einer Box ohne Hash-Prüfung die letzte Bestätigung überspringen sollte. Wenn wer mag, kann er das ja auch mal ausprobieren.

Gruss, Nico

PS: Natürlich alles wie üblich auf eigene Gefahr.
 

Anhänge

  • flash_firmware.bz2
    1.2 KB · Aufrufe: 14
Zuletzt bearbeitet:
Hallo,

da gibt's schon ein paar Infos zu dem Thema, besonders hier sogar eine Lösung ;-)

Viel Erfolg

Jörg
 
Naja, das ist nicht das was ich suche. Da müsste ich das Image ja wieder aufwendig irgendwo auf einen Webserver legen, mich auf der Box einloggen, von da das Script starten... Mir geht es darum, dass ich beispielsweise auf meinem Linux-Rechner ein neues DS-Mod-Image erstellt habe, und jetzt mit einem einzelnen Befehl von diesem Rechner aus das Image installieren kann. Ohne es vorher auf meinen Desktop zu übertragen, wo ich nen graphischen Browser hab, oder ähnliche Anstrengungen. Vor allem wär es auch schön, wenn das ohne weitere Vorraussetzungen auf der Box gehen würde. Und theoretisch muss das ja auch klappen.

Gruss, Nico
 
Suche im dsmod nach recover.pl bzw. den Varianten davon.
 
... es ging mir ja nicht nur um das eine Skript sondern eher um das "Hintergrundwissen" über den Ablauf beim Update. Dort im Thread sind fast alle deine "Forderungen" zu finden:
Nach deiner "Übertragung" ist das Image ja nun schon auf der Box. Aus den Infos zum Ablauf des Updates (und eigenen "Erfahrungen") kann man danach dann auf der Box mit dem skript "install" in /var/tmp "rumspielen". Soweit ist zumindest die "ohne WEB"-Forderung schonmal erledigt und nur das "mit einem einzelnen Befehl von diesem Rechner aus" klappt noch nicht so ganz...

Wenn du mutig bist kannst du natürlich (zumindest bei einer selbstgebauten Firmware) noch das ein oder andere in dem Skript verändern (z.B. die "Sicherheits-Abfragen tunen")

Jörg

Zusatz: Klar, der Verweis von Enrik ist natürlich noch gehaltvoller von den Infos her...
 
Zuletzt bearbeitet:
Also wenn auf der Ziel-Box schon ein dsmod mit Telnet/SSH-Server läuft, dann könnte man das Remote-Upgrade ja relativ einfach machen, indem man das neue FW-File per scp rüber_schiebt_ und anschließend per SSH-Kommando das Update auf der Box selber startet, wie im obigen Thread-Link erklärt. Das sollte man ja auch irgendwie "skripten" können...
 
@enrik:
Das habe ich mir zuerst angeschaut. Dabei ist ganz klar der Nachteil, dass ich die Box vorher rebooten muss, also auch keine Ein-Befehl-Show.

@derheimi
Jo, aber dann hat man wieder verschiedene Vorraussetzungen (telnet aktiv oder ds-mod, ....). Ich war jetzt ja eher auf der Suche nach einer allgemeingültigen Lösung.

Aber trotzdem danke für die Hinweise von Euch.

Gruss, Nico
 
Zuletzt bearbeitet:
Muss nicht auch das Update fortsetzen ein Multipart sein:

Code:
POST /cgi-bin/firmwarecfg HTTP/1.1
Referer: http://fritz.box/cgi-bin/firmwarecfg

Content-Type: multipart/form-data; boundary=---------------------------25084608016848
Content-Length: 161
-----------------------------25084608016848
Content-Disposition: form-data; name="install"

Update fortsetzen
-----------------------------25084608016848--

HTTP/1.x 200 OK
Content-Type: text/html; charset=iso-8859-1
----------------------------------------------------------

Denn wird anstelle von POST ein einfaches GET mit Parametern übergeben bricht die Aktion auch ab (Unsupported Request Method.).

Grüße
Harald
 
Perfekt, danke für den Hinweis. Das Fortsetzen muss ein Multipart sein. Der wget-Befehl hat zwar auch ein POST gemacht, aber eben kein Multipart. Damit klappt es nun. Ich habe nun ein kleines Script drumrum gebaut, was die ganze Sache automatisiert. Da sowieso curl benötigt wird, habe ich wget ganz rausgenommen.

Das Script ist selbsterklärend. Einfach speichern, Endung entfernen, ausführbar machen und mit -h aufrufen.

Ich selbst habe es nur mit meiner 7170 getestet. Mit einem funktionierenden Image funktioniert es. Es gibt auch eine Behandlung des Fehlers, der auftritt, wenn die angebene Datei kein korrektes Image ist, dies funktionier aber nicht korrekt, zumindest bei mir. Ich bekomme das gleiche Ergebnis raus, wie bei einem richtigen Image. Wer eine Lösung weiss, bitte her damit.

Weiters ist der Codeteil ungetestet, der auf einer Box ohne Hash-Prüfung die letzte Bestätigung überspringen sollte. Wenn wer mag, kann er das ja auch mal ausprobieren.

Natürlich mal wieder alles ohne Gewähr.

Edit: Scriptausgabe verschönert und Anhang in den ersten Post verschoben.
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.