on Wed, 01 May 2002 19:24:47 GMT, [EMAIL PROTECTED]
(Sterling Price) wrote: 

> I have a situation where I'm performing an FTP to transfer some
> files to a less-than-reliable site.  I have my FTP code inside an
> eval block so that the program can die and send a message to a
> pager if the FTP fails (code snippet shown below message). This
> works just fine, except that I am getting a lot of unnecessary
> messages to the pager because the site will sometimes not accept a
> connection, but then a few minutes later will be OK.  So, instead
> of doing a die to send a page on the first attempt, I'd like to
> set it up so that the connection would be attempted a total of 3
> times before failing and sending a page, pausing a few minutes
> (say 5 minutes) between attempts.  I can't quite wrap my mind
> around how to accomplish that though. I know I can use the sleep
> function to do the pause, but how should I restructure the eval
> block(s)? 

You can do your own error handling, without using 'die' or 'eval' 
which are, well, kinda permanent.

The following (untested) rudimentary code is how I would do this:

#! perl -w
use strict;

use Net::FTP;

use constant MAXATTEMPTS => 3;
use constant TIMETOWAIT  => 5*60; # 5 minutes
my $server = '';
my $user = '';
my $password = '';
my $directory = '';
my @files = qw (a b c);

my $attempt = 0;
my $ferrcount = 0;
my $ftp;
my $log = '';

ATTEMPT:
while (++$attempt <= MAXATTEMPTS) {

        # Try to get in...
        unless ( $ftp = Net::FTP->new($server)    and
                 $ftp->login($user, $password)    and
                 $ftp->cwd($directory)            and
                 $ftp->binary()                       ) {
                $log .= logerr("Attempt $attempt to get in failed");
                next ATTEMPT;
        }
        
        # OK, we are in, try to transfer files
        $ferrcount = 0;
        foreach my $file (@files) {
                $ferrcount++ unless $ftp->put($file);
        }
        
        $ftp->quit();
        
        last unless $ferrcount; # No problems encountered
        $log .= logerr("$ferrcount files not transfered");
                
} continue {
        $ftp->quit() if $ftp;
        sleep( TIMETOWAIT ); 
}

if ($ferrcount or $attempt > MAXATTEMPTS) { # Something went wrong
        print $log; # Here you would page
}

sub logerr {
        my $msg = shift;
        return scalar localtime() . " - $msg\n";
}

-- 
felix


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to