source: trunk/cleanup.php @ 5

Last change on this file since 5 was 5, checked in by us3, 9 years ago

Include STDOUT in EOJ email

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