#!/usr/local/bin/perl -w # Copyright 2000 Williams Interactive, Inc. # Programmer: Khurt Williams, 2000.10.18 # command switches are # [-netrc] : uses .netrc file to find user/passwd for the destination +server # [-u user] : specify the user id # [-p passwd] :specify the passwd for user id # -m server : server ip or name # -s source_dir : source dir # -t target_dir : target dir # [-log_dir /path/to/log] : location of log file use strict; use Getopt::Long; use Net::FTP; use Net::Netrc; use Log::ErrLogger; my ($log_file,@file_list,$file,$return_code); my ($netrc,$server,$source,$target,$user,$passwd,$log_dir,$ftp); my ($machine,$login,$password); my $options = { netrc => \$netrc, m => \$server, s => \$source, t => \ +$target, u => \$user, p => \$passwd, log_dir => \$log_dir }; GetOptions($options, "netrc","m=s","s=s","t=s","u:s","p:s","log_dir:s" +); @file_list = @ARGV; #make sure we have some filename usage() if( !defined(@file_list) ); #use netrc if( $netrc ) { #exit if not server specified usage () if( !defined($server) ); #make sure we use the correct userid if( !defined($user) ) { $machine = Net::Netrc->lookup($server); } else { $machine = Net::Netrc->lookup($server,$user); } #get login id and password for that server $login = $machine->login(); $password = $machine->password(); $user = $login; $passwd = $password; } #check that command line switches are set usage() if( !defined($user) || !defined($passwd) || !defined($server) +); usage() if( !defined($source) || !defined($target) ); #append to log file if it already exist $log_dir = "/tmp" if( !defined($log_dir) ); #log all event to file including die and warn $log_file = new Log::ErrLogger::File( FILE => ">$log_dir/SendToML.log" +,SENSITVITY => Log::ErrLogger::ALL ); #connect to server $ftp = new Net::FTP($server); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,__FILE__." ftp + started.\n"); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"ftp $server\n +"); #exit and log message on failure die($ftp->message()) if( !($ftp->login($user,$passwd)) ); #set mode to binary Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"bin\n"); #exit and log message on failure die($ftp->message()) if( !($ftp->binary()) ); #change local directory chdir($source); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"lcd $source\n +"); #change remote directory Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"cd $target\n" +); #exit and log message on failure die($ftp->message()) if( !($ftp->cwd($target)) ); foreach $file (@file_list) { #send files to server Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"put $file $f +ile\n"); retry_put($file) if( !($ftp->put($file,$file)) ); } #close connection $return_code = $ftp->quit(); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"quit\n"); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,__FILE__." ftp + ended.\n"); #end logging $log_file->close(); exit(0); sub usage { die "$0 [-netrc] [-u user] [-p passwd] -m [server] -s [source_dir] - +t [target_dir] [-log_dir [/path/to/logs/file]] file1 file2 ...\n"; } #resend file if first attempt fails #remove file if second attemp also fails. sub retry_put { my ($file) = @_; warn($ftp->message()); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"Will attempt + to resend file %s.\n",$file); warn($ftp->message()) if( !($ftp->quit()) ); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"quit\n"); $ftp = new Net::FTP($server); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"ftp $server\ +n"); die($ftp->message()) if( !($ftp->login($user,$passwd)) ); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"cd $target\n +"); die($ftp->message()) if( !($ftp->cwd($target)) ); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"put $file $f +ile\n"); remove_file($file) if( !($ftp->put($file,$file)) ); } sub remove_file { my ($file) = @_; warn($ftp->message()); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"Resend of $f +ile failed.\n"); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"Will attempt + to remove half baked file $file.\n"); warn($ftp->message()) if( !($ftp->quit()) ); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"quit\n"); $ftp = new Net::FTP($server); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"ftp $server\ +n"); die($ftp->message()) if( !($ftp->login($user,$passwd)) ); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"cd $target\n +"); die($ftp->message()) if( !($ftp->cwd($target)) ); Log::ErrLogger::log_error(Log::ErrLogger::INFORMATIONAL,"delete $file +\n"); warn($ftp->message()) if( !($ftp->delete($file)) ); }

In reply to Perl FTP by Khürt

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.