source: genappalpha/languages/html5/base.php @ 936

Last change on this file since 936 was 936, checked in by ehb, 6 years ago

alpha copy of genapp

File size: 34.8 KB
Line 
1<?php
2header('Content-type: application/json');
3# setup php session
4session_start();
5if (!isset($_SESSION['count'])) {
6  $_SESSION['count'] = 0;
7} else {
8  $_SESSION['count']++;
9}
10
11if ( !sizeof( $_REQUEST ) )
12{
13    session_write_close();
14    require_once "../mail.php";
15    $msg = "[PHP code received no \$_REQUEST] Possibly total upload file size exceeded limit.\nLimit is currently set to " . ini_get( 'post_max_size' ) . ".\n";
16    error_mail( $msg . "Error occured in __menu:id__ __menu:modules:id__.\n" );
17    $results = array("error" => $msg . "Please contact the administrators via feedback if you feel this is in error or if you have need to process total file sizes greater than this limit.\n" );
18    $results[ '_status' ] = 'failed';
19    echo (json_encode($results));
20    exit();
21}
22
23$do_logoff = 0;
24
25$window = "";
26if ( isset( $_REQUEST[ '_window' ] ) )
27{
28   $window = $_REQUEST[ '_window' ];
29}
30if ( !isset( $_SESSION[ $window ] ) )
31{
32   $_SESSION[ $window ] = array( "logon" => "", "project" => "" );
33}
34
35if ( isset( $_REQUEST[ "_logon" ] ) && 
36   ( !isset( $_SESSION[ $window ][ 'logon' ] ) || $_REQUEST[ "_logon" ] != $_SESSION[ $window ][ 'logon' ] ) ) {
37   $do_logoff = 1;
38   unset( $_SESSION[ $window ][ 'logon' ] );
39   $results[ '_logon' ] = "";
40}
41
42if ( !isset( $_REQUEST[ '_uuid' ] ) )
43{
44    $results[ "error" ] = "No _uuid specified in the request";
45    $results[ '_status' ] = 'failed';
46    echo (json_encode($results));
47    exit();
48}
49
50$cmd = isset( $_REQUEST[ '_docrootexecutable' ] ) ? "__docroot:html5__/__application__/" . $_REQUEST[ '_docrootexecutable' ] : "__executable_path:html5__/__executable__";
51if ( !is_executable( $cmd ) )
52{
53    $results[ "error" ] = "command not found or not executable $cmd";
54    $results[ '_status' ] = 'failed';
55    echo (json_encode($results));
56    exit();
57}
58
59require_once "../joblog.php";
60
61$GLOBALS[ 'module'    ] = "__menu:modules:id__";
62$GLOBALS[ 'jobweight' ] = floatval( "__jobweight__" );
63$GLOBALS[ 'menu'      ] = "__menu:id__";
64$GLOBALS[ 'logon'     ] = isset( $_SESSION[ $window ][ 'logon' ] ) ? $_SESSION[ $window ][ 'logon' ] : 'not logged in';
65$GLOBALS[ 'project'   ] = isset( $_REQUEST[ '_project' ] ) ? $_REQUEST[ '_project' ] : 'not in a project';
66$GLOBALS[ 'command'   ] = $cmd;
67$GLOBALS[ 'REMOTE_ADDR' ] = isset( $_SERVER[ 'REMOTE_ADDR' ] ) ? $_SERVER[ 'REMOTE_ADDR' ] : "not from an ip";
68
69// if user based, use alternate directory structure
70__~uniquedir{$uniquedir = "__uniquedir__";}
71
72__~nojobcontrol{$nojobcontrol = 1;$GLOBALS[ 'modal' ] = true;}
73
74$bdir = "";
75
76$adir = "__docroot:html5__/__application__";
77
78if ( !isset( $uniquedir ) &&
79     isset( $_SESSION[ $window ][ 'logon' ] ) &&
80     strlen( $_SESSION[ $window ][ 'logon' ] ) > 1 )
81{
82   $dir = "__docroot:html5__/__application__/results/users/" . $_SESSION[ $window ][ 'logon' ] . "/";
83   $bdir = $dir;
84   if ( isset( $_REQUEST[ '_project' ] ) &&
85        strlen( $_REQUEST[ '_project' ] ) > 1 )
86   {
87      $dir .= $_REQUEST[ '_project' ];
88   } else {
89      $dir .= 'no_project_specified';
90   }
91   $checkrunning     = $dir;
92// connect
93   if ( !isset( $nojobcontrol ) )
94   {
95      db_connect( true );
96      $coll = $use_db->__application__->joblock;
97      if ( $doc = $coll->findOne( array( "name" => $checkrunning ) ) )
98      {
99          $results[ 'error' ] = "A job is already running in this project, please wait until it completes or change projects";
100          $results[ '_status' ] = 'failed';
101          echo (json_encode($results));
102          exit();
103      }
104      try {
105          $coll->insert( array( "name" => $checkrunning, "jobweight" => $GLOBALS[ 'jobweight' ], "user" => $GLOBALS[ 'logon' ] )__~mongojournal{, array("j" => true )});
106      } catch(MongoCursorException $e) {
107          $results[ 'error' ] = "A job is already running in this project, please wait until it completes or change projects. " . $e->getMessage();
108          $results[ '_status' ] = 'failed';
109          echo (json_encode($results));
110          exit();
111      }
112   }
113} else {
114   do {
115       $dir = uniqid( "__docroot:html5__/__application__/results/" );
116   } while( file_exists( $dir ) );
117}
118$GLOBALS[ 'dir' ] = $dir;
119
120$logdir = "$dir__~logdirectory{/__logdirectory__}";
121$GLOBALS[ 'logdir' ] = $logdir; 
122
123if ( !file_exists( $dir ) )
124{
125   ob_start();
126
127   if ( !mkdir( $dir, 0777, true ) )
128   { 
129      $cont = ob_get_contents();
130      ob_end_clean();
131      if ( isset( $checkrunning ) )
132      {
133         try {
134             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{ "j" => true,} "justOne" => true ));
135         } catch(MongoCursorException $e) {
136             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
137         }
138      }
139      $results[ "error" ] .= "Could not create directory " . $dir . " " . $cont;
140      $results[ '_status' ] = 'failed';
141      echo (json_encode($results));
142      exit();
143   }
144   chmod( $dir, 0775 );
145   ob_end_clean();
146   $results[ "_fs_clear" ] = "#";
147}
148
149if ( !file_exists( $logdir ) )
150{
151   ob_start();
152
153   if ( !mkdir( $logdir, 0777, true ) )
154   { 
155      $cont = ob_get_contents();
156      ob_end_clean();
157      if ( isset( $checkrunning ) )
158      {
159         try {
160             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{ "j" => true,} "justOne" => true ));
161         } catch(MongoCursorException $e) {
162             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
163         }
164      }
165      $results[ "error" ] .= "Could not create directory " . $logdir . " " . $cont;
166      $results[ '_status' ] = 'failed';
167      echo (json_encode($results));
168      exit();
169   }
170   chmod( $logdir, 0775 );
171   ob_end_clean();
172   $results[ "_fs_clear" ] = "#";
173}
174
175$_REQUEST[ '_base_directory' ] = $dir;
176$_REQUEST[ '_log_directory' ] = $logdir;
177
178$app_json = json_decode( file_get_contents( "__appconfig__" ) );
179
180if ( $app_json == NULL ) {
181    if ( isset( $checkrunning ) )
182    {
183        try {
184            $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{ "j" => true,} "justOne" => true ));
185        } catch(MongoCursorException $e) {
186            $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
187        }
188    }
189    $results[ "_message" ] = [ "icon" => "toast.png",
190                               "text" => "<p>There appears to be an error with the appconfig.json file.</p>"
191                               . "<p>This is a serious error which should be forwarded to the site adiminstrator.</p>" 
192                               . "<p>Do not expect much to work properly until this is fixed.</p>" 
193        ];
194    $results[ "error" ] .= "appconfig.json is invalid";
195    $results[ '_status' ] = 'failed';
196    echo (json_encode($results));
197    exit();
198}   
199
200$_SESSION[ $window ][ 'udphost'         ] = $app_json->messaging->udphostip;
201$_SESSION[ $window ][ 'udpport'         ] = $app_json->messaging->udpport;
202$_SESSION[ $window ][ 'resources'       ] = $app_json->resources;
203$_SESSION[ $window ][ 'resourcedefault' ] = $app_json->resourcedefault;
204$_SESSION[ $window ][ 'submitpolicy'    ] = $app_json->submitpolicy;
205
206session_write_close();
207
208$_REQUEST[ '_udphost' ] =  $_SESSION[ $window ][ 'udphost' ];
209$_REQUEST[ '_udpport' ] =  $_SESSION[ $window ][ 'udpport' ];
210$_REQUEST[ 'resourcedefault' ] = $_SESSION[ $window ][ 'resourcedefault' ];
211
212__~resource{$useresource = "__resource__";}
213__~submitpolicy{$submitpolicy = "__submitpolicy__";}
214
215if ( !isset( $submitpolicy ) )
216{
217   if ( isset( $_SESSION[ $window ][ 'submitpolicy' ] ) &&
218        $_SESSION[ $window ][ 'submitpolicy' ] == "login" &&
219        ( !isset( $_SESSION[ $window ][ 'logon' ] ) ||
220          strlen( $_SESSION[ $window ][ 'logon' ] ) == 0 ) )
221   {
222         if ( isset( $checkrunning ) )
223         {
224            try {
225                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
226            } catch(MongoCursorException $e) {
227                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
228            }
229         }
230
231         $results[ "error" ] .= "You must be logged on to submit";
232         $results[ '_status' ] = 'failed';
233         echo (json_encode($results));
234         exit();
235   }
236} else {
237   if ( $submitpolicy == "login" &&
238        ( !isset( $_SESSION[ $window ][ 'logon' ] ) ||
239          strlen( $_SESSION[ $window ][ 'logon' ] ) == 0 ) )
240   {
241         if ( isset( $checkrunning ) )
242         {
243            try {
244                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
245            } catch(MongoCursorException $e) {
246                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
247            }
248         }
249
250         $results[ "error" ] .= "You must be logged on to submit";
251         $results[ '_status' ] = 'failed';
252         echo (json_encode($results));
253         exit();
254   }
255}
256
257$cmdprefix = "";
258
259if ( isset( $_SESSION[ $window ][ 'resourcedefault' ] ) &&
260     $_SESSION[ $window ][ 'resourcedefault' ] == "disabled" )
261{
262      if ( isset( $checkrunning ) )
263      {
264         try {
265             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
266         } catch(MongoCursorException $e) {
267             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
268         }
269      }
270      $results[ "error" ] .= "Job submission is currently disabled";
271      $results[ '_status' ] = 'failed';
272      echo (json_encode($results));
273      exit();
274}
275
276if ( isset( $useresource ) &&
277     !isset( $_SESSION[ $window ][ 'resources' ]->$useresource ) )
278{
279      if ( isset( $checkrunning ) )
280      {
281         try {
282             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
283         } catch(MongoCursorException $e) {
284             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
285         }
286      }
287
288      $results[ "error" ] .= "module specified resource " . $useresource . " is not defined in appconfig";
289      $results[ '_status' ] = 'failed';
290      echo (json_encode($results));
291      exit();
292}
293
294if ( !isset( $_SESSION[ $window ][ 'resources' ]->$_SESSION[ $window ][ 'resourcedefault' ] ) &&
295     !isset( $useresource ) )
296{
297     if ( isset( $checkrunning ) )
298     {
299        try {
300            $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
301        } catch(MongoCursorException $e) {
302            $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
303        }
304     }
305     $results[ "error" ] .= "No default resource specified in appconfig and no resource defined in module. This could be the result of an invalid appconfig.json";
306     $results[ '_status' ] = 'failed';
307     echo (json_encode($results));
308     exit();
309} else {
310   if ( isset( $useresource ) )
311   {
312      $cmdprefix = $_SESSION[ $window ][ 'resources' ]->$useresource;
313      $GLOBALS[ 'resource' ] = $useresource;
314   } else {
315      $cmdprefix = $_SESSION[ $window ][ 'resources' ]->$_SESSION[ $window ][ 'resourcedefault' ];
316      $GLOBALS[ 'resource' ] = $_SESSION[ $window ][ 'resourcedefault' ];
317   }
318   if(isset($cmdprefix->run)){
319      $cmdprefix = $cmdprefix->run;
320   }
321   if ( strlen( $cmdprefix ) > 1 )
322   { 
323      $fileargs = 1;
324   }
325}
326
327if ( isset( $app_json->submitblock ) ) {
328    __~debug:submitblock{error_log( "base.php submitblock found\n", 3, "/tmp/mylog" );}
329    $blocked = 0;
330    $bypass = 0;
331    $blocked_msg = [];
332    if ( isset( $app_json->submitblock->{"all"} ) &&
333         isset( $app_json->submitblock->{"all"}->active ) &&
334         $app_json->submitblock->{"all"}->active == 1 ) {
335        $blocked = 1;
336        $blocked_msg = 
337            [ "icon" => "warning.png",
338              "text" => isset( $app_json->submitblock->{"all"}->text ) 
339              ? $app_json->submitblock->{"all"}->text 
340              : "Submission of jobs to $k is currently disabled."
341            ];
342        if ( isset( $app_json->submitblock->{"all"}->allow ) &&
343             isset( $app_json->restricted ) &&
344             in_array( $app_json->submitblock->{"all"}->allow, $app_json->restricted ) &&
345             in_array( $GLOBALS[ 'logon' ], $app_json->restricted->{$app_json->submitblock->{"all"}->allow} ) ) {
346            $blocked = 0;
347            $bypass = 1;
348        }
349    } else {
350        if ( isset( $app_json->submitblock->{$GLOBALS['resource']} ) &&
351             isset( $app_json->submitblock->{$GLOBALS['resource']}->active ) &&
352             $app_json->submitblock->{$GLOBALS['resource']}->active == 1 ) {
353            $blocked = 1;
354            $blocked_msg = 
355                [ "icon" => "warning.png",
356                  "text" => "<p>" . ( isset( $app_json->submitblock->{$GLOBALS['resource']}->text ) 
357                                      ? $app_json->submitblock->{$GLOBALS['resource']}->text 
358                                      : ( "Submission of jobs to " . $GLOBALS['resource'] . " is currently disabled." ) ) . "</p>"
359                ];
360            if (  isset( $app_json->submitblock->{$GLOBALS['resource']}->allow ) &&
361                  isset( $app_json->restricted ) &&
362                  isset( $app_json->restricted->{ $app_json->submitblock->{$GLOBALS['resource']}->allow } ) &&
363                  in_array( $GLOBALS[ 'logon' ], $app_json->restricted->{$app_json->submitblock->{$GLOBALS['resource']}->allow} ) ) {
364                $blocked = 0;
365                $bypass = 1;
366            }
367        }                   
368    }
369    if ( $blocked ) {
370        __~debug:submitblock{error_log( "base.php submit block blocked\n", 3, "/tmp/mylog" );}
371        $results[ "_message" ] = $blocked_msg;
372        if ( isset( $checkrunning ) ) {
373            try {
374                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
375            } catch(MongoCursorException $e) {
376                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
377            }
378        }
379        $results[ '_status' ] = 'failed';
380        echo (json_encode($results));
381        exit();
382    }
383    if ( $bypass ) {
384        __~debug:submitblock{error_log( "base.php submit block bypassed\n", 3, "/tmp/mylog" );}
385        $blocked_msg[ 'text' ] .= "<p>Your permissions allowed submission anyway.</p>";
386        $results[ "_message" ] = $blocked_msg;
387    }       
388} else {
389    __~debug:submitblock{error_log( "submitblock not found\n" . json_decode( $app_json, JSON_PRETTY_PRINT ) . "\n", 3, "/tmp/mylog" );}
390}
391             
392
393__~debug:basemylog{error_log( "cmdprefix $cmdprefix\n", 3, "/tmp/mylog" );}
394__~debug:basemylog{error_log( "globals resource " . $GLOBALS['resource'] . "\n", 3, "/tmp/mylog" );}
395
396$org_request = $_REQUEST;
397
398// date_default_timezone_set("UTC");
399// $org_request[ '_datetime' ] = date( "Y M d H:i:s T", time() );
400
401function fileerr_msg($code)
402{
403    switch ($code) {
404        case UPLOAD_ERR_INI_SIZE:
405            $message = "The uploaded file exceeds the upload_max_filesize directive in php.ini";
406            break;
407        case UPLOAD_ERR_FORM_SIZE:
408            $message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
409            break;
410        case UPLOAD_ERR_PARTIAL:
411            $message = "The uploaded file was only partially uploaded";
412            break;
413        case UPLOAD_ERR_NO_FILE:
414            $message = "No file was uploaded";
415            break;
416        case UPLOAD_ERR_NO_TMP_DIR:
417            $message = "Missing a temporary folder";
418            break;
419        case UPLOAD_ERR_CANT_WRITE:
420            $message = "Failed to write file to disk";
421            break;
422        case UPLOAD_ERR_EXTENSION:
423            $message = "File upload stopped by extension";
424            break;
425         default:
426            $message = "Unknown upload error";
427            break;
428    }
429    return $message;
430} 
431
432__~debug:basemylog{error_log( "request\n" . print_r( $_REQUEST, true ) . "\n", 3, "/tmp/mylog" );}
433
434// special fake _FILES creation for strange bug
435if ( !sizeof( $_FILES ) ) {
436   $selalt = "_selaltval_";
437   $lenselalt = strlen( $selalt );
438   $found_selalt = false;
439   foreach ( $_REQUEST as $k=>$v ) {
440      if ( !strncmp( $k, $selalt, $lenselalt ) ) {
441          $found_selalt = true;
442          $tmp_key = substr( $k, $lenselalt );
443          $_FILES[ $tmp_key ] = json_decode( '{"name":"","type":"","tmp_name":"","error":4,"size":0}', true );
444          error_log( "__executable__ no files but found _selaltval_ with key $tmp_key\n", 3, "/tmp/mylog_selalt" );
445      }
446   }
447   if ( $found_selalt ) {
448       error_log( "__executable__ request\n" . print_r( $_REQUEST, true ) . "\n", 3, "/tmp/mylog_selalt" );
449       error_log( "files\n" . print_r( $_FILES, true ) . "\n", 3, "/tmp/mylog_selalt" );
450   }
451}
452
453if ( sizeof( $_FILES ) ) {
454
455    $module_json = json_decode( '__modulejson__' );
456    $required_files = [];
457
458    if ( isset( $module_json->fields ) ) {
459        foreach ( $module_json->fields as $k=>$v ) {
460            __~debug:trimfiles{error_log( "module json field $k\n" . print_r( json_encode( $v, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
461            if ( 
462                isset( $v->id ) 
463                && isset( $v->role )     && $v->role == "input"
464                && isset( $v->type )     && substr( $v->type, -4 ) == "file"
465                && isset( $v->required ) && strtolower( $v->required ) != "false" ) {
466                $required_files[ $v->id ] = 1;
467            }
468        }
469    }
470    __~debug:trimfiles{error_log( "required_files:\n" . print_r( json_encode( $required_files, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
471
472    // trim missing non-required
473    __~debug:trimfiles{error_log( "files:\n" . print_r( json_encode( $_FILES, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
474   
475    foreach ( $_FILES as $k=>$v ) {
476        if ( isset( $v[ 'name' ] ) && 
477             is_string( $v[ 'name' ] ) && 
478             !strlen( $v[ 'name' ] ) && 
479             !isset( $required_files[ $k ] ) &&
480             ( isset( $_REQUEST[ "_selaltval_$k" ] ) 
481               ? !isset( $_REQUEST[ $_REQUEST[ "_selaltval_$k" ] ] ) || empty( $_REQUEST[ $_REQUEST[ "_selaltval_$k" ] ] )
482               : 1 )
483              ) {
484            unset( $_FILES[ $k ] );
485        }
486    }
487    __~debug:trimfiles{error_log( "files after trim:\n" . print_r( json_encode( $_FILES, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
488
489   __~debug:basemylog{error_log( "files\n" . print_r( $_FILES, true ) . "\n", 3, "/tmp/mylog" );}
490   foreach ( $_FILES as $k=>$v )
491   {
492      if ( is_array( $v[ 'error' ] ) )
493      {
494         foreach ( $v[ 'error' ] as $k1=>$v1 )
495         {
496            if ( $v[ 'error' ][ $k1 ] )
497            {
498               if ( isset( $checkrunning ) )
499               {
500                  try {
501                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
502                  } catch(MongoCursorException $e) {
503                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
504                  }
505               }
506               if ( !isset( $results[ "error" ] ) )
507               {
508                   $results[ "error" ] = "";
509               }
510               if ( is_string( $v[ 'name' ][ $k1 ] ) && !strlen( $v[ 'name' ][ $k1 ] ) )
511               {
512                  $results[ "error" ] .= "Missing file input for identifier " . $k;
513               } else {
514                  $results[ "error" ] .= "Error uploading file " . $v[ 'name' ][ $k1 ] . " Error code:" . $v[ 'error' ][ $k1 ] . " " . fileerr_msg( $v[ 'error' ][ $k1 ] );
515               }
516               $results[ '_status' ] = 'failed';
517               echo (json_encode($results));
518               exit();
519            }
520//            error_log( "move_uploaded_file( " . $v[ 'tmp_name' ][ $k1 ] . ',' .  $dir . '/' . $v[ 'name' ][ $k1 ] . "\n", 3, "/var/tmp/my-errors.log");
521            if ( !move_uploaded_file( $v[ 'tmp_name' ][ $k1 ], $dir . '/' . $v[ 'name' ][ $k1 ] ) )
522            {
523               if ( isset( $checkrunning ) )
524               {
525                  try {
526                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
527                  } catch(MongoCursorException $e) {
528                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
529                  }
530               }
531               if ( !isset( $results[ "error" ] ) )
532               {
533                   $results[ "error" ] = "";
534               }
535               $results[ "error" ] .= "Could not move file " . $v[ 'name' ][ $k1 ];
536               $results[ '_status' ] = 'failed';
537               echo (json_encode($results));
538               exit();
539            }
540            if ( !isset( $_REQUEST[ $k ] ) || !is_array( $_REQUEST[ $k ] ) )
541            {
542               $_REQUEST[ $k ] = array();
543            }
544            $_REQUEST[ $k ][] = $dir . '/' . $v[ 'name' ][ $k1 ];
545            if ( !isset( $org_request[ $k ] ) || !is_array( $org_request[ $k ] ) )
546            {
547               $org_request[ $k ] = array();
548            }
549            $org_request[ $k ][] = $v[ 'name' ][ $k1 ];
550         }
551      } else {
552         if ( $v[ 'error' ] == 4 &&
553              isset( $_REQUEST[ '_selaltval_' . $k ] ) &&
554              isset( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ] ) &&
555              count( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ] ) == 1 ) 
556         {
557            $f = $bdir . substr( base64_decode( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ][ 0 ] ), 2 );
558            if ( !file_exists( $f ) )
559            {
560               if ( isset( $checkrunning ) )
561               {
562                  try {
563                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
564                  } catch(MongoCursorException $e) {
565                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
566                  }
567               }
568               $results[ "error" ] = "Missing file input for identifier " . $k;
569               $results[ '_status' ] = 'failed';
570               echo (json_encode($results));
571               exit();
572            }
573
574            if ( !isset( $_REQUEST[ $k ] ) || !is_array( $_REQUEST[ $k ] ) )
575            {
576               $_REQUEST[ $k ] = array();
577            }
578            $_REQUEST[ $k ][] = $f;
579            unset( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ] );
580            unset( $_REQUEST[ '_selaltval_' . $k ] );
581         } else {
582            if ( $v[ 'error' ] )
583            {
584               if ( isset( $checkrunning ) )
585               {
586                  try {
587                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
588                  } catch(MongoCursorException $e) {
589                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
590                  }
591               }
592               if ( !isset( $results[ "error" ] ) )
593               {
594                   $results[ "error" ] = "";
595               }
596               if ( is_string( $v[ 'name' ] ) && !strlen( $v[ 'name' ] ) )
597               {
598                  $results[ "error" ] .= "Missing file input for identifier " . $k;
599               } else {
600                  $results[ "error" ] .= "Error uploading file " . $v[ 'name' ] . " Error code:" . $v[ 'error' ] . " " . fileerr_msg( $v[ 'error' ] );
601               }
602               $results[ '_status' ] = 'failed';
603               echo (json_encode($results));
604               exit();
605            }
606//         error_log( "move_uploaded_file( " . $v[ 'tmp_name' ] . ',' .  $dir . '/' . $v[ 'name' ] . "\n", 3, "/var/tmp/my-errors.log");
607            if ( !move_uploaded_file( $v[ 'tmp_name' ], $dir . '/' . $v[ 'name' ] ) )
608            {
609               if ( isset( $checkrunning ) )
610               {
611                  try {
612                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
613                  } catch(MongoCursorException $e) {
614                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
615                  }
616               }
617               $results[ "error" ] .= "Could not move file " . $v[ 'name' ];
618               $results[ '_status' ] = 'failed';
619               echo (json_encode($results));
620               exit();
621            }
622            if ( !isset( $_REQUEST[ $k ] ) || !is_array( $_REQUEST[ $k ] ) )
623            {
624               $_REQUEST[ $k ] = array();
625            }
626            $_REQUEST[ $k ][] = $dir . '/' . $v[ 'name' ];
627            if ( !isset( $org_request[ $k ] ) || !is_array( $org_request[ $k ] ) )
628            {
629               $org_request[ $k ] = array();
630            }
631            $org_request[ $k ][] = $v[ 'name' ];
632         }
633      }
634   }
635}
636
637if ( sizeof( $_REQUEST ) )
638{
639    ob_start();
640    if ( !file_put_contents( "$logdir/_input_" . $_REQUEST[ '_uuid' ], json_encode( $org_request  ) ) )
641    {
642        $cont = ob_get_contents();
643        ob_end_clean();
644        if ( isset( $checkrunning ) )
645        {
646            try {
647                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
648            } catch(MongoCursorException $e) {
649                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
650            }
651        }
652        $results[ "error" ] .= "Could not write _input file data " . $cont;
653        $results[ '_status' ] = 'failed';
654        echo (json_encode($results));
655        exit();
656    }
657    ob_end_clean();
658    unset( $org_request );
659
660    $decodekeys = preg_grep( '/^_decodepath_/', array_keys( $_REQUEST ) );
661__~debug:basemylog{    error_log( "decode keys\n" . print_r( $decodekeys, true ) . "\n", 3, "/tmp/mylog" );}
662    foreach ( $decodekeys as $v ) {                     
663        $v1 = substr( $v, 12 );
664__~debug:basemylog{        error_log( "decode key $v -> $v1\n", 3, "/tmp/mylog" );}
665        if ( isset( $_REQUEST[ $v1 ] ) ) {
666__~debug:basemylog{            error_log( "is set request $v1\n", 3, "/tmp/mylog" );}
667            foreach ( $_REQUEST[ $v1 ] as $k2=>$v2 ) {
668__~debug:basemylog{                error_log( "foreach set request $v1: $k2 => $v2\n", 3, "/tmp/mylog" );}
669                $_REQUEST[ $v1 ][ $k2 ] = $bdir . substr( base64_decode( $v2 ), 2 );
670            }
671        } else {
672__~debug:basemylog{            error_log( "is NOT set request $v1\n", 3, "/tmp/mylog" );}
673        }
674    }
675
676    $keys = preg_grep( "/-/", array_keys( $_REQUEST ) );
677    foreach ( $keys as $k => $v )
678    {
679        $a = preg_split( "/-/", $v );
680        $_REQUEST[ $a[ 0 ] ][ $a[ 1 ] - 1 ] = $_REQUEST[ $v ];
681        unset( $_REQUEST[ $v ] );
682    }
683
684__~debug:basemylog{    error_log( "request ready to jsonize\n" . print_r( $_REQUEST, true ) . "\n", 3, "/tmp/mylog" );}
685    $json = json_encode( $_REQUEST );
686    $json = str_replace( "'", "_", $json );
687    ob_start();
688    if ( !chdir( $dir ) )
689    {
690      $cont = ob_get_contents();
691      ob_end_clean();
692      if ( isset( $checkrunning ) )
693      {
694         try {
695             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
696         } catch(MongoCursorException $e) {
697             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
698         }
699      }
700      $results[ "error" ] .= "Could not create directory " . $dir . " " . $cont;
701      $results[ '_status' ] = 'failed';
702      echo (json_encode($results));
703      exit();
704    }
705    ob_end_clean();
706    if ( isset( $fileargs ) )
707    {
708      ob_start();
709      if (!file_put_contents( "$logdir/_args_" . $_REQUEST[ '_uuid' ], $json ) )
710      {
711         $cont = ob_get_contents();
712         ob_end_clean();
713         if ( isset( $checkrunning ) )
714         {
715            try {
716                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
717            } catch(MongoCursorException $e) {
718                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
719            }
720         }
721         $results[ "error" ] .= "Could not write _args for remote submission " . $cont;
722         $results[ '_status' ] = 'failed';
723         echo (json_encode($results));
724         exit();
725      }
726      ob_end_clean();
727      // this is overriding too much, needs correction
728      if( $cmdprefix == "airavatarun" ) { 
729         $cmd = "$adir/$cmdprefix";
730         $cmd .= " __menu:modules:id__";
731         $cmd .= " '$json'"; 
732      } else {
733          $register = "perl $adir/util/ga_regpid_udp.pl __application__ " . 
734              $GLOBALS['resource'] . " " . 
735              $_REQUEST[ '_udphost' ] . " " .
736              $_REQUEST[ '_udpport' ] . " " .
737              $_REQUEST[ '_uuid' ] . " " .
738              '$$';
739
740          $cmd = "$cmdprefix '$register;cd $dir;$cmd \"\$(< $logdir/_args_" . $_REQUEST[ '_uuid' ] . ")\"'";
741      }
742    } else {
743      $cmd .= " '$json'";
744    }
745
746    $cmd .= " 2> $logdir/_stderr_" . $_REQUEST[ '_uuid' ] . " | head -c50000000";
747    __~debug:basemylog{error_log( "\tcmd: <$cmd>\n", 3, "/tmp/mylog" );}
748
749    $cmdfile = "$logdir/_cmds_" . $_REQUEST[ '_uuid' ];
750
751    ob_start();
752    if ( !file_put_contents( $cmdfile, $cmd ) )
753    {
754       $cont = ob_get_contents();
755       ob_end_clean();
756       if ( isset( $checkrunning ) )
757       {
758          try {
759              $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
760          } catch(MongoCursorException $e) {
761              $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
762          }
763       }
764       $results[ "error" ] .= "Could not write _cmds_ for remote submission " . $cont;
765       $results[ '_status' ] = 'failed';
766       echo (json_encode($results));
767       exit();
768    }
769    ob_end_clean();
770
771    logjobstart(__~cache{ false, "__cache__" });
772
773    $altcmd = "nohup /usr/local/bin/php __docroot:html5__/__application__/util/jobrun.php '" . $GLOBALS[ 'logon' ] . "' " . $_REQUEST[ '_uuid' ] . " " . ( isset( $checkrunning ) ? "1" : "0" ) . " 2>&1 >> /tmp/php_errors &";
774
775//    error_log( "\taltcmd:\n$altcmd\n", 3, "/tmp/mylog" );
776
777    __~debug:runjob{error_log( "base.php exec nohup jobrun\n", 3, "/tmp/php_errors" );}
778     
779    exec( $altcmd );
780
781    $results[ "_status" ] = "started";
782    __~debug:job{$results[ "jobrun" ] = "started";}
783   
784    if ( $do_logoff == 1 ) {
785        $results[ '_logon' ] = "";
786    }
787
788    echo json_encode( $results );
789    exit;
790
791    if ( isset( $results[ "_fs_clear" ] ) )
792    {
793        $fsc = $results[ "_fs_clear" ];
794        $results = '{"_status":"started"__~debug:job{,"jobrun":"started"},"_fs_clear":"' . $fsc . '"}';
795    } else {
796        $results = '{"_status":"started"__~debug:job{,"jobrun":"started"}}';
797    }
798   
799    if ( $do_logoff == 1 )
800    {   
801        $results = substr( trim( $results ), 0, -1 ) . ",\"_logon\":\"\"}";
802    }
803
804    echo $results;
805    exit;
806
807    $results = exec( $cmd );
808
809    logjobupdate( "finished", true );
810
811    $results = str_replace( "__docroot:html5__/__application__/", "", $results );
812    if ( $do_logoff == 1 )
813    {   
814        $results = substr( trim( $results ), 0, -1 ) + ",\"_logon\":\"\"}";
815    }
816
817    ob_start();
818    file_put_contents( "$logdir/_stdout_" . $_REQUEST[ '_uuid' ], $results );
819    ob_end_clean();
820
821    ob_start();
822    $test_json = json_decode( $results );
823    if ( $test_json == NULL )
824    {   
825        $cont = ob_get_contents();
826        ob_end_clean();
827
828        if ( isset( $checkrunning ) )
829        {
830           try {
831               $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
832           } catch(MongoCursorException $e) {
833               $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
834           }
835        }
836
837        if ( strlen( $results ) )
838        {
839            $results[ "error" ] = "Malformed JSON returned from executable $cont";
840            if ( strlen( $results ) > 1000 )
841            {
842                $results[ "executable_returned_end" ] = substr( $results, 0, 450  ) . " .... " . substr( $results, -450 );
843                $results[ "notice" ] = "The executable return string was greater than 1000 characters, so only the first 450 and the last 450 are shown above.  Check $logdir/_stdout for the full output";
844            } else {
845                $results[ "executable_returned" ] = substr( $results, 0, 1000 );
846            }
847        } else {
848            $results[ "error" ] = "Empty JSON returned from executable $cont";
849        }
850
851        ob_start();
852        $stderr = trim( file_get_contents( "$logdir/_stderr_" . $_REQUEST[ '_uuid' ] ) );
853        $cont = ob_get_contents();
854        ob_end_clean();
855        $results[ "error_output" ] = ( strlen( $stderr ) > 0 ) ? $stderr : "EMPTY";
856        if ( strlen( $cont ) )
857        {
858            $results[ "error_output_issue" ] = "reading _stderr reported $cont";
859        }           
860
861        echo (json_encode($results));
862        exit();
863    }
864    ob_end_clean();
865    if ( isset( $checkrunning ) )
866    {
867       try {
868           $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
869       } catch(MongoCursorException $e) {
870           $test_json[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
871       }
872       $results = json_encode( $test_json );
873    }
874} else {
875    if ( isset( $checkrunning ) )
876    {
877       try {
878           $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
879       } catch(MongoCursorException $e) {
880           $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
881       }
882    }
883    $results[ "error" ] .= "PHP code received no \$_REQUEST?";
884    echo (json_encode($results));
885    exit();
886}
887
888// cleanup CURRENTLY DISABLED!
889if ( sizeof( $_FILES ) )
890{
891   $files = new RecursiveIteratorIterator(
892       new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
893       RecursiveIteratorIterator::CHILD_FIRST
894   );
895
896   foreach ($files as $fileinfo) {
897      $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
898//      $todo( $fileinfo->getRealPath() );
899   }
900//   rmdir( $dir );
901}
902echo $results;
903?>
Note: See TracBrowser for help on using the repository browser.