Category Archives: Programación - Page 4

mod_wsgi + Python 2.6 en CentOS

Python

Hace algún tiempo publiqué un artículo donde explicaba cómo instalar mod_python con Python 2.6 en CentOS, por el problemita que tiene yum que no funciona con la última versión de Python. Pues bien, últimamente por lo que he venido leyendo, una alternativa mejor a mod_python es mod_wsgi, pues aparentemente funciona bastante mejor, más rápido y es la opción recomendada para usar con Apache y Django.

Por lo tanto, dejo esta guía muy sencilla de cómo instalar mod_wsgi con Python 2.6 en CentOS.

Descargar mod_wsgi, descomprimir y configurar

# cd /usr/src
# wget http://modwsgi.googlecode.com/files/mod_wsgi-3.1.tar.gz
# tar zxvf mod_wsgi-3.1.tar.gz
# cd mod_wsgi-3.1
# ./configure --with-python=/usr/bin/python2.6

Esa última línea es la clave para que utilice la instalación correcta de Python (ver el artículo anterior para saber cómo instalar Python 2.6 sin pisar la versión actual).

Luego compilamos e instalamos

# make && make install

Agregamos la línea para cargar el módulo en el httpd.conf

LoadModule wsgi_module        lib/apache/mod_wsgi.so

Y reiniciamos el Apache

service httpd restart

Luego para configurar un virtual host para que utilice mod_wsgi no es tan sencillo, pero tampoco es demasiado complicado. Básicamente hay que generar un archivo .wsgi, que no es más que un archivo Python que va a ser el que se integre con mod_wsgi y luego configurarlo en el httpd.conf. Lo que hay que tener en cuenta es que mod_wsgi no sirve contenido estático, por lo cual uno debe configurar por un lado el handling del código python y por otro los archivos estáticos. Si bien es algo distinto a lo que solemos hacer con mod_php, es algo bastante lógico y es una buena práctica pensar en servir por separado el contenido dinámico y el estático.

Como es un poco complejo, lo mejor es leer la guía correspondiente. En el sitio de mod_wsgi van a ver que hay mucha documentación. Particularmente, la guía de integración con Django es muy útil.

Python-Directadmin: API para conectarse a Directadmin desde Python

Este post viene un poco postergado. Hace algún tiempo que empecé con un pequeño proyecto y tenía pensado escribir una entrada en el blog para presentarlo, pero por distintos compromisos no he podido hacerlo hasta ahora, así que aquí va.

Para los que no lo sepan, Directadmin tiene una API para realizar distintas operaciones en el panel de control desde otra aplicación. La API no es más que una serie de URLs que reciben información por HTTP POST, ejecutan una acción y devuelven un resultado. De esa forma se pude acceder a muchas de las operaciones que uno realiza manualmente a través del panel (salvo algunas que parecen no estar muy bien implementadas/probadas).

En el foro de Directadmin existe una clase hecha en PHP a la que se le da bastante crédito, que lo que hace es abrir un socket y enviar requests HTTP a un servidor Directadmin y devolver la respuesta. Personalmente me parece que la clase es bastante mala y pobre, por las siguientes razones:

  • Está pensada para PHP 4.
  • No utiliza cURL, con lo cual hay demasiado código para hacer tareas que ya están implementadas en otras librerías.
  • Tiene un manejo de errores muy pobre
  • No es una implementación de la API de Directadmin (no implementa comandos específicos), sino que, como su nombre lo indica, se limita a crear un socket a un puerto HTTP y enviar requests (nuevamente… cURL).
  • El código no sigue ningún estándar de formato y “mejores prácticas”.

A pesar de todos estos problemas, tampoco me parecía un aporte muy interesante reescribir esa clase utilizando cURL. Además no tenía ganas de programar en PHP. Por lo tanto, lo que hice fue crear una implementación de la API en Python. Es decir, una librería que se ocupe de conectarse a un servidor Directadmin, enviar comandos, procesar sus respuestas y ofrecer una interfaz de programación cómoda para el desarrollador. De paso, el proyecto me sirvió para aprender un poco más de Python que es un lenguaje que me gusta mucho.

El resultado fue este proyecto que alojé en Google Code: http://code.google.com/p/python-directadmin/

El código es bastante sencillo (e incluso un poco tosco). Si ven el código del módulo directadmin, van a ver que hay una serie de clases. La más importante es la clase Api, que implementa los distintos métodos de la API de Directadmin (salvo algunos que no implementé aún). Esa clase hace uso de ApiConnector que es una clase muy sencilla que resume en unas pocas líneas lo que hacía la clase de PHP, utilizando urllib2. Luego hay un par de clases más para representar los tipos de usuarios, que no revisten mayor interés.

Posibles implementaciones

Cuando publiqué mi contribución en el foro de Directadmin obtuve una respuesta bastante poco amistosa de un usuario que no le veía utilidad a mi aporte. Más allá de esa persona, que afirma no conocer a nadie que programe en Python (sin comentarios…), yo creo que hay al menos tres vías de implementación de esta librería:

  • La más básica: crear scripts de consola para automatizar tareas (ver ejemplos más adelante).
  • Desarrollo web: así como el principal objetivo de la clase en PHP era que las empresas de hosting pudieran integrar sus sitios institucionales con el panel de control, esta implementación en Python permite el mismo tipo de integración para sitios desarrollados en Python (por ejemplo usando frameworks como Django, web2py, TurboGears, Pylons, etc.).
  • Aplicaciones de escritorio: no hay ni punto de comparación entre el soporte que ofrece Python para aplicaciones de escritorio con el que ofrece PHP. Hoy por hoy, un porcentaje muy alto de las aplicaciones de escritorio para Linux se escriben en Python y librerías como PyQt permiten hacer software desktop para Linux, Windows y Mac. Una aplicación de escritorio para monitorear y administrar múltiples servidores Directadmin se podría hacer sencillamente utilizando esta librería.

Ejemplos

Utilizar la API es bastante sencillo. En la página del proyecto podrán ver algunos ejemplos básicos como éste, para listar todos los usuarios del panel.

import directadmin

api = directadmin.Api("admin", "password", "hostname.com", 2222)
print api.list_all_users()

Además en el paquete incluí un archivo de ejemplo que se llama suspension.py. Este script utiliza la API para suspender/desuspender usuarios desde la consola. Se utiliza de la siguiente forma:

./suspension.py suspend

Tiene algunas otras opciones para especifiar host, puerto, usuario y password para conectarse Directadmin. Para ver las opciones disponibles pueden poner:

./suspension.py --help

Pendientes

Aún quedan varias cosas pendientes por hacer. Hay algunos métodos que no he implementado aún. Hay otros que los he probado y no funcionan, pero porque obtengo errores de parte de Directadmin y todavía nadie me ha sabido contestar por qué. También me gustaría crear un script de instalación con setuptools, pero todavía debo interiorizarme un poco más en el tema. Por último, me gustaría también hacer una implementación de más alto nivel, pues ahora la clase Api es una especie de bolsa de funciones que no me convence del todo.

Links

Sacar una foto con la webcam y enviarla por mail desde BASH

WEBCAM480K_1Esta noche tenía un ratito y me puse a jugar con la Eee PC que tanto me costó configurar. Lo que hice fue un simple script en BASH que toma una foto con la webcam, la guarda en un archivo temporal y la envía por mail a un destinatario.

El script utiliza ffmpeg y mutt. Pueden instalarlos poniendo

sudo apt-get install ffmpeg mutt

Para que Mutt funcione se tiene que usar con un MTA, por default postfix. Se puede instalar con Exim o con SSMTP. Este último es una especie de wrapper que nos permite configurar un MTA externo para enviar los mails. Esta guía explica bien cómo hacerlo.

#!/bin/bash
IMG_SIZE="320x240"
CAM_DEV="/dev/video0"

IMG_NAME="`mktemp -u /tmp/img.XXXXXX`.jpg"

mutt=/usr/bin/mutt
ffmpeg=/usr/bin/ffmpeg
date=`date`
hostname=`hostname`

echo "Taking picture and saving it on $IMG_NAME"

$ffmpeg -f video4linux2 \
	-s $IMG_SIZE \
	-r 5 \
	-vframes 1 \
	-i $CAM_DEV \
	-f mjpeg \
	$IMG_NAME > /dev/null 2>&1

if [ ! -z $1 ]; then
	echo "Attempting to email the picture to $1"
	echo "Picture taken on $hostname at $date" | \
		$mutt -s "A picture was sent to you" -a $IMG_NAME -- $1
fi

Para ejecutarlo, copiamos el contenido en un archivo, por ejemplo “cam.sh”. Luego le damos permisos de escritura y lo ejecutamos.

# chmod +x cam.sh
# ./cam.sh "myaddress@domain.com"

Entre las utilidades de este script podríamos pensar en sacar una foto de la persona en frente de la máquina cuando se produce un login incorrecto o en algún otro evento que pudiera darnos la pauta de un uso diferente al usual. Ideal para paranóicos y nerds obsesivos.

Netstat con colorcitos

GNU/Linux

GNU/Linux

Luego del post de ayer, pensando en que vengo posteando poco, me puse a buscar a ver si tenía algún otro script útil que pudiera compartir por este medio… pero no encontré nada. Algo debo tener por ahí, pero nada a mano. Lo que encontré es este script (medio feo) que hice hace bastante tiempo, que muestra un netstat (concretamente netstat -natp) con distintos colores según el estado de cada conexión (established, listen, syn_sent, fyn_wait, etc.). Claramente no es un script muy útil (ni muy bien hecho), pero lo publico. Quizás a alguno le sirve de disparador para hacer algo verdaderamente útil.

#!/bin/bash
cyan="\E[1;36m\E[1m";
normal="\E[m";
blue="\E[34m\E[1m";
violet="\E[35m\E[1m";
red="\E[31m\E[1m";
yellow="\E[33m\E[1m";
green="\E[37m\E[32m\E[1m";
text="\E[1;37m\E[1m";

if [ "$UID" != "0" ]; then
	echo -e "$red$0: You will get more information if you have root privileges. Try sudo $0$normal"
fi

netstat -natp | \
while read line; do

	if [ `echo $line | awk '{print($1)}'` = "Proto" ]; then
		echo -e "$yellow=====================================================================================================$normal"
		echo -e "$text$line$normal"
		echo -e "$yellow=====================================================================================================$normal"
	else

		state=`echo $line | awk '{print($6)}'`
		color=$normal
		case $state in
			"ESTABLISHED")
				color=$green;;
			"SYN_SENT" | "SYN_RECV")
				color=$yellow;;
			"FIN_WAIT1" | "FIN_WAIT2" |"TIME_WAIT")
				color=$violet;;
			"CLOSE" | "CLOSE_WAIT" | "LAST_ACK" | "CLOSING" )
				color=$blue;;
			"LISTEN")
				color=$cyan;;
			"UNKNOWN")
				color=$red;;
			*)
		esac
		echo -e "$color$line$normal"

	fi
done;

Nota: el script utiliza el comando netstat con los parámetros “natp”. Estos parámetros de esta forma solamente funcionan en GNU/Linux. Para otros sistemas Unix (Solaris, FreeBSD, etc.) será necesario adaptar los parámetros y ver si la salida del netstat es igual.

PHP 5.3 RC 2

PHP

PHP

PHP anunció el lanzamiento de la segunda release candidate de la versión 5.3, una versión realmente importante y muy esperada porque introduce cambios muy importantes.

De esta forma se hizo el anuncio oficial. Se espera que en dos o tres semana se lance el release candidate 3 para lanzar la versión definitiva seguramente en el verano septentrional (nuestro invierno).

Podemos ver el listado de upgrades en la Wiki de PHP.

Entre los cambios podemos ver la incorporación de namespaces, las modificaciones en el comportamiento de algunas funciones, el paso a PECL de muchas librerías internas actuales y cambios importantes en la configuración de PHP.