Newsgroup: it.comp.lang.perl
Titolo: FAR GIRARE CGI IN LOCALE

Salve a tutti...
ho questo problema: voglio far girare degli script cgi scritti in Perl sul
mio pc per testarli prima di effettuare l'upload sulla rete.
Per fare questo ho installato il web server Apache e ho installato
ActivePerl. Ho settato con cura i parametri necessari alla configurazione
del server nel file di configurazione di Apache, ho provato e riprovato
più volte a cambiare la shebang ma secondo me c'è un problema a livello di
path che non riesco a settare correttamente per far eseguire correttamente
i cgi all'interno del mio browser.
O mi si apre il file cgi e lo visualizzo, oppure mi viene chiesto di
scaricarlo con la solita finestra... come faccio a far ESEGUIRE questi
script... perchè il mio pc npn vuole proprio far partire l'interprete
perl???
Se volete ulteriori info sui settaggi, come penso che accadrà, scrivetemi!
Grazie.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 mio pc per testarli prima di effettuare l'upload sulla rete.
Prova a dare un occhio a questi 2 link e poi facci sapere:
http://www.latoserver.it/perl/install/windows.php3
http://www.apache3000.net/tools/apache/guida.php3?lez=12

Ti ringrazio ma quei link li ho già visitati per settare i file
all'inizio... sembra proprio che sebbene abbia i miei cgi nella giusta
cartella e li richiami dai browser, non parta l'interprete Perl!


 cartella e li richiami dai browser, non parta l'interprete Perl!
Potresti postare il tuo script e l'output che ottieni da linea di 
comando dando:
perl -V

L'OUTPUT OTTENUTO CON PERL -V E' QUESTO:
Summary of my perl5 (revision 5 version 6 subversion 1) configuration:
  Platform:
    osname=MSWin32, osvers=4.0, archname=MSWin32-x86-multi-thread
    uname=''
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    usethreads=undef use5005threads=undef useithreads=define
usemultiplicity=define
    useperlio=undef d_sfio=undef uselargefiles=undef usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
  Compiler:
    cc='cl', ccflags ='-nologo -O1 -MD -Zi -DNDEBUG -DWIN32 -D_CONSOLE
-DNO_STRICT -DHAVE_DES_FCRYPT  -DPERL_IMPLICIT_CONTEXT
 -DPERL_IMPLICIT_SYS -DPERL_MSVCRT_READFIX',
    optimize='-O1 -MD -Zi -DNDEBUG',
    cppflags='-DWIN32'
    ccversion='', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=10
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=4
    alignbytes=8, usemymalloc=n, prototype=define
  Linker and Libraries:
    ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf 
-libpath:"C:\usr\lib\CORE"  -machine:x86'
    libpth="C:\usr\lib\CORE"
    libs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib 
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleau
t32.lib  netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib  version.lib
odbc32.lib odbccp32.lib msvcrt.lib
    perllibs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib
 comdlg32.lib advapi32.lib shell32.lib ole32.lib o
leaut32.lib  netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib 
version.lib odbc32.lib odbccp32.lib msvcrt.lib
    libc=msvcrt.lib, so=dll, useshrplib=yes, libperl=perl56.lib
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug
-opt:ref,icf  -libpath:"C:\usr\lib\CORE"  -machine:x86'
Characteristics of this binary (from libperl):
  Compile-time options: MULTIPLICITY USE_ITHREADS PERL_IMPLICIT_CONTEXT
PERL_IMPLICIT_SYS
  Locally applied patches:
        ActivePerl Build 635
  Built under MSWin32
  Compiled at Feb  4 2003 15:34:21
  @INC:
    C:/usr/lib
    C:/usr/site/lib
    .
MENTRE LO SCRIPT E' IL SEGUENTE:
#! c:\usr\bin\perl.exe
#######################################################################
#######################################################################
#### Variables -- Set Accordingly
# This is the full path to your guestbook html file.  Be sure
# that it is writable by the web server.  In UNIX, that can
# be done with `chmod 666 gbook.html` where gbook.html is the
# name of your guestbook page.
$gbook = "/gb.htm";
# This is the full path to the entry template file.  For each
# variable in the form, use [varname] where you want it to
# appear in the template.  To add environmental variables add a $,
# as in [$HTTP_USER_AGENT].  Another useful environmental variable
# is [$REMOTE_HOST].  [date] is a special variable that adds a date 
# stamp to the entry, and [time] is a timestamp.
$template = "new.txt";
# This is the URL of the page you want displayed after a 
# submission is entered.  If it is set to "", a generic
# thank-you page is generated.
$success = "ancora da settare/gbok.htm";
# If this variable is set to 1, new entries are added to the top of the
# list.  If not, they are added at the bottom.
$add_at_top = 0;
# If you place "bad words" in this array, the guestbook will
# replace occurrences of them with ****.  This, to some degree, helps
# keep foul language out of your guestbook.  Comment it out if you don't
# want any filtering.
@badwords = ("gosh","heck","shucks","darn");
# This array contains the form fields that must be filled in before the
# entry can be added.  Set it to ("") if no particular form field *has*
# to be entered.
@required = ("name", "comments");
# This array contains the IP addresses which are banned from using the
# site.  To log IP addresses in your entries, use the special tag
# [$REMOTE_ADDR] in your template (See the README file for more info.)
# Set it to () if no one should be banned.
@banned = ();
# If this variable is set to 1, all html tags will be stripped from the
# submissions.  This prevents people from including huge images or other
# such things in their entries.
$ban_html = 0;
# If your system can use "flock" for file-locking, set this variable to
# 1.  Otherwise, set it to 0.
$filelock = 1;
# If this variable is set to 1, you will receive e-mailed confirmation
# each time someone adds to the guestbook.
$mail_you = 0; 
# This is the path to "sendmail" on your system.  On most UNIX
# systems, you can use 'which sendmail' or 'whereis sendmail'
# to find out the path.  If you didn't set mail_you
# equal to 1, you don't need to set this at all.
$mailer = "/usr/sbin/sendmail";
# This is the e-mail address to send mail to, if you set $mail_you
# equal to one.  Be sure to put a \ before the @, as in
# "mattr\@
cgiscripts.net
"
$adminaddr = "webmaster\@
example.com
";
###### Do Not Edit Below This Line ######
## Actions
# Check Security
&secure;
# Organize Input
&parse_form;
# Check Required Fields
&check_for_required;
# Add Entry
&add_entry;
# Mail Admin if Needed
if (($mail_you) && ($adminaddr)) {
  &mail_admin;
}
# Report Success
&report_success;
## Subroutines
sub secure {
 if (@banned) {
  my($ban);
  foreach $ban (@banned) {
    if ($ENV{'REMOTE_HOST'} =~ /^$ban/) { &error("BANNED"); }
  }
 }
}
sub parse_form {
 # Die if method is "GET"
 if ($ENV{'QUERY_METHOD'} eq "GET") {
   &error("GET");
 }
 my($ind,$value,$badword);
 # Get the input
 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 
 # Split the name-value pairs
 @couples = split(/&/, $buffer);
 foreach $one (@couples) {
    ($ind, $value) = split(/=/, $one);
    # Un-Webify plus signs and %-encoding
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $value =~ s/<!--(.|\n)*-->//g;
    # Kill Bad Words
    foreach $badword (@badwords) {
      $value =~ s/$badword/****/ig;
    }
    # Strip HTML
    if ($ban_html == 1) {
       $value =~ s/<([^>]|\n)*>//g;
    }
    $TAG{$ind} = $value;
 }                              
}
sub check_for_required {
 if (@required) {
   foreach $req (@required) {
     if (!$TAG{$req}) { push (@missing,$req); }
   }
 }
 if (@missing) { &error("MISSING"); }
}
sub add_entry {
 # Create Date Stamp
 my($date,$min,$hour,$day,$month,$year,$weekday,$ampm,$zero,@weekdays,@months);
 (undef, $min, $hour, $day, $month, $year, $weekday) = localtime(time);
 @weekdays = ("Sunday","Monday","Tuesday","Wednesday", 
             "Thursday","Friday","Saturday");
 @months = ("January","February","March","April","May","June","July",
           "August","September","October","November","December");
 # Dates correct through 2097 :)
 if ($year > 97) { $year += 1900; } else { $year += 2000; }  
 # Fix Time
 if ($hour > 12) { $hour -= 12; $ampm = "PM"; } else { $ampm = "AM"; }
 if ($hour == 0) { $hour = 12; }
 if ($min < 10) { $zero = "0"; } else { $zero = ""; }
 $time = "$hour:$zero$min $ampm";
 $date = "$weekdays[$weekday], $months[$month] $day, $year";
 
 # Parse Template and push data to @out array
 open (IN,$template) || &error("TMPL");
 while (<IN>) { 
   # Handle special date tag
   $_ =~ s/\[date\]/$date/ig;
   # Handle special time tag
   $_ =~ s/\[time\]/$time/ig;
   # Handle Environment Variables
   $_ =~ s/\[\$([^\]]*)\]/$ENV{$1}/ig;
   # Handle form input tags
   $_ =~ s/\[([^\]]*)\]/$TAG{$1}/ig;
   push (@out,$_);
 }
 close(IN);
 # Open guestbook and get entries
 open (GUEST,$gbook) || &error("GBR");
 # This should be more efficient, really
 @lines = <GUEST>;
 close (GUEST);
 # Write New Guestbook File
 open (NEW,">$gbook") || &error("GBW");
 if ($filelock) { flock(NEW,2); } # Lock File
 foreach $line (@lines) {
   if ($line =~ /\<\!--enter--\>/) {
     if ($add_at_top) { print NEW "<!--enter-->\n\n"; }
     foreach $entry (@out) { print NEW $entry; }
     if (!$add_at_top) { print NEW "<!--enter-->\n\n"; }
   } else { print NEW $line; }
 }
 if ($filelock) { flock(NEW,8); } # Unlock File
 close (NEW);
}
sub mail_admin {
 open (MAIL, "|$mailer -oi -t $adminaddr") || &error("MAIL");
 print MAIL "From: $adminaddr\n";
 print MAIL "Subject: Guestbook Entry\n\n";
 print MAIL "The following entry was added to the guestbook:\n\n";
 foreach $line (@out) {
   print MAIL "$line";
 }
 close (MAIL);
}
sub report_success {
 if ($success) {
  print "Location: $success \n\n";
 } else {
  print "Content-type: text/html \n\n";
  print "<html><body bgcolor='#ffffff'>\n";
  print "<h1>Thank you for adding to the guestbook!</h1>";
  print "Use your back button to return, and reload to see your entry";
  print "</body></html>\n";
 }
 exit;
}
sub error {
  my %ERR;
  $ERR{"BANNED"} = "Sorry, but this subnet has been banned, because
     the guestbook was abused by a previous user.  Please contact the
     site administrator for more information";
  $ERR{"MISSING"} = "Some required form fields were not filled out.
     Please use your back button to back up and fill in the missing
     fields";
  $ERR{"GET"} = "The script must be called with the POST method.";
  $ERR{"TMPL"} = "An error occurred while accessing the template file.
     If this persists, please contact the site administrator.";
  $ERR{"GBR"} = "An error occurred while reading the guestbook file.
     If this persists, please contact the site administrator.";
  $ERR{"GBW"} = "An error occurred while writing the guestbook file.
     If this persists, please contact the site administrator.";
  $ERR{"MAIL"} = "An error occurred while sending mail to the site
     administrator.  If this persists, please let them know.";
  my $emsg = $ERR{$_[0]};
  if (!$emsg) {
    $emsg = "The script has suffered an unknown error.";
  }
  print "Content-type: text/html", "\n\n";
  print "<html><body>\n";
  print "<h1>FlexBook Error</h1>\n";
  print "$emsg";
  print "</body></html>";
  exit;


 #! c:\usr\bin\perl.exe
A me lo script viene eseguito.
Domande:
1) l'hai posizionato nella directory cgi-bin di apache?
2) ha l'estensione .pl o .cgi ?

 2) ha l'estensione .pl o .cgi ?
Lo script è nella cartella giusta ed ha anche l'estensione corretta (.cgi).
Se apro il browser e digito localhost mi si visualizza il sito in locale.
Per cui in generale "Apache funziona"... poi quando vado ad eseguire lo
script tramite un form, ad esempio, viene visualizzato a video e non
eseguito... Hai qualche altro suggerimento? Vuoi spiegazioni più
dettagliate sulla config di apache?
Grazie!


 dettagliate sulla config di apache?
Sì, magari postala qua o spediscimela.

Ti ringrazio ma ho sistemato il problema.... avevo fatto un po' di casino
con il settaggio scriptalias.
Ora perň se mi permetti vorrei porti quest'altra domanda...
Penso che dovrň mettere i miei cgi su un server gratuito ma non potrň
usare lo stesso server per le mie pagine html in quanto mi si
riempirebbero di banner.
ora, come faccio con uno script cgi posto sul "server A" a gestire il mio
guestbook sul server B, dove per "gestire" intendo aprire il file html,
modificarlo, salvarlo e richiuderlo???
So che la domanda posta cosě fa veramente schifo, ma sono sicuro che si
capisce, scusa ma ho poco tempo ora...
Grazie ancora x tutto


 modificarlo, salvarlo e richiuderlo???
La cosa più semplice è quella di utilizzare ftp per trasferire i file 
tra i due server: da B ti scarichi su A il file del guestbook, lo 
elabori e poi lo rimeti su B.
Dunque ti server il modulo Net::FTP
Non so se tu abbia un accesso a console sui due server, ad ogni modo per 
verificare se hai quel modulo fai un CGI del tipo:
#!/usr/bin/perl
use Net::FTP;
print "Content-Type: text/html; charset=ISO-8859-1\n";
print $Net::FTP::VERSION;
Se ti dà un errore (a patto di avere il path del perl giusto) allora 
tale modulo non è installato, altrimenti lo è.
Documentazione su tale modulo la trovi qui:
http://search.cpan.org/~gbarr/libnet-1.17/Net/FTP.pm

Ti ringrazio x tutti i consigli che mi stai dando... provero' ad
informarmi sul metodo che mi hai consigliato tu, pero' mi permetto di
dirti che io avevo pensato di fare tutto in un altro modo... sono un
principiante con il Perl e non so se puo' funzionare una cosa del genere,
ma penso che si possa fare cosi':
-Dal server A tramite il form con cui la gente inserisce un nuovo
messaggio al guestbook richiamo uno script che risiede sul server B
-Sul server B metto anche il file html che sara' il vero e proprio
guestbook, per cui settando correttamente i permessi sul file lo script in
B apre il file ed inserisce il nuovo messaggio. Qui metto anche la pagina
da visualizzare in caso di successo, e se tutto va bene lo script manda
quella pagina come output.
-Poi per vedere dal server A il file del guestbook vero e proprio,
richiamo un altro cgi messo su B che non fa altro che dare in output il
file guestbook che risiede li'.
Dimmi tu se questo metodo e' piu' semplice del tuo, se ci sono dei pro e
dei contro, cosi' poi decido quale metodo usare...
Grazie! Ora vado a vedere il link che mi hai consigliato.


 file guestbook che risiede li'.
sei sempre sul server B
Direi che il tuo sistema va bene, solo che per "ingannare" l'utente devi 
  per forza di cose usare un frame.

Il mio sito è organizzato con tre frame, due "statici, sempre uguali" e
uno dove visualizzo i veri e propri contenuti... X cui dovrebbe funzionare
tutto.
Sto valutando anche la possibilità di usare un cgi che gestisca tutto il
"processo guestbook", cioè all'interno del cgi è contenuto tutto l'html
necessario, dal guestbook vero e proprio alla pagina x inserire il nuovo
messaggio... non so se sarà la strada giusta x risolvere il problema
perchè il codice diventa molto lungo e commettere errori è facilissimo!
Mi rendo conto cmq che ho le idee ancora confuse, e sto cambiando le carte
in tavola troppo spesso... non ti voglio far perdere tempo x cui cercherò
di trovare una soluzione e poi magari ti ricontatterò per chiederti una
mano su quello!
Il problema è che io avrei già tutto pronto, anzi, ho già tutto uploadato
su prohosting e gli script che sto usando ora (uno x il guestbook e uno x
una semplicissima chat richiamata tramite flash) funzionano benissimo, ma
prohosting piazza un banner su ogni pagina x cui immaginati cosa succede
al mio povero sito che è fatto da tre frame... UNO SCHIFO!
Sono giorni che navigo x cercare un appoggio dove poter mettere i cgi e le
mie pagine html e non avere la rottura di palle dei banner... sono
disposto ad inserirli ma dove voglio io, e tutto questo insieme sembra
impossibile da trovare!
Avevo trovato un'ottima soluzione con 
spaceports.com
, un buon server ftp,
supporto dei cgi, velocità ottima... peccato che non mi ero accorto che
accettavano solo contenuti in lingua inglese e... puff, hanno cancellato
il mio account! Il giorno dopo mi volevo reiscrivere per poi trovare una
soluzione e proprio in quel giorno SPACEPORTS E' DIVENTATO A PAGAMENTO!
LA SFIGA MI PERSEGUITA! ;-P
Hai qualche link da consigliarmi??
Grazie ancora!


 Hai qualche link da consigliarmi??
Non direttamente ma con google ho trovato qualche directory che tratta 
l'hosting in generale e dunque anche quello gratuito:
http://www.migliorhosting.it/gratuito/
http://www.free-webhosts.com/
http://www.clickherefree.com/
ma chissà quanti altri ce ne saranno.