source: trunk/cleanup.php @ 1

Last change on this file since 1 was 1, checked in by zollarsd, 10 years ago

Initial import

File size: 23.7 KB
Line 
1<?php
2/*
3 * cleanup.php
4 *
5 * functions relating to copying results and cleaning up the gfac DB
6 *
7 */
8
9include_once "/home/us3/bin/listen-config.php";
10$me              = 'cleanup.php';
11$email_address   = '';
12$queuestatus     = '';
13$jobtype         = '';
14$db              = '';
15$editXMLFilename = '';
16
17function gfac_cleanup( $us3_db, $requestID, $gfac_link )
18{
19   global $dbhost;
20   global $user;
21   global $passwd;
22   global $db;
23   global $guser;
24   global $gpasswd;
25   global $gDB;
26   global $me;
27   global $work;
28   global $email_address;
29   global $queuestatus;
30   global $jobtype;
31   global $editXMLFilename;
32   global $submittime;
33
34   $db = $us3_db;
35   write_log( "$me: debug db=$db; requestID=$requestID" );
36
37   $us3_link = mysql_connect( $dbhost, $user, $passwd );
38
39   if ( ! $us3_link )
40   {
41      write_log( "$me: could not connect: $dbhost, $user, $passwd" );
42      mail_to_user( "fail", "Internal Error $requestID\nCould not connect to DB" );
43      return( -1 );
44   }
45
46   $result = mysql_select_db( $db, $us3_link );
47
48   if ( ! $result )
49   {
50      write_log( "$me: could not select DB $db" );
51      mail_to_user( "fail", "Internal Error $requestID\n$could not select DB $db" );
52      return( -1 );
53   }
54
55   // First get basic info for email messages
56   $query  = "SELECT email, investigatorGUID, editXMLFilename FROM HPCAnalysisRequest " .
57             "WHERE HPCAnalysisRequestID=$requestID";
58   $result = mysql_query( $query, $us3_link );
59
60   if ( ! $result )
61   {
62      write_log( "$me: Bad query: $query" );
63      mail_to_user( "fail", "Internal Error $requestID\n$query\n" . mysql_error( $us3_link ) );
64      return( -1 );
65   }
66
67   list( $email_address, $investigatorGUID, $editXMLFilename ) =  mysql_fetch_array( $result );
68
69   $query  = "SELECT personID FROM people " .
70             "WHERE personGUID='$investigatorGUID'";
71   $result = mysql_query( $query, $us3_link );
72
73   list( $personID ) = mysql_fetch_array( $result );
74
75   /*
76   $query  = "SELECT clusterName, submitTime, queueStatus, method "              .
77             "FROM HPCAnalysisRequest h LEFT JOIN HPCAnalysisResult "            .
78             "ON h.HPCAnalysisRequestID=HPCAnalysisResult.HPCAnalysisRequestID " .
79             "WHERE h.HPCAnalysisRequestID=$requestID";
80   */
81   $query  = "SELECT clusterName, submitTime, queueStatus, method "              .
82             "FROM HPCAnalysisRequest h, HPCAnalysisResult r "                   .
83             "WHERE h.HPCAnalysisRequestID=$requestID "                          .
84             "AND h.HPCAnalysisRequestID=r.HPCAnalysisRequestID";
85
86   $result = mysql_query( $query, $us3_link );
87
88   if ( ! $result )
89   {
90      write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
91      return( -1 );
92   }
93
94   if ( mysql_num_rows( $result ) == 0 )
95   {
96      write_log( "$me: US3 Table error - No records for requestID: $requestID" );
97      return( -1 );
98   }
99
100   list( $cluster, $submittime, $queuestatus, $jobtype ) = mysql_fetch_array( $result );
101
102   // Get the GFAC ID
103   $query = "SELECT HPCAnalysisResultID, gfacID FROM HPCAnalysisResult " .
104            "WHERE HPCAnalysisRequestID=$requestID";
105
106   $result = mysql_query( $query, $us3_link );
107
108   if ( ! $result )
109   {
110      write_log( "$me: Bad query: $query" );
111      mail_to_user( "fail", "Internal Error $requestID\n$query\n" . mysql_error( $us3_link ) );
112      return( -1 );
113   }
114
115   list( $HPCAnalysisResultID, $gfacID ) = mysql_fetch_array( $result ); 
116
117   ////////
118   // Get data from global GFAC DB and insert it into US3 DB
119   // $gfac_link = mysql_connect( $dbhost, $guser, $gpasswd );
120
121   $result = mysql_select_db( $gDB, $gfac_link );
122
123   if ( ! $result )
124   {
125      write_log( "$me: Could not connect to DB $gDB" );
126      mail_to_user( "fail", "Internal Error $requestID\nCould not connect to DB $gDB" );
127      return( -1 );
128   }
129
130   $query = "SELECT status, cluster, id FROM analysis " .
131            "WHERE gfacID='$gfacID'";
132
133   $result = mysql_query( $query, $gfac_link );
134   if ( ! $result )
135   {
136      write_log( "$me: Could not select GFAC status for $gfacID" );
137      mail_to_user( "fail", "Could not select GFAC status for $gfacID" );
138      return( -1 );
139   }
140   
141   list( $status, $cluster, $id ) = mysql_fetch_array( $result );
142
143   if ( $cluster == 'bcf-local'  || $cluster == 'alamo-local' )
144   {
145         $clushost = $cluster;
146         $clushost = preg_replace( "/\-local/", "", $clushost );
147         get_local_files( $gfac_link, $clushost, $requestID, $id, $gfacID );
148   }
149
150   $query = "SELECT id, stderr, stdout, tarfile FROM analysis " .
151            "WHERE gfacID='$gfacID'";
152
153   $result = mysql_query( $query, $gfac_link );
154
155   if ( ! $result )
156   {
157      write_log( "$me: Bad query:\n$query\n" . mysql_error( $gfac_link ) );
158      mail_to_user( "fail", "Internal error " . mysql_error( $gfac_link ) );
159      return( -1 );
160   }
161
162   list( $analysisID, $stderr, $stdout, $tarfile ) = mysql_fetch_array( $result );
163
164   // Save queue messages for post-mortem analysis
165   $query = "SELECT message, time FROM queue_messages " .
166            "WHERE analysisID = $analysisID " .
167            "ORDER BY time ";
168   $result = mysql_query( $query, $gfac_link );
169
170   if ( ! $result )
171   {
172      // Just log it and continue
173      write_log( "$me: Bad query:\n$query\n" . mysql_error( $gfac_link ) );
174   }
175
176   $now = date( 'Y-m-d H:i:s' );
177   $message_log = "US3 DB: $db\n" .
178                  "RequestID: $requestID\n" .
179                  "GFAC ID: $gfacID\n" .
180                  "Processed: $now\n\n" .
181                  "Queue Messages\n\n" ;
182   if ( mysql_num_rows( $result ) > 0 )
183   {
184      while ( list( $message, $time ) = mysql_fetch_array( $result ) )
185         $message_log .= "$time $message\n";
186   }
187
188   $query = "DELETE FROM queue_messages " .
189            "WHERE analysisID = $analysisID ";
190
191   $result = mysql_query( $query, $gfac_link );
192
193   if ( ! $result )
194   {
195      // Just log it and continue
196      write_log( "$me: Bad query:\n$query\n" . mysql_error( $gfac_link ) );
197   }
198
199   // Save stdout, stderr, etc. for message log
200   $query  = "SELECT stdout, stderr, status, queue_msg FROM analysis " .
201             "WHERE gfacID='$gfacID' ";
202   $result = mysql_query( $query, $gfac_link );
203   try
204   {
205      // What if this is too large?
206      list( $stdout, $stderr, $status, $queue_msg ) = mysql_fetch_array( $result );
207   }
208   catch ( Exception $e )
209   {
210      write_log( "$me: stdout + stderr larger than 128M - $gfacID\n" . mysql_error( $gfac_link ) );
211      // Just go ahead and clean up
212   }
213
214   // But let's allow for investigation of other large stdout and/or stderr
215   if ( strlen( $stdout ) > 20480000 ||
216        strlen( $stderr ) > 20480000 )
217      write_log( "$me: stdout + stderr larger than 20M - $gfacID\n" );
218
219   $message_log .= "\n\n\nStdout Contents\n\n" .
220                   $stdout .
221                   "\n\n\nStderr Contents\n\n" .
222                   $stderr .
223                   "\n\n\nGFAC Status: $status\n" .
224                   "GFAC message field: $queue_msg\n";
225
226   // Delete data from GFAC DB
227   $query = "DELETE from analysis WHERE gfacID='$gfacID'";
228
229   $result = mysql_query( $query, $gfac_link );
230
231   if ( ! $result )
232   {
233      // Just log it and continue
234      write_log( "$me: Bad query:\n$query\n" . mysql_error( $gfac_link ) );
235   }
236
237   // Copy queue messages to LIMS submit directory (files there are deleted after 7 days)
238   global $submit_dir;
239   
240   // Get the request guid (LIMS submit dir name)
241   $query  = "SELECT HPCAnalysisRequestGUID FROM HPCAnalysisRequest " .
242             "WHERE HPCAnalysisRequestID = $requestID ";
243   $result = mysql_query( $query, $us3_link );
244   
245   if ( ! $result )
246   {
247      write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
248   }
249   
250   list( $requestGUID ) = mysql_fetch_array( $result );
251   $output_dir = "$submit_dir/$requestGUID";
252
253   // Try to create it if necessary, and write the file
254   // Let's use FILE_APPEND, in case this is the second time around and the
255   //  GFAC job status was INSERTed, rather than UPDATEd
256   if ( ! is_dir( $output_dir ) )
257      mkdir( $output_dir, 0775, true );
258   $message_filename = "$output_dir/$db-$requestID-messages.txt";
259   file_put_contents( $message_filename, $message_log, FILE_APPEND );
260  // mysql_close( $gfac_link );
261
262   /////////
263   // Insert data into HPCAnalysis
264
265   $query = "UPDATE HPCAnalysisResult SET "                              .
266            "stderr='" . mysql_real_escape_string( $stderr, $us3_link ) . "', " .
267            "stdout='" . mysql_real_escape_string( $stdout, $us3_link ) . "' "  .
268            "WHERE HPCAnalysisResultID=$HPCAnalysisResultID";
269
270   $result = mysql_query( $query, $us3_link );
271
272   if ( ! $result )
273   {
274      write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
275      mail_to_user( "fail", "Bad query:\n$query\n" . mysql_error( $us3_link ) );
276      return( -1 );
277   }
278
279   // Save the tarfile and expand it
280
281   if ( strlen( $tarfile ) == 0 )
282   {
283      write_log( "$me: No tarfile" );
284      mail_to_user( "fail", "No results" );
285      return( -1 );
286   }
287
288   // Shouldn't happen
289   if ( ! is_dir( "$work" ) )
290   {
291      write_log( "$me: $work directory does not exist" );
292      mail_to_user( "fail", "$work directory does not exist" );
293      return( -1 );
294   }
295
296   if ( ! is_dir( "$work/$gfacID" ) ) mkdir( "$work/$gfacID", 0770 );
297   chdir( "$work/$gfacID" );
298
299   $f = fopen( "analysis.tar", "w" );
300   fwrite( $f, $tarfile );
301   fclose( $f );
302
303   $tar_out = array();
304   exec( "tar -xf analysis.tar 2>&1", $tar_out, $err );
305
306   if ( $err != 0 )
307   {
308      chdir( $work );
309      exec( "rm -r $gfacID" );
310      $output = implode( "\n", $tar_out );
311
312      write_log( "$me: Bad output tarfile: $output" );
313      mail_to_user( "fail", "Bad output file" );
314      return( -1 );
315   }
316
317   // Insert the model files and noise files
318   $files      = file( "analysis_files.txt", FILE_IGNORE_NEW_LINES );
319   $noiseIDs   = array();
320   $modelGUIDs = array();
321
322   foreach ( $files as $file )
323   {
324      $split = explode( ";", $file );
325
326      if ( count( $split ) > 1 )
327      {
328         list( $fn, $meniscus, $mc_iteration, $variance ) = explode( ";", $file );
329     
330         list( $other, $mc_iteration ) = explode( "=", $mc_iteration );
331         list( $other, $variance     ) = explode( "=", $variance );
332         list( $other, $meniscus     ) = explode( "=", $meniscus );
333      }
334      else
335         $fn = $file;
336
337      if ( filesize( $fn ) < 100 )
338      {
339         write_log( "$me:fn is invalid $fn" );
340         mail_to_user( "fail", "Internal error\n$fn is invalid" );
341         return( -1 );
342      }
343
344      if ( preg_match( "/^job_statistics\.xml$/", $fn ) ) // Job statistics file
345      {
346         $xml         = file_get_contents( $fn );
347         $statistics  = parse_xml( $xml, 'statistics' );
348         $otherdata   = parse_xml( $xml, 'id' );
349
350         $query = "UPDATE HPCAnalysisResult SET "   .
351                  "wallTime = {$statistics['walltime']}, " .
352                  "CPUTime = {$statistics['cputime']}, " .
353                  "CPUCount = {$statistics['cpucount']}, " .
354                  "max_rss = {$statistics['maxmemory']}, " .
355                  "startTime = '{$otherdata['starttime']}', " .
356                  "endTime = '{$otherdata['endtime']}', " .
357                  "mgroupcount = {$otherdata['groupcount']} " .
358                  "WHERE HPCAnalysisResultID=$HPCAnalysisResultID";
359         $result = mysql_query( $query, $us3_link );
360
361         if ( ! $result )
362         {
363            write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
364         }
365
366         file_put_contents( "$output_dir/$fn", $xml );    // Copy to submit dir
367
368      }
369
370      else if ( preg_match( "/\.noise/", $fn ) > 0 ) // It's a noise file
371      {
372         $xml        = file_get_contents( $fn );
373         $noise_data = parse_xml( $xml, "noise" );
374         $type       = ( $noise_data[ 'type' ] == "ri" ) ? "ri_noise" : "ti_noise";
375         $desc       = $noise_data[ 'description' ];
376         $modelGUID  = $noise_data[ 'modelGUID' ];
377         $noiseGUID  = $noise_data[ 'noiseGUID' ];
378
379         $query = "INSERT INTO noise SET "  .
380                  "noiseGUID='$noiseGUID'," .
381                  "modelGUID='$modelGUID'," .
382                  "editedDataID=1, "        .
383                  "modelID=1, "             .
384                  "noiseType='$type',"      .
385                  "description='$desc',"    .
386                  "xml='" . mysql_real_escape_string( $xml, $us3_link ) . "'";
387
388         // Add later after all files are processed: editDataID, modelID
389
390         $result = mysql_query( $query, $us3_link );
391
392         if ( ! $result )
393         {
394            write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
395            mail_to_user( "fail", "Internal error\n$query\n" . mysql_error( $us3_link ) );
396            return( -1 );
397         }
398
399         $id        = mysql_insert_id( $us3_link );
400         $file_type = "noise";
401         $noiseIDs[] = $id;
402
403         // Keep track of modelGUIDs for later, when we replace them
404         $modelGUIDs[ $id ] = $modelGUID;
405         
406      }
407      else  // It's a model file
408      {
409         $xml         = file_get_contents( $fn );
410         $model_data  = parse_xml( $xml, "model" );
411         $description = $model_data[ 'description' ];
412         $modelGUID   = $model_data[ 'modelGUID' ];
413         $editGUID    = $model_data[ 'editGUID' ];
414
415         $query = "INSERT INTO model SET "       .
416                  "modelGUID='$modelGUID',"      .
417                  "editedDataID="                .
418                  "(SELECT editedDataID FROM editedData WHERE editGUID='$editGUID')," .
419                  "description='$description',"  .
420                  "MCIteration='$mc_iteration'," .
421                  "meniscus='$meniscus'," .
422                  "variance='$variance'," .
423                  "xml='" . mysql_real_escape_string( $xml, $us3_link ) . "'";
424
425         $result = mysql_query( $query, $us3_link );
426
427         if ( ! $result )
428         {
429            write_log( "$me: Bad query:\n$query " . mysql_error( $us3_link ) );
430            mail_to_user( "fail", "Internal error\n$query\n" . mysql_error( $us3_link ) );
431            return( -1 );
432         }
433
434         $modelID   = mysql_insert_id( $us3_link );
435         $id        = $modelID;
436         $file_type = "model";
437
438         $query = "INSERT INTO modelPerson SET " .
439                  "modelID=$modelID, personID=$personID";
440         $result = mysql_query( $query, $us3_link );
441      }
442
443      $query = "INSERT INTO HPCAnalysisResultData SET "       .
444               "HPCAnalysisResultID='$HPCAnalysisResultID', " .
445               "HPCAnalysisResultType='$file_type', "         .
446               "resultID=$id";
447
448      $result = mysql_query( $query, $us3_link );
449
450      if ( ! $result )
451      {
452         write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
453         mail_to_user( "fail", "Internal error\n$query\n" . mysql_error( $us3_link ) );
454         return( -1 );
455      }
456   }
457
458   // Now fix up noise entries
459   // For noise files, there is, at most two: ti_noise and ri_noise
460   // In this case there will only be one modelID
461
462   foreach ( $noiseIDs as $noiseID )
463   {
464      $modelGUID = $modelGUIDs[ $noiseID ];
465      $query = "UPDATE noise SET "                                                 .
466               "editedDataID="                                                     .
467               "(SELECT editedDataID FROM editedData WHERE editGUID='$editGUID')," .
468               "modelID="                                                          .
469               "(SELECT modelID FROM model WHERE modelGUID='$modelGUID')"          .
470               "WHERE noiseID=$noiseID";
471
472      $result = mysql_query( $query, $us3_link );
473
474      if ( ! $result )
475      {
476         write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
477         mail_to_user( "fail", "Bad query\n$query\n" . mysql_error( $us3_link ) );
478         return( -1 );
479      }
480   }
481
482   // Copy results to LIMS submit directory (files there are deleted after 7 days)
483   global $submit_dir; // LIMS submit files dir
484   
485   // Get the request guid (LIMS submit dir name)
486   $query  = "SELECT HPCAnalysisRequestGUID FROM HPCAnalysisRequest " .
487             "WHERE HPCAnalysisRequestID = $requestID ";
488   $result = mysql_query( $query, $us3_link );
489   
490   if ( ! $result )
491   {
492      write_log( "$me: Bad query:\n$query\n" . mysql_error( $us3_link ) );
493   }
494   
495   list( $requestGUID ) = mysql_fetch_array( $result );
496   
497   chdir( "$submit_dir/$requestGUID" );
498   $f = fopen( "analysis.tar", "w" );
499   fwrite( $f, $tarfile );
500   fclose( $f );
501
502   // Clean up
503   chdir ( $work );
504   // exec( "rm -rf $gfacID" );
505
506   mysql_close( $us3_link );
507
508   /////////
509   // Send email
510
511   mail_to_user( "success", "" );
512}
513
514function mail_to_user( $type, $msg )
515{
516   // Note to me. Just changed subject line to include a modified $status instead
517   // of the $type variable passed. More informative than just "fail" or "success."
518   // See how it works for awhile and then consider removing $type parameter from
519   // function.
520   global $email_address;
521   global $submittime;
522   global $queuestatus;
523   global $status;
524   global $cluster;
525   global $jobtype;
526   global $org_name;
527   global $admin_email;
528   global $dbhost;
529   global $requestID;
530   global $gfacID;
531   global $editXMLFilename;
532
533global $me;
534write_log( "$me mail_to_user(): sending email to $email_address for $gfacID" );
535
536   // Get GFAC status and message
537   // For right now, since we don't get clear and concise message
538   // $gfac_message = get_gfac_message( $gfacID );
539   // if ( $gfac_message === false ) $gfac_message = "";
540     
541   // Create a status to put in the subject line
542   switch ( $status )
543   {
544      case "COMPLETE":
545         $subj_status = 'completed';
546         break;
547
548      case "CANCELLED":
549      case "CANCELED":
550         $subj_status = 'canceled';
551         break;
552
553      case "FAILED":
554         $subj_status = 'failed';
555         break;
556
557      case "ERROR":
558         $subj_status = 'unknown error';
559         break;
560
561      default:
562         $subj_status = $status;       // For now
563         break;
564
565   }
566
567   // Parse the editXMLFilename
568   list( $runID, $editID, $dataType, $cell, $channel, $wl, $ext ) =
569      explode( ".", $editXMLFilename );
570
571   $headers  = "From: $org_name Admin<$admin_email>"     . "\n";
572   $headers .= "Cc: $org_name Admin<$admin_email>"       . "\n";
573
574   // Set the reply address
575   $headers .= "Reply-To: $org_name<$admin_email>"      . "\n";
576   $headers .= "Return-Path: $org_name<$admin_email>"   . "\n";
577
578   // Try to avoid spam filters
579   $now = time();
580   $headers .= "Message-ID: <" . $now . "cleanup@$dbhost>\n";
581   $headers .= "X-Mailer: PHP v" . phpversion()         . "\n";
582   $headers .= "MIME-Version: 1.0"                      . "\n";
583   $headers .= "Content-Transfer-Encoding: 8bit"        . "\n";
584
585   $subject       = "UltraScan Job Notification - $subj_status - " . substr( $gfacID, 0, 16 );
586   $message       = "
587   Your UltraScan job is complete:
588
589   Submission Time : $submittime
590   Analysis ID     : $gfacID
591   RunID           : $runID
592   EditID          : $editID
593   Data Type       : $dataType
594   Cell/Channel/Wl : $cell / $channel / $wl
595   Status          : $queuestatus
596   Cluster         : $cluster
597   Job Type        : $jobtype
598   GFAC Status     : $status
599   ";
600
601   // This would change to ( $status != 'COMPLETE' ) or something like that.
602   if ( $type != "success" ) $message .= "Error Message  :  $msg\n";
603
604   // Handle the error case where an error occurs before fetching the
605   // user's email address
606   if ( $email_address == "" ) $email_address = $admin_email;
607
608   mail( $email_address, $subject, $message, $headers );
609}
610
611function parse_xml( $xml, $type )
612{
613   $parser = new XMLReader();
614   $parser->xml( $xml );
615
616   $results = array();
617
618   while ( $parser->read() )
619   {
620      if ( $parser->name == $type )
621      {
622         while ( $parser->moveToNextAttribute() ) 
623         {
624            $results[ $parser->name ] = $parser->value;
625         }
626
627         break;
628      }
629   }
630
631   $parser->close();
632   return $results;
633}
634
635// Function to get information about the current job GFAC
636function get_gfac_message( $gfacID )
637{
638  global $serviceURL;
639  global $me;
640
641  $hex = "[0-9a-fA-F]";
642  if ( ! preg_match( "/^US3-Experiment/i", $gfacID ) &&
643       ! preg_match( "/^US3-$hex{8}-$hex{4}-$hex{4}-$hex{4}-$hex{12}$/", $gfacID ) )
644   {
645      // Then it's not a GFAC job
646      return false;
647   }
648
649   $url = "$serviceURL/jobstatus/$gfacID";
650   try
651   {
652      $post = new HttpRequest( $url, HttpRequest::METH_GET );
653      $http = $post->send();
654      $xml  = $post->getResponseBody();     
655   }
656   catch ( HttpException $e )
657   {
658      write_log( "$me: Job status not available - $gfacID" );
659      return false;
660   }
661
662   // Parse the result
663   $gfac_message = parse_message( $xml );
664
665   return $gfac_message;
666}
667
668function parse_message( $xml )
669{
670   $status       = "";
671   $gfac_message = "";
672
673   $parser = new XMLReader();
674   $parser->xml( $xml );
675
676   $results = array();
677
678   while( $parser->read() )
679   {
680      $type = $parser->nodeType;
681
682      if ( $type == XMLReader::ELEMENT )
683         $name = $parser->name;
684
685      else if ( $type == XMLReader::TEXT )
686      {
687         if ( $name == "status" ) 
688            $status       = $parser->value;
689         else 
690            $gfac_message = $parser->value; 
691      }
692   }
693     
694   $parser->close();
695   return $gfac_message;
696}
697
698function get_local_files( $gfac_link, $cluster, $requestID, $id, $gfacID )
699{
700   global $work;
701   global $work_remote;
702   global $me;
703   global $db;
704   global $status;
705
706   // Figure out local working directory
707   if ( ! is_dir( "$work/$gfacID" ) ) mkdir( "$work/$gfacID", 0770 );
708   $pwd = chdir( "$work/$gfacID" );
709
710   // Figure out remote directory
711   $remoteDir = sprintf( "$work_remote/$db-%06d", $requestID );
712
713   // Get stdout, stderr, output/analysis-results.tar
714   $output = array();
715//   $cmd = "scp us3@$cluster.uthscsa.edu:$remoteDir/stdout . 2>&1";
716//
717//   exec( $cmd, $output, $stat );
718//   if ( $stat != 0 )
719//      write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
720//     
721//   $cmd = "scp us3@$cluster.uthscsa.edu:$remoteDir/stderr . 2>&1";
722//   exec( $cmd, $output, $stat );
723//   if ( $stat != 0 )
724//      write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
725
726   $cmd = "scp us3@$cluster.uthscsa.edu:$remoteDir/output/analysis-results.tar . 2>&1";
727   exec( $cmd, $output, $stat );
728   if ( $stat != 0 ) 
729      write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
730
731   $cmd = "scp us3@$cluster.uthscsa.edu:$remoteDir/stdout . 2>&1";
732   exec( $cmd, $output, $stat );
733   if ( $stat != 0 ) 
734   {
735      write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
736      sleep( 10 );
737      write_log( "$me: RETRY" );
738      exec( $cmd, $output, $stat );
739      if ( $stat != 0 ) 
740         write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
741   }
742     
743   $cmd = "scp us3@$cluster.uthscsa.edu:$remoteDir/stderr . 2>&1";
744   exec( $cmd, $output, $stat );
745   if ( $stat != 0 ) 
746   {
747      write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
748      sleep( 10 );
749      write_log( "$me: RETRY" );
750      exec( $cmd, $output, $stat );
751      if ( $stat != 0 ) 
752         write_log( "$me: Bad exec:\n$cmd\n" . implode( "\n", $output ) );
753   }
754
755   // Write the files to gfacDB
756
757   if ( file_exists( "stderr" ) ) $stderr  = file_get_contents( "stderr" );
758   if ( file_exists( "stdout" ) ) $stdout  = file_get_contents( "stdout" );
759   if ( file_exists( "analysis-results.tar" ) ) 
760      $tarfile = file_get_contents( "analysis-results.tar" );
761
762   $query = "UPDATE analysis SET " .
763            "stderr='"  . mysql_real_escape_string( $stderr,  $gfac_link ) . "'," .
764            "stdout='"  . mysql_real_escape_string( $stdout,  $gfac_link ) . "'," .
765            "tarfile='" . mysql_real_escape_string( $tarfile, $gfac_link ) . "'";
766
767   $result = mysql_query( $query, $gfac_link );
768
769   if ( ! $result )
770   {
771      write_log( "$me: Bad query:\n$query\n" . mysql_error( $gfac_link ) );
772      echo "Bad query\n";
773      return( -1 );
774   }
775}
776?>
Note: See TracBrowser for help on using the repository browser.