tags/tracStyXman's globhttp://grulicueva.homelinux.net/~mdione/glob//tags/trac/StyXman's globikiwiki2009-01-22T04:24:04Ztrac-me-tiene-los-eggs-llenos-toma-2http://grulicueva.homelinux.net/~mdione/glob//posts/trac-me-tiene-los-eggs-llenos-toma-2/2009-01-22T04:24:04Z2008-09-09T00:17:05Z
<p>¿Se acuerdan de <a href=
"http://grulicueva.homelinux.net/~mdione/glob/posts/trac-me-tiene-los-eggs-llenos/">
la primera parte</a>? Bueno, venía aplicando esto varias veces
últimamente (nuevamente tracs y nuevamente plugins). Sé que
<a href="http://john.lenton.com.ar/2008/05/26/easy-install-without-virtualenv-implies-hard-maintenance/">
mi jefe me va a retar</a>, pero la verdad es que lo prefiero así.
Generalizé esa idea y lo hice un script, y para marcar su
diferencia con el <code>easy_install</code>, lo llamé
<code>useful_install</code>:</p>
<pre>
<code>#! /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')()
)
</code>
</pre>
<p>Como verán es idéntico al <code>easy_install</code>, salvo que
el primer parámetro es el directorio donde vamos a instalar las
cosas y que hace la magia necesaria de agregarlo al
<code>sys.path</code> y armar los argumentos para <code>e_i</code>.
Además, le podemos pasar más parámetros a voluntad y pasan derecho
al <code>load_entry_point</code> del <code>e_i</code>. Que lo
disfruten.</p>
<p><span class="selflink">trac</span> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../python/">python</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a></p>
trac-con-mercurial-en-etchhttp://grulicueva.homelinux.net/~mdione/glob//posts/trac-con-mercurial-en-etch/2009-01-22T04:24:04Z2008-07-18T01:09:46Z
<p>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 <a href=
"http://trac.edgewall.org/wiki/TracMercurial">las instrucciones de
la página</a>, sólo es cuestión de generar un <code>.egg</code>
(<a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/posts/trac-me-tiene-los-eggs-llenos/">¿se acuerdan?</a>),
ponerlo en el directorio <code>plugins</code> del environment y ya.
Pero corriendo <code>tracd</code> y entrando con un browser me
daba:</p>
<pre>
<code>TracError: Unsupported version control system "hg"
</code>
</pre>
<p>Mi primer sospechoso era el <code>.egg</code>; creía que no lo
estaba encontrando. Prendiendo el logging en el
<code>trac.ini</code> descubrí que en realidad si lo levantaba.
Siguiendo un par de links encontré una sugerencia de correr todos
los imports que corre el <code>backend.py</code> del plugin.
Finalmente descubrí que la línea:</p>
<pre>
<code>from mercurial.revlog import LookupError
</code>
</pre>
<p><a href=
"http://trac.edgewall.org/ticket/7346#comment:6">fallaba</a>. 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 <code>LookupError</code>.</p>
<p><span class="selflink">trac</span> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../mercurial/">mercurial</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a></p>
luchando-contra-el-spam-en-trachttp://grulicueva.homelinux.net/~mdione/glob//posts/luchando-contra-el-spam-en-trac/2009-01-22T04:24:04Z2008-07-04T23:29:16Z
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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ó:</p>
<pre>
<code>delete from ticket where length(summary)<11;
</code>
</pre>
<p>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:</p>
<pre>
<code>delete from ticket_change where ticket not in (select id from ticket);
</code>
</pre>
<p><code>delete</code>s similares deberían poderse aplicar a otras
partes del trac que estén abiertas.</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a> <span class=
"selflink">trac</span> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../spam/">spam</a></p>
trac-me-tiene-los-eggs-llenoshttp://grulicueva.homelinux.net/~mdione/glob//posts/trac-me-tiene-los-eggs-llenos/2009-01-22T04:24:04Z2008-07-04T23:29:16Z
<p><a href="http://trac.edgewall.org/wiki/">Trac</a> es fantástico.
Tiene todo lo que quiero y más. Amo Trac...</p>
<p>... 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 <code>.egg</code> que simplifican todo:
sólo ponés un <code>.egg</code> en el <code>tracenv/plugins</code>
y ya.</p>
<p>... y ya? I wish. Resulta que no, mirá vos, que si no hacés la
danza del <code>easy_install</code> no anda. Esto es porque éste se
las arregla para que un <code>.egg</code> (que a todo esto es un
<code>.zip</code> 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 (<code>e_i</code> por
defecto pone todo en el <code>site-packages</code> del python por
defecto) espero que los <code>.egg</code>s terminen en el
mencionado directorio. Así, intentamos con esto:</p>
<pre>
<code>sudo -u www-data easy_install --install-dir /var/lib/trac/xarope/plugins/ \
--site-dirs /var/lib/trac/xarope/plugins/ TracSpamFilter
error: /var/lib/trac/xarope/plugins/ (in --site-dirs) is not on sys.path
</code>
</pre>
<p>Lindo error. Resulta que no hay forma de coercer a
<code>e_i</code> que lo haga, por más que no esté en el
<code>PYTHONPATH</code> (bah, en el <code>sys.path</code>). Y
hablando de dicha envvar, no anda ni con <code>PYTHONPATH=path
comando</code> ni con un <code>export</code> previo.</p>
<p>Comienza la hora de la negrada. Primero vemos que
<code>e_i</code> es en realidad un wrapper de 4 líneas python:</p>
<pre>
<code>$ 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')()
)
</code>
</pre>
<p>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:</p>
<pre>
<code>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 TracSpamFilter
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: TracSpamFilter 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 TracSpamFilter 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 TracSpamFilter
</code>
</pre>
<p>Voilá! De acá! Si apunto mi browser a mi trac obtengo:</p>
<pre>
<code>[back trace]
ExtractionError: 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.
</code>
</pre>
<p>Ah, esto es fácil, sólo agrego un <code>SetEnv PYTHON_EGG_CACHE
path</code> en la configuración de Apache para este Trac y ahora
sí, yastá!</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a> <span class=
"selflink">trac</span></p>
sarge-etch-2http://grulicueva.homelinux.net/~mdione/glob//posts/sarge-etch-2/2009-01-22T04:24:04Z2008-07-04T23:29:16Z
<p>El segundo día me amaneció a las 13. Hoy tocaba terminar con el
Apache, que incuía apenas los <code>trac</code>s y el
<code>dotproject</code>. Ambos implicaban upgrades.</p>
<p>Los <code>trac</code> no me hicieron renegar mucho, pues está
<a href="http://trac.edgewall.org/wiki/0.10/TracUpgrade">muy
bien</a> documentado y hasta fue scripteable. Básicamente era un
salto de <a href=
"http://trac.edgewall.org/wiki/0.10/TracUpgrade#From0.8.xto0.9"><code>
sqlite2</code> a <code>sqlite3</code></a>, un <code>trac-admin ...
upgrade</code> seguido de un <code>trac-admin ...
resync</code>.</p>
<p>Con lo único con lo que renegué fue que a pesar del upgrade fue
exitoso no podía entrar. En los logs encontraba esto:</p>
<pre>
<code>(9)Bad file descriptor: Could not open password file: (null)
</code>
</pre>
<p><a href=
"http://idefix.net/~koos/irregular.php/irregular-20070213/mod-authnz-ldap-apache-2-2-and-allowing-all-ldap-users">
Google al rescate</a> me dijo que había que apagar esa directiva
que había tenido que modificar el día anterior:</p>
<pre>
<code>AuthzLDAPAuthoritative off
</code>
</pre>
<p>También me salió esto:</p>
<pre>
<code>Failed to load the AuthzSVNAccessFile: The character 'o' in rule '@except' is not allowed in authz rules
</code>
</pre>
<p>Eso era porque en un archivo de configuración del repo
(<code>conf.svnaccess</code>) tenía los permisos de sólo lectura
como <code>ro</code> en vez de <code>r</code>.</p>
<p>El <code>dotproject</code> me enfrentó a un viejo archienemigo:
<code>mysql</code>. 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
<code>/var</code> y no en <code>etc</code>.
<code>postgresql</code>, en cambio, es mucho más inteligente. Y
viva el SQL independiente del motor. Lástima nadie lo usa...</p>
<p>Bien, sólo tuve que hacer un dump del <code>mysql</code>
anterior (<code>chroot</code> 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
<code>https://server/dotproject/install</code>. 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
<code>include/config.php</code>; 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!</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../debian/">debian</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sarge/">sarge</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../etch/">etch</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../apache/">apache</a> <span class=
"selflink">trac</span> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../svn/">svn</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../mysql/">mysql</a> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../dotproject/">dotproject</a></p>
trac-para-kreissyhttp://grulicueva.homelinux.net/~mdione/glob//posts/trac-para-kreissy/2009-01-22T04:24:04Z2008-07-04T23:29:16Z
<p>esta noche me voy a dedicar rápidamente a poner un <a href=
"http://trac.edgewall.org/">trac</a> para <a href=
"http://grulicueva.homelinux.net/~mdione/projects/kreissy/">kreissy</a>.
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é.</p>
<p>lo primero es crear un trac-env para eso:</p>
<pre>
<code>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
</code>
</pre>
<p>también se puede con:</p>
<pre>
<code>mdione@skid:~/src/projects/kreissy$ trac-admin trac
</code>
</pre>
<p>a secas, ejecutar el comando <em>initenv</em> y responder las
preguntas, que en realidad son, en ese orden, los parámetro sde
allá arriba.</p>
<p>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<em>python y con mod</em>wsgi. hoy me siento valiente así que
usaría mod<em>wsgi, pero como creo que en algún momento esto puede
correr en un debian stable, me voy al más seguro
mod</em>python.</p>
<p>la <a href=
"http://trac.edgewall.org/wiki/TracModPython">documentación de
trac</a> 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.</p>
<p>resultó ser más sencillo que antes. la última que lo probé, hará
unas <em>cuantas</em> versiones de trac, me quedó un chancullo muy
feo. pero ahora sólo bastó este archivo <em>.htaccess</em> en el
directorio en mi <em>public_html</em>:</p>
<pre>
<code>SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/mdione/src/projects/kreissy/trac
PythonOption TracUriRoot /~mdione/projects/kreissy
</code>
</pre>
<p>y ya tengo el trac andando! ftatico! ahora a llenar contendo y
eso. pero eso mañana...</p>
<p><a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a> <span class=
"selflink">trac</span> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../kreissy/">kreissy</a> [[!tagling
tags/apache]]</p>
autenticacion-para-un-trachttp://grulicueva.homelinux.net/~mdione/glob//posts/autenticacion-para-un-trac/2009-01-22T04:24:04Z2008-07-04T23:29:16Z
<p>anoche puse a andar <a href=
"http://grulicueva.homelinux.net/~mdione/glob/posts/trac-para-kreissy/">
un trac para kreissy</a>. 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.</p>
<p>trac delega todo el sistema de autenticación en apache, así que
es lo mismo que poner a andar tal cosa. apache tiene <a href=
"http://httpd.apache.org/docs/2.2/howto/auth.html">muy buena
doc9n[1] al respecto</a>. el desafío es hacerlo andar desde un
<em>.htpasswd</em>.</p>
<p>pero, no se puede poner un bloque en un <em>.htpasswd</em>, 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.</p>
<p>al final el archivo
<em>/etc/apache2/sites-available/trac-kreissy</em> quedó:</p>
<pre>
<code><Location /~mdione/projects/kreissy>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /home/mdione/src/projects/kreissy/trac
PythonOption TracUriRoot /~mdione/projects/kreissy
</Location>
# auth
<Location /~mdione/projects/kreissy/login>
AuthType Basic
AuthName "kReiSSy-trac"
AuthUserFile /home/mdione/src/projects/kreissy/trac/htpasswd
Require valid-user
</Location>
</code>
</pre>
<p>luego agregamos el sitio como enabled y reiniciamos apache:</p>
<pre>
<code>$ sudo a2ensite trac-kreissy
Site trac-kreissy installed; run /etc/init.d/apache2 reload to enable.
$ sudo /etc/init.d/apache2 reload
</code>
</pre>
<p>c'est tout! luego configuro el trac con <em>trac-admin</em> y
listo.</p>
<h2><a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../sysadmin/">sysadmin</a> <span class=
"selflink">trac</span> <a href="http://grulicueva.homelinux.net/~mdione/glob//tags/trac/../apache/">apache</a></h2>
<p>[1] documentación.</p>