[Gelöst] AVM-Webif kompatible Sicherung über Freetz (.export)

vice_pres

Mitglied
Mitglied seit
6 Apr 2008
Beiträge
474
Punkte für Reaktionen
4
Punkte
18
Edit:

Script ist fertig :)

Vorraussetzung ist callmonitor mit Aktionen - das erledigt nämlich den Login

Es funktioniert so - ob es unbedingt die beste Lösung ist sei mal dahingestellt ;)

Sollte der Login am Webif scheitern oder die Export-Datei nicht den "richtigen" Inhalt enthalten wird eine E-Mail verschickt.

Das Script liesst den Absendernamen aus den Pushservice Einstellungen aus (aber nur den Absender, das ist in meinem Fall so gewollt) und verwendet den als Absender, der Rest ist von Hand konfiguriert.

Das Script kann als ersten Parameter einen Ziel-Dateinamen erhalten (mit existierendem Pfad) - wenn keiner angegeben wird dann wird die Datei "fritzbox.export" im Verzeichnis erstellt in dem auch das Script liegt. Alternativ kann man auch über BACKUPBASE fest einen anderen Pfad einstellen.

Code:
#!/bin/sh
. /etc/freetz_info.cfg
. /var/env.cache
EXPORT_PASSWORD=test
MAIL_BETREFF="Automatischer Export gescheitert"
MAIL_ABSENDER=`allcfgconv -C "ar7" -c -e  -o - | sed -ne '/^'"emailnotify"'[[:space:]]*{/,/^}/p' | grep From | sed -e 's/^[[:space:]]*From \= "//g' -e 's/\";//g' -e 's/\\\"//g'`
MAIL_EMPFAENGER="[email protected]"
MAIL_SERVER="192.168.0.1"
MAIL_BENUTZERNAME=""
MAIL_PASSWORD=""
FEHLERDATEI="/var/tmp/exportfehler.txt"
CURRENTDIR=$(cd "$(dirname "${0}")" && pwd)	# Ordner in dem das Script liegt
#BACKUPBASE="/var/media/ftp/uStor01"		# Ordner in dem die Dateien liegen sollen
BACKUPBASE=$CURRENTDIR				# Ordner in dem die Dateien liegen sollen
if [ "$1" != "" ];
then
	EXPORTDATEI=$1
else
	EXPORTDATEI="${BACKUPBASE}/fritzbox.export"
fi

[ -z "$APPLET" ] && exec /usr/lib/callmonitor/controller "$0" "$@"
require webui

# set -x
set "$@" --
if webui_login; then
	LOGIN_OK=OK
else
	echo "Login fehlgeschlagen" > $FEHLERDATEI
	mailer \
		-s "$MAIL_BETREFF" \
		-f "$MAIL_ABSENDER" \
		-t "$MAIL_EMPFAENGER" \
		-m "$MAIL_SERVER" \
		-a "$MAIL_BENUTZERNAME" \
		-w "$MAIL_PASSWORD" \
		-i $FEHLERDATEI
	rm -f $FEHLERDATEI
	exit 1
fi
export CONTENT_TYPE='multipart/form-data; boundary=---------------------------29790258764751'
export HTTP_HOST='169.254.255.255'
export REMOTE_ADDR='169.254.255.255'
export REQUEST_METHOD='POST'
STDINEXPORT="-----------------------------29790258764751
Content-Disposition: form-data; name=\"sid\"

$WEBUI_SID
-----------------------------29790258764751
Content-Disposition: form-data; name=\"ImportExportPassword\"

$EXPORT_PASSWORD
-----------------------------29790258764751
Content-Disposition: form-data; name=\"ConfigExport\"


-----------------------------29790258764751--
"
echo "$STDINEXPORT" | /usr/www/all/cgi-bin/firmwarecfg > $EXPORTDATEI
sed -i -e 1D -e 2D -e 3D $EXPORTDATEI
webui_logout
KONTROLLE=`head -n 8 $EXPORTDATEI | tail -n 1`
if [ "$KONTROLLE" != "**** CFGFILE:ar7.cfg" ]
then
	echo "Exportdatei scheint ungültig zu sein" > $FEHLERDATEI
	mailer \
		-s "$MAIL_BETREFF" \
		-f "$MAIL_ABSENDER" \
		-t "$MAIL_EMPFAENGER" \
		-m "$MAIL_SERVER" \
		-a "$MAIL_BENUTZERNAME" \
		-w "$MAIL_PASSWORD" \
		-i $FEHLERDATEI
	rm -f $FEHLERDATEI
	exit 1
fi

Der Ursprungstext:

Hi,

Folgende Situation: Die 7270 bei meiner Schwester hatte sich am Samstag verabschiedet, also schnell ne 7390 holen lassen und aus der Ferne eingerichtet, da ich nur ein var_flash Backup hatte wo ja nachher Anmeldepasswort, Internetzugangsdaten etc... nicht mehr stimmen. Ich weiß, dass ich vor "Ewigkeiten" mal ein Script hatte, dass auch nen Export übers Webif gemacht hat. Das war aber noch aus Zeiten vor der Anmeldung mit Passwort und der Notwendigkeit ein Passwort auf die Export Datei zu setzen (bzw jetzt sollte man es ja damit man die Datei auch auf einer anderen Box importieren kann)... Wenn ich mich recht entsinne hat das ein wget gemacht auf die URL die dann das Export-File rausgespuckt hat.

Gibts sowas ähnliches auch noch jetzt? Die Freetz sachen hab ich aus dem Backup von var_flash einfach wieder hinbekommen - aber son "Übernahme" Export ist natürlich auch eine nette Sache...

Gruß
Peter
 
Zuletzt bearbeitet:
Der FBEditor macht das ungefähr so. Wenn ich mich richtig erinnere auch mit Passwort. Mir ist nur nicht klar warum du es nicht übers Webinterface machen kannst!? Wo ist denn da der Unterschied zur wget Methode?

Gruß
Oliver
 
Hi Oli,

Hauptsächlich darin, dass ich das Wget in das automatisch laufende Backupscript einbinden könnte/eingebunden hatte. Es passiert automatisch... Denn irgendwas passiert (aus eigener Erfahrung) genau dann, wenn man nur noch ein altes Backup hat oder sowas. Wenn es sich script lässt kann man es einfach automatisch laufen lassen und hat immer n aktuelles Backup

Gruß
Peter
 
Es gibt z.B. im Callmonitor die Anmeldung über Challenge. Aber das hat eigentlich nichts mit Freetz zu tun. Evtl. wird dir wo anders besser geholfen...

Gruß
Oliver
 
Im Grunde genommen würde ja auch ein passender Aufruf von firmwarecfg reichen - das erzeugt ja schließlich den Export. Da hab ich mich allerdings schon etwas länger dran versucht und noch keinen Weg gefunden dem Teil wirklich irgendwie Parameter mitzugeben oder den Aufruf von AVM nachzubauen. Im Prinzip gibt es die Export Seite die eine Inpurt-Box für das Passwort hat(name="ImportExportPassword" id="uiPass") , sowie einen Knopf der den Export auslöst (onclick="uiDoExport()") - aber wie das ganze dann dazu führt, dass aus der firmwarecfg die passende .export rauskommt...

@Oli:
Das Problem ist: Ich wüsste (auch wenn es nur bedingt etwas mit Freetz zu tun hat, die Freetz eigene Sicherung macht ja ein an die Box-SN gebundenes Backup, was ja hier auch schonmal angeschnitten worden ist: http://www.ip-phone-forum.de/showthread.php?t=198385 ) keinen besseren Ort als hier für das Thema ;)

Edith sagt:
Ich war ja kurz davor mir selber ne .export von Hand zusammenzubauen, ich bekomm es auch fast hin, bis auf 2 Kleinigkeiten:

- Im Export ist oben das Passwort gesetzt, ich weiß nicht wie ich das zusammenbekommen soll. Im Grunde genommen sollte es ja reichen einmal nen richtigen Export zu machen mit einem bekannten Passwort und das dann zu kopieren. Aber ob da noch irgendwie die Datei Checksumme mit drin ist? Die Werte für das DSL-Passwort z.B. ist bei einer reinen cp-Kopie, einem Export ohne PW und einem Export mit PW immer gleich (also der verschlüsselte Wert mit $$$) - wie funktioniert das denn dann bitte??? Nur über das Passwort oben? Wenn die eigentlichen Passwörter (DSL,Webui,WLAN etc...) ja immer den gleichen Textstring haben...

Meine Testbox ist defekt... Erstmal auf ne andere Box warten von nem Arbeitskollegen, mag nicht meine produktive Box verbasteln...

Edit:
Ok, das mit der Checksumme kann man dann scheinbar vernachlässigen...
Das mit der config hat sich auch erledigt :)
 
Zuletzt bearbeitet:
An der Checksummenprüfung wurde irgendwann von AVM was geändert. Daher wird das Perl-Skript nicht mehr passen. Der FritzBox-Editor kann auch seit Jahren keine korrekte Prüfsumme mehr berechnen.

Gruß
Oliver
 
Ok, dann macht man das dann halt mit NoChecks...

Bin jetzt noch auf das Problem gestoßen, dass es im "richtigen" .export einen Binary Abschnitt für eine Datei config gibt - das ist das einzige File das ich nicht in /var/flash finden konnte - der Inhalt stimmt zu 99,8% mit dem binary-output von tamconf überein, aber eben nicht zu 100%

Wobei mich ja interessieren würde wie das mit den verschlüsselten Passwörtern funktioniert. Egal was für ein Passwort (und ob überhaupt) ich eingebe beim export über das Webif - die codierten Strings der Passwörter in der .config Datei ändern sich nicht?!

Gruß
Peter

Edit:
Hat sich erledigt - die Datei liegt unter /data/tam/config - my bad... Bleibt nur die Frage wie das mit den verschlüsselten Passwörtern ist. Bekomme wahrscheinlich morgen ne 7390 zum testen, dann werd ich ja sehen ob das übernehmen der Einstellungen (mitsamt Passwörtern) auf einer anderen Box klappt


Edit 2:
Also ich habe jetzt zumindest eine Datei die vom Fritz Webif angenommen wird zum zurückspielen mit dem richtigen Passwort.

Der Export fängt ja so an:
Code:
**** FRITZ!Box Fon WLAN 7390 CONFIGURATION EXPORT
Password=$$$$ABCDE(...)

Die jeweiligen Passwörter sehen ja ähnlich aus
Code:
username = "$$$$ABCDE(...)"

Ich hab den Password String mal aus dem Export von einer anderen Box genommen, das zurückspielen klappt, sämtliche Passwörter allerdings nicht. Also scheint es ja irgendwie von der Box abzuhängen -in meinem Fall für 4 Boxen werd ich wahrscheinlich einfach 4 mal export machen und dann das benutzen. Aber um das "Universal" zu machen müsste man schauen wie der string Password da erzeugt wird
 
Zuletzt bearbeitet:
Sofern das hilft (und noch geht): An der Stelle konnte man nach meiner Erinnerung auch einfach Klartext eintragen (username = "datissmeinname"). Sofern das noch klappt, ließe sich so eine Sicherung auf alle Boxen einspielen und nutzen.
 
Also - ich bekomm nachher ne 7390 zum testen ob sich die Settings auch auf einer anderen Box zurückspielen lassen. Das script zum erstellen des .export hab ich fertig - für die 4 Boxen auf denen ich das benutzen möchte habe ich jeweils ein reguläres export erzeugt mit dem gewünschten PW und den Password-String ins Script kopiert, das restore auf der gleichen Box funktioniert damit ohne Probleme.

Das "Problem" mit dem Plaintext: dann müsste man sich die Datei mit allcfgconv im Plaintext ausgeben lassen statt ein cat zu machen und den Header der beim cat erzeugt wird (Änderungsdatum der Datei soweit ich das nachvollziehen konnte) von Hand ins export bauen. Das wäre kein großes Problem, aber wieder etwas gefummel. Einfacher wäre natürlich wenn es eine Methode gibt aus einem Plaintext "Password" den gehashten String zu erzeugen.

Die Lösung stellt mich zu 90% zufrieden wenn nachher der Restore auf einer anderen Box funktioniert. Für 100% gibts da noch zuviele Haken:

- Wenn neue Dateien dazukommen die gesichert werden sollen (z.B. aufgrund neuer FW-Features) müssen diese von Hand im Script eingetragen werden - hier wäre ein funktionierender Aufruf der von AVM verwendeten Funktion für den export schon besser

- Wie oben erwähnt ist es nicht komplett portabel, es muss einmal ein Export mit einem gewählten Password gemacht werden und das muss dann ins Script kopiert werden

Ich werde nachher berichten ob das zurückspielen auf einer anderen Box geklappt hat und alle Passwörter übernommen worden sind.

Es klappt! Ich hab jetzt 2 verschiedene Backups von 2 verschiedenen 7390 auf einer frischen jungfräulichen 7390 zurückgespielt bekommen - ohne weitere Probleme (abgesehen vom "Nicht unterstützte Änderungen" mimimi). Damit habe ich - bis auf die "Gefahr", dass neue Dateien verloren gehen - erstmal eine Variante mit der ich meine 4 Boxen auch AVM Konform gesichert bekomme.

Schöner wäre natürlich der Weg über firmwarecfg direkt inkl Übergabe eines Passworts. Aber das ist wohl Wunschdenken... :)
 
Zuletzt bearbeitet:
Ich hab mich jetzt etwas an curl probiert nachdem ich mehrfach den Aufruf der export Seite mitgeschnitten habe (bzw das auslesen aus dem FBEditor 0.55 Beta 5) - ich beisser mir aber die Zähne daran aus. Ich habe Pikachu jetzt mal gefragt ob er mir die Sourcen von FBEditor zuschicken/zukommen lassen kann - ich hab zwar keine Java Erfahrung, aber da sollte sich dann auch ein "minimal" Export bestimmt zu basteln sein, hab mir den alten Quelltext auf github angeguckt, aber pikachu sagte ja, dass er auch einiges ändern musste, daher wäre ein aktueller Quelltext (gerade mit funktionierendem login) eine bessere Ausgangsbasis.

Mit dem callmonitor kann ich mich erfolgreich anmelden und bekomme auch eine sid - aber ich bekomm den export einfach nicht übergeben... :(
 
Die aktuellen Sourcen vom FBEditor sind auf github verfügbar.

Gruß
Oliver
 
Ach okay - das sind die aktuellen? Dachte das wären ältere und nicht die zur aktuellen Beta von Pikachu
 
Im Grunde genommen würde ja auch ein passender Aufruf von firmwarecfg reichen - das erzeugt ja schließlich den Export. Da hab ich mich allerdings schon etwas länger dran versucht und noch keinen Weg gefunden dem Teil wirklich irgendwie Parameter mitzugeben oder den Aufruf von AVM nachzubauen.
Hast du schon probiert, den Aufruf von AVM mithilfe eines Wrappers mitzuschneiden? So habe ich bisher die Verwendung unbekannter Binaries analysiert. Also Original-Binary verschieben, an die Stelle ein Skript, das Parameter und Umgebungsvariablen in eine Datei loggt und dann das Original-Binary 'exec'-t.
 
War mir etwas zu heikel bisher weil ich keine Bastelbox mehr übrig hatte, aber ich hab jetzt meine Bastel 3270 wieder und werd das morgen mal in Angriff nehmen - ich hoffe, dass es in dem Fall auch so klappt wie ich mir das vorstelle (gute Idee mit dem wrapper script - so mach ich es jetzt auch)

Danke für den Tip!
(und ich brech mir einen ab mit versuchen mit curl und allem anderen :D)
 
Daran hatte ich ja mal garnicht gedacht...
Es wird garnichts als Parameter übergeben scheinbar, es werden nur Umgebungsvariablen gesetzt - leider beinhaltet keine davon z.B. das im Webinterface eingegeben wird...

Code:
> CLIENTCONNECTION='192.168.3.3:51360'
> CONTENT_LENGTH='372'
> CONTENT_TYPE='multipart/form-data; boundary=---------------------------16221514319222'
> GATEWAY_INTERFACE='CGI/1.1'
> HTTPS='off'
> HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
> HTTP_ACCEPT_ENCODING='gzip, deflate'
> HTTP_ACCEPT_LANGUAGE='de,de-de;q=0.8,en-us;q=0.5,en;q=0.3'
> HTTP_HOST='192.168.3.254'
> HTTP_REFERER='http://192.168.3.254/system/export.lua?sid=8378db79ff759d58'
> HTTP_USER_AGENT='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0'
> PATH='/bin:/usr/bin'
> PATH_INFO='/cgi-bin/firmwarecfg'
> PATH_TRANSLATED='/usr/www/html/cgi-bin/firmwarecfg'
> PPID='1161'
> PS1='\w \$ '
> PWD='/usr/www/all/cgi-bin'
> REMOTE_ADDR='192.168.3.3'
> REQUEST_METHOD='POST'
> SCRIPT_NAME='/cgi-bin/firmwarecfg'
> SERVER_PROTOCOL='HTTP/1.1'
> SERVER_SOFTWARE='AVM websrv'
> WEBDIR_PATH='/usr/www/html'

Das sind die Sachen die im Gegensatz zu einem "set" in einer SSH-Shell zusätzlich im SET sind das als wrapper lief... Und das Passwort ist wie gesagt nicht dabei...
 
Code:
> CONTENT_LENGTH='372'
> CONTENT_TYPE='multipart/form-data; boundary=---------------------------16221514319222'
> REQUEST_METHOD='POST'
Das ist ein Post-Request. Die Parameter erhält firmwarecfg also über die Standardeingabe (372 Bytes lang).

PS: Da das aber ein einfacher CGI-Aufruf ist (Ich dachte beim Vorschlag mit dem Wrapper an etwas Komplizierteres), lässt sich der Aufruf viel leichter auf Client-Seite im Browser nachvollziehen (z.B. mit Firebug o.ä.).
 
Zuletzt bearbeitet:
Das mit dem POST ist richtig, ich hab das auslesen auch schon mit wireshark mal gecaptured weil ich mir von dem Capture etwas erhofft hatte wenn FBEditor das ausliesst...

im Wrapper habe ich mir $* ausgeben lassen, da hätte doch dann ein STDIN an firmwarecfg doch auftauchen müssen, oder?

Den Inhalt vom POST hab ich auch schonmal probiert von Hand nachzubauen, aber das fand ich irgendwie etwas schwierig mit dem boundary - und wget macht kein multipart/form-data so wie ich gelesen hab, da stand ich schon auf dem Schlauch
 
Sooooo... Das mit dem $* ist mir eingefallen als ich mir heute im Stau darüber Gedanken gemacht habe... Ich bin auch schlauer mittlerweile und hab den STDIN gecaptuered

Code:
-----------------------------71561981427914
Content-Disposition: form-data; name="sid"

666dbc7b999dfb49
-----------------------------71561981427914
Content-Disposition: form-data; name="ImportExportPassword"

test
-----------------------------71561981427914
Content-Disposition: form-data; name="ConfigExport"


-----------------------------71561981427914--

Das entspricht dem was ich mir auch anhand des Wireshark-Captures zusammengebaut habe. Jetzt probiere ich das mal als STDIN zu übergeben in nem Script, denn ohne STDIN und mit falschem STDIN schmeisst das Binary nämlich ne Webpage aus.

Edit:
So, ich habs gerade einmal auf der Kommandozeile hinbekommen. Aber nur solange die Session noch gültig ist. Das geht ja mit dem Kommandozeilen Login wie du ihn im Callmonitor benutzt. Habs jetzt soweit laufen mit nem temporären file mit der gültigen SID drin. Ich bastel da morgen mal in Ruhe dran weiter.

Auf jedenfall schonmal 1000 Dank für die Tips in die richtige Richtung! :)
 
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.