Ich verwende schon seit einigen Jahren verschiedene Scripte für das tägliche Backup von Verzeichnissen, Datenbanken und eines LDAP-Servers. Die Scripte sind für sich recht einfach gehalten, enthalten aber doch recht viel redundanten Code und sind nicht immer einfach an neue Gegebenheiten anzupassen. Da mir vor kurzem der Server, auf dem dieses Wiki läuft, mit einem Dateisystemfehler crashte, hatte ich endlich auch mal einen Grund, dieses Backup„gefummel“ aufzuräumen. Die meisten Scripte waren schon in Perl geschrieben, wenn sie auch meist noch nicht auf die Perlmodule selbst zurückgriffen. Mir kam bei der Neukonzeption der Gedanke, das ganze Backupsystem modular aufzubauen, d.h. alle Funktionen in Modulen auszulagern. Da ich erst vor einiger Zeit ein paar (nicht frei verfügbare) Module geschrieben hatte, war die Umsetzung recht schnell erledigt. Die meiste Zeit ging dabei mit der Einbindung von Net::SFTP drauf, das ich allerdings zu Gunsten von Net::SFTP::Foreign aufgegeben habe.
Das komplette Archiv ist unter ftp://singollo.de/pub/perl-archive-0.1.16a.tar.gz zu finden. Es steht auch ein svn-Repository zur Verfügung. Eine Mitarbeit ist gewünscht (Mail an webmaster (at) singollo.de).
Im Repo singollo.de (siehe auch den folgenden Abschnitt im Artikel „Repository erstellen“) verschiedene Versionen zu finden.
Es ist lizenzfrei nutzbar. Über Rückmeldungen und Hilfe bei der Weiterentwicklung würde ich mich freuen.
Das Script backup.pl ist ein Beispiel zur Implementation des Backupsystems und bindet alle weiteren Module auf Grundlage der Konfiguration ein. Das Script unterstützt als User root die Angabe einer abweichenden Konfigurationsdatei (-c foo.bar) als die zentrale /etc/archive/backup.conf. Ruft ein User das Script auf, so kann entweder der Administrator eine /etc/archive/backup_USER.conf vorgeben oder das Script sucht nach der im HOME-Verzeichnis unter .archive/backup.conf abgelegten Konfiguration. Die Konfigurationsdateien sollten nur für den jeweiligen User lesbar sein, da sie Passwörter im Klartext beinhaltet. Die Zugriffsrechte auf die Sicherungsdateien werden mit chmod 0400 auf den aufrufenden User beschränkt, das Sicherungsverzeichnis wird mit 0700 erzeugt.
Der User root hat zusätzlich die Möglichkeit einzelne oder mehrere Module zum Testen auszuwählen, um eventuelle Konfigurationsprobleme oder Fehler im Script zu finden. In der Konfigurationsdatei müssen die entsprechenden Daten eingetragen und das aufgerufene Modul auch freigeschaltet sein.
Das Archiv bitte nach /etc/archive entpacken. Für die Ausführung mittels cron liegt dem Archive ein kurzes Script bei. Es kann entweder nach /etc/cron.daily kopiert oder in die eigene crontab integriert werden.
Der Abschnitt „System“ enthält globale Variablen, die für alle Module verwendbar sind. Die Module selbst dürfen nur ihre eigenen Variablen (modulname_*) verwenden. Alle Module werden mit *_enable=1 eingeschaltet, andere Werte schalten die Module ab.
Das Basismodul Base.pm stellt alle zentralen Funktionen der weiteren Module zur Verfügung.
Gibt die Startzeile aus, wobei $Archive::Base::Service die Beschreibung des Services enthält.
Wie PrintStart(), gibt jedoch die Endzeile aus.
Erstellt ein Logfile, abhängig von $Archive::Base::CONF{„log“}.
Liest die angebene Konfigurationsdatei. Die Konfigurationsdaten werden im Hash $Archive::Base::CONF gespeichert. Die Keys dieses Hashes entsprechen den Variablen in der Datei. Modulspezifische Variablen werden mit dem Modulnamen in Kleinschrift und Unterstrich vorangestellt bezeichnet (z.B. mysql_host).
Erstellt das lokale Backupverzeichnis nach dem Muster JJJJMMTT.
Löscht alle Backups älter als $Archive::Base::CONF{'lifetime'} Tage. $Archive::Base::CONF{'lifetime'}=0 schaltet dies ab.
Komprimiert ein File mit xz, bzip2 oder gzip.
Verschlüsselt und signiert das Backupfile mit GPG.
Ändert die Rechte (chmod) aller Dateien im Zielverzeichnis auf 0400.
Hilfsfunktion für CleanUp(). Sollte nicht ausserhalb von CleanUp() aufgerufen werden.
Die in $Archive::Base::CONF{'dir_source'} mit Komma getrennten Verzeichnisse werden mit afio (Default) oder cpio (Fallback) gesichert. Die Slashes des Verzeichnisnamens werden durch Unterstrich ersetzt. Dieser so geänderte Verzeichnisname wird als Dateinamen verwendet. Es wird für jede Sicherung mit afio ein Logfile erstellt. Die Backups werden automatisch gepackt. Eine Verwendung von PackFile() aus Base.pm ist nicht möglich.
Alle mit dem in der Konfiguration hinterlegten Account werden mittels mysqldump gesichert und anschliessend komprimiert.
Dieses Modul sichert das LDAP-Verzeichnis als LDIF-File. Es werden alle lesbaren Datensätze des angegebenen Accounts gesichert. Als Filter ist objectClass=* fest vorgegeben. Sollte hier eine andere Filterung erforderlich werden, kann das Modul passend erweitert werden (z.B. Variable ldap_filter).
Es gibt leider keine allgemein gültige Möglichkeit den cyrus-imapd zu sichern. Ich habe im Netz ein Beispiel gefunden und es auf openSUSE portiert.
Entsprechend backup() sollte diese Funktion ein Zurückspielen der Daten ermöglichen. Ist allerdings ungetestet.
Dovecot 2.x bietet Möglichkeiten an, an die Speicherorte der Mails zu kommen. Zuerst wird eine Liste aller User geholt, dann für jeden einzelnen das zugehörige maildir. Da ich zur Authentifizierung eine MySQL-Datenbank nutze, kann ich die Variante mit den Variablen mail_location und location nicht austesten. Soweit ich die Anleitung verstanden habe, sollte es allerdings auch damit klappen.
Ein einfaches Entpacken der erstellten tar.gz-Archive sollte ausreichen.
Löscht Dateien, die älter der Vorhaltezeitraum ist.
Das FTP-Modul unterstützt FTP und SFTP. Sollte das Modul Net::SFTP nicht geladen werden können, so wird auf FTP umgeschaltet. SFTP unterstützt ssh-Keys (siehe auch ssh_keygen.sh), aber auch das Login mittels Passwort. Letzteres dient als Fallback und sollte daher immer angeben werden.
Archive::Storage::FTP unterstützt wie alle weiteren Sicherungsmodule das Rotieren von Backups. „w“ steht für Wochentags (1-7), „d“ für täglich (JJJJMMTT) und alle weiteren Angaben übertragen die Daten direkt ins Zielverzeichnis.
Synchronisiert Quell- und Zielverzeichnis miteinander. Die Rotation der Daten ist nur mit der Option „d“ sinnvoll, da „w“ mit einem veralteten Stand synchronisiert. Die Option „w“ lohnt sich nur, wenn auf dem Zielserver das Verzeichnis zuvor gelöscht wird.
Es kopiertd ie Dateien ähnlich wie Archive::Storage::FTP auf einen Server.