#!/usr/bin/perl -w use strict; use Net::FTP; use IO::File; use Getopt::Long; use Cwd; sub Do_glob; sub Do_upload; GetOptions( "host=s" => \$main::host, "h=s" => \$main::host, "user=s" => \$main::user, "u=s" => \$main::user, "local=s" => \$main::localdir, "l=s" => \$main::localdir, "remote=s" => \$main::remotdir, "r=s" => \$main::remotdir ); unless($main::host && $main::user && $main::localdir && $main::remotdir) { die $0." [--host|-h] ". "[--user|-u] \n". "[--local|-l] ". "[--remote|-r] \n"; } umask 022; system "stty -echo"; print "Password required for $main::user at $main::host: "; chop($main::pass = ); print "\n"; system "stty echo"; $main::statfile = $main::localdir.'/.stat'; @main::statdat = stat $main::statfile; $main::mtime = $main::statdat[9]; @main::filelist = (); @main::filerem = (); @main::failed = (); @main::dirs = (); Do_glob($main::localdir); $main::ftp = Net::FTP->new($main::host); $main::ftp->login("$main::user","$main::pass"); if($main::ftp->ok()) { Do_upload(); } else { die "$main::host returned ". $main::ftp->code()." ".$main::ftp->message(); } $main::ftp->quit; $main::fh = new IO::File ">$main::statfile"; if(defined $main::fh) { print $main::fh "@main::filelist\n@main::filerem\n"; $main::fh->close; } else { warn "Cannot open $main::statfile. $!\n"; } if (defined scalar @main::failed) { $main::now = time; utime $main::now, $main::now, @main::failed; } exit; sub Do_upload { my ($i); unless(defined scalar @main::filelist) { print "No files to update\n"; $main::ftp->close; exit; } print "Starting upload.... ".(scalar @main::filelist)." files\n"; $main::ftp->binary; if(@main::dirs) { @main::dirs = reverse @main::dirs; foreach $i (@main::dirs) { $main::ftp->mkdir($i); unless(($main::ftp->ok())|| ($main::ftp->message()=~/File exists/)) { warn "$main::host returned ". $main::ftp->code()." ".$main::ftp->message(). "for mkdir $i\n"; } } } for($i=0;$i< scalar @main::filelist;$i++) { $main::ftp->put("$main::filelist[$i]","$main::filerem[$i]"); unless($main::ftp->ok()) { warn "$main::host returned ". $main::ftp->code()." ".$main::ftp->message(). "for put $main::filelist[$i]\n"; unshift @main::failed, $main::filelist[$i]; } } } sub Do_glob { my $directory = shift; my ($i,@stat,$mtime); chdir $directory; foreach $i (glob '*') { if (-d $i) { @stat = stat $i; $mtime = $stat[10]; if((! defined $main::mtime)|| ($mtime >= $main::mtime)) { unshift @main::dirs, cwd().'/'.$i; $main::dirs[0] =~ s/$main::localdir/$main::remotdir/; } Do_glob($i); } elsif (-r $i) { @stat = stat $i; $mtime = $stat[9]; if ((! defined $main::mtime)||($mtime >= $main::mtime)) { unshift @main::filelist, cwd().'/'.$i; unshift @main::filerem, cwd().'/'.$i; $main::filerem[0] =~ s/$main::localdir/$main::remotdir/; } } } chdir '..'; }