• Publicidad

Error 500 y use lib ¿qué relación tienen?

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Error 500 y use lib ¿qué relación tienen?

Notapor danimera » 2013-01-25 12:16 @552

Tengo este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. BEGIN {
  4.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  5.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  6. }
  7.  
  8. use CGI::Carp qw(fatalsToBrowser);
  9. use warnings;
  10.  
  11. #Controlador del Admin
  12. use lib('../');
  13. #use lib '../libs';
  14.  
  15.  
  16. use Datea::Casslc qw(:all);
  17. print "Content-type: text/plain\n\n";
  18.  
  19. print "testing...\n";
  20.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


y efectivamente, la respuesta es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Can't locate Datea/Casslc.pm in @INC (@INC contains: ../ /home/acertp3d/perl5/lib/perl5 /home/acertp3d/perl5/lib/perl5/i686-linux /home/acertp3d/perl/usr/local/lib/perl5/5.8.8/i686-linux /home/acertp3d/perl/usr/local/lib/perl5/5.8.8 /home/acertp3d/perl/usr/local/lib/perl5/site_perl/5.8.8/i686-linux /home/acertp3d/perl/usr/local/lib/perl5/site_perl/5.8.8 /home/acertp3d/perl/usr/local/lib/perl5/site_perl /home/acertp3d/perl. /usr/local/lib/perl5/5.8.8/i686-linux /usr/local/lib/perl5/5.8.8 /usr/local/lib/perl5/site_perl/5.8.8/i686-linux /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl .) at index.pl line 16.
  2. BEGIN failed--compilation aborted at index.pl line 16.
  3.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ahora, tengo el mismo código pero descomento la línea de use lib ('../libs')

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Internal Server Error
  2. The server encountered an internal error or misconfiguration and was unable to complete your request.
  3.  
  4. Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.
  5.  
  6. More information about this error may be available in the server error log.
  7.  
  8. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
  9.  
  10.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ahora... efectivamente ese módulo no existe en mi libs, pero aun así no entiendo qué tiene que ver lo que me pasa ?¡?
Última edición por explorer el 2013-01-25 13:23 @599, editado 1 vez en total
Razón: Desactivar la creación de URL
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Error 500 y use lib ¿qué relación tienen?

Notapor explorer » 2013-01-25 13:41 @612

El código que hay en el BEGIN es muy común para trabajar en proveedores de servicios de alojamiento, para permitir que el usuario pueda instalar su propio árbol de bibliotecas colgando de su directorio raíz. Eso se consigue con la modificación de @INC, y así Perl sabe dónde buscar.

La modificación de @INC se puede hacer de dos maneras: directamente, por medio de la modificación del array especial @INC, o usando 'use lib'. Pero, al final, estamos hablando de lo mismo.

Como se cuenta en perldoc lib, poner

use lib LISTA;

es lo mismo que decir

BEGIN { unshift(@INC, LISTA) }

En tu caso, estás usando los dos métodos, pero podrías simplificarlo para dejar uno solo.

Pero... tu estás agregando la ruta '../' y '../libs'. Ten en cuenta que cuando se ejecuta el cgi, lo hace dentro del directorio donde reside el cgi, por lo que la ruta de búsqueda de bibliotecas ya no será igual a cuando ejecutas el cgi desde un directorio personal. Fíjate que las rutas '../' y '../libs' son relativas a esa posición.

Quizás el mensaje de error sale porque ha ocurrido un fallo de carga o lectura o no hay suficientes permisos para acceder a esos directorios.

¿No tienes acceso al error.log del servidor web como dice el mensaje? Ahí podría haber alguna pista más. El error 500 es demasiado genérico... "Fallo de ejecución" puede significar cualquier cosa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error 500 y use lib ¿qué relación tienen?

Notapor danimera » 2013-01-25 13:56 @622

El único error del log es:
[Fri Jan 25 12:43:50 2013] [error] [client 190.99.147.134] File does not exist: /home/acertp3d/public_html/500.shtml

No puedo o no sé simplificarlo, porque uso el módulo Date::Calc que no me funciona si no lo instalo en el hosting, porque si lo copio al directorio libs/ pues me da error de servidor.

Ilustraré estos ejemplos:

Así me funciona bien:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. #use lib('../libs');
  4. BEGIN {
  5.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  6.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  7. }
  8.  
  9. use CGI::Carp qw(fatalsToBrowser);
  10. use warnings;
  11.  
  12. use Date::Calc qw(:all);
  13. print "Content-type: text/plain\n\n";
  14.  
  15. print "testing...\n";
  16.  
  17. my ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();
  18. print   "$year-$month-$day $hour:$min:$sec";
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este otro me funciona bien
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use lib('../'); ############################################
  4. BEGIN {
  5.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  6.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  7. }
  8.  
  9. use CGI::Carp qw(fatalsToBrowser);
  10. use warnings;
  11.  
  12. use Date::Calc qw(:all);
  13. print "Content-type: text/plain\n\n";
  14.  
  15. print "testing...\n";
  16.  
  17. my ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();
  18. print   "$year-$month-$day $hour:$min:$sec";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este ya no me funciona. Me da error 500
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use lib('../libs'); ############################################
  4. BEGIN {
  5.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  6.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  7. }
  8.  
  9. use CGI::Carp qw(fatalsToBrowser);
  10. use warnings;
  11.  
  12. use Date::Calc qw(:all);
  13. print "Content-type: text/plain\n\n";
  14.  
  15. print "testing...\n";
  16.  
  17. my ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();
  18. print   "$year-$month-$day $hour:$min:$sec";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y este sí me funciona
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use lib('../otroinexistentedirectorio'); ############################################
  4. BEGIN {
  5.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  6.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  7. }
  8.  
  9. use CGI::Carp qw(fatalsToBrowser);
  10. use warnings;
  11.  
  12. use Date::Calc qw(:all);
  13. print "Content-type: text/plain\n\n";
  14.  
  15. print "testing...\n";
  16.  
  17. my ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();
  18. print   "$year-$month-$day $hour:$min:$sec";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Concluyo que mi directorio libs/ está embrujado, es más: si pongo otro directorio que exista y no sea libs/ funciona bien. Obviamente tengo que usar libs/ porque ahí tengo el resto de mis módulos, y debo usar ese BEGIN porque el módulo Date::Calc no funciona sin eso...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Error 500 y use lib ¿qué relación tienen?

Notapor danimera » 2013-01-25 14:00 @625

Las rutas están bien, el único problema es al usar el Date::Calc.

No me convence esta solución temporal. Lo que pasa es que trabajo con CGI-App así que opté por algo raro y es poner esto en inicio de mi código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package MyApp::MyBase;
  2. use base 'CGI::Application';
  3.  
  4.  
  5. BEGIN {
  6.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  7.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  8. }
  9. use Date::Calc qw(:all);
  10. use lib('../libs','libs'); # usar las librerias luego de llamar Date::Calc
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Error 500 y use lib ¿qué relación tienen?

Notapor explorer » 2013-01-25 18:11 @799

Yo haría lo siguiente: averiguar la ruta absoluta dónde quedan instalados los módulos que instalo yo, y luego, en el programa, poner el 'use lib' con esa ruta 'absoluta'.

En el caso que tuve con un alojamiento así, desde el panel de control podías mandar instalar distribuciones Perl, de la lista que te ofrecía, o la URL que podías indicar. En la página de instrucciones te daban indicaciones de que pusieras el bloque BEGIN{} como el que has mostrado, y de esa manera los programas y cgi tenían acceso a los módulos instalados.

Yo, lo primero que hice fue un pequeñísimo cgi cuya única misión era un File::Find sobre @INC, por lo que devolvía toda la lista completa de todos los archivos que podían accederse con @INC. Allí supe qué módulos estaban instalados de base y dónde se instalaban los nuevos módulos. Todas eran rutas de la forma /home/<usuario>/perl/, pero eso depende de cada sistema.

Luego, arreglé un poco el código BEGIN, para que no saturara de rutas inútiles @INC (cuanta más rutas, más lento el programa):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $homedir = (getpwuid($>))[7];                      # directorio raíz del usuario (nosotros)
  2. my $n_inc = scalar @INC;                              # cuántas rutas hay por defecto
  3. for (my $i = 0; $i < $n_inc; $i++ ) {                 # para todas ellas...
  4.      if (-d $homedir . '/perl' . $INC[$i]) {          # si existe la misma ruta, pero dentro del dir. de usuario
  5.          unshift(@INC,$homedir . '/perl' . $INC[$i]); # lo agregamos al principio de @INC
  6.          $n_inc++;                                    # actualizamos número de rutas
  7.          $i++;                                        # saltamos al siguiente (recordar que hemos metido una por delante)
  8.      }
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(naturalmente, la parte de '/perl' hay que personalizarla según cada proveedor de alojamiento)

Y ya está: una vez que hemos actualizado @INC, ya no hace falta poner 'use lib' en ningún sitio.

Es más, si tienes un conocimiento exacto de todas las rutas extra que necesitas en tus programas, puedes quitar toda la parte BEGIN{} y usar un único 'use lib' con esas rutas. Pero siempre (para evitar problemas), escritas de forma absoluta. Sería algo así (no sería necesaria la parte BEGIN{}):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use lib qw(
  2.     /home/acertp3d/perl5/lib/perl5/i686-linux
  3.     /home/acertp3d/perl5/lib/perl5
  4.     /home/acertp3d/perl5/usr/local/lib/perl5/5.8.8/i686-linux
  5.     /home/acertp3d/perl5/usr/local/lib/perl5/5.8.8
  6.     /home/acertp3d/perl5/usr/local/lib/perl5/site_perl/5.8.8/i686-linux
  7.     /home/acertp3d/perl5/usr/local/lib/perl5/site_perl/5.8.8
  8. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(Naturalmente, estas rutas dependen de cada sistema. Solo hay que indicar las rutas extra a las que @INC ya trae por defecto).

Si tienes módulos instalados en 'libs/', entonces debes ponerlo de forma absoluta, para que quede clara dónde quieres buscar, y no en cualquier otro 'libs/' que @INC encuentre.

use lib '/home/acertp3d/libs';
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error 500 y use lib ¿qué relación tienen?

Notapor danimera » 2013-01-26 08:01 @375

Es perfecta la solucion para las rutas de librerias , ahora volvamos al problema del post.

No se que tenda mi directorio libs, pero cada vez que uso un modulo que no existe me sale error 500.

Con este codigo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3.  
  4. #BEGIN {
  5. #    my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  6. #    unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  7. #}
  8.  
  9. use CGI::Carp qw(fatalsToBrowser);
  10. use warnings;
  11. #use lib('../libs');
  12. use Date::Calc qw(:all);
  13.  
  14. print "Content-type: text/plain\n\n";
  15.  
  16. print "testing...\n";
  17.  
  18. my ($year,$month,$day, $hour,$min,$sec) = Today_and_Now();
  19. print   "$year-$month-$day $hour:$min:$sec";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El resultado es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. Can't locate Date/Calc.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.8/i686-linux /usr/local/lib/perl5/5.8.8 /usr/local/lib/perl5/site_perl/5.8.8/i686-linux /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl .) at index.cgi line 12. 
  2. BEGIN failed--compilation aborted at index.cgi line 12. 


Pero si descomento la linea de use lib('../libs'); entonces tengo error 500 eso es ilogico, y el directorio tiene permisos 755 y fuera de eso funciona todo bien a menos que ponga un modulo que no existe.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Error 500 y use lib ¿qué relación tienen?

Notapor danimera » 2013-01-26 12:40 @569

PROBLEMA SOLUCIONADO:

explorer, me corriges, por favor, si me equivoco:

Resulta que el problema era el use CGI::Carp qw(fatalsToBrowser);
ya que este módulo no estaba en mi directorio libs/ y cuando ponía la línea

use lib('../libs');

tal como decía explorer, creo, ya no me busca más los módulos que había adicionado con BEGIN.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. BEGIN {
  2.     my $b__dir = (-d '/home/acertp3d/perl'?'/home/acertp3d/perl':( getpwuid($>) )[7].'/perl');
  3.     unshift @INC,$b__dir.'5/lib/perl5',$b__dir.'5/lib/perl5/i686-linux',map { $b__dir . $_ } @INC;
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


SI NO QUE buscaba todo en el directorio libs/, que no tenía el cgi-carp.

Entonces ahí estaba el problema, no tenía el cgi-carp en libs/ por eso el error 500 al no encontrar algún módulo, aunque el cgi-carp ya está instalado por defecto. El use lib me cambia donde busca las bibliotecas...

Considero buena opción la de explorer de poner las rutas de todas las librerías en un solo use lib.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Intermedio

¿Quién está conectado?

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