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

Last change on this file since 1263 was 1263, checked in by ehb, 5 years ago

More XSEDE project bits

File size: 41.3 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
216$_REQUEST[ '_udphost' ] =  $_SESSION[ $window ][ 'udphost' ];
217$_REQUEST[ '_udpport' ] =  $_SESSION[ $window ][ 'udpport' ];
218$_REQUEST[ 'resourcedefault' ] = $_SESSION[ $window ][ 'resourcedefault' ];
219$_REQUEST[ '_webroot' ] = "__docroot:html5__";
220$_REQUEST[ '_application' ] = "__application__";
221
222__~resource{$useresource = "__resource__";}
223__~submitpolicy{$submitpolicy = "__submitpolicy__";}
224
225if ( !isset( $submitpolicy ) )
226{
227   if ( isset( $_SESSION[ $window ][ 'submitpolicy' ] ) &&
228        $_SESSION[ $window ][ 'submitpolicy' ] == "login" &&
229        ( !isset( $_SESSION[ $window ][ 'logon' ] ) ||
230          strlen( $_SESSION[ $window ][ 'logon' ] ) == 0 ) )
231   {
232         if ( isset( $checkrunning ) )
233         {
234            try {
235                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
236            } catch(MongoCursorException $e) {
237                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
238            }
239         }
240
241         $results[ "error" ] .= "You must be logged on to submit";
242         $results[ '_status' ] = 'failed';
243         echo (json_encode($results));
244         exit();
245   }
246} else {
247   if ( $submitpolicy == "login" &&
248        ( !isset( $_SESSION[ $window ][ 'logon' ] ) ||
249          strlen( $_SESSION[ $window ][ 'logon' ] ) == 0 ) )
250   {
251         if ( isset( $checkrunning ) )
252         {
253            try {
254                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
255            } catch(MongoCursorException $e) {
256                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
257            }
258         }
259
260         $results[ "error" ] .= "You must be logged on to submit";
261         $results[ '_status' ] = 'failed';
262         echo (json_encode($results));
263         exit();
264   }
265}
266
267$cmdprefix = "";
268
269if ( isset( $_SESSION[ $window ][ 'resourcedefault' ] ) &&
270     $_SESSION[ $window ][ 'resourcedefault' ] == "disabled" )
271{
272      if ( isset( $checkrunning ) )
273      {
274         try {
275             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
276         } catch(MongoCursorException $e) {
277             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
278         }
279      }
280      $results[ "error" ] .= "Job submission is currently disabled";
281      $results[ '_status' ] = 'failed';
282      echo (json_encode($results));
283      exit();
284}
285
286if ( isset( $useresource ) &&
287     !isset( $_SESSION[ $window ][ 'resources' ]->$useresource ) )
288{
289      if ( isset( $checkrunning ) )
290      {
291         try {
292             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
293         } catch(MongoCursorException $e) {
294             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
295         }
296      }
297
298      $results[ "error" ] .= "module specified resource " . $useresource . " is not defined in appconfig";
299      $results[ '_status' ] = 'failed';
300      echo (json_encode($results));
301      exit();
302}
303
304if ( !isset( $_SESSION[ $window ][ 'resources' ]->$_SESSION[ $window ][ 'resourcedefault' ] ) &&
305     !isset( $useresource ) )
306{
307     if ( isset( $checkrunning ) )
308     {
309        try {
310            $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
311        } catch(MongoCursorException $e) {
312            $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
313        }
314     }
315     $results[ "error" ] .= "No default resource specified in appconfig and no resource defined in module. This could be the result of an invalid appconfig.json";
316     $results[ '_status' ] = 'failed';
317     echo (json_encode($results));
318     exit();
319} else {
320   if ( isset( $useresource ) )
321   {
322      $cmdprefix = $_SESSION[ $window ][ 'resources' ]->$useresource;
323      $GLOBALS[ 'resource' ] = $useresource;
324   } else {
325      $cmdprefix = $_SESSION[ $window ][ 'resources' ]->$_SESSION[ $window ][ 'resourcedefault' ];
326      $GLOBALS[ 'resource' ] = $_SESSION[ $window ][ 'resourcedefault' ];
327   }
328   if(isset($cmdprefix->run)){
329      $cmdprefix = $cmdprefix->run;
330   }
331   if ( strlen( $cmdprefix ) > 1 ) {
332      $fileargs = 1;
333   }
334}
335
336if ( isset( $app_json->submitblock ) ) {
337    __~debug:submitblock{error_log( "base.php submitblock found\n", 3, "/tmp/mylog" );}
338    $blocked = 0;
339    $bypass = 0;
340    $blocked_msg = [];
341    if ( isset( $app_json->submitblock->{"all"} ) &&
342         isset( $app_json->submitblock->{"all"}->active ) &&
343         $app_json->submitblock->{"all"}->active == 1 ) {
344        $blocked = 1;
345        $blocked_msg = 
346            [ "icon" => "warning.png",
347              "text" => isset( $app_json->submitblock->{"all"}->text ) 
348              ? $app_json->submitblock->{"all"}->text 
349              : "Submission of jobs to $k is currently disabled."
350            ];
351        if ( isset( $app_json->submitblock->{"all"}->allow ) &&
352             isset( $app_json->restricted ) &&
353             in_array( $app_json->submitblock->{"all"}->allow, $app_json->restricted ) &&
354             in_array( $GLOBALS[ 'logon' ], $app_json->restricted->{$app_json->submitblock->{"all"}->allow} ) ) {
355            $blocked = 0;
356            $bypass = 1;
357        }
358    } else {
359        if ( isset( $app_json->submitblock->{$GLOBALS['resource']} ) &&
360             isset( $app_json->submitblock->{$GLOBALS['resource']}->active ) &&
361             $app_json->submitblock->{$GLOBALS['resource']}->active == 1 ) {
362            $blocked = 1;
363            $blocked_msg = 
364                [ "icon" => "warning.png",
365                  "text" => "<p>" . ( isset( $app_json->submitblock->{$GLOBALS['resource']}->text ) 
366                                      ? $app_json->submitblock->{$GLOBALS['resource']}->text 
367                                      : ( "Submission of jobs to " . $GLOBALS['resource'] . " is currently disabled." ) ) . "</p>"
368                ];
369            if (  isset( $app_json->submitblock->{$GLOBALS['resource']}->allow ) &&
370                  isset( $app_json->restricted ) &&
371                  isset( $app_json->restricted->{ $app_json->submitblock->{$GLOBALS['resource']}->allow } ) &&
372                  in_array( $GLOBALS[ 'logon' ], $app_json->restricted->{$app_json->submitblock->{$GLOBALS['resource']}->allow} ) ) {
373                $blocked = 0;
374                $bypass = 1;
375            }
376        }                   
377    }
378    if ( $blocked ) {
379        __~debug:submitblock{error_log( "base.php submit block blocked\n", 3, "/tmp/mylog" );}
380        $results[ "_message" ] = $blocked_msg;
381        if ( isset( $checkrunning ) ) {
382            try {
383                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
384            } catch(MongoCursorException $e) {
385                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
386            }
387        }
388        $results[ '_status' ] = 'failed';
389        echo (json_encode($results));
390        exit();
391    }
392    if ( $bypass ) {
393        __~debug:submitblock{error_log( "base.php submit block bypassed\n", 3, "/tmp/mylog" );}
394        $blocked_msg[ 'text' ] .= "<p>Your permissions allowed submission anyway.</p>";
395        $results[ "_message" ] = $blocked_msg;
396    }       
397} else {
398    __~debug:submitblock{error_log( "submitblock not found\n" . json_encode( $app_json, JSON_PRETTY_PRINT ) . "\n", 3, "/tmp/mylog" );}
399}
400             
401
402__~debug:basemylog{error_log( "cmdprefix $cmdprefix\n", 3, "/tmp/mylog" );}
403__~debug:basemylog{error_log( "globals resource " . $GLOBALS['resource'] . "\n", 3, "/tmp/mylog" );}
404
405$org_request = $_REQUEST;
406
407// date_default_timezone_set("UTC");
408// $org_request[ '_datetime' ] = date( "Y M d H:i:s T", time() );
409
410function fileerr_msg($code)
411{
412    switch ($code) {
413        case UPLOAD_ERR_INI_SIZE:
414            $message = "The uploaded file exceeds the upload_max_filesize directive in php.ini";
415            break;
416        case UPLOAD_ERR_FORM_SIZE:
417            $message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
418            break;
419        case UPLOAD_ERR_PARTIAL:
420            $message = "The uploaded file was only partially uploaded";
421            break;
422        case UPLOAD_ERR_NO_FILE:
423            $message = "No file was uploaded";
424            break;
425        case UPLOAD_ERR_NO_TMP_DIR:
426            $message = "Missing a temporary folder";
427            break;
428        case UPLOAD_ERR_CANT_WRITE:
429            $message = "Failed to write file to disk";
430            break;
431        case UPLOAD_ERR_EXTENSION:
432            $message = "File upload stopped by extension";
433            break;
434         default:
435            $message = "Unknown upload error";
436            break;
437    }
438    return $message;
439} 
440
441__~debug:basemylog{error_log( "request\n" . print_r( $_REQUEST, true ) . "\n", 3, "/tmp/mylog" );}
442
443// special fake _FILES creation for strange bug
444if ( !sizeof( $_FILES ) ) {
445   $selalt = "_selaltval_";
446   $lenselalt = strlen( $selalt );
447   $found_selalt = false;
448   foreach ( $_REQUEST as $k=>$v ) {
449      if ( !strncmp( $k, $selalt, $lenselalt ) ) {
450          $found_selalt = true;
451          $tmp_key = substr( $k, $lenselalt );
452          $_FILES[ $tmp_key ] = json_decode( '{"name":"","type":"","tmp_name":"","error":4,"size":0}', true );
453          error_log( "__executable__ no files but found _selaltval_ with key $tmp_key\n", 3, "/tmp/mylog_selalt" );
454      }
455   }
456   if ( $found_selalt ) {
457       error_log( "__executable__ request\n" . print_r( $_REQUEST, true ) . "\n", 3, "/tmp/mylog_selalt" );
458       error_log( "files\n" . print_r( $_FILES, true ) . "\n", 3, "/tmp/mylog_selalt" );
459   }
460}
461
462if ( sizeof( $_FILES ) ) {
463
464    $module_json = json_decode( '__modulejson__' );
465    $required_files = [];
466
467    if ( isset( $module_json->fields ) ) {
468        foreach ( $module_json->fields as $k=>$v ) {
469            __~debug:trimfiles{error_log( "module json field $k\n" . print_r( json_encode( $v, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
470            if ( 
471                isset( $v->id ) 
472                && isset( $v->role )     && $v->role == "input"
473                && isset( $v->type )     && substr( $v->type, -4 ) == "file"
474                && isset( $v->required ) && strtolower( $v->required ) != "false" ) {
475                $required_files[ $v->id ] = 1;
476            }
477        }
478    }
479    __~debug:trimfiles{error_log( "required_files:\n" . print_r( json_encode( $required_files, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
480
481    // trim missing non-required
482    __~debug:trimfiles{error_log( "files:\n" . print_r( json_encode( $_FILES, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
483   
484    foreach ( $_FILES as $k=>$v ) {
485        if ( isset( $v[ 'name' ] ) && 
486             is_string( $v[ 'name' ] ) && 
487             !strlen( $v[ 'name' ] ) && 
488             !isset( $required_files[ $k ] ) &&
489             ( isset( $_REQUEST[ "_selaltval_$k" ] ) 
490               ? !isset( $_REQUEST[ $_REQUEST[ "_selaltval_$k" ] ] ) || empty( $_REQUEST[ $_REQUEST[ "_selaltval_$k" ] ] )
491               : 1 )
492              ) {
493            unset( $_FILES[ $k ] );
494        }
495    }
496    __~debug:trimfiles{error_log( "files after trim:\n" . print_r( json_encode( $_FILES, JSON_PRETTY_PRINT ), true ) . "\n", 3, "/tmp/mylog" );}
497
498   __~debug:basemylog{error_log( "files\n" . print_r( $_FILES, true ) . "\n", 3, "/tmp/mylog" );}
499   foreach ( $_FILES as $k=>$v )
500   {
501      if ( is_array( $v[ 'error' ] ) )
502      {
503         foreach ( $v[ 'error' ] as $k1=>$v1 )
504         {
505            if ( $v[ 'error' ][ $k1 ] )
506            {
507               if ( isset( $checkrunning ) )
508               {
509                  try {
510                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
511                  } catch(MongoCursorException $e) {
512                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
513                  }
514               }
515               if ( !isset( $results[ "error" ] ) )
516               {
517                   $results[ "error" ] = "";
518               }
519               if ( is_string( $v[ 'name' ][ $k1 ] ) && !strlen( $v[ 'name' ][ $k1 ] ) )
520               {
521                  $results[ "error" ] .= "Missing file input for identifier " . $k;
522               } else {
523                  $results[ "error" ] .= "Error uploading file " . $v[ 'name' ][ $k1 ] . " Error code:" . $v[ 'error' ][ $k1 ] . " " . fileerr_msg( $v[ 'error' ][ $k1 ] );
524               }
525               $results[ '_status' ] = 'failed';
526               echo (json_encode($results));
527               exit();
528            }
529//            error_log( "move_uploaded_file( " . $v[ 'tmp_name' ][ $k1 ] . ',' .  $dir . '/' . $v[ 'name' ][ $k1 ] . "\n", 3, "/var/tmp/my-errors.log");
530            if ( !move_uploaded_file( $v[ 'tmp_name' ][ $k1 ], $dir . '/' . $v[ 'name' ][ $k1 ] ) )
531            {
532               if ( isset( $checkrunning ) )
533               {
534                  try {
535                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
536                  } catch(MongoCursorException $e) {
537                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
538                  }
539               }
540               if ( !isset( $results[ "error" ] ) )
541               {
542                   $results[ "error" ] = "";
543               }
544               $results[ "error" ] .= "Could not move file " . $v[ 'name' ][ $k1 ];
545               $results[ '_status' ] = 'failed';
546               echo (json_encode($results));
547               exit();
548            }
549            if ( !isset( $_REQUEST[ $k ] ) || !is_array( $_REQUEST[ $k ] ) )
550            {
551               $_REQUEST[ $k ] = array();
552            }
553            $_REQUEST[ $k ][] = $dir . '/' . $v[ 'name' ][ $k1 ];
554            if ( !isset( $org_request[ $k ] ) || !is_array( $org_request[ $k ] ) )
555            {
556               $org_request[ $k ] = array();
557            }
558            $org_request[ $k ][] = $v[ 'name' ][ $k1 ];
559         }
560      } else {
561         if ( $v[ 'error' ] == 4 &&
562              isset( $_REQUEST[ '_selaltval_' . $k ] ) &&
563              isset( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ] ) &&
564              count( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ] ) == 1 ) 
565         {
566            $f = $bdir . substr( base64_decode( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ][ 0 ] ), 2 );
567            if ( !file_exists( $f ) )
568            {
569               if ( isset( $checkrunning ) )
570               {
571                  try {
572                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
573                  } catch(MongoCursorException $e) {
574                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
575                  }
576               }
577               $results[ "error" ] = "Missing file input for identifier " . $k;
578               $results[ '_status' ] = 'failed';
579               echo (json_encode($results));
580               exit();
581            }
582
583            if ( !isset( $_REQUEST[ $k ] ) || !is_array( $_REQUEST[ $k ] ) )
584            {
585               $_REQUEST[ $k ] = array();
586            }
587            $_REQUEST[ $k ][] = $f;
588            unset( $_REQUEST[ $_REQUEST[ '_selaltval_' . $k ] ] );
589            unset( $_REQUEST[ '_selaltval_' . $k ] );
590         } else {
591            if ( $v[ 'error' ] )
592            {
593               if ( isset( $checkrunning ) )
594               {
595                  try {
596                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
597                  } catch(MongoCursorException $e) {
598                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
599                  }
600               }
601               if ( !isset( $results[ "error" ] ) )
602               {
603                   $results[ "error" ] = "";
604               }
605               if ( is_string( $v[ 'name' ] ) && !strlen( $v[ 'name' ] ) )
606               {
607                  $results[ "error" ] .= "Missing file input for identifier " . $k;
608               } else {
609                  $results[ "error" ] .= "Error uploading file " . $v[ 'name' ] . " Error code:" . $v[ 'error' ] . " " . fileerr_msg( $v[ 'error' ] );
610               }
611               $results[ '_status' ] = 'failed';
612               echo (json_encode($results));
613               exit();
614            }
615//         error_log( "move_uploaded_file( " . $v[ 'tmp_name' ] . ',' .  $dir . '/' . $v[ 'name' ] . "\n", 3, "/var/tmp/my-errors.log");
616            if ( !move_uploaded_file( $v[ 'tmp_name' ], $dir . '/' . $v[ 'name' ] ) )
617            {
618               if ( isset( $checkrunning ) )
619               {
620                  try {
621                      $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
622                  } catch(MongoCursorException $e) {
623                      $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
624                  }
625               }
626               $results[ "error" ] .= "Could not move file " . $v[ 'name' ];
627               $results[ '_status' ] = 'failed';
628               echo (json_encode($results));
629               exit();
630            }
631            if ( !isset( $_REQUEST[ $k ] ) || !is_array( $_REQUEST[ $k ] ) )
632            {
633               $_REQUEST[ $k ] = array();
634            }
635            $_REQUEST[ $k ][] = $dir . '/' . $v[ 'name' ];
636            if ( !isset( $org_request[ $k ] ) || !is_array( $org_request[ $k ] ) )
637            {
638               $org_request[ $k ] = array();
639            }
640            $org_request[ $k ][] = $v[ 'name' ];
641         }
642      }
643   }
644}
645
646function only_numerics( $a ) {
647    $b = [];
648    foreach ( $a as $v ) {
649        if ( ctype_digit( $v ) ) {
650            $b[] = $v;
651        }
652    }
653    __~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" );}
654    return $b;
655}
656
657function last_nonnumeric( $a ) {
658    $i = count( $a ) - 1;
659    while ( $i >= 0 && ctype_digit( $a[ $i ] ) ) {
660        --$i;
661    }
662    if ( $i < 0 ) {
663        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" );
664        return $a[ 0 ];
665    }
666    __~debug:basemylog{error_log( "last non numeric from:\n" . json_encode( $a, JSON_PRETTY_PRINT ) . "\n is " . $a[$i] . "\n", 3, "/tmp/mylog" );}
667    return $a[ $i ];
668}   
669
670
671if ( sizeof( $_REQUEST ) )
672{
673    ob_start();
674    if ( !file_put_contents( "$logdir/_input_" . $_REQUEST[ '_uuid' ], json_encode( $org_request  ) ) )
675    {
676        $cont = ob_get_contents();
677        ob_end_clean();
678        if ( isset( $checkrunning ) )
679        {
680            try {
681                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
682            } catch(MongoCursorException $e) {
683                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
684            }
685        }
686        $results[ "error" ] .= "Could not write _input file data " . $cont;
687        $results[ '_status' ] = 'failed';
688        echo (json_encode($results));
689        exit();
690    }
691    ob_end_clean();
692    unset( $org_request );
693
694    $decodekeys = preg_grep( '/^_decodepath_/', array_keys( $_REQUEST ) );
695__~debug:basemylog{    error_log( "decode keys\n" . print_r( $decodekeys, true ) . "\n", 3, "/tmp/mylog" );}
696    foreach ( $decodekeys as $v ) {                     
697        $v1 = substr( $v, 12 );
698__~debug:basemylog{        error_log( "decode key $v -> $v1\n", 3, "/tmp/mylog" );}
699        if ( isset( $_REQUEST[ $v1 ] ) ) {
700__~debug:basemylog{            error_log( "is set request $v1\n", 3, "/tmp/mylog" );}
701            foreach ( $_REQUEST[ $v1 ] as $k2=>$v2 ) {
702__~debug:basemylog{                error_log( "foreach set request $v1: $k2 => $v2\n", 3, "/tmp/mylog" );}
703                $_REQUEST[ $v1 ][ $k2 ] = $bdir . substr( base64_decode( $v2 ), 2 );
704            }
705        } else {
706__~debug:basemylog{            error_log( "is NOT set request $v1\n", 3, "/tmp/mylog" );}
707        }
708    }
709
710    __~debug:basemylog{error_log( "old repeaters __oldrepeaters__ newrepeaters __newrepeaters__\n", 3, "/tmp/mylog" );}
711    $keys = preg_grep( "/-/", array_keys( $_REQUEST ) );
712    foreach ( $keys as $k => $v ) {
713        if ( !preg_match( "/^_/", $v ) ) {
714            $a = preg_split( "/-/", $v );
715            if ( !__~extendedjsoninputtags{1}0 ) {
716                if ( 1 ) {
717                    $b = only_numerics( $a );
718                    $tag = last_nonnumeric( $a );
719                    if ( count( $b ) ) {
720                        if ( !isset( $_REQUEST[ $tag ] ) || !is_array( $_REQUEST[ $tag ] ) ) {
721                            $_REQUEST[ $tag ] = [];
722                        }
723                        if ( !is_array( $_REQUEST[ $tag ] ) ) {
724                            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" );
725                        } else {
726                            $obj = &$_REQUEST[ $tag ];
727                            foreach ( $b as $v2 ) {
728                                if ( !isset( $obj[ $v2 ] ) ) {
729                                    $obj[ $v2 ] = [];
730                                }
731                                if ( !is_array( $obj[ $v2 ] ) ) {
732                                    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" );
733                                    break;
734                                }
735                                if ( count( $obj ) <= $v2 ) {
736                                    __~debug:basemylog{error_log( "for $v ... v2 is $v2 filling upto $v2\n", 3, "/tmp/mylog" );}
737                                    $obj += array_fill( 0, $v2 + 1, null );
738                                    ksort( $obj );
739                                }
740                                $obj = &$obj[ $v2 ];
741                            }
742                            $obj = $_REQUEST[ $v ];
743                        }
744                    } else {
745                        $_REQUEST[ $tag ] = $_REQUEST[ $v ];
746                    }
747                } else {
748                    $i = count( $a ) - 1;
749                    $isdigit = ctype_digit( $a[ $i ] );
750                    __~debug:basemylog{error_log( "old repeaters style used isdigit=$isdigit i=$i key=" . $a[$i] . " value $v\n", 3, "/tmp/mylog" );}
751                    if ( $isdigit && $i > 0 ) {
752                        __~debug:basemylog{error_log( "array add $v\n", 3, "/tmp/mylog" );}
753                        if ( !is_array( $_REQUEST[ $a[ $i - 1 ] ] ) ) {
754                            $_REQUEST[ $a[ $i - 1 ] ] = [];
755                        }
756                        $_REQUEST[ $a[ $i - 1 ] ][ $a[ $i ] ] = $_REQUEST[ $v ];
757                    } else {
758                        if ( !$isdigit ) {
759                            __~debug:basemylog{error_log( "not array add $v\n", 3, "/tmp/mylog" );}
760                            $_REQUEST[ $a[ $i ] ] = $_REQUEST[ $v ];
761                        } else {
762                            __~debug:basemylog{error_log( "not array add $v and skipped\n", 3, "/tmp/mylog" )};
763                        }
764                    }
765                }
766                unset( $_REQUEST[ $v ] );
767            } else { // old new way of long tags
768                __~debug:basemylog{error_log( "new repeaters style used\n", 3, "/tmp/mylog" );}
769                __~debug:basemylog{error_log( "preg_split of $v:\n" . json_encode( $a, JSON_PRETTY_PRINT ) . "\n", 3, "/tmp/mylog" );}
770                if ( !isset( $_REQUEST[ $a[ 0 ] ] ) || !is_array( $_REQUEST[ $a[ 0 ] ] ) ) {
771                    $_REQUEST[ $a[ 0 ] ] = [];
772                }
773                $obj = &$_REQUEST[ $a[ 0 ] ];
774                for ( $i = 1; $i < count( $a ) - 1; ++$i ) {
775                    if ( !isset( $obj[ $a[ $i ] ] ) || !is_array( $obj[ $a[ $i ] ] ) ) {
776                        $obj[ $a[ $i ] ] = [];
777                    }
778                    if ( ctype_digit( $a[ $i ] ) && count( $obj ) <= $a[ $i ] ) {
779                        __~debug:basemylog{error_log( "for $v ...\$a[\$i] is $a[$i] filling upto $a[$i]\n", 3, "/tmp/mylog" );}
780                        $obj += array_fill( 0, $a[ $i ] + 1, null );
781                        ksort( $obj );
782                    }
783                    $obj = &$obj[ $a[ $i ] ];
784                }
785                $obj[ $a[ count( $a ) - 1 ] ] = $_REQUEST[ $v ];
786                // $_REQUEST[ $a[ 0 ] ][ $a[ 1 ] - 1 ] = $_REQUEST[ $v ];
787                unset( $_REQUEST[ $v ] );
788            }
789        }
790    }
791
792    __~debug:basemylog{error_log( "request ready to jsonize\n" . print_r( $_REQUEST, true ) . "\n", 3, "/tmp/mylog" );}
793    __~debug:basemylog{error_log( "request in json" . json_encode( $_REQUEST, JSON_PRETTY_PRINT ) . "\n", 3, "/tmp/mylog" );}
794    $json = json_encode( $_REQUEST );
795    $json = str_replace( "'", "_", $json );
796    ob_start();
797    if ( !chdir( $dir ) )
798    {
799      $cont = ob_get_contents();
800      ob_end_clean();
801      if ( isset( $checkrunning ) )
802      {
803         try {
804             $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
805         } catch(MongoCursorException $e) {
806             $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
807         }
808      }
809      $results[ "error" ] .= "Could not create directory " . $dir . " " . $cont;
810      $results[ '_status' ] = 'failed';
811      echo (json_encode($results));
812      exit();
813    }
814    ob_end_clean();
815    if ( strlen( $json ) > 129000 ) {
816        $fileargs = 1;
817        $bigargs = 1;
818    }
819    if ( isset( $fileargs ) )
820    {
821      ob_start();
822      if (!file_put_contents( "$logdir/_args_" . $_REQUEST[ '_uuid' ], $json ) )
823      {
824         $cont = ob_get_contents();
825         ob_end_clean();
826         if ( isset( $checkrunning ) )
827         {
828            try {
829                $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
830            } catch(MongoCursorException $e) {
831                $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
832            }
833         }
834         $results[ "error" ] .= "Could not write _args for remote submission " . $cont;
835         $results[ '_status' ] = 'failed';
836         echo (json_encode($results));
837         exit();
838      }
839      ob_end_clean();
840      // this is overriding too much, needs correction
841      if( $cmdprefix == "airavatarun" ||
842          $cmdprefix == "oscluster" ) { 
843         $cmd = "$adir/$cmdprefix";
844         $cmd .= $cmdprefix == "oscluster" ? " __executable__" : " __menu:modules:id__";
845         $cmd .= " '$json'"; 
846      } else {
847          if ( strlen( $cmdprefix ) ) {
848              $register = "perl $adir/util/ga_regpid_udp.pl __application__ " . 
849                  $GLOBALS['resource'] . " " . 
850                  $_REQUEST[ '_udphost' ] . " " .
851                  $_REQUEST[ '_udpport' ] . " " .
852                  $_REQUEST[ '_uuid' ] . " " .
853                  '$$';
854
855              if ( isset( $bigargs ) ) {
856                  $cmd = "$cmdprefix '$register;cd $dir;$cmd @$logdir/_args_" . $_REQUEST[ '_uuid' ] . "'";
857              } else {
858                  $cmd = "$cmdprefix '$register;cd $dir;$cmd \"\$(< $logdir/_args_" . $_REQUEST[ '_uuid' ] . ")\"'";
859              }                 
860          } else {
861              if ( isset( $bigargs ) ) {
862                  $cmd = "$cmd @$logdir/_args_" . $_REQUEST[ '_uuid' ];
863              } else {
864                  $cmd = "$cmd \"\$(< $logdir/_args_" . $_REQUEST[ '_uuid' ] . ")\"";
865              }
866          }             
867      }
868    } else {
869      $cmd .= " '$json'";
870    }
871
872    $cmd .= " 2> $logdir/_stderr_" . $_REQUEST[ '_uuid' ] . " | head -c50000000";
873    __~debug:basemylog{error_log( "\tcmd: <$cmd>\n", 3, "/tmp/mylog" );}
874
875    $cmdfile = "$logdir/_cmds_" . $_REQUEST[ '_uuid' ];
876
877    ob_start();
878    if ( !file_put_contents( $cmdfile, $cmd ) )
879    {
880       $cont = ob_get_contents();
881       ob_end_clean();
882       if ( isset( $checkrunning ) )
883       {
884          try {
885              $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
886          } catch(MongoCursorException $e) {
887              $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
888          }
889       }
890       $results[ "error" ] .= "Could not write _cmds_ for remote submission " . $cont;
891       $results[ '_status' ] = 'failed';
892       echo (json_encode($results));
893       exit();
894    }
895    ob_end_clean();
896
897    logjobstart(__~cache{ false, "__cache__" });
898
899    $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 &";
900
901//    error_log( "\taltcmd:\n$altcmd\n", 3, "/tmp/mylog" );
902
903    __~debug:runjob{error_log( "base.php exec nohup jobrun\n", 3, "/tmp/php_errors" );}
904     
905    exec( $altcmd );
906
907    $results[ "_status" ] = "started";
908    __~debug:job{$results[ "jobrun" ] = "started";}
909   
910    if ( $do_logoff == 1 ) {
911        $results[ '_logon' ] = "";
912    }
913
914    echo json_encode( $results );
915    exit;
916
917    if ( isset( $results[ "_fs_clear" ] ) )
918    {
919        $fsc = $results[ "_fs_clear" ];
920        $results = '{"_status":"started"__~debug:job{,"jobrun":"started"},"_fs_clear":"' . $fsc . '"}';
921    } else {
922        $results = '{"_status":"started"__~debug:job{,"jobrun":"started"}}';
923    }
924   
925    if ( $do_logoff == 1 )
926    {   
927        $results = substr( trim( $results ), 0, -1 ) . ",\"_logon\":\"\"}";
928    }
929
930    echo $results;
931    exit;
932
933    $results = exec( $cmd );
934
935    logjobupdate( "finished", true );
936
937    $results = str_replace( "__docroot:html5__/__application__/", "", $results );
938    if ( $do_logoff == 1 )
939    {   
940        $results = substr( trim( $results ), 0, -1 ) + ",\"_logon\":\"\"}";
941    }
942
943    ob_start();
944    file_put_contents( "$logdir/_stdout_" . $_REQUEST[ '_uuid' ], $results );
945    ob_end_clean();
946
947    ob_start();
948    $test_json = json_decode( $results );
949    if ( $test_json == NULL )
950    {   
951        $cont = ob_get_contents();
952        ob_end_clean();
953
954        if ( isset( $checkrunning ) )
955        {
956           try {
957               $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
958           } catch(MongoCursorException $e) {
959               $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
960           }
961        }
962
963        if ( strlen( $results ) )
964        {
965            $results[ "error" ] = "Malformed JSON returned from executable $cont";
966            if ( strlen( $results ) > 1000 )
967            {
968                $results[ "executable_returned_end" ] = substr( $results, 0, 450  ) . " .... " . substr( $results, -450 );
969                $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";
970            } else {
971                $results[ "executable_returned" ] = substr( $results, 0, 1000 );
972            }
973        } else {
974            $results[ "error" ] = "Empty JSON returned from executable $cont";
975        }
976
977        ob_start();
978        $stderr = trim( file_get_contents( "$logdir/_stderr_" . $_REQUEST[ '_uuid' ] ) );
979        $cont = ob_get_contents();
980        ob_end_clean();
981        $results[ "error_output" ] = ( strlen( $stderr ) > 0 ) ? $stderr : "EMPTY";
982        if ( strlen( $cont ) )
983        {
984            $results[ "error_output_issue" ] = "reading _stderr reported $cont";
985        }           
986
987        echo (json_encode($results));
988        exit();
989    }
990    ob_end_clean();
991    if ( isset( $checkrunning ) )
992    {
993       try {
994           $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
995       } catch(MongoCursorException $e) {
996           $test_json[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
997       }
998       $results = json_encode( $test_json );
999    }
1000} else {
1001    if ( isset( $checkrunning ) )
1002    {
1003       try {
1004           $coll->remove( array( "name" => $checkrunning ), array(__~mongojournal{"j" => true,} "justOne" => true ));
1005       } catch(MongoCursorException $e) {
1006           $results[ 'error' ] = "Error removing running project record from database.  This project is now locked. " . $e->getMessage();
1007       }
1008    }
1009    $results[ "error" ] .= "PHP code received no \$_REQUEST?";
1010    echo (json_encode($results));
1011    exit();
1012}
1013
1014// cleanup CURRENTLY DISABLED!
1015if ( sizeof( $_FILES ) )
1016{
1017   $files = new RecursiveIteratorIterator(
1018       new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
1019       RecursiveIteratorIterator::CHILD_FIRST
1020   );
1021
1022   foreach ($files as $fileinfo) {
1023      $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
1024//      $todo( $fileinfo->getRealPath() );
1025   }
1026//   rmdir( $dir );
1027}
1028echo $results;
1029?>
Note: See TracBrowser for help on using the repository browser.