in reply to Re: net-sftp-foreign transfer failed vs file not present.
in thread net-sftp-foreign transfer failed vs file not present.

Hello

thank you for your input. I modified the script accordingly but still gives me this error: Uncaught exception from user code: Couldn't stat remote file: No such file at ./datalex.pl line 37. here is my script with the code adapted:
#!/usr/bin/perl -w use strict; use warnings; use Net::SFTP::Foreign; use POSIX qw(strftime); use diagnostics; use Net::SFTP::Foreign::Constants qw(:error :status); my $datestring =strftime "%d-%m-%Y", localtime; my $host="sftp.brusselsairlines.com"; my $username="dlex"; my $local="/mnt/datalex"; my $file="BookingReport_Daily_$datestring.xls"; #nagios integration. my $sftp = Net::SFTP::Foreign->new($host, user=> $username, stderr_dis +card => 1 ); $sftp->die_on_error("unable to establish SFTP Connection"); my $ok = 0; my $failed = 0; if ( -e "$local/$file"){ print "BH-ZONE-BATCHSRV-1\tfoster_report_transfer\t0\tFile \" +$file\" has already been Downloaded to ==> \"$local\"\n"; } else { unless ($sftp->get("$file", "$local/$file")) { if (($sftp->error == SFTP_ERR_REMOTE_STAT_FAILED or $sftp->error == SFTP_ERR_REMOTE_OPEN_FAILED) and $sftp->status == SSH2_FX_NO_SUCH_FILE) { print "Remote file does not exist!"; } else { print "Transfer Failed"; } die $sftp->error; } print "File \"$file\" downloaded to ==> \"$local\"\n"; $sftp->remove($file); $ok++; } #print "$ok files have been downloaded, $failed files failed!\n\n"; $sftp->disconnect();
perhaps i should use $sftp->ls to get the filename but I do not understand how to get the name of the file in a variable.. i do not understand the hash reference. i try this but it does not work. .
my $ls = $sftp->ls( '.', wanted => qr/$datestring/) or die "unable to + retrieve directory: ".$sftp->error; my $file = "$_->{filename}\n" for (@$ls); print $file
thanks

Replies are listed 'Best First'.
Re^3: net-sftp-foreign transfer failed vs file not present.
by McA (Priest) on Aug 07, 2014 at 11:44 UTC

    Hi,

    I've just seen that your problem isn't solved yet, is it?

    You get an exception, but this is what you've coded:

    unless ($sftp->get("$file", "$local/$file")) { if (($sftp->error == SFTP_ERR_REMOTE_STAT_FAILED or $sftp->error == SFTP_ERR_REMOTE_OPEN_FAILED) and $sftp->status == SSH2_FX_NO_SUCH_FILE) { print "Remote file does not exist!"; } else { print "Transfer Failed"; } die $sftp->error; }

    Independent from your if-clause you have a die at the end of your conditional block when get didn't work. More interesting would be to see whether you get the line "Remote file does not exist!".

    Where does the message "Uncaught exception from user code: Couldn't stat remote file: No such file at ./datalex.pl line 37" come from? A wrapper?

    Regards
    McA

      Hello,

      I guess that removing the die outside the if solves the issue. I have other query.. how can I print the output of the sftp. when I execute a transfer in the command live and I get a file from the sftp I get this output on screen...
      sftp> get BookingReport_Daily_07-08-2014.xls Fetching /dlex/BookingReport_Daily_07-08-2014.xls to BookingReport_Dai +ly_07-08-2014.xls
      how can in perl achieve this and redirect that ouptut to a log file per instance.

        I get the feeling, that you start to think too complicated. When you use the sftp command line client it gives you some feedback about the fact that you have just downloaded a file with name 'x' and stored it somewhere locally with name 'y'. This is the same you want to do in your perl script. So, why don't you just simply print a message after you know you've transfered the file? You can also push the message on an internal message stack for later use.

        Regards
        McA