1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
#!/usr/bin/perl # # Rolf Rost, 6.4.2002 # Download eines kompletten Webtrees via FTP # Alle Verzeichnisse und Dateien werden remote eingelesen und lokal # gespiegelt # ########### Benutzervorgaben ############################################## # Lokales Downloadverzeichnis, no trailing Slash (am Ende kein Slash) $ldir = "/tmp"; # Endungen der Files fuer ascii-mode (mit Punkt und mit "|" getrennt) # einfache Hochkomma $asc = '.htm|.html|.css|.pl|.cgi|.txt|.htaccess|.log|.ini'; # Benutzername, Passwort und Hostname (oder IP-Nummer) für den FTP Zugang $ftp_id = "***"; # Benutzername $ftp_pw = "***"; # Passwort $ftp_host = "i-netlab.de"; # FTP HostName (IP oder Name) ################## Ende der Benutzervorgaben ############################## use File::Basename; use File::Path; use Net::FTP; $|=1; # Verbindung zum FTP Host herstellen und einloggen $ftp = Net::FTP->new($ftp_host) or die "Keine Verbindung\n"; $ftp->login($ftp_id, $ftp_pw) or die "Anmeldung fehlgeschlagen\n"; # Remote Files auf eine Liste lesen ab einem best. Verzeichnis @rfiles = (); traverse("/htdocs"); # Remote Files downloaden, dazu ggf. Verzeichnisse lokal anlegen &download; exit; ################### Subfunctions ########################################## # anhand der RemoteFile Liste FTP Donwload sub download{ foreach my $rfile(@rfiles){ # den oder die slashes am Anfang entfernen $rfile =~ s/^\/+//; #print "$rfile\n"; my ($name, $path) = fileparse($rfile); # lokal chdir oder mkdir + chdir $xdir = "$ldir/$path"; chdir $xdir or mkpath($xdir); chdir $xdir; print "FTP $name -> $ldir/$path$name\n"; # und nun das Download via FTP # Uebertragungsmode if( $name =~ /$asc$/ ){ $ftp->ascii } else{ $ftp->binary } $ftp->cwd("/$path"); $ftp->get($name); } $ftp->quit(); } # Remote via FTP den Tree traversieren und Files einlesen sub traverse { my $dir = shift; unless (rdir($dir)) { warn "Can't read $dir via FTP\n"; return; } for (rdir($dir)) { @line = split /\s+/,$_; # $line[0] $line[8] next if /^\./; if ( /^d/ and !/^l/ ) { #print "$dir/$line[8]\n"; traverse("$dir/$line[8]"); } else { #print "$dir/$line[8]\n"; push @rfiles, "$dir/$line[8]"; } } } # RemoteDir einlesen und array zurueckgeben sub rdir{ my $dir = shift; $ftp->cwd($dir); $rdir = $ftp->dir(); return @$rdir; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
sub traverse { my $dir = shift; for (rdir($dir)) { foreach my $entry (parse_dir($_)) { my ($name, $type, $size, $mtime, $mode) = @$entry; if( $type eq 'f' ) { my $time_string = strftime "%Y-%m-%d %H:%M:%S", gmtime($mtime); #print "File $name has an mtime of $time_string\n"; print "."; push @rfiles, $mtime." ".$dir."\/".$name." ".$time_string; #print $mtime; #print $ftp->mdtm($dir."\/".$name); } else { print $dir."\/".$name."\n"; #traverse($dir."\/".$name); } } } }
strftime "%Y-%m-%d %H:%M:%S", gmtime($mtime);
1
2
3
4
5
6
7
8
9
10
11
impressum.html
perl: 2011-01-06 23:00:00
filezilla: 2011-01-07 16:25:05
index.html
perl: 2011-02-10 23:00:00
filezilla: 2011-01-11 15:27:53
leistungen.html
perl: 2011-01-04 23:00:00
filezilla: 2011-01-04 21:25:32