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 = ×tamp(); 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.
