Novedades: actualmente estoy impulsando el proyecto Argentina en Python, desde aquí (ver mapa)

Muchos subdominios en el mismo proyecto

Muchas veces me he encontrado con proyectos, en general Django, que requieren la configuración de varios subdominios para el mismo proyecto. Por ejemplo, en el proyecto que estoy trabajando ahora, la idea es que uno pueda crear torneos dentro del sitio, para el cual el sistema le asigna un subdominio a cada torneo. Entonces, si el sitio lo tengo alojado en http://example.com y creo un torneo con el nombre Torneo de verano, la URL generada para mi torneo sería http://torneo-de-verano.example.com. Una vez que ingreso a esa URL, se usa el nombre del subdominio (torneo-de-verano) para mostrar el torneo correspondiente.

¿Qué pasa? Cuando estamos desarollando, el problema con el que nos encontramos acá, es que en general corremos el servidor de desarrollo en la misma máquina que trabajamos: localhost (puerto 8000), por lo que el ejemplo anterior sería similar pero en vez de example.com se crea bajo localhost: http://torneo-de-verano.localhost:8000. El problema que tenemos acá es que el DNS que usualmente consultamos (el que nos viene de nuestro ISP) no sabe nada sobre localhost y es por eso que Linux por lo general busca si está hardcodeado en nuestro /etc/hosts para saber a dónde redireccionar, pero ahí no dice nada sobre los subdominios de localhost, así que no sabe a dónde mandarlo y es por eso que dice que no encuentra nada.

¿La solución a este problema?: dnsmasq. Gracias a este servidor de DNS podemos hacer que todos los subdominios que creamos bajo localhost apunten a localhost (127.0.0.1) sin trabajo extra cada vez que creamos un nuevo torneo.

  1. Instalación de dnsmasq:

    sudo apt-get install dnsmasq
    
  2. Comentar esta línea en /etc/NetworkManager/NetworkManager.conf:

    dns=dnsmasq
    
  3. Reiniciar NetworkManager:

    sudo restart network-manager
    
  4. Agregar estas líneas a /etc/dnsmasq.conf:

    listen-address=127.0.0.1
    address=/localhost/127.0.0.1
    
  5. Reiniciar dnsmasq:

    sudo /etc/init.d/dnsmasq restart
    

Esto nos permite despreocuparnos de todos los subdominios de localhost ya que siempre van a apuntar a nuestra máquina sea cual sea. Además de en este proyecto en particular, lo estoy usando para todos los proyectos ya que me es más práctico levantar un server de django en <nombre-de-proyecto>.localhost:8000 y así me quedan las claves, nombres de usuario y demás guardadas en el Firefox para esa URL específica. Sino, a veces me quiere poner la clave de admin de otro proyecto por ejemplo (que también tiene el usuario admin)


Seguridad de los paquetes de Python

El martes pasado publiqué mi primer paquete de Python (Pegá todo en linkode.org) utilizando el sistema PyPI. Por un lado, me gustó que sea super fácil de subir tu paquete al sistema de paquetes de Python, lo que permite que después sea super fácil de instalarlos también mediante el uso de easy_install o pip en una sola línea. Además, es muy sencillo de especificar los requerimientos de tu paquete (puede que dependa de otros) y basta con solo nombrarlos y agregarle el número de version. Hasta ahí, ¡todo una ganga!

Esta configuración se hace mediante un script de configuración que es requerido por PyPI que se llama setup.py y que no es más que un script Python, en dónde está permitido hacer todo lo que sea necesario para instalar nuestro paquete. Acá viene lo que me llamó la atención: como podés ejecutar cualquier cosa que sea Python dentro de ese script, es muy fácil de romper cuantas computadoras quieras ya que podés borrar todo lo que quieras o bien, y más peor aún, robar cualquier tipo de información que tenga el usuario en la PC y mandarla por email a dónde más te guste, en simples pasos.

Es más, muchas veces queremos instalar un paquete Python pero no dentro de nuestro virtualenv, sino que queremos que esté disponible para todos los proyectos en los que estamos trabajando y para eso, necesitamos instalarlo diréctamente en los paquetes del sistema. Para eso, ejecutamos el mismo comando que antes, pero le agregamos sudo, algo así:

sudo pip install <nombre-del-paquete>

Eso, sí, así como lo ves, nos puede romper toda la máquina.

Entiendo cuál es el problema y no estoy seguro de cuál es la solución, ya que la idea de PyPI es que cualquiera pueda publicar un paquete y ponerlo a disposición de todo el mundo. Es por eso, que los paquetes no pasan por una verificación previa y a todos se les permite el acceso a este servicio.

Escribí un ejemplo de setup.py que borra un archivo creado por root bajo la carpeta /tmp. La forma de comprobar esto sería algo así:

# ejecuando como un usuario sin privilegios de root
sudo touch /tmp/sudo.file
python setup.py -h

Eso nos va a preguntar si queremos borrar el archivo /tmp/sudo.file y aunque le pongamos que sí, los permisos que tenemos como usuario normal no lo va a borrar y nos va a dar un error. Sin embargo, si ejecutamos el mismo script, pero como root (o enmascarado através de sudo) sí lo va a borrar e incluso no nos va a preguntar nada:

# ejecuando como un usuario CON privilegios de root
sudo python setup.py -h

Busqué un poco en Google sobre esto para ver si encontraba algún foro de discusión así podía leer sobre otras opiniones pero no encontré. ¿Qué se anda diciendo por ahí sobre este tema? ¿Qué opinan los que leyeron este post?


Pegá todo en linkode.org

Últimamente me encontré que la comunidad de Python Argentina está trabajando en un montón de proyectos: la nueva página de PyAr [1], preciosa [2], nikola [3], pyconference [4], ninja-ide [5] y un centenar de cosas más (que podés ver en acá). Entre esas cosas, la que me interesa mencionar en este post es el pastebin que inteligente, que no es ni más ni menos que un pastebin (como tantos otros) pero con algunas cositas copadas: http://linkode.org

Como todo buen herramienta de pastebin, tiene que tener un comando de consola para poder pegar la salida de un comando en el servicio web. Por eso mismo, me puse a trabajar algunas horas en escribir un programa de línea de comandos que cumpla con lo básico: "capturar la entrada estandar y publicarla dentro de linkode.org mostrando la URL como resultado".

Además, cuenta con algunas otras opciones más que hacen que sea un poco más útil para otras cosas, aunque lo importante es que lo básico sea confiable y funcione correctamente.

El paquete se llama linkodeit y lo podés descargar desde PyPI, utilizando easy_install o pip o del repositorio de github:

pip install linkodeit

Para usarlo:

$ echo "Hello world!" | linkodeit
http://linkode.org/VSSUM59FGMvTjKVsBewT53
$
[1] https://github.com/PyAr/pyarweb/
[2] http://preciosdeargentina.com.ar/
[3] http://getnikola.com/
[4] https://github.com/PyConference/PyConference/
[5] http://ninja-ide.org/

Nuevas páginas

Hoy estoy inaugurando dos nuevas páginas en mi blog (las pueden encontrar en la barra de arriba):

Módulos Python
dónde voy a ir agregando aquellas cosas que encontré útil a lo largo de mis desarrollos y colaboraciones en proyectos Python
Traducciones
dónde están publicadas todas las colaboraciones y proyectos en los que trabajé que están relacionados con traducciones del Inglés al Español o viceversa

¡Voy a ir actualizádolas a medida que encuentre más información!