pFTP script
#!perl
## Version 2.0.1
## Laurence R. Taylor taylor.2@nd.edu www.nd.edu/~taylor
## Copyright (C) 2000
## Freely distributed under the standard GNU Copyleft agreement
use strict;
use Net::FTP;
if($#ARGV<0) {
print"Drop some files/folders on this Droplet to use!\n";
exit(0);
}
my(@MAC_paths)=('LRT web mirror:','Outputs:');
my(@server_paths)=('~/www/','/afs/nd.edu/user8/sciwww/ht-docs/math/');
my(@ip_index)=('0','0');
my(@ip_numbers)=('129.74.250.114');
my(@login_names);
my(@passwords);
my($tt,@passwd,$yy,$zz,$ii,$last_server_dir);
my(@files,@short_files,@FTP,@ips,$ftp);
## Fill in login names and passwords
get_file_list(\@files,\@ARGV);
setup_file_arrays(\@files,\@FTP,\@short_files,\@ips);
$zz=0;
while($zz<=$#files) { ## loop through the servers
## open a connection to the correct server
$ftp = Net::FTP->new($ip_numbers[$zz]) or die($!);
$ftp->login($login_names[$zz],$passwords[$zz]) or die($!);
$last_server_dir="";
for($yy=0;$yy<=$#files;$yy++) {
if($ips[$yy]==$zz) { ## send file to this server if we should
for($ii=0;$ii<=$#files;$ii++){
ftp_file($short_files[$ii],\$last_server_dir,$FTP[$ii],$files[$ii]);
}
}
}
$ftp->quit(); ## shut down this connection
$zz++;
}
print"DONE.\n";
exit();
sub ftp_file{
my($short_file,$last_server_dir,$ftp_dir,$file)=@_;
my($xx);
print"Sending ",$short_file;
if($$last_server_dir ne $ftp_dir) { ## cd to new dir if necessary
if( $ftp->cwd($ftp_dir) ) {
$$last_server_dir=$ftp_dir;
}
else{
print"Failed to change directories into \"";
print$ftp_dir."\". File \"",$short_file;
print"\" will not be FTP'ed.\n";
print"This usually means that your mirror and ftp site";
print" are out of sync.";
next;
}
}
## figure out binary or ascii
undef($xx);
if($file=~/.html/) {
$xx=$ftp->ascii();print" as ASCII.\n";
}
else {
$xx=$ftp->binary();print" as binary.\n";
}
if(undef($xx)) {print"type died.\n";exit(1);}
## put the file
$ftp->put($file) or die($!);
}
sub setup_file_arrays{
my($files,$ftp_dirs,$short_files,$ips)=@_;
my($ii,$kk,$rr);
for($ii=0;$ii<=$#$files;$ii++){ # Get real paths to files
for($kk=0;$kk<=$#MAC_paths;$kk++){
$rr=rindex($$files[$ii],$MAC_paths[$kk]);
if($rr>0) {last;}
}
if($rr<0) {
print"File \"",$$files[$ii],"\" is not in a known mirror.\n";
print"The whole FTP is cancelled.\n";exit(1);
}
$rr+=length($MAC_paths[$kk]);
$$short_files[$ii]=substr($ARGV[$ii],$rr);
$$ftp_dirs[$ii]=$server_paths[$kk].$$short_files[$ii];
$$ftp_dirs[$ii]=~s/:/\//g;
$rr=rindex($$ftp_dirs[$ii],"/");
$$ftp_dirs[$ii]=substr($$ftp_dirs[$ii],0,$rr+1);
$$ips[$ii]=$ip_index[$kk];
}
}
sub get_file_list{
my($files,$argv)=@_;
my($ii,$jj,$kk,$dir);$jj=$#$files;
for($ii=0;$ii<=$#$argv;$ii++){ # Get real paths to files
if( -l $$argv[$ii] ) {
$$files[++$jj]=readlink($$argv[$ii]);
}
else{$$files[++$jj]=$$argv[$ii];}
if( -d $$files[$jj]) {
$dir=pop(@$files);
opendir(DIR,$dir) or die($!);
my(@new_files)=readdir(DIR);
closedir(DIR);
for($kk=0;$kk<=$#new_files;$kk++) {
$new_files[$kk]=$dir.":".$new_files[$kk];
}
get_file_list($files,\@new_files);
$jj=$#$files;
}
}
}