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

Last change on this file since 1373 was 1373, checked in by ehb, 4 years ago

updates to qr : checkbox, text fields working

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