Patch: Backup/Restore für DS-Mod

kriegaex

Aktives Mitglied
Mitglied seit
7 Nov 2006
Beiträge
2,927
Punkte für Reaktionen
3
Punkte
36
Nicht wenige Leute wünschen sich einen einfachen Mechanismus, um über die Web-Oberfläche des DS-Mod gespeicherte Einstellungen aus dem ttfs (/var/flash/*) sichern und wiederherstellen zu können. Seit Februar 2007 gibt es die Funktion "Sichern/Wiederherstellen" für die beiden DS-Mods (Kernel 2.4 und 2.6), allerdings waren bisher beide Versionen mit unterschiedlichen Haserl-Versionen ausgestattet (mehr zu Haserl weiter unten) und enthielten die Binaries direkt, anstatt sie selbst im Mod zu bauen. Das ist jetzt anders.

Features:
  • Sichern aller sichtbarer Dateien aus /var/flash in einem tar.gz-File und Download derselben per Mausklick. Und ich meine wirklich alle:DS-Mod-Konfiguration, AVM-Konfiguration, debug.cfg, inklusive Dateien mit Größe null und ohne Ausnahme, also auch multid.leases, stat.cfg usw.
  • Wiederherstellen einer Sicherung aus einem dieser tar.gz-Files. Die gewählte Datei wird per Mausklick hochgeladen, entpackt und die enthaltenen Dateien werden gnadenlos nach /var/flash zurück kopiert. Das ist praktisch nach einem Recover und erneuten Einspielen eines Mods, wenn man wieder ohne langes Konfigurieren einen zuvor gesicherten Stand haben will. Ich benutze es aber auch einfach, um nach Einstellungsänderungen wieder zum vorigen Stand zurückzukehren.
  • Wie die Oberfläche aussieht, zeigen die angehängten Screenshots.

Schmankerl am Rande: Um den HTML form-based upload gemäß RFC 1867 zu realisieren, habe ich Haserl 0.9.16 eingebaut, einen in C geschriebenen CGI-Wrapper, der außer Uploads noch ein bißchen Scripting beherrscht. Ist echt praktisch und ziemlich schlank, paßt daher gut zur Fritz!Box. Man kann Haserl auch für andere Sachen benutzen.

Der Patch enthält Folgendes:
  • Install-Skript, in dem ggf. noch das DS-Mod-Verzeichnis anzupassen ist
  • Patch fürs DS-Mod-Webmenü: neue Menüpunkte für Sichern/Wiederherstellen und für die mit in diesem kombinierten Paket enthaltene Rudi-Shell (siehe auch Wiki)
  • CGI-Skripten für beide neuen Funktionalitäten
  • Make-Skripten für Haserl unter make/haserl

Anschließend einfach nochmal die Sequenz
Code:
make haserl-precompiled
make
aufrufen und Firmware neu einspielen.

Update 6: (02.04.2007, 03:22): Es gibt nun keinen Patch mit enthaltenem Haserl-Binary mehr wie früher, sondern ein kombiniertes Paket mit kleiner Installations-Routine, welches für beide DS-Mods (ds-0.2.9 von danisahne und ds-0.2.9_26-x mit x<14 von olistudent) funktionieren sollte. Bitte beachten:
  • Nicht wundern, außer Sichern/Wiederherstellen ist in dieser Version auch die Rudi-Shell (siehe auch Wiki) enthalten.
  • Ab ds-0.2.9_26-14 wird dieser Patch nicht mehr benötigt, da sowohl Haserl als auch Backup/Restore und Rudi-Shell sowieso darin enthalten sind.
  • Haserl ist nun für alle Mods auf dem gleichen Stand und wird direkt im Build-Prozeß gebaut. Binaries werden nicht mehr verteilt.
 

Anhänge

  • backup-restore-1.gif
    backup-restore-1.gif
    18.8 KB · Aufrufe: 185
  • backup-restore-2.gif
    backup-restore-2.gif
    28.9 KB · Aufrufe: 162
  • backup-restore+rudi.tar.bz2
    4.9 KB · Aufrufe: 32
Zuletzt bearbeitet:
Das ist eine feine Sache, ich habe gerade gestern den Backup über telnet/tar gemacht.

Hat jemand eine Idee, warum er auf meinem Mac sowohl unter Safari als auch Firefox eine binäre Datei "do_backup.cgi" lädt? Der Dateityp ist "Binary File" und nicht html, so wie die Datei intern aussieht.

Mit dem Internet Explorer auf dem Mac lädt er mir die ganze binäre Datei und zeigt sie gleich an.

Nur unter Windows mit dem Internet Explorer bietet er mir die Tar-Datei als Download an.

Ich denke es liegt daran, dass der cgi erst einen "Content-type: text/plain" schickt und die Applikation dann den HTTP header mit

Content-type: application/x-gzip
Content-Disposition: attachment; filename="var_flash.tar.gz"

nachschiebt.
 
Zuletzt bearbeitet:
dksoft2 schrieb:
Hat jemand eine Idee, warum er auf meinem Mac sowohl unter Safari als auch Firefox eine binäre Datei "do_backup.cgi" lädt? Der Dateityp ist "Binary File" und nicht html, so wie die Datei intern aussieht.

Zwar habe ich keinen Mac und muß zu meiner Schande gestehen, daß ich Windows auch nur mit IE7 (bzw. dem Aufsatz Maxthon) getestet habe, aber gerade habe ich mal Firefox und Opera probiert, und auch da klappt es nicht wie vorgesehen. Um das zu verallgemeinern, werde ich wohl noch nacharbeiten müssen, ich hatte das erst mal nur für mich gehackt. Vielleicht geht das auch mit Haserl anstatt mit einem reinen Shell-Skript. Der Download war schon lauffähig, als ich merkte, daß der Upload ohne Zusatzwerkzeug schwierig werden würde, und nachdem ich den mit Haserl erledigt hatte, habe ich mir den Download nicht mehr angeschaut.

Edit:

dksoft2 schrieb:
Ich denke es liegt daran, dass der cgi erst einen "Content-type: text/plain" schickt und die Applikation dann den HTTP header mit (...)

Den Content-Type text/plain setzt nicht mein Skript sondern der httpd, welcher schlau sein möchte. :-7 Aber den werden wir schon austricksen. Update folgt demnächst, hoffe ich. Solange heißt's IE benutzen, auch wenn es manchen Leuten schwer fallen dürfte. ;-)
 
Neue Version, Download und Info vgl. erstes Posting. Falls Patch schon eingespielt, am besten den alten erst deinstallieren (patch --reverse), dann neuen einspielen.
 
OK, Haken dran. Geht super!

Ich habe den Backup auf einem Mac mit Safari, Firefox und IE6 unter CrossOver probiert. Funktioniert. Allerdings habe ich keinen Restore getestet, aber das Tar-Archiv, sowie das ds-mod Tar-Archiv im Archiv liesen sich auspacken und die Inhalte kommen mir bekannt vor.

Danke für den prompten Service.
 
Update #2 kommt jetzt auch mit dem Opera-Browser zurecht. Haserl hatte sich an seinen Formular-POST-Requests verschluckt, inzwischen verwende ich GET, das reicht hier auch.
 
Gibt es auch schon eine Anleitung für nicht Linux'ler. Ich komme leider nicht wirklich weit mit meinem Cygwin. Hab die Sachen entpackt und die Verzeichnisstruktur in der Install.Datei entsprechend angepaßt. Beim Ausführen von ./install kommen allerdings nur Fehlermeldungen:

zr3ic01@administrator1 ~/ds-mod
$ ./install
: command not found
: command not found
: No such file or directoryestore.patch
: command not found
chmod: cannot access `/home/zr3ic01/ds-mod/ds-0.2.9\r/root/usr/mww/cgi-bin\r/backup_restore.cgi\r': No such file or directory
chmod: cannot access `/home/zr3ic01/ds-mod/ds-0.2.9\r/root/usr/mww/cgi-bin\r/do_backup.cgi\r': No such file or directory
chmod: cannot access `/home/zr3ic01/ds-mod/ds-0.2.9\r/root/usr/mww/cgi-bin\r/do_restore.cgi\r': No such file or directory
: command not found
tar: /home/zr3ic01/ds-mod/ds-0.2.9\r/root\r: Cannot chdir: No such file or directory
tar: Error is not recoverable: exiting now
: command not found

Ich wundert irgendwie das er z.B. bei den chmod Befehlen immer ein "r" zu viel hat oder?Hier mal der Inhalt des Config Files:

#!/bin/bash

# Edit, if necessary
DS_MOD_DIR=~/ds-mod/ds-0.2.9

# Patch source stuff
patch -p 1 -d $DS_MOD_DIR/root < backup-restore.patch

# Make new CGI scripts executable
CGI_DIR=$DS_MOD_DIR/root/usr/mww/cgi-bin
chmod +x $CGI_DIR/backup_restore.cgi
chmod +x $CGI_DIR/do_backup.cgi
chmod +x $CGI_DIR/do_restore.cgi

# Add 'Haserl' CGI handler binary
tar xvjf haserl-bin.tar.bz2 --directory $DS_MOD_DIR/root

Bin für jeden Tip dankbar.

Gruss Oli
 
@oli_kh: Deine Konstellation wirft mehrere Fragen bzw. Probleme auf:
  1. Mit cygwin kannst Du keinen aktuellen DS-Mod mit 2.6er Kernel bauen, wie olistudent ihn pflegt. Also nehme ich an, Du möchtest die letzte Version mit 2.4er Kernel von Danisahne bauen. Das müßte gehen, ich habe das früher auch mit cygwin kompiliert ohne Probleme.
  2. Das mit im Paket gelieferte Haserl ist ein Binary, von dem ich nicht weiß, ob es unter dem 2.4er Kernel läuft. Nehmen wir einfach mal an, dem sei so.
  3. In Deiner Konsolenausgabe steht nicht jeweils ein einzelnes "r" zu viel, sondern ein "\r", wenn Du genau schaust. Das ist die übliche Schreibweise in C oder auch in UNIX-Shells für "carriage return" (CR), was wiederum unter Windows ein Teil des Zeilenumbruch-Codes CR-LF (LF = "line feed") ist. Unter UNIX ist der Zeilenwechsel ein einfacher LF. Es sieht mir so aus, als würde cygwin die Shell-Skripten im UNIX-Format erwarten, Du hast sie aber im Windows-Format gespeichert (Vermutung). Daher werden die CR-Codes einiger Windows-Zeilenumbrüche in die Strings eingebaut.

Abhilfe für Punkt 1: Mit Linux bauen (FriBoLi oder etwas anderes) - natürlich nur, falls Du überhaupt was anderes als Kernel 2.4 willst/brauchst. Der funktioniert auch, ich mochte den alten Mod.

Abhilfe für Punkt 2: Notfalls einfach Haserl selber bauen.

Abhilfe für Punkt 3 (Dein Hauptproblem, dessentwegen Du gepostet hast): Versuch mal, die Dateien mit UNIX-Zeilenenden zu speichern oder mit Anführungszeichen bzw. Hochkommata bei der Variablenzuweisung zu arbeiten. Beispiel:
Code:
#!/bin/bash

# Edit, if necessary
DS_MOD_DIR=[B]"~/ds-mod/ds-0.2.9"[/B]

# Patch source stuff
patch -p 1 -d $DS_MOD_DIR/root < backup-restore.patch

# Make new CGI scripts executable
CGI_DIR=[B]"$DS_MOD_DIR/root/usr/mww/cgi-bin"[/B]
chmod +x $CGI_DIR/backup_restore.cgi
chmod +x $CGI_DIR/do_backup.cgi
chmod +x $CGI_DIR/do_restore.cgi

# Add 'Haserl' CGI handler binary
tar xvjf haserl-bin.tar.bz2 --directory $DS_MOD_DIR/root
 
Also ich wollte den Patch für eine Eumex IP mit dem dsmod-0.2.9-p6 auf einer avm 06.04.27 Firmware verwenden. Also 2.4er Kernel... Dein Tip bezüglich der Windows Formatierung hat wohl seine Berechtigung, da ich als alter Windows'ler das Script natürlich vorab mit dem notepad editiert habe... Werd das Ganze jetzt mal mit einem Cygwin Editor testen...

Edit: Welchen Editor gibt es denn unter Cygwin?


Gruss Oli
 
Zuletzt bearbeitet:
So gut wie jeder brauchbare Windows-Editor (außer Notepad, aber der ist auch nicht brauchbar) kann UNIX-Zeilenenden schreiben (meistens als Option bei "Speichern unter"). Ich benutze z.B. TextPad, aber es gibt -zig andere.

Alternative: Unter Cygwin solltest du auch das Kommandozeilen-Tool dos2unix (auch unix2dos, falls Du das mal brauchst) zur Verfügung haben.

Edit: Auch, wenn's off-topic ist: Unter Cygwin gibt es jede Menge guter Editoren, die man bei Bedarf installieren kann.
 
haserl für uClibc-0.9.26

MfG Oliver
 

Anhänge

  • haserl.tar.gz
    9.1 KB · Aufrufe: 19
@kriegaex
Danke für den Tip bezüglich der Formatierung - das war des Rätels Lösung. 1x mit dos2unix bearbeitet und schon funktioniert die Sache! mit Haserl hatte ich beim Patchen keine Probleme... Nach dem einspielen der Firmware war auch der Menüpunkt in der ds-mod WebGui sichtbar. Wenn ich aber auf den Button sichern gehe, endet das Ganze in einer weißen Seite... Also von einem anschließenden Download ist hier nicht die Rede?

@olistudent
Bietet deine Version einen Vorteil gegenüber der bisherigen? Oder ist das mein Problem?
 
Du darfst nicht das haserl-Binary aus dem Archiv von kriegaex nehmen, weil das für die uClibc-0.9.28 ist.

MfG Oliver
 
Code:
Extracting backup files...
tar: var_flash.tar.gz: No such file or directory
Restoring configuration...
ls: var_flash: No such file or directory
done
Removing backup...
done
Restarting in 5 seconds...
Hm... da will was nicht ganz ;)

Mit tar -xzf var_flash.tar.gz konnte ich die Datei aber manuell auf der Box entpacken.
Gruß Niko
 
Ich kann das hier nicht nachvollziehen, bei mir klappt es. Kannst Du das mal irgendwie tracen? Klappt der Upload des Archivs nicht? Liegt es nicht im richtigen Pfad? Wenn ich zusätzlich die tar-Zeile in do_restore.cgi mit echo ausgebe, steht da so etwas wie tar xvzf /tmp/B0PryP, denn Haserl erzeugt ja eine temporäre Datei und keine mit dem Namen des Original-Files.

Hast Du wirklich meinen Patch eingespielt, wie er hier gepostet ist? Im Zweifel poste mal Deine do_restore.cgi.
 
Hi,
also hier ist die ganze Ausgabe
Code:
Wiederherstellung (Restore)
Sie haben gerade die Datei hochgeladen.
Sie ist unter dem temporären Namen var_flash.tar.gz auf der Fritz!Box gespeichert.
Die Dateigröße beträgt cat: var_flash.tar.gz: No such file or directory 0 Bytes. Installationsverlauf:

Extracting backup files...
tar: var_flash.tar.gz: No such file or directory
Restoring configuration...
ls: var_flash: No such file or directory
done
Removing backup...
done
Irgendetwas klappt mit dem Upload-Dateinamen nicht bzw dem Upload an sich.
Das CGI:
Code:
/var/tmp $ cat /usr/mww/cgi-bin/do_restore.cgi
#!/usr/bin/haserl -u -U /var/tmp
<?
PATH=/bin:/usr/bin:/sbin:/usr/sbin
. /usr/lib/libmodcgi.sh
cgi_begin 'Konfiguration wiederherstellen (Restore)' 'do_restore'
?>
<h1>Wiederherstellung (Restore)</h1>

<?if test -n "$FORM_uploadfile" ?>
  Sie haben gerade die Datei <b><? echo -n $FORM_uploadfile_name ?></b> hochgeladen.<br>
  Sie ist unter dem temporären Namen <i><? echo $FORM_uploadfile ?></i> auf der Fritz!Box gespeichert.<br>
  Die Dateigröße beträgt <? cat $FORM_uploadfile | wc -c ?> Bytes.</p>
  <b>Installationsverlauf:</b>
  <pre><?
    cd /var/tmp
    export BACKUP_DIR='var_flash'
    rm -rf $BACKUP_DIR
    echo "Extracting backup files..."
    tar xvzf $FORM_uploadfile
    echo "Restoring configuration..."
    for file in $(ls $BACKUP_DIR); do
      echo "cat $BACKUP_DIR/$file > /var/flash/$file"
      cat $BACKUP_DIR/$file > /var/flash/$file
    done
    echo "done"
    echo "Removing backup..."
    rm -rf $BACKUP_DIR
      rm -f $FORM_uploadfile
    echo "done"
    if [ "$FORM_restart" = "on" ]; then
      echo "Restarting in 5 seconds..."
      (sleep 5; reboot)&
     fi
  ?></pre>
<?el?>
  Sie haben keine Sicherungs-Datei zum Hochladen ausgewählt. Der Zustand
  der Fritz!Box wurde nicht verändert.
<?fi?>

<p>
<form action="/cgi-bin/status.cgi" method=GET>
  <input type=submit value=Zurück zur Übersicht>
</form><p>

<? cgi_end ?>
/var/tmp $

Gruß Niko

EDIT: Hab eben die Vermutung gehabt, dass Haserl vielleicht nicht installiert wurde, aber ein
Code:
/var/tmp $ haserl
This is haserl version 0.8.0
This program runs as a cgi interpeter, not interactively.
Bug reports to: Nathan Angelacos <[email protected]>
scheint zu funktionieren.

EDIT 2:
Wo kommt eigentlich das $FORM_uploadfile_name her? Wird das automatisch generiert? Ein Feld uploadfile_name existiert im Form ja nicht.
 
Zuletzt bearbeitet:
Jetzt bitte noch backup_restore.cgi.
 
Code:
#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin
. /usr/lib/libmodcgi.sh

cgi_begin 'Konfiguration sichern/wiederherstellen' 'backup_restore'

cat << EOF
<h1>Sicherung (Backup)</h1>

Sichern sämtlicher Einstellungen aus dem Flash-Speicher <i>/var/flash</i>. Dies
umfaßt sowohl die Einstellungen der Original-Firmware als auch die des
DS-Mod sowie sämtlicher sonstiger beim Start geladener Erweiterungen (z.B.
LCR-Updater).<p>

<form action="/cgi-bin/do_backup.cgi" method=GET>
  <input type=submit value=Sichern>
</form><p>

<h1>Wiederherstellung (Restore)</h1>

Wiederherstellen eines zuvor gesicherten Archivs mit Einstellungen
<i>(var_flash.tar.gz)</i>. Damit wird die Fritz!Box wieder in den Zustand zum
Zeitpunkt der entsprechenden Sicherung versetzt.<p>

<b><i>Nach der Wiederherstellung sollte das Gerät neu gestartet werden, um
alle Einstellungen zu aktivieren.</i></b><p>

<form action="/cgi-bin/do_restore.cgi" method=GET>
  <input type=file name=uploadfile><br>
  <input type=checkbox name=restart checked>Neustart nach Wiederherstellung<p>
  <input type=submit value=Wiederherstellen>
</form>
EOF

cgi_end
Die Get-Methode stört mich etwas, wegen der begrenzten Größe... sicher, dass das immer ausreicht?

Gruß Niko
 
Hallo Niko!

Seit gestern, 16:20 Uhr, war mein DSL-Zugang weg. Erst zwei teure Supportanrufe bei 1&1 und eine dadurch ausgelöste Beauftragung an T-Com zum Reset des Modems später geht es seit ein paar Minuten wieder. Wenn ich meine alte ISDN-Anlage nicht noch zur Reserve hier hängen hätte, wäre sogar das Telephonieren nicht gegangen.

Zum Problem: Von POST auf GET habe ich umgestellt, weil es mit anderen Browsern Probleme gab. Wie das nochmal genau war, weiß ich schon nicht mehr. Kannst gern mal ändern, wenn Du möchtest. So hatte ich es anfangs auch.

Was die Variablen betrifft: Alle Formularfelder werden von Haserl ins Environment geschrieben als FORM_<fieldname>. Bei Upload-Files gibt es zusätzlich noch FORM_<fieldname>_name für den temporären Dateinamen auf dem Server.

Ich könnte Dir sicher besser helfen, wenn ich Dein Problem irgendwie nachvollziehen könnte. Wir scheinen die gleiche Hardware und den gleichen Mod einzusetzen. Das ist schon mal gut. Wie sieht's mit dem Browser aus? Welchen benutzt du, von welchem OS aus?
 
Hi,
seit Freitag vorletzter Woche bin ich von 1&1 weg :D

OK. Zum Problem: Getestet hab ichs mit dem Firefox 2.0.1 und dem IE7 unter Windows XP Pro, beides ohne Erfolg. Wenn ich zu Hause bin, werd ich mein VMWare-Kubuntu aber nochmal anschmeißen und nachgucken, was dort Firefox und der Konqueror machen.

Gruß Niko
 
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.