RT#38722: DFH: paymentech upload and download retry
authorJonathan Prykop <jonathan@freeside.biz>
Fri, 30 Oct 2015 06:57:46 +0000 (01:57 -0500)
committerJonathan Prykop <jonathan@freeside.biz>
Fri, 30 Oct 2015 06:57:46 +0000 (01:57 -0500)
FS/FS/log_context.pm
FS/bin/freeside-paymentech-download
FS/bin/freeside-paymentech-upload

index bd14247..ff34717 100644 (file)
@@ -18,6 +18,8 @@ my @contexts = ( qw(
   queue
   upgrade
   upgrade_taxable_billpkgnum
+  freeside-paymentech-upload
+  freeside-paymentech-download
 ) );
 
 =head1 NAME
index 16ac3c2..1b2f951 100755 (executable)
@@ -11,11 +11,20 @@ use FS::Record qw(qsearch qsearchs);
 use FS::pay_batch;
 use FS::cust_pay_batch;
 use FS::Conf;
+use FS::Log;
 
 use vars qw( $opt_t $opt_v $opt_a );
 getopts('vta:');
 
 #$Net::SFTP::Foreign::debug = -1;
+
+sub log_and_die {
+  my $message = shift;
+  my $log = FS::Log->new('freeside-paymenttech-download');
+  $log->error($message);
+  die $message; 
+}
+
 sub usage { "
   Usage:
       freeside-paymentech-download [ -v ] [ -t ] [ -a archivedir ] user\n
@@ -25,13 +34,13 @@ my $user = shift or die &usage;
 adminsuidsetup $user;
 
 if ( $opt_a ) {
-  die "no such directory: $opt_a\n"
+  log_and_die("no such directory: $opt_a\n")
     unless -d $opt_a;
-  die "archive directory $opt_a is not writable by the freeside user\n"
+  log_and_die("archive directory $opt_a is not writable by the freeside user\n")
     unless -w $opt_a;
 }
 
-my $unzip_check = `which unzip` or die "can't find unzip executable\n";
+my $unzip_check = `which unzip` or log_and_die("can't find unzip executable\n");
 
 #my $tmpdir = File::Temp->newdir();
 my $tmpdir = tempdir( CLEANUP => 1 ); #DIR=>somewhere?
@@ -39,22 +48,31 @@ my $tmpdir = tempdir( CLEANUP => 1 ); #DIR=>somewhere?
 my $conf = new FS::Conf;
 my @batchconf = $conf->config('batchconfig-paymentech');
 # BIN, terminalID, merchantID, username, password
-my $username = $batchconf[3] or die "no Paymentech batch username configured\n";
-my $password = $batchconf[4] or die "no Paymentech batch password configured\n";
+my $username = $batchconf[3] or log_and_die("no Paymentech batch username configured\n");
+my $password = $batchconf[4] or log_and_die("no Paymentech batch password configured\n");
 
 my $host = ($opt_t ? 'orbitalbatchvar.paymentech.net'
                    : 'orbitalbatch.paymentech.net');
 print STDERR "Connecting to $username\@$host...\n" if $opt_v;
 
-my $sftp = Net::SFTP::Foreign->new( host => $host,
-                                    user => $username,
-                                    password => $password,
-                                    timeout => 30,
-                                    );
-die "failed to connect to '$username\@$host'\n(".$sftp->error.")\n" if $sftp->error;
+my $sftp;
+my $ssh_retry      = 25;   # number of times to try connection, needs to be >= 1
+my $ssh_retry_wait = 60*5; # seconds to wait between tries
+while ($ssh_retry > 0) {
+  $sftp = Net::SFTP::Foreign->new( host => $host,
+                                   user => $username,
+                                   password => $password,
+                                   timeout => 30,
+                                 );
+  last unless $sftp->error;
+  $ssh_retry -= 1;
+  sleep($ssh_retry_wait) if $ssh_retry > 0;
+}
+
+log_and_die("failed to connect to '$username\@$host'\n(".$sftp->error.")\n") if $sftp->error;
 
 my @files = map { $_->{filename} } @{ $sftp->ls('.', wanted => qr/_resp\.zip$/) };
-die "no response files found\n" if !@files;
+log_and_die("no response files found\n") if !@files;
 
 BATCH: foreach my $filename (@files) {
 
index 609019e..a6e6a5d 100755 (executable)
@@ -11,12 +11,20 @@ use FS::Record qw(qsearch qsearchs);
 use FS::pay_batch;
 use FS::cust_pay_batch;
 use FS::Conf;
+use FS::Log;
 
 use vars qw( $opt_a $opt_t $opt_v $opt_p );
 getopts('avtp:');
 
 #$Net::SFTP::Foreign::debug = -1;
 
+sub log_and_die {
+  my $message = shift;
+  my $log = FS::Log->new('freeside-paymenttech-upload');
+  $log->error($message);
+  die $message; 
+}
+
 sub usage { "
   Usage:
     freeside-paymentech-upload [ -v ] [ -t ] user batchnum
@@ -26,7 +34,7 @@ sub usage { "
 my $user = shift or die &usage;
 adminsuidsetup $user;
 
-my $zip_check = `which zip` or die "can't find zip executable\n";
+my $zip_check = `which zip` or log_and_die("can't find zip executable\n");
 
 my @batches; 
 
@@ -34,21 +42,21 @@ if($opt_a) {
   my %criteria = (status => 'O');
   $criteria{'payby'} = uc($opt_p) if $opt_p;
   @batches = qsearch('pay_batch', \%criteria);
-  die "No open batches found".($opt_p ? " of type '$opt_p'" : '').".\n" 
+  log_and_die("No open batches found".($opt_p ? " of type '$opt_p'" : '').".\n")
     if !@batches;
 }
 else {
   my $batchnum = shift;
-  die &usage if !$batchnum;
+  log_and_die("batchnum not passed\n".&usage) if !$batchnum;
   @batches = qsearchs('pay_batch', { batchnum => $batchnum } );
-  die "Can't find payment batch '$batchnum'\n" if !@batches;
+  log_and_die("Can't find payment batch '$batchnum'\n") if !@batches;
 }
 
 my $conf = new FS::Conf;
 my @batchconf = $conf->config('batchconfig-paymentech');
 # BIN, terminalID, merchantID, username, password
-my $username = $batchconf[3] or die "no Paymentech batch username configured\n";
-my $password = $batchconf[4] or die "no Paymentech batch password configured\n";
+my $username = $batchconf[3] or log_and_die("no Paymentech batch username configured\n");
+my $password = $batchconf[4] or log_and_die("no Paymentech batch password configured\n");
 
 #my $tmpdir = File::Temp->newdir();
 my $tmpdir = tempdir( CLEANUP => 1 ); #DIR=>somewhere?
@@ -61,7 +69,7 @@ foreach my $pay_batch (@batches) {
   print STDERR "Exporting batch $batchnum to $filename...\n" if $opt_v;
   my $text = $pay_batch->export_batch(format => 'paymentech');
   $text =~ s!<fileID>FILEID</fileID>!<fileID>$filename</fileID>! 
-    or die "couldn't find FILEID tag\n";
+    or log_and_die("couldn't find FILEID tag\n");
   open OUT, ">$tmpdir/$filename.xml";
   print OUT $text;
   close OUT;
@@ -69,7 +77,7 @@ foreach my $pay_batch (@batches) {
   system('zip', '-P', $password, '-q', '-j',
            "$tmpdir/$filename.zip", "$tmpdir/$filename.xml");
 
-  die "failed to create zip file\n" if (! -f "$tmpdir/$filename.zip" );
+  log_and_die("failed to create zip file\n") if (! -f "$tmpdir/$filename.zip" );
   push @filenames, $filename;
 }
 
@@ -77,17 +85,26 @@ my $host = ($opt_t ? 'orbitalbatchvar.paymentech.net'
                    : 'orbitalbatch.paymentech.net');
 print STDERR "Connecting to $username\@$host...\n" if $opt_v;
 
-my $sftp = Net::SFTP::Foreign->new( host => $host,
-                                    user => $username,
-                                    password => $password,
-                                    timeout => 30,
-                                    );
-die "failed to connect to '$username\@$host'\n(".$sftp->error.")\n" 
+my $sftp;
+my $ssh_retry      = 25;   # number of times to try connection, needs to be >= 1
+my $ssh_retry_wait = 60*5; # seconds to wait between tries
+while ($ssh_retry > 0) {
+  $sftp = Net::SFTP::Foreign->new( host => $host,
+                                   user => $username,
+                                   password => $password,
+                                   timeout => 30,
+                                 );
+  last unless $sftp->error;
+  $ssh_retry -= 1;
+  sleep($ssh_retry_wait) if $ssh_retry > 0;
+}
+
+log_and_die("failed to connect to '$username\@$host'\n(".$sftp->error.")\n")
     if $sftp->error;
 
 foreach my $filename (@filenames) {
   $sftp->put("$tmpdir/$filename.zip", "$filename.zip")
-    or die "failed to upload file (".$sftp->error.")\n";
+    or log_and_die("failed to upload file (".$sftp->error.")\n");
 }
 
 print STDERR "Finished!\n" if $opt_v;