Benutzer-Werkzeuge

Webseiten-Werkzeuge


Writing /srv/www/htdocs/udo/singollo.de/linux.singollo.de/public_html/data/cache/4/425b19579fb7e908345bc3a11ed4eb2e.metadata failed
scripts:backupsystem_mit_perl

Backupsystem mit Perl

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.

  • Mit der Version 0.1.0 habe ich die Namensräume der Module geändert. Neben dem Basismodul Archive::Base gibt es Archive::Backup für alle Backupmodule (Verzeichnisse, LDAP und MySQL) und Archiv::Storage für die Sicherungsmodule (FTP, rsync, scp). Seit Version 0.1.1 existiert auch ein Modul mit Backup sowie Restore für Cyrus-Imapd.
  • In Version 0.1.2 wurde ein kleine Unschönheit beseitigt: die LDAP-Konfiguration benötigt kein „_“ anstelle von „=“ mehr.
  • Version 0.1.3 bietet ein Modul für den IMAP-Server dovecot. Das Backup läuft während des Betriebes von dovecot, kann also unerwünschte Nebeneffekte verursachen. An einer Lösung wird gearbeitet.
  • ssh_keygen.sh ist in der Version 0.1.4 überarbeitet worden. Es erfordert die Angabe eines Accounts in der Form user@your.ftp.server und fordert bei Bedarf ein Passwort an. Es erstellt zusätzlich die erforderlichen Verzeichnisse backup und die Unterverzeichnisse 1-7.
  • In Version 0.1.5 wurde die Unterstützung von xz, bzip2 und gzip zur Komprimierung hinzugefügt.
  • Ein Update der Dokumentation und Erstellung einer README-Datei und einer Manpage erfolgte in der Version 0.1.6.
  • Mit der Version 0.1.8 ist das scp-Modul hinzugekommen. Daneben enthält diese Version jetzt auch eine Möglichkeit zum Loggen der Ausgaben.
  • Version 0.1.9 liegt nicht zum Download vor.
  • Die Version 0.1.10 enthält zwei Bugfixes in den Modulen backup.pl und Dovecot.pm. backup.pl hat das auf der Kommandozeile übergebene Konfigurationsfile nicht angenommen und Dovecot.pm wertet die Ausgabe von doveadm anders aus.
  • Version 0.1.11: Bugfix im Modul scp
  • Version 0.1.12: Bugfix im Modul Dovecot
  • Version 0.1.12a: Bugfix im Modul Dovecot
  • Version 0.1.13: Überarbeitung der Optionen von backup.pl
  • Version 0.1.14: Konfiguration in Datenbank, Überarbeitung der Optionen, bessere Usersteuerung, Apache-vHosts werden abgefragt
  • Version 0.1.15: Diverse Änderungen in den Modulen
  • Version 0,1.16: GPG-Verschlüsselung ermöglicht (bei Directory.pm nur volles Backup, kein inkrementelles!), Scripte nach scripts/ verschoben, man.sh erzeugt keine gzippte Manpages mehr
  • Version 0,1.16: Fehler beim Aufruf von EncryptFile() beseitigt

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.

Module

Basismodul

  • backup.pl
  • restore.pl
  • Base.pm

Backupmodule

  • Directory.pm
  • MySQL.pm
  • LDAP.pm
  • Cyrus.pm
  • Dovecot.pm

Sicherungsmodule

  • Directory.pm
  • FTP.pm
  • Rsync.pm
  • scp.pm

Script backup.pl

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.

Konfiguration backup.conf

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.

Module (System)

Modul Base.pm

Das Basismodul Base.pm stellt alle zentralen Funktionen der weiteren Module zur Verfügung.

Funktion: PrintStart()

Gibt die Startzeile aus, wobei $Archive::Base::Service die Beschreibung des Services enthält.

Funktion: PrintEnd()

Wie PrintStart(), gibt jedoch die Endzeile aus.

Funktion: PrintLog()

Erstellt ein Logfile, abhängig von $Archive::Base::CONF{„log“}.

Funktion: ReadConfig()

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).

Funktion: CreateBackup()

Erstellt das lokale Backupverzeichnis nach dem Muster JJJJMMTT.

Funktion: CleanUp()

Löscht alle Backups älter als $Archive::Base::CONF{'lifetime'} Tage. $Archive::Base::CONF{'lifetime'}=0 schaltet dies ab.

Funktion: PackFile()

Komprimiert ein File mit xz, bzip2 oder gzip.

Funktion: EncryptFile()

Verschlüsselt und signiert das Backupfile mit GPG.

Funktion: Chmod()

Ändert die Rechte (chmod) aller Dateien im Zielverzeichnis auf 0400.

Funktion: remove()

Hilfsfunktion für CleanUp(). Sollte nicht ausserhalb von CleanUp() aufgerufen werden.

Module (Backup)

Modul Directory.pm

Funktion: backup()

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.

Modul MySQL.pm

Funktion: backup()

Alle mit dem in der Konfiguration hinterlegten Account werden mittels mysqldump gesichert und anschliessend komprimiert.

Modul LDAP.pm

Funktion: backup()

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).

Modul Cyrus.pm

Funktion: backup()

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.

Funktion: restore()

Entsprechend backup() sollte diese Funktion ein Zurückspielen der Daten ermöglichen. Ist allerdings ungetestet.

Modul Dovecot.pm

Funktion: backup()

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.

Funktion: restore()

Ein einfaches Entpacken der erstellten tar.gz-Archive sollte ausreichen.

Module (Storage)

Modul Directory.pm

Funktion: cleanup()

Löscht Dateien, die älter der Vorhaltezeitraum ist.

Modul FTP.pm

Funktion: put()

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.

Modul Rsync.pm

Funktion: put()

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.

Modul scp.pm

Es kopiertd ie Dateien ähnlich wie Archive::Storage::FTP auf einen Server.

Misc

Troubleshooting

  • Version 0.1.3: Dovecot im laufenden Betrieb gesichert. Besser wäre es, wenn während der Sicherung der Server nicht läuft. An diesem Problem wird noch gearbeitet.

History

Version 0.1.16

  • GPG-Verschlüsselung ermöglicht (bei Directory.pm nur volles Backup, kein inkrementelles!).
  • Scripte nach scripts/ verschoben.
  • man.sh erzeugt keine gezippten Manpages mehr, erstellt zusätzlich ein README.

Version 0.1.15

  • Bug in Directory.pm behoben. Cleanup() in die Storage-Module verlagert.

Version 0.1.14

  • Konfiguration in Datenbank, Überarbeitung der Optionen, bessere Usersteuerung, Apache-vHosts werden abgefragt.

Version 0.1.13

  • Überarbeitung der Optionen bei backup.pl: -c config.cfg oder -m module1,module2,…

Version 0.1.12a

  • Bug in Dovecot.pm (alpha-Staus aufgehoben) behoben.

Version 0.1.12

  • Bug in Dovecot.pm behoben.

Version 0.1.11

  • Fehler in SCP-Modul: letzte Reste vom FTP-Modul entfernt.

Version 0.1.10

  • Dovecot.pm an die Ausgabe von doveadm angepasst. Fehlerhafte Variablenübergabe an backup.pl korrigiert.

Version 0.1.9

  • Ping() überprüft die Verfügbarkeit des Zielrechners in den Storage-Modulen.

Version 0.1.8

  • scp-Modul erstellt und PrintLog() hinzugefügt.

Version 0.1.7

  • Bugfixes

Version 0.1.6

  • Dokumentation von backup.pl aktualisiert und man-Page erstellt.

Version 0.1.5

  • PackFile() und Chmod() in Base-Modul eingebaut. PackFile unterstützt derzeit xz, bzip2 und gzip.

Version 0.1.4

  • ssh_keygen.sh überarbeitet

Version 0.1.3

  • Dovecot hinzugefügt

Version 0.1.2

  • Konfiguration geändert

Version 0.1.1

  • Cyrus-Imapd hinzugefügt, inklusive Restore (ist noch Beta)

Version 0.1.0

  • Namensräume geändert

MySQL.pm (Version 0.0.3, Build 20110521)

  • Variable $dump_file (Dateiname für Sicherungsdatei) um Server und Port erweitert und wird jetzt mittels sprintf() zusammengesetzt.

Base.pm (Version 0.0.3, Build 20110312)

  • Fehler in remove(): Der Zeitstempel für die Modifikation eines Files greift nicht beim Verzeichnis, da der Inhalt des Verzeichnisses ja zuvor gelöscht wird. Daher wurde auf den Zeitstempel für die Erstellung umgestellt und das Verzeichnis wird jetzt mittels remove_path() aus File::Path gelöscht.

ToDo

  • Aktualisierung der Scriptlets
  • Verschlüsselung der Passwörter
  • Konfigurationssoftware
  • Weitere Module wie dvdbackup, tape, postgresql u.a. erstellen
  • Archive::Backup::*::restore() zur Wiederherstellung von Daten hinzufügen
  • Archive::Backup::* erweitern, dass mehrere Server angegeben werden können
  • Archive::Base→ReadConfig mit den Optionen aus backup.pl erweitern
scripts/backupsystem_mit_perl.txt · Zuletzt geändert: 20.03.2016 17:37 von udo