Perl-Skript für überwachte Backups mit Hilfe von rsync
Das folgende Perl-Skript holt sich Verzeichnisse via rsync über SSH von einen entfernten Linux-Rechner und sichert diese lokal. Konfigurieren lässt sich dabei der Remote-Host und die zu sichernden Verzeichnisse sowie die Benachrichtigung via E-Maill. Das Skript lässt sich per Cronjob aufrufen und sendet nur im Falle eines Fehlers ein E-Mail.
Dateien von einem Remote-System sichern
#!/usr/bin/perl
#
# config
#
$remotehost = "192.168.0.1";
$remoteport = "22";
$remoteuser = "username";
$subject = "Backup: rsync error";
$mailfrom = "backup\@domain.com";
$mailto = "admin\@domain.com";
$tmp_file = "/tmp/backup.txt";
# remotepath => localpath
%rsync = (
'/etc/' => '/mnt/backup/etc/',
'/mnt/data/' => '/mnt/backup/data/'
);
$rsync_args = '-avze';
$rsync_options = '--delete --hard-links --human-readable';
#
# script
#
use FileHandle;
use POSIX qw/strftime/;
while( ($remotepath, $localpath) = each(%rsync) ){
$starttime = strftime('%T (%d.%m.%Y)', localtime);
@check = system('rsync ' . $rsync_args . ' "ssh -p ' . $remoteport . ' -l ' . $remoteuser . ' -o ServerAliveInterval=5" ' . $rsync_options . ' ' . $remotehost . ':' . $remotepath . ' ' . $localpath . ' >> ' . $tmp_file . ' 2>&1');
if($? != 0) {
push(@warn, "$remotepath => $localpath");
$endtime = strftime('%T (%d.%m.%Y)', localtime);
push(@warn, " $starttime - $endtime\n");
system('echo ------------------------ >> ' . $tmp_file);
}
}
if(@warn){
$mail = new FileHandle;
$mail->open("| /usr/sbin/sendmail -t") || die "Cannot open: $!";
$mail->print("From: $mailfrom\n");
$mail->print("To: $mailto\n");
$mail->print("Subject: $subject\n\n");
foreach (@warn) {
$mail->print($_, "\n");
}
$mail->print("\n\n------------------------\n\n");
open(HANDLE, $tmp_file);
while (<HANDLE>){
$mail->print($_, "\n");
}
close(HANDLE);
$mail->close();
}
system('rm ' . $tmp_file);
Dateien vom lokalen Rechner wegsichern
Sollten Sie den umgekehrten Fall benötigen, dass Sie lokale Verzeichnisse via SSH auf einen entfernten Rechner sichern müssen, dann bietet sich folgende Abwandlung des oberen Skriptes an.
#!/usr/bin/perl
#
# config
#
$remotehost = "192.168.0.1";
$remoteport = "22";
$remoteuser = "username";
$subject = "Backup: rsync error";
$mailfrom = "backup\@domain.com";
$mailto = "admin\@domain.com";
$tmp_file = "/tmp/backup.txt";
# localpath => remotepath
%rsync = (
'/etc/' => '/mnt/backup/etc/',
'/mnt/data/' => '/mnt/backup/data/'
);
$rsync_args = '-avze';
$rsync_options = '--delete --hard-links --human-readable';
#
# script
#
use FileHandle;
use POSIX qw/strftime/;
while( ($localpath, $remotepath) = each(%rsync) ){
$starttime = strftime('%T (%d.%m.%Y)', localtime);
@check = system('rsync ' . $rsync_args . ' "ssh -p ' . $remoteport . ' -l ' . $remoteuser . ' -o ServerAliveInterval=5" ' . $rsync_options . ' ' . $localpath . ' ' . $remotehost . ':' . $remotepath . ' >> ' . $tmp_file . ' 2>&1');
if($? != 0) {
push(@warn, "$localpath => $remotepath");
$endtime = strftime('%T (%d.%m.%Y)', localtime);
push(@warn, " $starttime - $endtime\n");
system('echo ------------------------ >> ' . $tmp_file);
}
}
if(@warn){
$mail = new FileHandle;
$mail->open("| /usr/sbin/sendmail -t") || die "Cannot open: $!";
$mail->print("From: $mailfrom\n");
$mail->print("To: $mailto\n");
$mail->print("Subject: $subject\n\n");
foreach (@warn) {
$mail->print($_, "\n");
}
$mail->print("\n\n------------------------\n\n");
open(HANDLE, $tmp_file);
while (<HANDLE>){
$mail->print($_, "\n");
}
close(HANDLE);
$mail->close();
}
system('rm ' . $tmp_file);
Dateien/Ordner aus der Synchronisierung ausnehmen
Um Dateien oder Ordner aus der Synchronisierung auszunehmen müssen Sie zunächst eine Text-Datei mit den Ausnahmen (eine Ausnahme pro Zeile) erstellen. Die Ausnahme-Regel besteht dabei aus dem lokalen Pfad zur Datei bzw. zum Ordner. Für Mehrfachausnahmen wird der Wildcard-Operator unterstützt.
Das folgenden Beispiel wird den Inhalt des Ordners download, den Ordner test bzw. die Datei resolv.conf bei der Synchronisierung ausnehmen.
srv/www/htdocs/download/*
mnt/data/test
etc/resolv.conf
Damit unsere Ausnahmen auch berücksichtigt werden müssen Sie in den obigen Skripten die Zeile mit den rsync-Options wie folgt abändern. Vergessen Sie nicht den Pfad zu Ihrer Ausnahmedatei entsprechend anzupassen.
$rsync_options = '--delete --hard-links --human-readable --exclude-from "/my/path/backup_exclude.txt"';
system() ist crap, kein Perl.
http://search.cpan.org/search?query=rsync&mode=all