El Nota: Sabes, esto... esto es un caso muy, muy complicado, Maude. Un montón de input y de output. Afortunadamente estoy siguiendo un régimen de drogas bastante estricto para mantener la mente..., ya sabes...: ágil.Entonces: la buena noticia es que para escribir un módulo lighttpd no estáis obligados a seguir el mismo régimen de El Nota... la mala noticia es que se necesita un poco de esfuerzo, pero será mucho más fácil después de leer este post (y el anterior, por supuesto... ¿que no lo habéis leído? ¡Pero esta es la segunda parte!).
cara de "¡Ahora se cómo se escribe un módulo lighttpd!" |
En primer lugar elegimos un nombre y una acción... va a ser un clásico: le llamaremos mod_helloworld y el módulo escribirá en el browser la frase "Hello, world!" (¡Muy, pero muy, original!).
Abrimos un terminal de Linux, entramos en la root-directory del entorno de desarrollo y ejecutamos los siguientes comandos (que he enumerado para describirlos uno por uno):
1. sudo gedit /etc/lighttpd/lighttpd.conf 2. gedit src/Makefile.am 3. cp src/mod_skeleton.c src/mod_helloworld.c 4. gedit src/mod_helloworld.c 5. ./autogen.sh 6. ./configure 7. make 8. sudo make install 9. sudo cp /usr/local/lib/mod_helloworld.so /usr/lib/lighttpd 10. sudo /etc/init.d/lighttpd restartEntonces: con 1. editamos (con gedit, pluma, vim, geany... o con lo que os gusta más), el file de configuración lighttpd para añadir a la lista de módulos instalados el nuestro nuevo módulo: buscad la lista "server.modules" y insertad después de el último módulo, el nuevo. Una vez echo esto el aspecto de la lista será así
server.modules = ( "mod_access", "mod_alias", "mod_compress", "mod_redirect", "mod_helloworld", )Con 2. editamos el file Makefile.am del package. En comparación con el package original estamos añadiendo un módulo, por lo que hay que buscar el último módulo estándar presente (normalmente es mod_accesslog). Nos encontraremos con cuatro líneas de este tipo:
lib_LTLIBRARIES += mod_accesslog.la mod_accesslog_la_SOURCES = mod_accesslog.c mod_accesslog_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined mod_accesslog_la_LIBADD = $(common_libadd)Copiamos estas líneas y las pegamos inmediatamente a continuación, sustituiendo en las NUEVAS cuatro lineas mod_accesslog con mod_helloworld. Guardamos y salimos: ahora el nuestro Makefile.am está listo para manejar también el nuevo módulo. Las líneas añadidas serán estas:
lib_LTLIBRARIES += mod_helloworld.la mod_helloworld_la_SOURCES = mod_helloworld.c mod_helloworld_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined mod_helloworld_la_LIBADD = $(common_libadd)Con 3. copiamos el file mod_skeleton.c en un nuevo file che llamaremos mod_helloworld.c: mod_skeleton.c es untemplate file que contiene el esqueleto básico de un módulo: este file nos lo proporcionan amablemente los excelentes desarrolladores de lighttpd para facilitarnos el desarrollo de nuevos módulos.
Con 4. editamos mod_helloworld.c y, con un comando de sustitución global, cambiamos todas las recurrencias de la palabra skeleton en helloworld. Por el momento guardamos el file así como está y salimos del editor.
Con la secuencia 5.6.7.8. (¿ya vista en el post anterior, os acordáis?) compilamos e instalamos el nuevo módulo. Es posible que en el paso 6. (la configuración) el proceso os diga dice que no encontra algunas librerias: normalmente el error se resuelve usando:
sudo apt-get install libpcre3-dev libbz2-devy repitiendo, luego, el punto 6.
Con 9. copiamo el nuevo módulo generado (que tiene la forma de una librería dinámica, una .so) en la directory de sistema que contiene los módulos lighttpd.
Con 10., finalmente, reiniciamos lighttpd y, si no aparece ningún error, el nuestro Web Server ya está listo para utilizar el nuevo módulo (que, por el momento, está medio vacío: como se ha mencionado anteriormente es sólo el esqueleto de un módulo).
¿Que nos falta en este punto? Bueno, obviamente, tenemos que añadir un poco de código al nuestro módulo para que él haga algo (en este caso, mostrarnos un bonito "Hello, world!"). Pero esto lo veremos en el próximo episodio, y, como siempre, no contengáis la respiración esperando...
¡Hasta el próximo post!