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

Last change on this file since 1495 was 1495, checked in by ehb, 3 years ago

Docker runs locally thru genapp with run directory mounted on container

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