• Publicidad

Perl y Jetty

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Perl y Jetty

Notapor howohow » 2010-12-12 23:13 @009

Saludos a todos/as,

Este es mi primer post. Estoy iniciándome en Perl, disculpad mi torpeza si desvarío en alguna cosilla.

Estoy interesado en configurar Perl para que funcione en local con el servidor HTML y contenedor de servlets Jetty. Todo ello instalado sobre Ubuntu 10.10.

No consigo indicarle que permita la ejecución de CGI Perl a través del navegador.

En el documento web.xml almacenado dentro de WEB-INF del proyecto test, tengo la siguiente configuración sobre CGI:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1.   <servlet>
  2.     <servlet-name>CGI</servlet-name>
  3.     <servlet-class>org.mortbay.servlet.CGI</servlet-class>
  4.     <load-on-startup>1</load-on-startup>
  5.   </servlet>
  6.  
  7.   <servlet-mapping>
  8.     <servlet-name>CGI</servlet-name>
  9.     <url-pattern>/cgi-bin/*</url-pattern>
  10.   </servlet-mapping>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


hola.cgi contiene:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. print "Content-type: text/html\n\n";
  3. print "Hola Perl";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El cgi se encuentra ubicado en:
/home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi

La llamada al cgi:
http://localhost:8080/cgi-bin/hola.cgi

La llamada al cgi devuelve en el navegador:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
HTTP ERROR 500
Problem accessing /cgi-bin/hola.cgi. Reason:
    Failed to exec CGI
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



Sin embargo, no ha habido problemas para que ejecute hola.sh situado en el mismo directorio que los CGI Perl.

hola.sh contiene:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. #!bin/sh
  2. echo "Content-Type: text/html"
  3. echo
  4. echo "<H1>Hola Bash</H1>"
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ubicado:
/home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.sh

Llamada:
http://localhost:8080/cgi-bin/hola.sh


Puestos a pedir :-) ¿Cómo puedo cambiar el default path :
/home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/
?

Alguna sugerencia, please.

Thanks.

howohow
howohow
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-12-12 11:24 @517

Publicidad

Re: Perl y Jetty

Notapor explorer » 2010-12-13 07:08 @339

Bienvenido a los foros de Perl en Español, howohow.

¿Existe de verdad /usr/bin/perl?

¿Tiene el cgi Perl los mismos permisos de ejecución que el sh?

¿Si haces

/usr/bin/perl -c /home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi

te devuelve un Ok?

¿Si haces

/usr/bin/perl /home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi

te devuelve el "Hola"?

¿Has mirado el error.log -o como se llame en Jetty- para ver si da más información de por qué no lo ejecuta?

No conozco Jetty, pero en Apache, una de las formas de indicar que un contenido es el resultado de la ejecución de un programa es según la extensión del programa. Quizás .cgi no esté reconocido. Según la configuración que muestras, Jetty hace como ejecutables a todo lo que esté contenido en el directorio, por lo que entonces solo habría que preocuparse de que los programas sean legibles -tengan permisos de lectura/ejecución para el usuario que ejecuta Jetty-.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl y Jetty

Notapor howohow » 2010-12-13 08:33 @398

¿Si haces

/usr/bin/perl -c /home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi

te devuelve un Ok?


Correcto "Compila correctamente":
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. howohow@howohow-desktop:~$ /usr/bin/perl -c /home/nedit/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi
  2. /home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi syntax OK
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



¿Si haces

/usr/bin/perl /home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi

te devuelve el "Hola"?


Incorrecto "NO devuelve 'hola'":
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. howohow@howohow-desktop:~$ /usr/bin/perl /home/howohow/servers/jetty-6.1.21/webapps/test/cgi-bin/hola.cgi
  2. Content-type: text/html
  3.  
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



¿Has mirado el error.log -o como se llame en Jetty- para ver si da más información de por qué no lo ejecuta?


Respuesta del log en Jetty:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. 0:0:0:0:0:0:0:1 -  -  [13/dic/2010:03:58:44 +0000] "GET /cgi-bin/hola.pl HTTP/1.1" 500 1398
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



... permisos de lectura/ejecución para el usuario que ejecuta


Con permiso full a todos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. howohow@howohow-desktop:~/servers/jetty-6.1.21/webapps/test/cgi-bin$ ls -l
  2. total 20
  3. -rwxrwxr-x 1 howohow howohow  74 2009-09-23 01:49 hola.sh
  4. -rwxrwxrwx 1 howohow howohow  73 2010-12-13 04:44 hola.cgi
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Más sugerencias o reinstalo Jetty y Perl? Me gustaría aprender encontrando el problema. En otro caso recurro a las reinstalaciones. :-) Esto parece "win" ;-)

Gracias por tu ayuda, explorer.

howohow
howohow
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-12-12 11:24 @517

Re: Perl y Jetty

Notapor explorer » 2010-12-13 10:13 @467

Reinstalar Perl en un sistema puede ser muy doloroso. Incluso puedes cargarte el propio sistema. Si lo vas a hacer, usa siempre el gestor de paquetes de software del sistema. Y sí, es una solución típico de los windowseros, cuando llegan a un callejón sin salida (aparente).

Me extraña que no veas la salida de "Hola Perl". Añade un "\n" al final de la línea, así:

print "Hola Perl\n";

y nos cuentas si sale o no. Para estar seguros, después de la primera línea, añada estas líneas:

use strict;
use warnings;
use diagnostics;


y nos cuentas que sale ahora.

Todo lo demás lo veo bien, salvo que no vemos los permisos de la carpeta cgi-bin/. Pero como dices que el sh sí que ha sido ejecutado, pues supongo que estarán bien.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl y Jetty

Notapor howohow » 2010-12-13 16:02 @710

Me extraña que no veas la salida de "Hola Perl". Añade un "\n" al final de la línea, así:

print "Hola Perl\n";

Has dado en el clavo. ¡Ja! He pedido unas gafas para Reyes. :lol:

En consola:
Correcto sale "Hola Perl"


Por cierto, el módulo "diagnosticos" no lo he encontrado supongo que has querido decir: "diagnostics". Cielos, qué montón de módulos. ¿Aparte de CPAN me recomiendas algún otro almacén de módulos?

El directorio cgi-bin tiene permisos.

Para mas emoción Jetty sirve bien PHP.

Por descarte el culpable, Jetty o Perl o ambos (ni idea)

Perl parece funcionar bien, el servidor lo mismo. Qué cosa más extraña. Revisado todo de nuevo. Todo está tal cual lo descrito en el post.

Se acabó la paciencia. Reinstalando Jetty y Perl.
howohow
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-12-12 11:24 @517

Re: Perl y Jetty

Notapor explorer » 2010-12-13 17:19 @763

Yo tampoco veo nada. Empiezo a sospechar que es el famoso error del carácter final invisible de la primera línea.

O que /usr/bin/perl no es ejecutable por el Jetty.

Hecha un vistazo a mi CGI mínimo para que lo pruebes. El módulo CGI::Carp sacará los posibles errores a la pantalla del navegador.

CPAN contiene la inmensa mayor parte de todos los módulos de Perl. Precisamente por eso es una de las fuerzas de Perl: tener todo centralizado. Otros repositorios de módulos son versiones especiales (como por ejemplo, para Windows) o compilaciones para arquitecturas, como por ejemplo los módulos SSL en la Universidad de Winnipeg, donde, a propósito, está el buscador kobesearch, creado por el recientemente fallecido Randy Kobes.

E instalarlos es tan sencillo como usar el comando cpan, desde la línea de comandos. Eso es impagable.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl y Jetty

Notapor howohow » 2010-12-13 23:39 @027

Reinstalado Jetty y todo funcionando perfectamente, no ha hecho falta reinstalar Perl. Ahora Jetty si sirve los CGI con el navegador.

Revisado de nuevo todo lo descrito, configurado de nuevo Jetty con las mismas funcionalidades que las apuntadas. No veo ningún cambio que pueda anunciar.



Hecha un vistazo a mi CGI mínimo para que lo pruebes. El módulo CGI::Carp sacará los posibles errores a la pantalla del navegador.

Cuando leí el mensaje ya había reinstalado Jetty. Probado ahora con resultado correcto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. CGI MINIMO
  2.  
  3. Si ves este texto es que SÍ está funcionando bien.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La duda quedará en el recuerdo. Sin embargo, mirando el aspecto positivo es que seguiré con mi propósito de intentar conectar mediante Perl, un servicio web y una base de datos nativa XML embebida en Jetty.



Instalada y levantada la base de datos embebida, instalado el conector para el servicio decido realizar la conexión del modo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use RPC::XML;
  3. use RPC::XML::Client;
  4.  
  5. $URL = "http://guest:guest\@localhost:8080/exist/xmlrpc";
  6. print "connectando con la $URL de la base de datos...\n";
  7. $client = new RPC::XML::Client $URL;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4




Para comprobar que la conexión se ha realizado con éxito me decido ha realizar una consulta sobre un documento ejemplo que existe en la raíz de la base de datos. El documento se llama examples.xml y tiene esta estructura:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <example-queries>
  2. <query>
  3.   <description>Simple fulltext query on Shakespeare plays</description>
  4.   <code>for $speech in //SPEECH[LINE &= 'love'] return $speech</code>
  5. </query>
  6.  
  7. <query>
  8. <description>Fulltext query using near</description>
  9. <code>for $speech in //SPEECH[SPEAKER &= 'witch' and near(., 'fenny snake')] return $speech</code>
  10. </query>
  11.  
  12. ...
  13. </example-queries>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Decido extraer el valor de cada una de las descripciones
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<description> valoresAExtraer </description>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Preparando la consulta en el cgi con xpath y xquery
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$consulta = <<END;
for \$b in document('/examples.xml')//example-queries/query
let \$c := \$b
return
        \$c/description
END


# Opciones de salida
$opciones = RPC::XML::struct->new(
    'indent' => 'yes',
    'encoding' => 'UTF-8',
    'highlight-matches' => 'none');

$solicitud = RPC::XML::request->new("query", $consulta, 20, 1, $opciones);
$respuesta = $cliente->send_request($solicitud);
if($respuesta->is_fault) {
    die "Ha ocurrido un Error: " . $respuesta->string . "\n";
}

print $respuesta->value;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hasta ahí por ahora, me imagino que siendo Perl cada uno lo hará a su estilo. Si me mostráis otras maneras estaría encantado de aprender.



Lo siguiente que probaré será realizar una consulta más compleja y estudiar su parseo, para finalmente intentar aplicarle Ajax a unas listas select, que, por cierto, ya he ojeado un ejemplo de explorer sobre el tema:



Perl, simplemente fantástico ¡Con tanta información no te aburres! :-)
howohow
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-12-12 11:24 @517

Re: Perl y Jetty

Notapor howohow » 2010-12-17 08:11 @382

Siguiendo con mi aprendizaje de Perl, me surge la siguiente duda:

Retomando la salida del CGI expuesto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $respuesta->value . "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La llamada al CGI:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. /usr/bin/perl /home/howohow/servers/jetty-6.1.24/webapps/test/cgi-bin/consultaExist.cgi
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

muestra:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <exist:result xmlns:exist="http://exist.sourceforge.net/NS/exist" hits="2" start="1" count="2">
  2. <description>Simple fulltext query on Shakespeare plays</description><description>Fulltext query using near</description><description>
  3. </exist:result>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


En el lado del cliente ¿Se debería mostrar de la siguiente manera el resultado a través de Ajax?
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html><head>
  2. <script type = "text/javascript">
  3. var XMLHttp;
  4. if(navigator.appName == "Microsoft Internet Explorer") {
  5.         XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
  6. }       else {
  7.                 XMLHttp = new XMLHttpRequest();
  8.         }
  9.  
  10.  
  11. function mostraConsulta() {
  12.         XMLHttp.open("GET", "/cgi-bin/consultaExist.cgi", true);
  13.         XMLHttp.onreadystatechange = function() {
  14.                 if (XMLHttp.readyState == 4) {
  15.                         document.getElementById( 'muestra_div' ).innerHTML = XMLHttp.responseText;
  16.                 }
  17.         }
  18.         XMLHttp.send(null);
  19. }
  20. </script>
  21. </head>
  22.  
  23. <body>
  24.         <input type = "button" onclick = "javascript&#058; mostraConsulta();" value = "Muestra la Consulta">
  25.         <div id = "muestra_div">
  26.         Click y Muestra la Consulta
  27.         </div>
  28. </body></html>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



El div no muestra nada. ¿Sería correcto? ¿Dónde me pierdo?
howohow
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-12-12 11:24 @517

Re: Perl y Jetty

Notapor explorer » 2010-12-17 08:19 @388

Yo creo que, si haces un

XMLHttp.open("GET", "/cgi-bin/consultaExist.cgi", true);

quiere decir que espera una respuesta con una cabecera HTTP correcta, así que, antes del print() con el contenido del xml tendrás que emitir una cabecera indicando que lo que mandas es un XML. Sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "Content-Type: text/xml\n\n";
print $respuesta->value, "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl y Jetty

Notapor howohow » 2010-12-17 08:46 @407

Perfecto.

"No hay peor ciego que el que no quiere ver"

Gracias Explorer.
howohow
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-12-12 11:24 @517


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron