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;
    }
  }
}