#!/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; }