Debian + Lighttpd + Mailman

vicm3@hotmail.com (Víctor Martinez)
Mon, 23 Feb 2009 16:20:43 -0600

Bueno después de darme de topes con esto, ya logre que funcione esta configuración, que me dio muchos problemas... para empezar por que no me enviaba el error y así ni encontraba el por que marcaba error.

Primero he de decir que tal cual lo único que debe hacer uno para que se ejecuten los cgi de mailman en Debian es lighttpd-enable-mod cgi y en lighttpd.conf agregar:

alias.url += (

"/cgi-bin/" => "/usr/lib/cgi-bin/",

"/pipermail/" => "/var/lib/mailman/archives/public/",

"/images/mailman/" => "/usr/share/images/mailman/",

)

Como podrán ver en /usr/lib/cgi-bin es donde Debian realmente guarda los cgi (derivado de como ha ido creciendo esta instalación aún tengo /var/www/html/ (que en Debian debiera ser /var/www ) ahora el detalle esta en que lighttpd corre como el usuario 33 (www-data) y normalmente mailman espera al 38 (list) asi que no encontraba ni el error por que al ejecutarlo como lighttpd ni escribía en los logs.

Primero pensé en hacer strace de lighttpd, craso error, como el sitio esta vivo y tiene muchas visitas en unos segundos me llenaba de pantallas y aun cuando encontraba el error no lograba distinguirlo de muchas otras cosas que se ejecutaban casi al mismo tiempo.

Entonces fui directamente a /usr/lig/cgi-bin/mailman y le di file listinfo:

listinfo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

Entonces, pues a ejecutarlo,

./listinfo

Status: 405 Method not allowed

Content-type: text/plain

The method is not allowed

Mhh, por ahí recordé que con su se pueden enviar comandos con su y el usuario así que

su - www-data -c /usr/lib/cgi-bin/mailman/listinfo

_atatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatat_

[----- Mailman Version: 2.1.11 -----]

[----- Traceback ------]

Traceback (most recent call last):

File "/var/lib/mailman/scripts/driver", line 82, in run_main

immediate=1)

File "/usr/lib/mailman/Mailman/Logging/StampedLogger.py", line 52, in init

Logger.init(self, category, nofail, immediate)

File "/usr/lib/mailman/Mailman/Logging/Logger.py", line 50, in init

self.get_f()

File "/usr/lib/mailman/Mailman/Logging/Logger.py", line 68, in get_f

1)

File "/usr/lib/python2.5/codecs.py", line 817, in open

file = builtin.open(filename, mode, buffering)

IOError: [Errno 13] Permission denied: '/var/lib/mailman/logs/error'

Content-type: text/html

Bug in Mailman version 2.1.11

Bug in Mailman version 2.1.11

We're sorry, we hit a bug!

Please inform the webmaster for this site of this

problem. Printing of traceback and other system information has been

explicitly inhibited, but the webmaster can find this information in the

Mailman error logs.

[----- Python Information -----]

sys.version = 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)

[GCC 4.3.2]

sys.executable = /usr/bin/python

sys.prefix = /usr

sys.exec_prefix = /usr

sys.path = /usr

sys.platform = linux2

[----- Environment Variables -----]

LANG: en_US

TERM: xterm

SHELL: /bin/sh

LANGUAGE: en_MX:en_US:en_GB:en

SHLVL: 1

PYTHONPATH: /var/lib/mailman

PWD: /var/www

LOGNAME: www-data

USER: www-data

HOME: /var/www

MAIL: /var/mail/www-data

_: /usr/lib/cgi-bin/mailman/listinfo

Ahi estaba el primer detalle:

IOError: [Errno 13] Permission denied: '/var/lib/mailman/logs/error'

/var/log/mailman no es puede ser escrito cuando es invocado por www-data en este caso lighttpd a dar chown www-data.www-data /var/log/mailman -R

Bueno después de arreglar eso a invocarlo de nuevo:

/usr/lib/cgi-bin/mailman# su - www-data -c /usr/lib/cgi-bin/mailman/listinfo

Status: 405 Method not allowed

Content-type: text/plain

The method is not allowed

Bueno al menos ya tenemos el mismo comportamiento que cuando lo ejecuto directo como root, pero mejor aún ahora si escribe el error en /var/log:

Feb 23 15:02:31 2009 admin(10633): _atatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatat_

admin(10633): [----- Mailman Version: 2.1.11 -----]

admin(10633): [----- Traceback ------]

admin(10633): Traceback (most recent call last):

admin(10633): File "/var/lib/mailman/scripts/driver", line 110, in run_main

admin(10633): main()

admin(10633): File "/usr/lib/mailman/Mailman/Cgi/listinfo.py", line 42, in main

admin(10633): listinfo_overview()

admin(10633): File "/usr/lib/mailman/Mailman/Cgi/listinfo.py", line 87, in listinfo_overview

admin(10633): mlist = MailList.MailList(name, lock=0)

admin(10633): File "/usr/lib/mailman/Mailman/MailList.py", line 130, in init

admin(10633): self.Load()

admin(10633): File "/usr/lib/mailman/Mailman/MailList.py", line 638, in Load

admin(10633): dict, e = self.load(file)

admin(10633): File "/usr/lib/mailman/Mailman/MailList.py", line 604, in load

admin(10633): fp = open(dbfile)

admin(10633): IOError: [Errno 13] Permission denied: '/var/lib/mailman/lists/anime/config.pck'

admin(10633): [----- Python Information -----]

admin(10633): sys.version = 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)

[GCC 4.3.2]

admin(10633): sys.executable = /usr/bin/python

admin(10633): sys.prefix = /usr

admin(10633): sys.exec_prefix = /usr

admin(10633): sys.path = /usr

admin(10633): sys.platform = linux2

admin(10633): [----- Environment Variables -----]

admin(10633): REDIRECT_STATUS: 200

admin(10633): SERVER_SOFTWARE: lighttpd/1.4.19

admin(10633): SCRIPT_NAME: /cgi-bin/mailman/listinfo

admin(10633): REQUEST_METHOD: GET

admin(10633): HTTP_KEEP_ALIVE: 300

admin(10633): SERVER_PROTOCOL: HTTP/1.1

admin(10633): CONTENT_LENGTH: 0

admin(10633): HTTP_ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7,*;q=0.7

admin(10633): HTTP_USER_AGENT: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009011912 Firefox/3.0.6

admin(10633): HTTP_CONNECTION: keep-alive

admin(10633): SERVER_NAME: foo.bar

admin(10633): REMOTE_PORT: 58661

admin(10633): SERVER_PORT: 80

admin(10633): SERVER_ADDR: 0.0.0.0

admin(10633): DOCUMENT_ROOT: /var/www/html

admin(10633): PYTHONPATH: /var/lib/mailman

admin(10633): SCRIPT_FILENAME: /usr/lib/cgi-bin/mailman/listinfo

admin(10633): HTTP_HOST: foo.bar

admin(10633): REQUEST_URI: /cgi-bin/mailman/listinfo

admin(10633): HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

admin(10633): GATEWAY_INTERFACE: CGI/1.1

admin(10633): REMOTE_ADDR: foo.bar

admin(10633): HTTP_ACCEPT_LANGUAGE: en-us,en;q=0.5

admin(10633): HTTP_ACCEPT_ENCODING: gzip,deflate

[terminal]

Mhh... aqui lo importante

[terminal]

admin(10633): IOError: [Errno 13] Permission denied: '/var/lib/mailman/lists/anime/config.pck'

admin(10633): [----- Python Information -----]

El directorio lists y todo su contenido tiene como dueño root.list entonces pues ahora nuestro binario (setgid) no puede leer las listas... pero entonces ya estamos de gane:

chown www-data.list lists/ -R

Y voila tenemos mailman funcionando en Debian con lighttpd. Resumiendolo en pocos pasos.

1) Es necesario activar el modulo cgi de lighttpd (si esta uno en stable, es este caso Lenny, no hay necesidad de modificar su configuración.

2) En lighttpd.conf hay que añadir alias a los archivos que se van a usar:

alias.url += (

"/cgi-bin/" => "/usr/lib/cgi-bin/",

"/pipermail/" => "/var/lib/mailman/archives/public/",

"/images/mailman/" => "/usr/share/images/mailman/",

)

3) /var/log/mailman tiene como dueño root.list y debe ser www-data.list para que pueda escribir lighttpd ahi

4) /var/lib/mailman/list tiene como dueño a root.list y tambien debe ser www-data.lists para que pueda leer y modificar ahi lighttpd (bueno mas bien el script pero que es invocado por lighttpd), también a archives/ data/ deben cambiarseles los permisos o de lo contrario la pagina del administrador no funciona correctamente

5) newlist en caso de que aun no tengamos listas creadas.

Actualización: 28 Feb, añado más directorios que deben tener permisos www-data.list