domingo, 4 de mayo de 2008

Generar páginas dinámicamente con lisp y apache

Yo no quiero usar un modulo-extraño-de-comunicacion-de-apache-con-lisp ni nada por el estilo. Sólo quiero "Generar páginas dinámicamente con lisp y apache". La solución elegida pasa por convertir los fuentes de clisp (common-lisp) en ejecutables con
chmod a+x *.lisp

y añadiendo como primera línea de los archivos:

#!/usr/bin/clisp

Así, podemos comprobar que el fichero en lisp se ejecuta correctamente:

Romeo:/home/rober# ls -l /var/www/lisp/prueba.lisp
-rwxr-xr-x 1 root root 43 2005-07-02 20:59 /var/www/lisp/prueba.lisp

Romeo:/home/rober# cat /var/www/lisp/prueba.lisp
#!/usr/bin/clisp
(format t "hola, mundo")

Romeo:/home/rober# /var/www/lisp/prueba.lisp
hola, mundo

Ahora, en /etc/apache/httpd.conf añadimos las siguientes lineas

Romeo:/home/rober# head -905 /etc/apache/httpd.conf | tail -4

Options +ExecCgi
AddHandler cgi-script .lisp


que, para una carpeta concreta, añade permisos de ejecución para los CGIs, que debe ir acompañada de los permisos de ejecución de los archivos en el sistema. Además, elige cgi-script como manejador para los archivos acabados en .lisp. Es *importante* que las primeras lineas que el script escriba por stdout (con lisp usando format o print) sean "content-type: text/html" sin las comillas, o especificar otro tipo si el script genera otra cosa que no sea html. Después, se debe dejar una línea en blanco, o sea, usar *DOS* saltos de linea en lisp:
(format t "~%~%" )

después se interpreta que el resto de la salida por pantalla debe ser enviada. Podemos hacer lo mismo para los public_html de cada usuario (notese el ExecCGI en la linea Options y el AddHandler):
Romeo:/home/rober# head -355 /etc/apache/httpd.conf | tail -20

UserDir public_html
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#

AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCgi
        AddHandler cgi-script .lisp

Order allow,deny
Allow from all


Order deny,allow
Deny from all




Para rematar añadimos index.lisp al final de lista del DirectoryIndex para que un archivo index.lisp sirva de archivo inicial si no se especifica ninguno...
Romeo:/home/rober# head -363 /etc/apache/httpd.conf | tail -3

DirectoryIndex index.html index.htm index.shtml index.cgi index.php index.lisp


Demostración de funcionamiento:

rober@Romeo:~/public_html$ ls -l index.lisp
-rwxr-xr-x 1 rober rober 106 2005-07-02 21:06 index.lisp

rober@Romeo:~/public_html$ cat index.lisp
#!/usr/bin/clisp
(format t "content-type: text/html")
(format t "~%~%" )
(format t "hola, soy rober!" )

rober@Romeo:~/public_html$ ./index.lisp
content-type: text/html

hola, soy rober!

rober@Romeo:~/public_html$ lynx --dump -nolist localhost/~rober

hola, soy rober!