prozedur    

Lab · männlich · registriert seit 2004 · vor 28 Tagen zuletzt online

b wie backup

Sonstiges · · 2 Kommentare

Einfaches Backupskript zum Sichern von Tagebüchern und Prüfungsarbeiten im odt-Format, Zugang zu einem vorzugsweise entfernten FTP-Server vorausgesetzt.
Werte für user, password, host, localdir und remotedir in den Zeilen 6-10 können der Bequemlichkeit halber fest eingetragen werden.


    1 #!/usr/bin/perl
    2 use warnings;
    3 use strict;
    4 use Net::FTP;
    5 
    6 my $user = shift;
    7 my $password = shift;
    8 my $host = shift;
    9 my $local_dir = shift;
   10 my $remote_dir = shift;
   11 
   12 my $timestamp = &timestamp();
   13 my $file_to_back_up = shift;
   14 
   15 my $timestamp_file = $local_dir.'timestamps.txt';
   16 my $timestamp_filehandle;
   17 my %timestamp_of = parse_timestamp_file($timestamp_file);
   18 
   19 # Liefert einen String im Format YYYY.MM.DD zum Anhängen an den Namen der
   20 # entfernten Datei. Dadurch wird erreicht, dass man mehrere nach Datum
   21 # sortierte Dateiversionen hat.
   22 sub timestamp {
   23    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime();
   24    my $jahr=$year+1900;
   25    my $monat=$mon+1;
   26    my $tag=$mday;
   27    my $timestamp;
   28 
   29    if (length($monat) == 1) {
   30       $monat="0$monat";
   31    }
   32    if(length($tag) == 1)   {
   33       $tag="0$tag";
   34    }
   35    $timestamp=$jahr.'.'.$monat.'.'.$tag;
   36    return $timestamp;
   37 }
   38 
   39 # Einlesen und prüfen einer Datei, in der die Dateinamen und
   40 # epoch-timestamps der zuvor bereits gesicherten Dateien.
   41 # Routine gibt einen Hash mit Dateienamen und zugehörigen epoch-Werten
   42 # zurück.
   43 sub parse_timestamp_file {
   44     my $timestamp_file = shift;
   45     my %timestamp_of;
   46     
   47     open($timestamp_filehandle, $timestamp_file) or die $!;
   48     while (<$timestamp_filehandle>) {
   49         chomp($_);
   50         my @records = split(/\s+/, $_);
   51         my $current_file = $records[0];
   52         my $current_timestamp = $records[1];
   53         if (not $current_file =~ /^[a-z_\.\d\-]+\.odt$/
   54             or not $current_timestamp =~ /^[\d]+$/) {
   55             
   56             
   57             warn "timestamp file '$timestamp_file' invalid or not existent
   58             
   59             
   60             ";
   61             return;
   62         }
   63         else {
   64             $timestamp_of{$current_file} = $current_timestamp;
   65         }
   66         
   67     }
   68     close($timestamp_filehandle);
   69     return %timestamp_of;
   70 }
   71 
   72 # main-Routine.
   73 sub main {
   74 
   75     # Einlesen des zu sichernden Verzeichnisses.
   76     opendir(DIR,"$local_dir");
   77     my @entries = readdir(DIR) or die $!;
   78     closedir(DIR);
   79     
   80     # Aufbauen der FTP-Verbindung.
   81     my $ftp = Net::FTP->new($host,
   82                             Timeout => 360,
   83                             Port    => 21,
   84                             Debug   => 1,
   85                             Hash    => 0
   86                            ) or die "Can't initialize new FTP instance $!";
   87     $ftp->login($user, $password) or die "Can't login $!";
   88     $ftp->cwd($remote_dir) or die "Can't change working directory 
   89               $remote_dir $!";
   90     $ftp->binary() or die "Failed to set binary mode\n";
   91     
   92     # Nachdem die Dateinamen/epoch-timestamps Datei eingelesen wurde, kann 
   93     sie
   94     # nun mit den aktuellen Werten überschrieben werden.
   95     open($timestamp_filehandle, ">$timestamp_file");
   96     
   97     foreach my $current_file (@entries) {
   98        if ($current_file =~ /odt$/) {
   99            
  100            # Im neunten Element des von stat zurückgegebenen Arrays steht
  101            # der last-changed epoch-timestamp.
  102            my @info = stat($local_dir.$current_file);
  103            my $timestamp_of_current_file = $info[9];
  104             
  105            if ($timestamp_of{$current_file}
  106                and $timestamp_of_current_file
  107                == $timestamp_of{$current_file}) {
  108                 print "
  109                 
  110                 Remote file $current_file is already up to date.\n\n";
  111             }
  112             else {
  113               my $remote_file = $current_file;
  114               $remote_file =~ s/\.odt$/$timestamp\.odt/;
  115               $ftp->put($local_dir.$current_file, $remote_file)
  116               or die "Can't put $current_file $!";
  117             }
  118               
  119           # Jetzt die timestamp_file aktualisieren.
  120           print $timestamp_filehandle
  121                 "$current_file $timestamp_of_current_file\n";
  122        }
  123     }
  124     close($timestamp_filehandle);
  125 
  126     $ftp->quit();
  127 }
  128 
  129 &main();
  130 
  131 __END__
  132 
  133 =head1 Beschreibung
  134 
  135 Einfaches Backupskript zum Sichern von Tagebüchern und Prüfungsarbeiten im
  136 odt-Format, Zugang zu einem vorzugsweise entfernten FTP-Server 
  137 vorausgesetzt.
  138 
  139 =head1 Diagnose
  140 
  141 Im Fall einer nicht vorhandenen oder ungültigen timestamps.txt gibt b eine
  142 Warnung aus. Fatale Fehler sind nicht vorgesehen.
  143 
  144 =head1 Lizenz
  145 
  146 Dieses Programm ist freie Software. Sie können es weitergeben und verändern 
  147 unter den gleichen Bedingungen wie Perl selbst.
Letzte Änderung: 17. April 2010 12:50

Tags:

2 Kommentare

sieht kompliziert aus


Ganz und gar nicht.

Blog durchsuchen

Willst du auch bloggen?
Kostenlos bloggen bei Spin.de
Diese Seite ist eine auf spin.de gelagerte persönliche Homepage, deren Verantwortlichkeit beim Nutzer liegt.
spin.de ist eine große Online-Community mit Chat, Blogs, Foren, Online-Spielen und vielem mehr.
Hol dir deine kostenlose Homepage von Spin.de

Impressum · Datenschutz · Sitemap