anoche puse a andar un trac para kreissy. una de las cosas que dejé colgando fue que el trac quedó abierto como... bueno, apelen a su imaginación para terminar esa frase. esa misma noche humitos dejó su impronta, cosa que no me molesta, pero marca que esto no puede quedar así. so, a poner auth.
trac delega todo el sistema de autenticación en apache, así que es lo mismo que poner a andar tal cosa. apache tiene muy buena doc9n[1] al respecto. el desafío es hacerlo andar desde un .htpasswd.
pero, no se puede poner un bloque en un .htpasswd, lo cual imposibilita la empresa. y esto, ahora recuerdo, es lo que lo hizo imposible antes. así que no queda otra que recurrir a la configuración global de apache y dejarnos de joder.
al final el archivo /etc/apache2/sites-available/trac-kreissy quedó:
<Location /~mdione/projects/kreissy>
<span class="createlink">SetHandler</span> mod_python
<span class="createlink">PythonHandler</span> trac.web.modpython_frontend
<span class="createlink">PythonOption</span> <span class="createlink">TracEnv</span> /home/mdione/src/projects/kreissy/trac
<span class="createlink">PythonOption</span> <span class="createlink">TracUriRoot</span> /~mdione/projects/kreissy
</Location>
# auth
<Location /~mdione/projects/kreissy/login>
<span class="createlink">AuthType</span> Basic
<span class="createlink">AuthName</span> "kReiSSy-trac"
<span class="createlink">AuthUserFile</span> /home/mdione/src/projects/kreissy/trac/htpasswd
Require valid-user
</Location>
luego agregamos el sitio como enabled y reiniciamos apache:
$ sudo a2ensite trac-kreissy
Site trac-kreissy installed; run /etc/init.d/apache2 reload to enable.
$ sudo /etc/init.d/apache2 reload
c'est tout! luego configuro el trac con trac-admin y listo.
sysadmin trac apache
[1] documentación.
¿Se acuerdan de la primera
parte?
Bueno, venía aplicando esto varias veces últimamente (nuevamente tracs y
nuevamente plugins). Sé que mi jefe me va a
retar,
pero la verdad es que lo prefiero así. Generalizé esa idea y lo hice un
script, y para marcar su diferencia con el easy_install, lo llamé
useful_install:
#! /usr/bin/python
__requires__ = 'setuptools==0.6c3'
import sys
path= sys.argv.pop (1)
sys.path.append (path)
sys.argv= [sys.argv[0], '--install-dir', path, '--site-dirs', path ]+sys.argv[1:]
from pkg_resources import load_entry_point
sys.exit(
load_entry_point('setuptools==0.6c3', 'console_scripts', 'easy_install')()
)
Como verán es idéntico al easy_install, salvo que el primer parámetro
es el directorio donde vamos a instalar las cosas y que hace la magia
necesaria de agregarlo al sys.path y armar los argumentos para e_i.
Además, le podemos pasar más parámetros a voluntad y pasan derecho al
load_entry_point del e_i. Que lo disfruten.
Como habrán notado en mi post anterior, estuve agregando un plugin anti spam en un Trac que tiene submit de tickets anómimo. Una vez que TracSpamFilter está instalado como mencioné en tal post y habiendo instalado WebAdmin también, queda andando de una.
Un comentario antes de pasar al punto de este post. El plugin funciona con un sistema de karma. Un post arranca con karma 0 y luego se le va cambiando a medida que los distintos filtros se disparan o no. El tema es que algunos suman y otros restan karma. Pero esto no se deduce fácilmente de la página de configuración, pues todos los valores son positivos. Bueno, les comento: el único positivo es el SessionFilterStrategy y el resto son negativos.
Esto quiere decir por ejemplo que por default, un usuario con login (SessionFilterStrategy, +9) puede mandar muchos links externos (ExternalLinksFilterStrategy, -2) y que además matcheen contra BadContent (ése es el RegexFilterStrategy, -5) sin que lo marque como spam.
Volviendo al punto, el problema es que una vez instalado sólo filtra spam entrante, pero no lo que ya hay. Cómo sacárselo de encima? No encontré mejor solución que hackear la base de datos. En mi caso particular, que creo que es el que está afectando a muchos, encontré que los summaries eran muy cortos, por lo que con esto alcanzó:
delete from ticket where length(summary)<11;
También es posible que les hayan llenado comentarios de tickets con spam. No es mi caso directo, sino más bien la forma en que testeaba el plugin. Habiendo hecho lo anterior, los comentarios (y en realidad, cualquier cambio sobre los mismos) de esos tickets quedaron huérfanos. Se los puede borrar con:
delete from ticket_change where ticket not in (select id from ticket);
deletes similares deberían poderse aplicar a otras partes del trac que
estén abiertas.
Trac es fantástico. Tiene todo lo que quiero y más. Amo Trac...
... hasta que se me ocurre la inefable idea de ponerle plugins. Resulta
que Trac es plugineable desde la versión 0.9, y que en la versdion 0.10
más aún, con más plugineabilidad que antes! Y además, existen usas cosas
llamadas .egg que simplifican todo: sólo ponés un .egg en el
tracenv/plugins y ya.
... y ya? I wish. Resulta que no, mirá vos, que si no hacés la danza del
easy_install no anda. Esto es porque éste se las arregla para que un
.egg (que a todo esto es un .zip con el paquete) se pueda cargar.
Ok, tons nos proponemos a hacer dicha danza. El tema es que uno quiere
ser ordenadito y en vez de ensuciar el sistema (e_i por defecto pone
todo en el site-packages del python por defecto) espero que los
.eggs terminen en el mencionado directorio. Así, intentamos con esto:
sudo -u www-data easy_install --install-dir /var/lib/trac/xarope/plugins/ \
--site-dirs /var/lib/trac/xarope/plugins/ <span class="createlink">TracSpamFilter</span>
error: /var/lib/trac/xarope/plugins/ (in --site-dirs) is not on sys.path
Lindo error. Resulta que no hay forma de coercer a e_i que lo haga,
por más que no esté en el PYTHONPATH (bah, en el sys.path). Y
hablando de dicha envvar, no anda ni con PYTHONPATH=path comando ni
con un export previo.
Comienza la hora de la negrada. Primero vemos que e_i es en realidad
un wrapper de 4 líneas python:
$ cat $(which easy_install)
#!/usr/bin/python2.4
# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.6c3','console_scripts','easy_install'
__requires__ = 'setuptools==0.6c3'
import sys
from pkg_resources import load_entry_point
sys.exit(
load_entry_point('setuptools==0.6c3', 'console_scripts', 'easy_install')()
)
Cuál es la idea? Arrancar un intérprete python, modificar sys.path, de paso sys.argv, invocar dichas líneas de python y ya:
In [1]: import sys
In [2]: sys.path.append ("/var/lib/trac/xarope/plugins/")
In [3]: __requires__ = 'setuptools==0.6c3'
In [4]: from pkg_resources import load_entry_point
In [5]: lep= load_entry_point('setuptools==0.6c3', 'console_scripts', 'easy_install')
In [10]: sys.argv.extend (['--install-dir', '/var/lib/trac/xarope/plugins/', '--site-dirs', '/var/lib/trac/xarope/plugins/', 'TracSpamFilter'])
In [13]: lep ()
Creating /var/lib/trac/xarope/plugins/site.py
Searching for <span class="createlink">TracSpamFilter</span>
Reading http://www.python.org/pypi/TracSpamFilter/
Reading http://trac.edgewall.org/wiki/SpamFilter
Reading http://www.python.org/pypi/TracSpamFilter/0.2dev-r4489
Best match: <span class="createlink">TracSpamFilter</span> dev
Downloading http://svn.edgewall.com/repos/trac/sandbox/spam-filter#egg=TracSpamFilter-dev
Doing subversion checkout from http://svn.edgewall.com/repos/trac/sandbox/spam-filter to /tmp/easy_install-C5o9rL/spam-filter
Processing spam-filter
Running setup.py -q bdist_egg --dist-dir /tmp/easy_install-C5o9rL/spam-filter/egg-dist-tmp-nVJ04Y
Adding <span class="createlink">TracSpamFilter</span> 0.2.1dev-r6418 to easy-install.pth file
Installed /var/lib/trac/xarope/plugins/TracSpamFilter-0.2.1dev_r6418-py2.4.egg
Processing dependencies for <span class="createlink">TracSpamFilter</span>
Voilá! De acá! Si apunto mi browser a mi trac obtengo:
[back trace]
<span class="createlink">ExtractionError</span>: Can't extract file(s) to egg cache
The following error occurred while trying to extract file(s) to the Python egg
cache:
[Errno 13] Permission denied: '/var/www/.python-eggs'
The Python egg cache directory is currently set to:
/var/www/.python-eggs
Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
Ah, esto es fácil, sólo agrego un SetEnv PYTHON_EGG_CACHE path en la
configuración de Apache para este Trac y ahora sí, yastá!
sysadmin trac
El segundo día me amaneció a las 13. Hoy tocaba terminar con el Apache,
que incuía apenas los tracs y el dotproject. Ambos implicaban
upgrades.
Los trac no me hicieron renegar mucho, pues está muy
bien documentado y
hasta fue scripteable. Básicamente era un salto de sqlite2 a
sqlite3,
un trac-admin ... upgrade seguido de un trac-admin ... resync.
Con lo único con lo que renegué fue que a pesar del upgrade fue exitoso no podía entrar. En los logs encontraba esto:
(9)Bad file descriptor: Could not open password file: (null)
Google al rescate me dijo que había que apagar esa directiva que había tenido que modificar el día anterior:
<span class="createlink">AuthzLDAPAuthoritative</span> off
También me salió esto:
Failed to load the <span class="createlink">AuthzSVNAccessFile</span>: The character 'o' in rule '@except' is not allowed in authz rules
Eso era porque en un archivo de configuración del repo
(conf.svnaccess) tenía los permisos de sólo lectura como ro en
vez de r.
El dotproject me enfrentó a un viejo archienemigo: mysql. La verdad
que no se a queinacarajos se le ocurre que es una excelente idea poner
la configuración de acceso y permisos de una base de datos dentro de la
base misma. Por un lado eso termina siendo un archivo binario no
versionable y por otro obliga al sysadmin a aprender SQL (cosa que sé,
pero no manejo fluidamente ni me interesa saberlo; otro de los motivos
por los que amo los ORM's). Y además esta configuración termina en
/var y no en etc. postgresql, en cambio, es mucho más inteligente.
Y viva el SQL independiente del motor. Lástima nadie lo usa...
Bien, sólo tuve que hacer un dump del mysql anterior (chroot
mediante), crear la base en el nuevo y hacer un load. Fantástico. Luego
una lucha trabado con el sistema de permisos antesmencionado. Luego
apuntar un browser a https://server/dotproject/install. En ese
minisitio tuve primero que configurarlo (como DP no es un paquete en
Debian, lo instalé de fuentes; la configuración queda en un archivo en
include/config.php; ojo que las otras opciones es nukear las bases),
luego volver a entrar a dicha URL, momento en el cual detecta las bases
viejas y da la opción de upgradearlas. Anduvo sin problemas y ahora
disfrutamos de un DP más nuevo. Yeepee!
esta noche me voy a dedicar rápidamente a poner un trac para kreissy. la idea final es que el URL anterior sea la páfina oficial del proyecto, pero que no necesariamente sea el URL final; puede que haya un redirect al medio. ya explicaré porqué.
lo primero es crear un trac-env para eso:
mdione@skid:~/src/projects/kreissy$ trac-admin trac initenv kReiSSy sqlite:db/trac.db svn /home/mdione/src/projects/kreissy/svn /usr/share/trac/templates
también se puede con:
mdione@skid:~/src/projects/kreissy$ trac-admin trac
a secas, ejecutar el comando initenv y responder las preguntas, que en realidad son, en ese orden, los parámetro sde allá arriba.
el punto complicado es enganchar esto con el apache. hay varios métodos: usándolo como un cgi común y coriente, con FastCGI, con mod_python y con mod_wsgi. hoy me siento valiente así que usaría mod_wsgi, pero como creo que en algún momento esto puede correr en un debian stable, me voy al más seguro mod_python.
la documentación de trac es muy explícita con respecto a los pasos a seguir, así que no pienso repetirlos acá. sí voy a tratar de explicar cómo lo adapté a mi situación.
resultó ser más sencillo que antes. la última que lo probé, hará unas cuantas versiones de trac, me quedó un chancullo muy feo. pero ahora sólo bastó este archivo .htaccess en el directorio en mi public_html:
<span class="createlink">SetHandler</span> mod_python
<span class="createlink">PythonHandler</span> trac.web.modpython_frontend
<span class="createlink">PythonOption</span> <span class="createlink">TracEnv</span> /home/mdione/src/projects/kreissy/trac
<span class="createlink">PythonOption</span> <span class="createlink">TracUriRoot</span> /~mdione/projects/kreissy
y ya tengo el trac andando! ftatico! ahora a llenar contendo y eso. pero eso mañana...
Desde hace como dos semanas que vengo esporádicamente peleando con un problema:
Tenía que poner a andar el plugin de Mercurial para Trac. Según las
instrucciones de la página, sólo
es cuestión de generar un .egg (¿se acuerdan?),
ponerlo en el directorio plugins del environment y ya. Pero corriendo tracd
y entrando con un browser me daba:
<span class="createlink">TracError</span>: Unsupported version control system "hg"
Mi primer sospechoso era el .egg; creía que no lo estaba encontrando.
Prendiendo el logging en el trac.ini descubrí que en realidad si lo levantaba.
Siguiendo un par de links encontré una sugerencia de correr todos los imports
que corre el backend.py del plugin. Finalmente descubrí que la línea:
from mercurial.revlog import <span class="createlink">LookupError</span>
fallaba. Se vé que el
Mercurial que viene en Etch (0.9.1-1+etch1) no es del todo compatible, a pesar
que la página del plugin dice que lo es, inclusive hasta con 0.8. Para
"repararlo" simplemente saué las (1) referencias a LookupError.