• Publicidad

Contador de vistas

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Contador de vistas

Notapor seafree » 2016-06-01 11:28 @519

Hola. Tengo un contador de visitas CGI:

#! /usr/bin/perl

print "Content-type: text/html\n\n";

#Nombre del archivo que va guardando los incrementos
$this = "counter.txt";

#Abrimos el archivo para leer su contenido
open (THIS, "$this") || die("No puedo abrir el archivo!");
$that = <THIS>;
close (THIS);
open (THIS, ">$this") || die("No puedo abrir el archivo!");
$that++;
print THIS "$that";
close (THIS);
print "$that";
exit;

El script funciona pero, ¿cómo puedo ejecutar el script cada vez que alguien entre al sitio? ¿Puedo correr el script desde un programa HTML (página principal) o debe ser desde un script CGI?

Gracias.

Agradeceré si alguien me indica, por favor, si esta declaración es válida:

<body bgcolor="#FFFFFF" onload="../../cgi-bin/tester/perl count_visitas.cgi">

Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: Contador de vistas

Notapor explorer » 2016-06-01 16:03 @710

No es obligatorio que sea de tipo MIME 'text/html'. Si te fijas, solo estás devolviendo un sencillo 'text/plain'.

Para que funcione, debe haber "algo" en la página que lo solicite.

El problema es que, con HTML estándar (que es un lenguaje de marcado, no de programación), no hay ningún elemento que permita "incluir" el contenido de un archivo de texto en el flujo normal del código HTML.

Así que, ahora, son dos problemas: llamar al CGI, y colocar el contador de visitas en la página (o quizás no; este último problema es opcional).

Para resolverlo, se puede hacer de varias maneras. Que recuerde:
  • colocar la ruta del CGI en el 'src' de una marca <img ...>. Esto es muy feo (la página espera una imagen, pero recibe un texto. Al final, no sale nada en pantalla). Lo puedes esconder diciendo que la imagen tiene un tamaño de 1x1, y así es invisible (o casi)
  • usar un <iframe> en alguna parte de la página, que además de llamar al CGI, puede mostrar su contenido. Es lo más sencillo y rápido.
  • usar un evento onload, que llame a un CGI, y que deposite el resultado en alguna parte del DOM. El ejemplo que pones no es correcto: los eventos deben ser código JavaScript.
  • una cosa muy elaborada, pero es lo que yo suelo usar: Server-Side Includes. En el servidor web Apache, cargamos el complemento mod_include. En el archivo de configuración de definición de funcionamiento del servidor agregamos la opción Options +Includes (o, mejor aún, Options +IncludesNOEXEC) al directorio donde vamos a colocar las páginas HTML. Y en ellas ponemos líneas como esta: <!--#include virtual="/ruta/al/cgi/cgi.pl" --> Eso lo que hace es llamar al CGI, recoger su respuesta, y colocarla en lugar de esa etiqueta. Es como un sistema de plantillas, pero muy primitivo. Pero funciona.
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: Contador de vistas

Notapor seafree » 2016-06-09 09:51 @452

Hola, explorer. De acuerdo a tus recomendaciones opté por la más sencilla, pero no se ejecuta el incremento mandando el error:
Internal Server Error

Tú recomendación:
Colocar la ruta del CGI en el 'src' de una marca <img ...>. Esto es muy feo (la página espera una imagen, pero recibe un texto. Al final, no sale nada en pantalla). Lo puedes esconder diciendo que la imagen tiene un tamaño de 1x1, y así es invisible (o casi)

Pues bien, realicé las modificaciones al código:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
.
.
</head>
<body >
<img src="../../cgi-bin/sifamep/count_visitas.cgi" height="4" width="4" />
.
.
.
.

Y me manda el mensaje:

Internal Server Error

Verifiqué los permisos del script y tiene:
-rwxr-xr-x 1 root root
-rwxrwxr-x 1 root root

Tiene 775 pero eso no es el problema.

Verifiqué el archivo de log error del servidor Apache y lo que tiene registrado es:

(8)Exec format error: exec of '/var/www/cgi-bin/sifamep/count_visitas.cgi' failed
Premature end of script headers: count_visitas.cgi


Me podrás dar algún truco, al respecto. Mil gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Contador de vistas

Notapor explorer » 2016-06-09 16:37 @734

No da muchas pistas, el error...

Prueba antes a instalar y ejecutar mi CGI mínimo.

Fíjate en el uso de

use CGI::Carp qw(fatalsToBrowser);

que manda los mensajes de error a la ventana. Podría dar más información.

Voy a decir una posible causa.

El programa hace dos operaciones de lectura y escritura de archivos. Quizás no sea capaz de encontrarlos y/o no tenga permisos de escritura.

Recuerda que, aunque el programa tiene como propietario a root (a propósito, algo nada recomendable, por temas de seguridad), lo ejecuta el usuario del servidor web (httpd, apache2, www-data o cualquier otro nombre parecido).

Entonces, ese programa se ejecuta con ese propietario. Hay que ver si ese usuario tiene permiso para leer el archivo, y luego modificarlo. Lo normal es que el archivo esté puesto a nombre del usuario web, o al menos, al grupo. Y con permiso de escritura en él.

Se podría hacer algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI       qw(:standard      );
  3. use CGI::Carp qw(fatalsToBrowser);
  4.  
  5. my $archivo  = "/tmp/counter.txt";      # por seguridad, damos la ruta completa
  6. my $contador = 0;                       # si el $archivo no existe, iniciamos el $contador a 0
  7.  
  8. eval {                                  # lo ejecutamos en un entorno controlado:
  9.     open my $FILE, '<', $archivo;       # si se produce un error, lo cazará eval,
  10.     $contador = 0+ <$FILE>;             # y dejará el error en $@
  11.     close $FILE;
  12. };
  13. if ($@) {
  14.     die "ERROR en la lectura: $@\n";
  15. }
  16.  
  17. $contador++;
  18.  
  19. print
  20.     header,
  21.     start_html('Prueba de contador'),
  22.     h1('Contador:'),
  23.     hr,
  24.     p($contador),
  25.     hr,
  26.     end_html,
  27.     ;
  28.  
  29. eval {
  30.     open my $FILE, '>', $archivo) {
  31.     print   $FILE $contador;
  32.     close   $FILE;
  33. };
  34. if ($@) {
  35.     die "ERROR en la escritura: $@\n";
  36. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


También podría ser... que tu perl NO esté en /usr/bin/... sino en otro sitio.
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: Contador de vistas

Notapor seafree » 2016-06-10 11:37 @525

Respecto a tu última observación:

"También podría ser... que tu perl NO esté en /usr/bin/... sino en otro sitio."

Pienso que si ese fuera el detalle, entonces ningún programa se ejecutaría, ¿no es así?

¿De qué manera puedo comprobar el directorio donde Perl se encuentra instalado?
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Contador de vistas

Notapor seafree » 2016-06-10 12:52 @578

El CGI mínimo funciona bien en mi sitio, pero al agragar la linea:

use CGI::Carp qw(fatalsToBrowser);

No envía mayor detalle de error.

De acuerdo a la causa que mencionas:

Cree el script de ejemplo que me enviaste y al compilar manda los mensajes de error de sintaxis en la linea open my $FILE, '<', $archivo) {

Algo más: creé el usuario web con directorio especifico:
# useradd -d /tmp/web web y le asigne los permisos: # chmod 775 web

Y sigue mandando errores de compilación.

¿Qué estoy omitiendo?
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Contador de vistas

Notapor explorer » 2016-06-10 13:35 @607

seafree escribiste:Cree el script de ejemplo que me enviaste y al compilar manda los mensajes de error de sintaxis en la linea open my $FILE, '<', $archivo) {
Corregido.

seafree escribiste:Algo más: creé el usuario web con directorio especifico:
# useradd -d /tmp/web web y le asigne los permisos: # chmod 775 web

Y sigue mandando errores de compilación.
Eso no sirve. Si está instalado el servidor web, entonces YA existe un usuario web, que está definido en el script de arranque del servidor web. Si estás en un entorno Linux, gestionado con un panel de control o sistema de paquetería de software, te recomiendo que deshagas lo que has hecho, no sea que estés descomponiendo el sistema.

seafree escribiste:¿De qué manera puedo comprobar el directorio donde Perl se encuentra instalado?
Con el comando which perl el sistema te informa dónde está el perl del sistema. Lo normal será /usr/bin/perl, así que eso es lo que hay que poner en la línea shebang.

Esto es importante: LOS DOS primeros caracteres del ARCHIVO han de ser '#' y '!'.
Si no ocurre eso, entonces es normal que salga el mensaje de error Exec format error.

seafree escribiste:¿Qué estoy omitiendo?
Cuando el Apache se encuentra con el caso de tener que ejecutar un cgi, mira esa línea, y arranca el intérprete indicado ahí y le pasa como argumento el propio cgi.
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: Contador de vistas

Notapor seafree » 2016-06-10 14:48 @658

Gracias por tu apoyo, explorer:

1) En efecto: a pesar de que mi script cuenta con la línea #! /usr/bin/perl, esta no era la primera; la primera era un comentario. Con la ayuda de tus observaciones ahora sí se despliega el error en la web:

Could not open file! at /var/www/cgi-bin/count_visitas2.cgi line 24.

La línea 24 es: open (THIS, ">$this") || die("Could not open file!");

2) Al ejecutar which perl la ruta que despliega es /usr/bin/perl

Gracias por tu apoyo, explorer, aún tengo algunos detalles y los arreglaré. Saludos.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Contador de vistas

Notapor seafree » 2016-06-10 15:23 @682

Gracias por tu gran ayuda, explorer. Aparte de tus observaciones hice unas modificaciones de permisos y ya quedó.

Respetos,
seafree
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado