hello,
i have this problem when trying to run a Racket application from an Apache web server. I modify a PHP application that call a command line application (could be Fortran,Python,Scheme....)
the application caller in PHP looks like this:
function generateCmdField() {
file_put_contents('php://stderr', print_r("generateCmdField : CubeURL = $this->CubeURL\n", TRUE));
//$this->cmd= "python -c \"print('Real Python')\""; // OK
//$this->cmd= "/opt/homebrew/var/www/cgi-bin/test-cgi"; // KO
$this->cmd= "/opt/homebrew/var/www/cgi-bin/interpole_fields"; // Scheme
if ($this->DebugShowCmd) {
$this->warning .= " FORTRAN command=".$this->cmd;
}
file_put_contents('php://stderr', print_r("generateCmdField : this->cmd=$this->cmd\n", TRUE));
file_put_contents('php://stderr', print_r("CoordinateSpecified : this->warning=$this->warning\n", TRUE));
}
}
// execute the command (interpolation)
function GeneralReturn() {
$test=0;
$message="";
$msg="";
while (($test < 3) && (strpos(strtoupper($message),'CPU') === FALSE)) {
sleep(3);
$test+=1;
if (file_exists($this->url_input.".txt")) { // input file
$message=exec($this->cmd." 0>&1",$outp,$retc); // execute the command line
// $message=exec($this->cmd." 2>&1",$outp,$retc);
$msg = $msg.$message.'['.$retc.']|'; // concatenate return message
file_put_contents('php://stderr', print_r("GeneralReturn : msg=$msg\n outp=$outp\n", TRUE));
}
//else {throw new SoapFault("1", "Writting pb");}
}
if ($test > 0) { $this->warning.=",TESTS=".$test." ".$msg; }
exec("rm ".$this->url_input) ; // remove input file
if (strpos(strtoupper($message),'CPU') === FALSE) {
//CPU TIME is the last line of the code if it works
//throw new SoapFault("1", "Interpolation error".$msg);
$this->warning.="; Interpolation routines did not succeed";
}
if (strpos(strtoupper($message),"ERROR") !== FALSE) { throw new SoapFault("1", "Interpolation error ".$msg); }
if (strpos(strtoupper($message),"WARNING") !== FALSE) { $this->warning.="; ".$message; }
$ret="http://impex.latmos.ipsl.fr/getWSFile.php?location=".str_replace("/var/www/html/IMPEx/","",$this->url_output); // getWSFile.php ? return the raw output file or modified?
if ($this->warning != "") {
$header = new SoapHeader('http://impex.latmos.ipsl.fr/','warning',"WARNING:".$this->warning,false);
$GLOBALS['server']->addSoapHeader($header);
}
return $ret;
}
interpolate_fields is a Scheme program that will prepare data and call later Python code...
for now it is just this:
#! /usr/bin/env racket
#lang reader SRFI-105
;; interpolate field caller
;; Damien MATTEI
(module interpolate-field-caller racket
(require Scheme+)
(display "Scheme+ : interpole_fields") (newline)
) ; end module
i put this code in cgi-bin ,even if cgi-bin test has fail to allow code, there is no problem in running python or code from PHP, so i suppose,PHP has rights to run any code it want,and this is the case as it can run Python and Racket, but the problem is that my Racket code can not find some stuff to start...
The racket code run from command line ,the web server can run racket but i have an error.
First the command line test of my Racket code that works:
(base) mattei@MacBook-Pro-Touch-Bar cgi-bin % ls -la
total 40
drwxr-xr-x 7 mattei admin 224 23 oct 11:17 .
drwxr-xr-x 37 mattei admin 1184 23 oct 11:37 ..
-rwxr-xr-x@ 1 mattei admin 222 23 oct 11:03 interpole_fields
-rw-r--r-- 1 mattei admin 820 18 avr 2024 printenv
-rw-r--r-- 1 mattei admin 1074 18 avr 2024 printenv.vbs
-rw-r--r-- 1 mattei admin 1133 18 avr 2024 printenv.wsf
-rwxr-xr-x@ 1 mattei admin 1269 23 oct 11:17 test-cgi
(base) mattei@MacBook-Pro-Touch-Bar cgi-bin % ./interpole_fields
SRFI-105 Curly Infix parser for Racket Scheme by Damien MATTEI
(based on code from David A. Wheeler and Alan Manuel K. Gloria.)
Possibly skipping some header's lines containing space,tabs,new line,etc or comments.
SRFI-105.rkt : number of skipped lines (comments, spaces, directives,...) at header's beginning : 9
Parsed curly infix code result =
(module interpolate-field-caller racket
(require Scheme+)
(display "Scheme+ : interpole_fields")
(newline))
Scheme+ : interpole_fields
the output is correct ,it display a single line.
but when ran from client that call the PHP code ,it ran racket but racket got problem to find all the normal stuff ,here the error in httpd log:
generateCmdField : this->cmd=/opt/homebrew/var/www/cgi-bin/interpole_fields
CoordinateSpecified : this->warning= Following parameters ignored=OutputFileType;units=1; FORTRAN command=/opt/homebrew/var/www/cgi-bin/interpole_fields
standard-module-name-resolver: collection not found
for module path: SRFI-105
collection: "SRFI-105"
in collection directories:
/Users/mattei/Library/Racket/8.14/collects
/Applications/Racket/collects/
... [170 additional linked and package directories]
context...:
/Applications/Racket/collects/syntax/module-reader.rkt:265:4: get
/Applications/Racket/collects/syntax/module-reader.rkt:315:4: read-fn
[Wed Oct 23 11:37:46.077700 2024] [php:warn] [pid 22248] [client ::1:58578] PHP Warning: Array to string conversion in /opt/homebrew/var/www/IMPExWS.php on line 801
GeneralReturn : msg=[1]|
outp=Array
note: forget FORTRAN text it is now Scheme code.
note i put the PHP code but it is not directly the problem seems Racket can not load my library the same way in GUI or command line when running on a web server
when writting that i think now of an authorisation problem : can Racket access /Users/mattei/Library/Racket/8.14/collects from a PHP call on a web server?
Update:
in fact there is no directory that search Racket:
(base) mattei@MacBook-Pro-Touch-Bar cgi-bin % ls -la /Users/mattei/Library/Racket/8.14/collects
ls: /Users/mattei/Library/Racket/8.14/collects: No such file or directory
(base) mattei@MacBook-Pro-Touch-Bar cgi-bin % ls -la /Users/mattei/Library/Racket/8.14/
total 8
drwxr-xr-x@ 6 mattei staff 192 23 oct 10:54 .
drwxr-xr-x 4 mattei staff 128 11 oct 15:10 ..
drwxr-xr-x@ 24 mattei staff 768 23 oct 10:55 doc
-rw-r--r--@ 1 mattei staff 696 23 oct 10:54 links.rktd
drwxr-xr-x@ 15 mattei staff 480 23 oct 10:54 pkgs
drwxr-xr-x@ 3 mattei staff 96 11 oct 15:11 share
why racket is it searching here? this error only happens when launching by httpd and PHP
update 2:
(base) mattei@MacBook-Pro-Touch-Bar cgi-bin % ls -la /Applications/Racket/collects/
total 0
drwxr-xr-x@ 26 mattei admin 832 9 aoĆ» 19:59 .
drwxr-xr-x@ 16 mattei admin 512 11 oct 15:07 ..
drwxr-xr-x@ 4 mattei admin 128 9 aoĆ» 19:59 acks
drwxr-xr-x@ 17 mattei admin 544 9 aoĆ» 19:59 compiler
drwxr-xr-x@ 6 mattei admin 192 9 aoĆ» 19:59 data
drwxr-xr-x@ 3 mattei admin 96 9 aoĆ» 19:59 db
drwxr-xr-x@ 5 mattei admin 160 9 aoĆ» 19:59 dynext
drwxr-xr-x@ 12 mattei admin 384 9 aoĆ» 19:59 ffi
drwxr-xr-x@ 18 mattei admin 576 9 aoĆ» 19:59 file
drwxr-xr-x@ 4 mattei admin 128 9 aoĆ» 19:59 info
drwxr-xr-x@ 3 mattei admin 96 9 aoĆ» 19:59 info-domain
drwxr-xr-x@ 4 mattei admin 128 9 aoĆ» 19:59 json
drwxr-xr-x@ 6 mattei admin 192 9 aoĆ» 19:59 launcher
drwxr-xr-x@ 16 mattei admin 512 9 aoĆ» 19:59 net
drwxr-xr-x@ 13 mattei admin 416 9 aoĆ» 19:59 openssl
drwxr-xr-x@ 14 mattei admin 448 9 aoĆ» 19:59 pkg
drwxr-xr-x@ 9 mattei admin 288 9 aoĆ» 19:59 planet
drwxr-xr-x@ 116 mattei admin 3712 9 aoĆ» 19:59 racket
drwxr-xr-x@ 12 mattei admin 384 9 aoĆ» 19:59 raco
drwxr-xr-x@ 3 mattei admin 96 9 aoĆ» 19:59 reader
drwxr-xr-x@ 3 mattei admin 96 9 aoĆ» 19:59 realm
drwxr-xr-x@ 3 mattei admin 96 9 aoĆ» 19:59 s-exp
drwxr-xr-x@ 38 mattei admin 1216 9 aoĆ» 19:59 setup
drwxr-xr-x@ 46 mattei admin 1472 9 aoĆ» 19:59 syntax
drwxr-xr-x@ 6 mattei admin 192 9 aoĆ» 19:59 version
drwxr-xr-x@ 9 mattei admin 288 9 aoĆ» 19:59 xml
Update 3:
i think that my program comes from the user that ran the racket code is Apache user _www not me (mattei) and that my libraries are installed in my home dir...
so now the question is to install my libraries (SRFI-105 ,Scheme+) system wide or tell Racket to look in my home directory....
Update 4:
digging... and digging again... i find that my personnal modules are "linked" as installation :
> (current-library-collection-links)
'(#f #<path:/Users/mattei/Library/Racket/8.14/links.rktd> #<path:/Applications/Racket v8.14/collects/../share/links.rktd>)
less /Users/mattei/Library/Racket/8.14/links.rktd
(("scribble-math" (#"pkgs" #"scribble-math"))
("scribble-code-examples" (#"pkgs" #"scribble-code-examples"))
("scribble-code-examples" (#"pkgs" #"scribble-code-examples-lib"))
("Scheme+R6RS" (up up #"CloudStorage" #"Dropbox" #"git" #"Scheme-PLUS-for-Racket-R6RS"))
(root (#"pkgs" #"reprovide-lang-lib"))
(root (#"pkgs" #"lang-file-lib"))
(root (#"pkgs" #"syntax-macro-lang"))
(root (#"pkgs" #"sci"))
(root (#"pkgs" #"pretty-format"))
("colors" (#"pkgs" #"colors"))
(root (#"pkgs" #"debug"))
("SRFI-105" (up up #"CloudStorage" #"Dropbox" #"git" #"SRFI-105-for-Racket"))
("Scheme+" (up up #"CloudStorage" #"Dropbox" #"git" #"Scheme-PLUS-for-Racket" #"main" #"Scheme-PLUS-for-Racket")))
/Users/mattei/Library/Racket/8.14/links.rktd (END)
i suppose this is not used by "_www racket" , i will check that soon, in last solution i suppose making a standalone executable in Racket (i made it years ago for a command line application ,not web server) that incorporate all the libraries should works but this is not an easy develoment procedure as i must compile code many times in the day...
Update 5:
yes exactly the same on the client-server web application the PHP calls Racket that display those paths:
command=./cgi-bin/interpole_fields
GeneralReturn : msg=Scheme+ : interpole_fields[0]|
tmp3=Array
(
[0] => (/Users/mattei/Library/Racket/8.14/lib /Applications/Racket/lib)
[1] => (#f /Users/mattei/Library/Racket/8.14/links.rktd /Applications/Racket/collects/../share/links.rktd)
[2] => Scheme+ : interpole_fields
)
when i launch :
#! /usr/bin/env racket
;;#lang reader SRFI-105
;; interpolate field caller
;; Damien MATTEI
(module interpolate-field-caller racket
;;(require Scheme+)
(require setup/dirs)
(display (get-lib-search-dirs)) (newline)
(display (current-library-collection-links)) (newline)
(display "Scheme+ : interpole_fields") (newline)
) ; end module
i do not understand why it can not load SRFI-105 and Scheme+ as :
("SRFI-105" (up up #"CloudStorage" #"Dropbox" #"git" #"SRFI-105-for-Racket"))
("Scheme+" (up up #"CloudStorage" #"Dropbox" #"git" #"Scheme-PLUS-for-Racket" #"main" #"Scheme-PLUS-for-Racket"))
from /Users/mattei/Library/Racket/8.14/links.rktd
if do: (up up #"CloudStorage" #"Dropbox" #"git" #"SRFI-105-for-Racket")
i'm well in the SRFI-105 module source code:
(base) mattei@MacBook-Pro-Touch-Bar tmp % cd /Users/mattei/Library/Racket/8.14/
(base) mattei@MacBook-Pro-Touch-Bar 8.14 % ls -la ../../CloudStorage/Dropbox/git/SRFI-105-for-Racket
total 104
drwx------@ 12 mattei staff 384 1 oct 12:00 .
drwxr-xr-x@ 23 mattei staff 736 4 sep 21:58 ..
drwx------@ 13 mattei staff 416 27 sep 11:39 .git
-rw-------@ 1 mattei staff 35149 20 aoĆ» 02:17 LICENSE
-rw-------@ 1 mattei staff 417 2 oct 08:47 README.md
drwx------@ 7 mattei staff 224 23 oct 10:54 compiled
drwx------@ 4 mattei staff 128 17 aoĆ» 23:06 deprecated
drwx------@ 14 mattei staff 448 3 sep 11:22 doc
-rw-------@ 1 mattei staff 563 20 oct 01:08 info.rkt
-rw-------@ 1 mattei staff 7494 21 oct 00:31 main.rkt
drwx------@ 4 mattei staff 128 3 sep 11:22 scribblings
drwx------@ 8 mattei staff 256 18 oct 02:02 src