- Mitglied seit
- 5 Dez 2006
- Beiträge
- 80
- Punkte für Reaktionen
- 1
- Punkte
- 8
Hallo,
wie man weiß, verweigert die 7490 mit neuerer AVM-Software die Installation unsignierter Versionen über die Web-Oberfläche und „push_firmware“ aus Freetz funktioniert auch nicht bei diesem Modell.
Für letzteres habe ich mir einen – recht primitiven – Ersatz gebastelt; die Ideen und Programmschnipsel dafür stammen aus hiesigen Threads von PeterPawn, dessen „YourFritz“ und „push_firmware“ aus Freetz. Soweit bei jenen Werken Nutzungsbedingungen genannt sind, handelt es sich um die GPL Version 2 und somit steht das hier als davon abgeleitetes Werk auch unter der GPLv2. Es ist also ausdrücklich gestattet, das auch Nicht-Privat weiterzuverwenden und dabei zu verändern.
Eine Warnung vorweg: die meisten Sicherheits-Überprüfungen habe ich weggelassen, man kann also Unsinn damit machen, insbesondere inkompatible Firmware auf die Box schreiben.
Getestet ist es nur unter Debian (so ungefähr Jessie) x86/x86_64 Multiarch, also Linux.
Es besteht aus 2 Teilen: zunächst einem Progrämmchen, das nur dazu dient, die Box nach dem Start im EVA-Modus „abzufangen“ und diesen aufrechtzuerhalten, es wird sich einfach an- und wieder abgemeldet. Das habe ich eigenständig gelassen, weil es auch zu anderen Zwecken nützlich ist, beispielsweise um danach von Hand zwischen den beiden alternativen Firmware-Speicherplätzen der 7490 umzuschalten.
eva-login.sh:
Die Funktionsweise ist von „push_firmware“ aus Freetz übernommen, aber ohne den ganzen Schnickschnak mit Überprüfungen und der Dateiübertragung an sich.
Ohne Parameter wird die Standard-IP-Adresse „192.168.178.1“ angenommen, jeder andere übergebene Wert wird als auflösbarer Name oder IP-Adresse verwendet.
Gibt man hier Blödsinn an, wird der Ping stets fehlschlagen und man muß mit Strg-C abbrechen.
Benötigt werden die Kommandos „ping“ und „ftp“, die installiert sein müssen, auch das wird nicht geprüft, es klappt halt einfach nicht, wenn diese nicht da oder von den Parametern her inkompatibel sind.
Der auskommentierte Teil wird nur dann benötigt, wenn man das Skript erst startet und dann die Box neu startet und die Box im Normalmodus dieselbe IP hat wie im EVA-Modus direkt nach dem Einschalten. Jener Abschnitt wartet so lange, bis die Box nicht mehr antwortet und geht dann sofort im nächsten Abschnitt zum Warten auf die nächste Antwort über, die kommt, sobald im EVA-Modus ein Ping empfangen wurde. Für jeden Ping-Versuch wird ein · gemalt.
Sobald die Box (wieder) antwortet, endet die Schleife und es meldet sich per FTP an und wieder ab. Von diesem Zeitpunkt an läuft der normale Startvorgang der Box nicht mehr weiter, man kann sich später jederzeit erneut per FTP anmelden.
Das eigentliche Datei-Übertragungs-Programm ruft das obige Skript auf, es muß im Suchpfad liegen oder man muß das 2. Skript so ändern, daß es mit relativem oder absolutem Pfad aufgerufen wird. Alternativ kann man beide in eine Datei zusammenbasteln.
Für die eigentliche Datei-Übertragung wird das folgende Skript benötigt: https://github.com/PeterPawn/YourFritz/blob/master/eva_tools/eva_to_memory
7490install.sh:
Der 2. Teil braucht bis zu 2 Übergabeparameter, nämlich einen Dateinamen und die IP-Adresse, falls es nicht oben genannte Standardadresse ist.
Alles, was kein gültiger Dateiname (mit Pfadangabe, falls nicht im aktuellen Verzeichnis) einer existierenden Datei ist, wird als IP/Rechnername behandelt, auch wenn das Unsinn ist. In dem Fall schlüge wieder der Ping fehl und man müßte abbrechen. Die Reihenfolge der beiden Parameter ist egal, gibt man aber mehr als 2 an, hängt von deren Reihenfolge ab, was danach genau passiert, falls etwas sinnvolles, dann würde man das auch mit genau 1-2 Parametern hinbekommen. Ohne gültigen Dateinamen geschieht überhaupt nichts.
Hat man einen Dateinamen übergeben und existiert diese Datei, wird versucht, sie im aktuellen Verzeichnis mit Tar auszupacken. Dabei wird ein Verzeichnis „./var“ mit Unterverzeichnissen erzeugt. Schlägt das fehl, werden auch nachfolgende Aktionen scheitern – abgesehen davon, die Box im EVA anzuhalten.
Geht alles gut, werden aus „./var/tmp“ der Kernel und das Dateisystem jeweils um die angehängte Prüfsumme von 8 Bytes gekürzt, diese beiden Dateien dann zusammengefügt und das Ergebnis als „$FIMG.eva“ gespeichert. Dazu muß das Verzeichnis, in dem „$FIMG“ liegt, die als Parameter übergebene Firmware-Datei, vom aufrufenden Benutzer beschreibbar sein. Danach wird die ausgepackte Datei und deren temporärer Inhalt unterhalb von „./var“ wieder gelöscht.
Für diese Aktionen werden die Kommandos „tar“, „dd“, „stat“, „cat“, „rm“ benötigt, die im Pfad liegen müssen. Die verwendete Shell muß rechnen können, um 8 Bytes von der Dateilänge abzuziehen. Der Vorgang braucht auch genügend freien Platz: temporär etwa 3 Mal die Firmware-Größe.
Nunmehr folgt die Anmeldung an der Box, danach die Übertragung der gerade erstellten Datei in deren Speicher mit Hilfe von „eva_to_memory“; wie das funktioniert, kann man hier nachlesen: http://www.ip-phone-forum.de/showthread.php?t=283039&p=2147416&viewfull=1#post2147416.
Beispiel-Aufruf:
7490install.sh ./FRITZ.Box_7490.113.06.30.image 203.0.113.5
Das erstellt ./FRITZ.Box_7490.113.06.30.image.eva und überträgt es zum Router mit der Adresse 203.0.113.5.
Die erstellte Datei bleibt auch lokal erhalten, nur die entpackte Firmware und Zwischenprodukte werden wieder gelöscht.
Es ist die Adresse anzugeben, welche der Router beim Startvorgang annimmt; wenn man ihm nur in der Weboberfläche einen von der AVM-Vorgabe abweichenden Adreßbereich vergeben hat, ist das immer noch 192.168.178.1! Der Rechner, von dem aus das Update gemacht werden soll, muß eine Adresse im selben Subnetz haben, beziehungsweise muß eine Route zum Ziel bestehen.
Die Einstellungen bleiben wie bei einem normalen Update erhalten, soweit die neu geflashte Version sie „versteht“.
- - - Aktualisiert - - -
Anmerkung: ich hätte auch „image2ram“ aus „YourFritz“ nehmen können, um die Datei umzuwandeln, das macht ein paar Prüfungen, scheint mir dafür aber länger zu laufen.
- - - Aktualisiert - - -
Zu den Voraussetzungen:
Das „eva_to_memory“ braucht zwingend das OpenBSD-Netcat! Das aus Busybox, die „klassische“ Version 1.10 oder „Netcat6“ funktionieren nicht! Wer wie ich Debian verwendet, muß also mit „update-alternatives“ bei mehreren installierten Versionen die richtige davon als „nc“ einstellen, oder anders sicherstellen, daß die OpenBSD-Version als „nc“ gefunden wird!
wie man weiß, verweigert die 7490 mit neuerer AVM-Software die Installation unsignierter Versionen über die Web-Oberfläche und „push_firmware“ aus Freetz funktioniert auch nicht bei diesem Modell.
Für letzteres habe ich mir einen – recht primitiven – Ersatz gebastelt; die Ideen und Programmschnipsel dafür stammen aus hiesigen Threads von PeterPawn, dessen „YourFritz“ und „push_firmware“ aus Freetz. Soweit bei jenen Werken Nutzungsbedingungen genannt sind, handelt es sich um die GPL Version 2 und somit steht das hier als davon abgeleitetes Werk auch unter der GPLv2. Es ist also ausdrücklich gestattet, das auch Nicht-Privat weiterzuverwenden und dabei zu verändern.
Eine Warnung vorweg: die meisten Sicherheits-Überprüfungen habe ich weggelassen, man kann also Unsinn damit machen, insbesondere inkompatible Firmware auf die Box schreiben.
Getestet ist es nur unter Debian (so ungefähr Jessie) x86/x86_64 Multiarch, also Linux.
Es besteht aus 2 Teilen: zunächst einem Progrämmchen, das nur dazu dient, die Box nach dem Start im EVA-Modus „abzufangen“ und diesen aufrechtzuerhalten, es wird sich einfach an- und wieder abgemeldet. Das habe ich eigenständig gelassen, weil es auch zu anderen Zwecken nützlich ist, beispielsweise um danach von Hand zwischen den beiden alternativen Firmware-Speicherplätzen der 7490 umzuschalten.
eva-login.sh:
Code:
#!/bin/sh
ip="192.168.178.1"
for ARG in $@
do
if [ ! x"$ARG" = x ]
then
ip="$ARG"
fi
done
#echo "Warte auf Ausschalten von „$ip“…"
#while ping -c1 -w1 $ip > /dev/null
#do
# echo -n "·"
# sleep 0.2
#done
#echo " Keine Antwort mehr."
echo "Warte auf Einschalten von „$ip“…"
while ! ping -c1 -w1 $ip > /dev/null
do
echo -n "."
sleep 0.2
done
echo " $ip gefunden!"
ftp -n -p<<ENDE
open $ip
user adam2 adam2
debug
quit
ENDE
Die Funktionsweise ist von „push_firmware“ aus Freetz übernommen, aber ohne den ganzen Schnickschnak mit Überprüfungen und der Dateiübertragung an sich.
Ohne Parameter wird die Standard-IP-Adresse „192.168.178.1“ angenommen, jeder andere übergebene Wert wird als auflösbarer Name oder IP-Adresse verwendet.
Gibt man hier Blödsinn an, wird der Ping stets fehlschlagen und man muß mit Strg-C abbrechen.
Benötigt werden die Kommandos „ping“ und „ftp“, die installiert sein müssen, auch das wird nicht geprüft, es klappt halt einfach nicht, wenn diese nicht da oder von den Parametern her inkompatibel sind.
Der auskommentierte Teil wird nur dann benötigt, wenn man das Skript erst startet und dann die Box neu startet und die Box im Normalmodus dieselbe IP hat wie im EVA-Modus direkt nach dem Einschalten. Jener Abschnitt wartet so lange, bis die Box nicht mehr antwortet und geht dann sofort im nächsten Abschnitt zum Warten auf die nächste Antwort über, die kommt, sobald im EVA-Modus ein Ping empfangen wurde. Für jeden Ping-Versuch wird ein · gemalt.
Sobald die Box (wieder) antwortet, endet die Schleife und es meldet sich per FTP an und wieder ab. Von diesem Zeitpunkt an läuft der normale Startvorgang der Box nicht mehr weiter, man kann sich später jederzeit erneut per FTP anmelden.
Das eigentliche Datei-Übertragungs-Programm ruft das obige Skript auf, es muß im Suchpfad liegen oder man muß das 2. Skript so ändern, daß es mit relativem oder absolutem Pfad aufgerufen wird. Alternativ kann man beide in eine Datei zusammenbasteln.
Für die eigentliche Datei-Übertragung wird das folgende Skript benötigt: https://github.com/PeterPawn/YourFritz/blob/master/eva_tools/eva_to_memory
7490install.sh:
Code:
#!/bin/sh
VR="./var"
VT="$VR/tmp"
KI="$VT/kernel.image"
FI="$VT/filesystem.image"
IP="192.168.178.1"
for ARG in $@
do
if [ -f "$ARG" ]
then
FIMG="$ARG"
else
IP="$ARG"
fi
done
if [ -f "$FIMG" ]
then
tar xvf "$FIMG"
if [ -d "$VT" ]
then
for IMG in "$KI" "$FI"
do
if [ -f "$IMG" ]
then
dd iflag=count_bytes bs=256 if="$IMG" of="$IMG.tmp" count=$(( `stat --printf=%s "$IMG"`-8 ))
fi
done
cat "$KI.tmp" "$FI.tmp" > "$FIMG.eva"
rm -rfv "$VR"
eva-login.sh "$IP"
eva_to_memory "$FIMG.eva" "$IP"
fi
fi
Der 2. Teil braucht bis zu 2 Übergabeparameter, nämlich einen Dateinamen und die IP-Adresse, falls es nicht oben genannte Standardadresse ist.
Alles, was kein gültiger Dateiname (mit Pfadangabe, falls nicht im aktuellen Verzeichnis) einer existierenden Datei ist, wird als IP/Rechnername behandelt, auch wenn das Unsinn ist. In dem Fall schlüge wieder der Ping fehl und man müßte abbrechen. Die Reihenfolge der beiden Parameter ist egal, gibt man aber mehr als 2 an, hängt von deren Reihenfolge ab, was danach genau passiert, falls etwas sinnvolles, dann würde man das auch mit genau 1-2 Parametern hinbekommen. Ohne gültigen Dateinamen geschieht überhaupt nichts.
Hat man einen Dateinamen übergeben und existiert diese Datei, wird versucht, sie im aktuellen Verzeichnis mit Tar auszupacken. Dabei wird ein Verzeichnis „./var“ mit Unterverzeichnissen erzeugt. Schlägt das fehl, werden auch nachfolgende Aktionen scheitern – abgesehen davon, die Box im EVA anzuhalten.
Geht alles gut, werden aus „./var/tmp“ der Kernel und das Dateisystem jeweils um die angehängte Prüfsumme von 8 Bytes gekürzt, diese beiden Dateien dann zusammengefügt und das Ergebnis als „$FIMG.eva“ gespeichert. Dazu muß das Verzeichnis, in dem „$FIMG“ liegt, die als Parameter übergebene Firmware-Datei, vom aufrufenden Benutzer beschreibbar sein. Danach wird die ausgepackte Datei und deren temporärer Inhalt unterhalb von „./var“ wieder gelöscht.
Für diese Aktionen werden die Kommandos „tar“, „dd“, „stat“, „cat“, „rm“ benötigt, die im Pfad liegen müssen. Die verwendete Shell muß rechnen können, um 8 Bytes von der Dateilänge abzuziehen. Der Vorgang braucht auch genügend freien Platz: temporär etwa 3 Mal die Firmware-Größe.
Nunmehr folgt die Anmeldung an der Box, danach die Übertragung der gerade erstellten Datei in deren Speicher mit Hilfe von „eva_to_memory“; wie das funktioniert, kann man hier nachlesen: http://www.ip-phone-forum.de/showthread.php?t=283039&p=2147416&viewfull=1#post2147416.
Beispiel-Aufruf:
7490install.sh ./FRITZ.Box_7490.113.06.30.image 203.0.113.5
Das erstellt ./FRITZ.Box_7490.113.06.30.image.eva und überträgt es zum Router mit der Adresse 203.0.113.5.
Die erstellte Datei bleibt auch lokal erhalten, nur die entpackte Firmware und Zwischenprodukte werden wieder gelöscht.
Es ist die Adresse anzugeben, welche der Router beim Startvorgang annimmt; wenn man ihm nur in der Weboberfläche einen von der AVM-Vorgabe abweichenden Adreßbereich vergeben hat, ist das immer noch 192.168.178.1! Der Rechner, von dem aus das Update gemacht werden soll, muß eine Adresse im selben Subnetz haben, beziehungsweise muß eine Route zum Ziel bestehen.
Die Einstellungen bleiben wie bei einem normalen Update erhalten, soweit die neu geflashte Version sie „versteht“.
- - - Aktualisiert - - -
Anmerkung: ich hätte auch „image2ram“ aus „YourFritz“ nehmen können, um die Datei umzuwandeln, das macht ein paar Prüfungen, scheint mir dafür aber länger zu laufen.
- - - Aktualisiert - - -
Zu den Voraussetzungen:
Das „eva_to_memory“ braucht zwingend das OpenBSD-Netcat! Das aus Busybox, die „klassische“ Version 1.10 oder „Netcat6“ funktionieren nicht! Wer wie ich Debian verwendet, muß also mit „update-alternatives“ bei mehreren installierten Versionen die richtige davon als „nc“ einstellen, oder anders sicherstellen, daß die OpenBSD-Version als „nc“ gefunden wird!