#!/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 $file\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 $file\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 $file 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)) ); }