Newsgroup: it.comp.lang.perl
Titolo: CGI

Per favore... qualcuno sa dirmi perché uno script perl sotto linux non
può creare un file via CGI ?
Mi spiego: uso Apache come server Web con le estensioni suExec
installate (forse configurate male?) e da una pagina HTML (uso Netscape
3.0) lancio uno script perl che dovrebbe salvare un file sul disco
(nella dir cgi-bin/ del server) e farlo partire... non crea il file.
Perché? Ho anche provato a dare alla dir i permessi chmod 777 ma nemmeno
questo serve.
Da cosa dipende ?
Bye e grazie
  Snoopy

 (nella dir cgi-bin/ del server) e farlo partire... non crea il file.
intendi dire che salvi il file e immediatamente provia eseguirlo?
Cosa stai cercando di fare?
4) Cerce la "CGI idiot's guide" su CPAN o su 
perl.com/perl
. La checklist
che da e' spesso utilissima
Ciao
luca


perche' nella directory cgi-bin? I log cosa riportano?..

Grazie per la risposta... davvero... non mi aspettavo una risposta cosi'
veloce... popolo di internet vi amo :o)
Prima di rispondere pero' preciso come dovrebbe funzionare lo script: il
programma (interamente in perl) consiste in un analizzatore di file di
log... li legge e ne estrae una serie di statistiche. Per ottimizzare al
massimo il programma in base alle diverse opzioni e statistiche
richieste
abbiamo pensato (io e il tizio che lavora con me) di porre il nucleo
centrale dell'analizzatore in un altro file, che viene letto e da cui
vengono
prelevate solo le parti utili. Quindi si salva una copia del nucleo su
disco
e la si lancia (con una system).
Via internet si lancia con un semplice tag action (method=post) da una
pagina che permette di specificare tutte le opz e le stat (mesi giorni
ore
settimane e roba del genere...) il file ottimizza.cgi che apre stat.cgi
e lo
elabora (in base alle opz), salvandolo come copia.cgi. Il file viene
reso
eseguibile e lanciato... l'output e' in HTML e dovrebbe apparire... ma
il
processo si blocca alla scirttura del file sul disco: il perl non rileva
alcun errore, ma con una stat controllo l'esistenza del file e becco
l'errore.
Spero di essere stato chiaro... spero...
Tutto funzionava fino a quando abbiamo pensato
all'auto-ottimizzazione...
A proposito... qualsiasi script cgi semplice (tipo stampa @ENV ecc ecc)
funziona benissimo.
Ora ecco le risposte:
vai con la solidarieta' sociale, comiciamo...
1) lo spazio su disco c'e'
2) lo script da riga di comando funziona e 3)...
Dalla idiot's list... (io l'idiota che risponde) allora le proviamo
tutte... cosi' forse...
D) Di chi e' lo script?
R) Di un user creato apposta: tale "www"
D) Permessi ? E in quale dir si trova lo script ?
R) 755 su tutti i file nella dir cgi-bin/ (la dir si trova in
   /wwwserver/htdocs/users/www/cgi-bin la dir del server e'... si
capisce
   spero... non funge nemmeno in /wwwserver/cgi-bin/ :) )
D) E' abilitata l'esecuzione dei CGI ? E per l'estensione .cgi ?
R) Per tutte le dir cgi-bin/ ho creato una voce <Directory> in
accesse.conf
   con le opzioni ALL (quindi ExecCGI dovrebbe essere compreso...)
   In srm.conf c'e' la linea:
    AddHandler CgiScript .cgi -> credo sia questa...
D) Sotto quale uid funziona il server ?
R) Questo l'ho cambiato or ora... in httpd.conf ho messo:
    User "www"
    Group #100
D) Puo' l'utente www scrivere il file che provi ascrivere via CGI ?
R) Da riga di comando funziona... per cui... poi le dir cgi-bin/ hanno i
   permessi 777... mah!
D) Cosa succede quando lo fai partire interattivamente ?
R) Che vuol dire ? Scusi puo' ripetere ? (questa domanda e' un po'
   oscuretta... poi non uso CGI.pm... e' un guaio ?)
D) Cosa appare in error_log
R) Allora... ci sono varie possibilita':
   se non intercetto l'errore (il file non viene scritto sul disco)
   [Wed Jan  7 11:27:09 1998] access to
/wwwserver/htdocs/users/www/cgi-bin/ottimizza.cgi failed for localhost,
reason: Premature end of script headers
   se lo intercetto... be' nessun errore... ovvio, se invece (curioso)
   faccio funzionare lo script da riga di comando (cosi' ho gia' il file
che
   dovrebbe scrivere sul disco) e lancio lo script via cgi (non dovrebbe
far
   altro che far partire il file copia.cgi di prima... visto che lui non
   scirve...) mi da' lo stesso errore... come se il file non esistesse !
   (il file copia.cgi rimane intatto...)
D) Versione del perl e dell' OS ?
R) Perl 5.003 e linux slakware 2.0.28
D) Versione della libreria ?
R) Ma e' proprio necessaria CGI.pm ?
D) Path del perl ?
R) Sono giuste.
D) Che server usi ?
R) Apache 1.2.4
D) Che succede se usi perl -w ?
R) Mi da' solo due tipo di warning: uso di var. non inizializzata e uso
   dello split implicito su @_ ... non c'entrano
D) E se usi perl -T ?
R) Non mi trova piu' la mia libreria...
D) Che succede se usi "use strict" ?
R) Non funge piu'!!! Sara' che uso tutte variabili globali... puo'
dipendere
   da questo?
D) Ti sei ricordato di stampere il "MIME type" (che roba e'?) prima di
ogni
   altro non-header ?
R) La prima cosa che stampo e' Content type.... sull'idiot's guide c'e'
un
   Set-cookie prima... che sia questo ? Pero' altri script funzionano...
non
   capisco...
D) Ti sei ricordato di redirigere l'output su STDOUT ?
R) Con $|=1 all'inizio ? Non cambia nulla.
D) Hai controllato che le chiamate di sistema funzionano ?
R) Nell'aprire il file in output e nello scirverlo non seganala nulla...
   eppure non scrive su disco.
D) Ti sei ricordato di non postare su comp.lang.perl che non c'entra
nulla ?
R) Be'... in effetti sono un po' OT ... sorry :o))))))
.....ngueeeeeeeeeeh
Ora ho controllato tutto... non riesco ad estrarre info utili...
Spero che possiate aiutarmi... scusate l'OT e il messagio extra-large
:o)
Ciao e GRAZIE.
 Snoopy
P.S.: Se non ci capite nulla... mi spedite una bella mail con almeno un
      "..zzi tuoi !" ... thanks ...

 R) Con $|=1 all'inizio ? Non cambia nulla.
hai provato chiundendo STDOUT e riaprendolo rediretto su file?
 
Uhm ti e' molto problematico inviarmi direttamente il file cgi che ci
guardo?
ciao
		Davide

 nucleo su disco e la si lancia (con una system). 
Vi suggerirei, invece, di porre il codice dell'"analizzatore" in una o più
variabili, quindi selezionare durante il run-time le "parti utili" ed
eseguirle con l'istruzione 'eval'; 
Es: 
   $pippo = "  print  \$pippo  ";
   eval $pippo;
Ad ogni modo, se devi eseguire codice Perl esterno, credo sia preferibile
usare un 'do(nomefile)' anziché un 'system()'. 
Saluti,
Max

Grazie per l'aiuto... spero di poter ricambiare un giorno...
Sono quasi riuscito a risolvere il problema... ho creato uno scheletro,
un programma semplificato che fa le stesse cose che il mio programma
dovrebbe fare, almeno per quanto riguarda la parte CGI. In pratica: il
file da far partire è il primo qui sotto, mentre il secondo (che ho
chiamato cgi_IN) viene aperto e copiato integralmente nel file
cgi_OUT.cgi, e quest'ultimo invocato tramite una do. Il tutto funziona
regolarmente ma, cosa alquanto curiosa (almeno per me) se invece della
do uso la system (rendendo prima il file eseguibile) non scrive più il
file su disco. Da riga di comando funziona in qualsiasi caso... provare
per credere... ho lasciato le righe commentate apposta...
In ogni caso il mio programma ancora non funziona: seguendo lo schema di
questi due esempi, non scrive per nulla il file cgi_OUT.cgi; se invece
lancio da riga di comando il programma mi dà errore sull'utlima system,
quella che rimuove il file cgi_OUT.cgi. Visto che non lo cancella...
posso eseguirlo via cgi... ed infatti lo esegue... niente male... un bel
casino...
Come se non bastasse... supponiamo di avere già il file cgi_OUT.cgi e di
lanciare il primo file (quello qui sotto): nessun errore, tutto funziona
regolarmente, è l'unico caso in cui non dà alcun messaggio di errore...
a parte il fatto che, in ogni caso, il file copiato non viene cancellato
dal disco...
Misteri del Perl.
Almeno ora so che l'errore è nel mio programma e non nella
configurazione di apache... non male come inizio... non mi resta che
spulciare 2000 righe di programma (non mio) :)
In ogni caso... posso, se volete, spedirvi tutto il progetto, per me non
è un problema... fatemi sapere se volete il file... fatemelo mettere a
posto un attimino... lo rendo presentabile...
Tutto il programma fa parte del progetto di Laboratorio di Informatica
II: Sistemi Operativi del corso di Informatica dell'Università di Roma
"La Sapienza". Il testo del progetto lo trovato online all'indirizzo
 
http://cesare.dsi.uniroma1.it
ma il sever è quasi sempre spento... per chi lo vuole glielo spedisco
io... che se aspettate l'università...
Ecco i due file (che funzionano)
#!/usr/bin/perl
$file_in='cgi_IN';
$file_out='cgi_OUT.cgi';
open (IN,"$file_in");
open (OUT,">$file_out");
while (<IN>)
 { print OUT $_ }
close IN;
close OUT;
#system("chmod +x $file_out");
do "$file_out" || die "$@";
#system ('cgi_OUT.cgi');
system("rm $file_out");
Questo è il secondo file...
#!/usr/bin/perl
print "Content-type:text/html\n\n";
print <<EndOfHTML;
<html><head><title>Print Environment</title></head>
<body>
EndOfHTML
;
foreach $key (keys (%ENV)) {
  print "$key = $ENV{$key}<br>\n";
}
print "</body></html>";
Eppure sembra semplice...
Ciao e grazie.
   Snoopy

Grazie per la risposta... davvero... non mi aspettavo una risposta cosi'
veloce... popolo di internet vi amo :o)
Prima di rispondere pero' preciso come dovrebbe funzionare lo script: il
programma (interamente in perl) consiste in un analizzatore di file di
log... li legge e ne estrae una serie di statistiche. Per ottimizzare al
massimo il programma in base alle diverse opzioni e statistiche
richieste
abbiamo pensato (io e il tizio che lavora con me) di porre il nucleo
centrale dell'analizzatore in un altro file, che viene letto e da cui
vengono
prelevate solo le parti utili. Quindi si salva una copia del nucleo su
disco
e la si lancia (con una system).


Ora ecco le risposte:



D) Permessi ? E in quale dir si trova lo script ?
R) 755 su tutti i file nella dir cgi-bin/ (la dir si trova in
   /wwwserver/htdocs/users/www/cgi-bin la dir del server e'... si
capisce
   spero... non funge nemmeno in /wwwserver/cgi-bin/ :) )
D) E' abilitata l'esecuzione dei CGI ? E per l'estensione .cgi ?
R) Per tutte le dir cgi-bin/ ho creato una voce <Directory> in
accesse.conf
   con le opzioni ALL (quindi ExecCGI dovrebbe essere compreso...)
   In srm.conf c'e' la linea:
    AddHandler CgiScript .cgi -> credo sia questa...
D) Sotto quale uid funziona il server ?
R) Questo l'ho cambiato or ora... in httpd.conf ho messo:
    User "www"
    Group #100
D) Puo' l'utente www scrivere il file che provi ascrivere via CGI ?
R) Da riga di comando funziona... per cui... poi le dir cgi-bin/ hanno i
   permessi 777... mah!
D) Cosa succede quando lo fai partire interattivamente ?
R) Che vuol dire ? Scusi puo' ripetere ? (questa domanda e' un po'
   oscuretta... poi non uso CGI.pm... e' un guaio ?)
D) Cosa appare in error_log
R) Allora... ci sono varie possibilita':
   se non intercetto l'errore (il file non viene scritto sul disco)
   [Wed Jan  7 11:27:09 1998] access to
/wwwserver/htdocs/users/www/cgi-bin/ottimizza.cgi failed for localhost,
reason: Premature end of script headers
   se lo intercetto... be' nessun errore... ovvio, se invece (curioso)
   faccio funzionare lo script da riga di comando (cosi' ho gia' il file
che
   dovrebbe scrivere sul disco) e lancio lo script via cgi (non dovrebbe
far
   altro che far partire il file copia.cgi di prima... visto che lui non
   scirve...) mi da' lo stesso errore... come se il file non esistesse !
   (il file copia.cgi rimane intatto...)
D) Versione del perl e dell' OS ?
R) Perl 5.003 e linux slakware 2.0.28
D) Versione della libreria ?
R) Ma e' proprio necessaria CGI.pm ?
D) Path del perl ?
R) Sono giuste.
D) Che server usi ?
R) Apache 1.2.4
D) Che succede se usi perl -w ?
R) Mi da' solo due tipo di warning: uso di var. non inizializzata e uso
   dello split implicito su @_ ... non c'entrano
D) E se usi perl -T ?
R) Non mi trova piu' la mia libreria...
D) Che succede se usi "use strict" ?
R) Non funge piu'!!! Sara' che uso tutte variabili globali... puo'
dipendere
   da questo?
D) Ti sei ricordato di stampere il "MIME type" (che roba e'?) prima di
ogni
   altro non-header ?
R) La prima cosa che stampo e' Content type.... sull'idiot's guide c'e'
un
   Set-cookie prima... che sia questo ? Pero' altri script funzionano...
non
   capisco...
D) Ti sei ricordato di redirigere l'output su STDOUT ?
R) Con $|=1 all'inizio ? Non cambia nulla.
D) Hai controllato che le chiamate di sistema funzionano ?


Ehm.... ho confuso tutto ... questo è il messaggio giusto.. :)
Ciao Max
Ti ringrazio (spero che ci si possa dare del tu sui gruppi di
discussione anche se non ci si conosce... sono nuovo del posto :) per la
risposta, mi è stata davvero utile: ho sostituito la system con do e ora
funziona! Bé... in realtà funziona solo un programma di esempio che ho
creato apposta per scovare eventuali bug nel mio programma o errori
nella configurazione di apache... comunque passo dopo passo... prima o
poi (spero il prima possibile) riuscirò a far funzionare il vero
programma.
Se vuoi maggiori info (cioé se non ci hai capito nulla...) leggi la mia
risposta su it.comp.lang.perl a Davide Giansoldati.
Grazie.
Ciao.
  Snoopy - Giuseppe Pascarella



file su disco.
Sembrerebbe un qualche tipo di controllo di sicurezza. Se e' cosi', o
c'e' un settaggio per disabilitarlo, oppure ciccia.
Che succede pero' se salvi i dati in un file NON eseguibile e poi vai
a lanciare un programma che rende il file eseguibile e lo esegue?
Leonardo
".signature": bad command or file name

Ciao Leonardo,
Ringrazio anche te per l'inervento in questa, ormai, difficile
questione... ecco la tua risposta: già salvo in un file non
eseguibile... poi lo rendo eseguibile e lo lancio... bel dilemma non
credi ?
Comunque... come sempre... in un modo o nell'altro risolverò il
problema.
Ciao e Grazie
       Giuseppe