• Publicidad

Problema al ejecutar un programa Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema al ejecutar un programa Perl

Notapor noa86 » 2010-11-23 17:36 @775

Hola,

He encontrado una aplicación que me interesa instalar para probarla, y primer paso es instalar los módulos Perl, y para ello viene un archivo install_modules.pl pero al ejecutarlo en Apache, http://miservidor/cgi-bin/install_modules.pl me salta un error...

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't chdir to /home/Ainhoa/perlmvccgiapp/app1_private/perl_mods: Permission denied at ..../cgi-bin/install_modules.pl line 31.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No tengo claro qué permisos no tengo, si tengo que ejecutar este archivo como root, o si tengo que dar privilegios a otras carpetas. Esto último lo he probado pero no lo consigo.

¿Alguna solución?
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Publicidad

Re: Problema al ejecutar un programa Perl

Notapor explorer » 2010-11-23 18:09 @798

El error indica que el usuario que ejecuta el servidor web no tiene permisos para entrar en ese directorio. Bueno, en ese y en todos de los que depende.

Lo normal es que el servidor web sea ejecutado por el usuario www-data o httpd o algo parecido. Si haces un ps aux lo verás.

Entonces, tienes, básicamente, dos opciones.

1.- La peor solución, pero la más rápida, dar permisos 755 a todos los subdirectorios que llegan a perl_mods. Es decir, cambiar los permisos de

/home
/home/Ainhoa
/home/Ainhoa/perlmvccgiapp
/home/Ainhoa/perlmvccgiapp/app1_private
/home/Ainhoa/perlmvccgiapp/app1_private/perl_mods


Es mala solución, porque el resto de usuarios también podrán entrar en esos subdirectorios.

2.- La otra opción es mejor: consiste en cambiar la propiedad del grupo de las carpetas al mismo grupo al que pertenece el usuario que ejecuta el servidor web. Si, por ejemplo, ese usuario pertenece al grupo www-data, cambiaremos los subdirectorios a ese grupo y les daremos los permisos 750. Así, él podrá entrar pero no el resto de usuarios.

Naturalmente, esto no tiene por qué hacerse en todos los subdirectorios. Por ejemplo, en el /home y en el /Ainhoa, con permisos 755 ya sería suficiente.

La cuestión es que el usuario www-data pueda entrar a través de todos ellos.
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: Problema al ejecutar un programa Perl

Notapor noa86 » 2010-11-24 05:08 @256

Todas las carpetas las tengo en el directorio cgi-bin y ya no me sale el error anterior

El código es el siguiente... puede que haya algún error que no me dado cuenta.

Mi duda es, este código por lo que entiendo yo descarga los tar.gz para instalarlos. Pero no me sale para seleccionar ningún módulo para instalar......

Este es el tutorial que estoy intentando instalar...
https://docs.google.com/View?docID=dd363fg9_77gb4hdh7b&revision=_latest#Installing_modules_37541888856_704822253751149

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. # INSTRUCTIONS to install a Perl module into a nonstandard (local/private) directory:
  3. # - use perldigger.pl to find out where perl, tar, gzip, mysql, HOME, etc. are.  
  4. #   Then set $APP_PRIVATE_DIR and $TAR (and adjust the first line of this script, if necessary).
  5. # - ftp Perl modules, e.g., <module>.tar.gz, to $FTP_CPAN_MODULES_DIR, then run this script
  6. # In Perl programs that use the modules, add
  7. #   use lib qw($LOCAL_PERL_DIR/lib/perl5/5.8.8  $LOCAL_PERL_DIR/lib/perl5/site_perl/5.8.8 $LOCAL_PERL_DIR/lib/perl5/site_perl)
  8.  
  9. use CGI qw(:standard);
  10. use CGI::Carp qw(fatalsToBrowser);
  11.  
  12. my $APP_PRIVATE_DIR = '/app1_private/'; ##  must end with '/'
  13. my $TAR = '/bin/tar';  ##
  14.  
  15. my $FTP_CPAN_MODULES_DIR = $APP_PRIVATE_DIR . 'perl_mods';
  16.         # ftp CPAN modules into this directory
  17.         # they will be unpacked here by this program
  18. my $LOCAL_PERL_DIR = $APP_PRIVATE_DIR;  
  19.         # Perl modules will be installed in $LOCAL_PERL_DIR/lib and $LOCAL_PERL_DIR/bin
  20.  
  21. print header;
  22. my @modules_to_install = param('modules');
  23. if(@modules_to_install) {
  24.         install_modules()
  25. } else {
  26.         display_form()
  27. }
  28. exit;
  29. # ---------------------------------------------------------------------------------------
  30. sub display_form {
  31.         chdir $FTP_CPAN_MODULES_DIR || die "Can't chdir to $FTP_CPAN_MODULES_DIR: $!";
  32.         opendir(DIR, '.') || die "Can't opendir: $!";
  33.         my @modules_gz = grep { /gz$/ } readdir(DIR);    # e.g., finds CGI-Application-4.06.tar.gz
  34.         rewinddir DIR;
  35.         my @modules_installed = grep { /\d$/ } readdir(DIR);  # e.g., finds CGI-Application-4.06
  36.         closedir DIR;
  37.         print h3('Select tar.gz modules to unzip and install into '.$LOCAL_PERL_DIR.'lib')
  38.                 ,start_form()
  39.                 ,checkbox_group(-name=>'modules', -values=>\@modules_gz, -linebreak=>'true')
  40.                 ,submit('install')
  41.                 ,p('Already untared:'), join(br, @modules_installed)
  42.                 ,'<div><a href="http://sourceforge.net"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=244452&amp;type=3" width="125" height="37" border="0" alt="SourceForge.net Logo" /></a></div>'
  43.                 ,end_form()
  44. }
  45. # ---------------------------------------------------------------------------------------
  46. sub install_modules {
  47.         foreach my $mod (@modules_to_install) {
  48.                 $mod =~ s/.tar.gz//;
  49.                 print hr,h2($mod);
  50.                 print '<pre>'
  51.                         ,`cd $FTP_CPAN_MODULES_DIR; $TAR -xvzf $mod.tar.gz 2>&1`  # unzips and untars
  52.                         ,`cd $FTP_CPAN_MODULES_DIR/$mod; echo "<hr>Makefile.PL:\n"; /usr/bin/perl Makefile.PL PREFIX=$LOCAL_PERL_DIR 2>&1;`
  53.                         ,`cd $FTP_CPAN_MODULES_DIR/$mod; echo "<hr>make:\n"; $MAKE 2>&1;`
  54.                         ,`cd $FTP_CPAN_MODULES_DIR/$mod; echo "<hr>make test:\n"; $MAKE test 2>&1;`
  55.                         ,`cd $FTP_CPAN_MODULES_DIR/$mod; echo "<hr>make install:\n"; $MAKE install 2>&1`
  56.                         ,'</pre>';
  57.         }
  58.         print hr,p('Done!')
  59.                 ,'<div><a href="http://sourceforge.net"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=244452&amp;type=3" width="125" height="37" border="0" alt="SourceForge.net Logo" /></a></div>'
  60. }
  61.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Problema al ejecutar un programa Perl

Notapor explorer » 2010-11-24 07:17 @345

Es un programa para instalar módulos en un determinado directorio.

Las instrucciones dicen:
- usa perldigger.pl para localizar dónde está perl, tar, gzip, mysql, HOME, etc. Entonces, ajusta las variables $APP_PRIVATE_DIR y $TAR (y la primera línea de este script, si es necesario).

- sube por ftp los módulos Perl, por ejemplo, <módulo>.tar.gz, a $FTP_CPAN_MODULES_DIR, y luego ejecuta este programa

- En los programas Perl que usen estos módulos, añade

use lib qw($LOCAL_PERL_DIR/lib/perl5/5.8.8 $LOCAL_PERL_DIR/lib/perl5/site_perl/5.8.8 $LOCAL_PERL_DIR/lib/perl5/site_perl)


Bueno, se trata de un modo, un poco complejo, de subir e instalar módulos a un servidor de Internet en el cual no tengamos otras facilidades para instalar módulos Perl, o no tengamos un acceso completo al servidor. Cosa muy distinta a hacerlo en nuestra propia máquina, donde instalar los módulos es algo trivial, con la ayuda del comando cpan.

En cuanto al programa, primero intentará hacer un

chdir $FTP_CPAN_MODULES_DIR

$FTP_CPAN_MODULES_DIR vale "/app1_private/perl_mods". Es decir, es una ruta absoluta (comienza por '/', por lo que cuelga directamente del directorio raíz del sistema). Y aquí veo el primer problema, porque está en contradicción con un mensaje anterior, donde decías que la ruta es /home/Ainhoa/perlmvccgiapp/app1_private. ¿En qué quedamos? ¿Cuál es la correcta? En cualquier caso, si el directorio no existe y/o no puede entrar, morirá en el die().

Si, luego, opendir() falla, es que, quizás, el programa sí que ha conseguido entrar en el directorio , pero no ha podido leer el listado de ficheros que hay dentro. Tendrás que revisar los permisos de lectura y ejecución del directorio.
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: Problema al ejecutar un programa Perl

Notapor noa86 » 2010-11-24 07:32 @356

Vale, la ruta correcta es /var/www/app1_private/ que he continuado haciendo cambios y es como por fin la página me sale, aunque no consiga que me salgan los módulos a instalar. Al final, lo he realizado con CPAN, que me parece más sencillo, mirando en el código los módulos que utiliza.

Me puesto a ejecutar el programa y me sale el siguiente error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Died at /usr/share/perl5/base.pm line 94.
BEGIN failed--compilation aborted at ../../app1_private/modules/MyMain.pm line 5.
Compilation failed in require at /var/www/cgi-bin/app1/main.cgi line 10.
BEGIN failed--compilation aborted at /var/www/cgi-bin/app1/main.cgi line 10.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w -T
  2. # Copyright © Mark Rajcok 2008  All rights reserved
  3.  
  4. my $PRIVATE_HOME_DIR;
  5. BEGIN { $PRIVATE_HOME_DIR = '../../app1_private'; }
  6. use strict;
  7. use lib $PRIVATE_HOME_DIR.'/modules';
  8. use lib $PRIVATE_HOME_DIR.'/lib/perl5/site_perl';
  9. use CGI::Carp qw(fatalsToBrowser);
  10. use MyMain;
  11.  
  12. MyMain->new(
  13.          TMPL_PATH              => $PRIVATE_HOME_DIR.'/templates'
  14.         ,-config_file   => $PRIVATE_HOME_DIR.'/config/app1.cfg'
  15. )->run;
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package MyMain;
  2. # Copyright © 2008 Mark Rajcok
  3. $VERSION = 1.00;
  4. use strict;
  5. use base 'BaseCgiApp';
  6. #-------------------------------------------------------------------------------
  7. sub setup {                             # overrides                     # called after cgiapp_init()
  8.         my $self = shift;
  9.         $self->authen->protected_runmodes(qw/main/);
  10. }
  11. #------------------------------------------------------------------------------
  12. sub main : StartRunmode {
  13.         my $self = shift;
  14.         my $errs = shift;
  15.         my $q = $self->query;
  16.         my $t = $self->load_tmpl('main.html');
  17.         $t->output   # if you like to type, you could instead have 'return $t->output;'
  18. }
  19. #------------------------------------------------------------------------------
  20. sub do_something : Runmode {
  21.    # do something interesting here... pull stuff out of the database, display it, etc.
  22. }
  23. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé si el error está en la sintaxis o cuál es el error exactamente...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Problema al ejecutar un programa Perl

Notapor explorer » 2010-11-24 08:07 @380

El error dice que el módulo base no ha podido localizar el módulo BaseCgiApp.pm.

Hay un problema con los use lib, que no están reflejando de forma correcta la ruta hacia los directorios donde se debería encontrar.

Una de dos... o me aseguro que ese fichero está donde debería estar, o cambiaría la línea 5 por una ruta absoluta (no fiarme de una ruta relativa).
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: Problema al ejecutar un programa Perl

Notapor noa86 » 2010-11-24 09:34 @440

Vale, ya he cambiado la ruta de MyMain:
use base '/app1_private/modules/BaseCgiApp'
y ya no me sale el error, y también he cambiado las rutas en el main.cgi:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. BEGIN { $PRIVATE_HOME_DIR = '/app1_private'; }
  2. use strict;
  3. use lib $PRIVATE_HOME_DIR.'/app1_private/modules';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tengo una duda: ¿esta ruta debería estar por defecto con la instalación de Perl? Por que no tengo ese directorio...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use lib $PRIVATE_HOME_DIR.'/lib/perl5/site_perl';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora me sale otro error, ¿podría ser por eso?

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't locate MyMain.pm in @INC (@INC contains: /app1_private/lib/perl5/site_perl /app1_private/app1_private/modules /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5 /usr/share/perl5 /usr/local/lib64/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/local/lib/perl5/site_perl/5.10.0 /usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl /usr/lib/perl5/site_perl) at /var/www/cgi-bin/app1/main.cgi line 10.
BEGIN failed--compilation aborted at /var/www/cgi-bin/app1/main.cgi line 10.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Problema al ejecutar un programa Perl

Notapor explorer » 2010-11-24 09:49 @450

Tienes un error en el primer código.

En la primera línea pones

$PRIVATE_HOME_DIR = '/app1_private';

y en la tercera pones

use lib $PRIVATE_HOME_DIR.'/app1_private/modules';

Es decir, que estás incorporando, con use lib, el directorio '/app1_private/app1_private/modules'.

No creo que eso esté bien. Ni el valor de $PRIVATE_HOME_DIR ni el valor que le pasas a use lib.

Con

use lib $PRIVATE_HOME_DIR.'/lib/perl5/site_perl';

estamos indicando a Perl que si necesita buscar un módulo, que pruebe a mirar en $PRIVATE_HOME_DIR . '/lib/perl5/site_perl', es decir, en directorio privado. La ruta /lib/perl5/site_perl es típica de la instalación de los módulos del sistema, pero como has hecho una instalación "doméstica", los módulos se encontrarán en el directorio donde los instalaste ($PRIVATE_HOME_DIR).

Y fíjate en el mensaje de error: Perl te da una lista de todos los directorios en los que busca a los módulos que va a necesitar. Esa lista es la que modificamos dentro de nuestros programas con el use lib. Si Perl no encuentra MyMain.pm es que no está en ninguno de esos directorios. Apuesto a que el incorrecto es /app1_private/app1_private/modules.

Por favor, repasa lo que significa ruta absoluta y relativa; y la importancia de que una ruta empiece por '/' o no.

Y en Perl, debes entender lo que hace el operador '.' (concatenación).
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: Problema al ejecutar un programa Perl

Notapor noa86 » 2010-11-24 16:44 @738

He vuelto al principio, a la parte de código de instalación de módulos compleja, ya que sin esa parte que me instala los módulos en una carpeta determinada creo que no me va a funcionar el resto de la aplicación...

Por lo menos he conseguido que arranque y que me muestre los módulos a instalar pero cuando le doy a instalar me salta este mensaje de error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CGI-Application-Plugin-Session-1.03/
/bin/tar: CGI-Application-Plugin-Session-1.03: Cannot mkdir: Permission denied
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


He probado a dar permisos a las carpetas tanto de lectura de ejecución y escritura, pero me sigue dando el mismo error, y no encuentro en Internet ninguna solución... ¿sabes por qué puede ser?
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Problema al ejecutar un programa Perl

Notapor explorer » 2010-11-24 16:48 @742

El error dice que el comando tar no tiene permisos para crear directorios (mkdir).

El error estará en el valor de $FTP_CPAN_MODULES_DIR, según la línea 51 del primer código que publicaste.

Podría darse el caso de que no te deja crear el directorio porque ya está creado antes, de los intentos anteriores.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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