Hallo zusammen!
Schon seit einiger Zeit sichere ich ganz bestimmte Daten auf meinem USB-Stick. Bei jedem Einstecken des Sticks im heimischen Rechner wird per UDEV ein Script getriggert, welches das Backup übernimmt. Konkret geht es dabei um ein Desktop-Wiki, was auf meinem Stick lebt. Das war jedenfalls der Anfang, nun möchte ich auch alle anderen Daten auf dem Stick automatisiert sichern. Da mein Script sozusagen "historisch gewachsen" ist, ist es sehr unflexibel, alles hart kodiert... ich möchte nun umstellen auf eine Konfigurationsdatei zum Script.
Hier mal zur Veranschaulichung ein Beispiel für eine Ordner-/Dateistruktur auf dem USB-Stick:
./portableapps <= Verzeichnis, immer da, soll gesichert werden ./Desktopwiki <= Verzeichnis, immer da, soll gesichert werden ./Desktopwiki/cache <= Verzeichnis, immer da, soll NICHT gesichert werden ./Bilder <= Verzeichnis, nicht immer da, soll ggf. gesichert werden ./Bilder/Urlaub <= Verzeichnis, zufällig da, soll gesichert werden ./Dokumente <= Verzeichnis, nicht immer da, soll ggf. gesichert werden ./temp <= Verzeichnis, nicht immer da, soll NICHT gesichert werden ./text.txt <= unsortierte Datei, nicht immer da, soll gesichert werden ./ebook.pdf <= unsortierte Datei, nicht immer da, soll gesichert werden
Charakterisieren könnte man das wie folgt:
Mischung aus Dateien und Verzeichnissen, nennen wir sie "Objekte"
Objekte sind entweder:
bekannt, standardmäßig vorhanden ⇒ Sicherung an vorbestimmten Ort
bekannt und vorhanden ⇒ Sicherung an vorbestimmten Ort oder auch nicht
bekannt und nicht vorhanden ⇒ tu nix
unbekannt ⇒ Sicherung an vorbestimmten Ort
Sowohl auf die bekannten, wie auch auf die unbekannten Daten müsste man also einzeln eingehen. Ich stelle mir eine Konfigurationsdatei folgendermaßen vor:
i portableapps /home/user/backup/portableapps 5 i Desktopwiki /home/user/backup/Desktopwiki 60 e Desktopwiki/cache i Bilder /home/user/Bilder 10 i Dokumente /home/user/Dokumente 10 e temp
"Zu lesen" wäre das vom Script spaltenweise:
i/e: include oder exclude
Quelle
wenn "i": Ziel
wenn "i": Anzahl der zu behaltenden Backups
Arbeiten möchte ich mit rdiff-backup, da habe ich ein bisschen Erfahrung. Das Script soll ein Shell-Script sein, eigene Erfahrungen habe ich sonst nur mit Assembler (nicht der Rede wert), Pascal/Delphi (konnte ich mal ganz gut), C (ein bisschen), HTML... neue Sprachen (perl, ruby, keine Ahnung, was es noch so gibt) möchte ich eigentlich nicht lernen. Außerdem spricht für ein Shell-Script, dass das auch mit einem Minimalsystem (also im Notfall, wenn man eben ein Backup wirklich braucht) funktioniert.
Die Funktionsweise des Scriptes, wie ich es mir vorstelle:
Lies eine Zeile.
Wenn 1. Spalte = "i", dann
Parameter ermitteln
include-String = 2. Spalte
exclude-String = Summe aller 2. Spalten der Konfigurationsdatei außer der gerade bearbeiteten
ziel-String = 3. Spalte
Vorhalteparameter = 4. Spalte
Backup-Befehl zusammensetzen: "rdiff-backup %include-String %exclude-string %ziel-string %vorhalteparameter
Backup-Befehl ausführen und Log-Datei schreiben
wenn 1. Spalte = "e", dann tu nix
Wiederhole die Schleife, bis alle Zeilen der Konfigurationsdatei abgearbeitet sind
Zum Schluss noch den "unbekannten Rest" sichern:
Parameter ermitteln
include-String = *
exclude-String = Summe aller 2. Spalten der Konfigurationsdatei
ziel-String = Ziel-Ordner für den Rest (hart kodiert)
Vorhalteparameter = Fixwert (hart kodiert)
Backup-Befehl zusammensetzen: "rdiff-backup %include-String %exclude-string %ziel-string %vorhalteparameter
Backup-Befehl ausführen und Log-Datei schreiben
So. Ich denke, damit müsste ich eigentlich alles abgedeckt haben. Was ich nicht sichern will, wird ausgeschlossen (auch beim "Reste sichern"), was ich sichern will wird differenziert nach Zielorten und Vorhaltezeit abgelegt. Um den Rest wird sich auch gekümmert. Bis hierhin finde ich das ganz gut, habe ich was vergessen?
Nun das Problem: Wie verarbeite ich so eine Konfigurationsdatei in einem Shell-Script? In einer Hochsprache (Pascal, ...) würde ich ein Array (4 Spalten, x Zeilen) vollschreiben und das sinnvoll durchlaufen. Zweidimensionale Arrays und Bash sind ein Graus. Ich habe mal angefangen da zu recherchieren, aber das ist dann auch der Punkt, an dem ich meine Ambitionen immer abbreche. Zweidimensionale Arrays in einem Shell-Script zu verarbeiten ist ein ewiger Krampf und wenn ich so recht drüber nachdenke: Selbstzweck? Die Konfiguratiosdatei IST ja eigentlich schon das Array! Nur... wie durchlaufe ich die? Mit sed/awk? Da brauche ich Hilfe. Das ist zwar gutes Werkzeug, aber für mich recht kompliziert zu bedienen. Und: Wie gehe ich mit Leerzeichen, Sonderzeichen etc. um? Was nutze ich als Feldtrenner... Tabulator (ggf. mehrere!) wäre mir am liebsten, alles andere (bspw. Leerzeichen) könnte ja u.U. in den Daten vorkommen, davor ist man nie gefeit...
Über eine Hilfestellung, insbesondere zum Verarbeiten/Auseinandernehmen der Konfigurationsdatei würde ich mich sehr freuen.
Ciao
Wolle
P.S.: Die Backup-Scripte im Wiki habe ich studiert. Ist aber nicht das, was ich machen möchte. Grafische Programme oder überhaupt komplexere Programme sind nicht so meins, ich möchte das Ganze gerne selbst in der Hand haben, kontrollieren können und das auch im Notfall (Datenträgerausfall, ggf. kein vollständiges System mehr verfügbar) - sonst isses witzlos.