Latest entries
Configurando avisos automáticos por correo en Fail2Ban
22 April 2011
Hace poco escribía sobre como instalar Fail2Ban para proteger nuestro sistema contra ataques por fuerza bruta. Un detalle interesante es que cada vez que se realice un bloqueo, se nos envíe un informe de forma automática con información de whois. Para ello debemos configurar lo siguiente:
# nano /etc/fail2ban/jail.conf
...
destemail = admin@micorreo.com
action = %(action_mw)s
...
Después, reiniciamos el servicio y listo:
# service fail2ban restart
Instalando PIL dentro de VirtualEnv
20 April 2011
A la hora de instalar PIL dentro de VirtualEnv me he encontrado con el siguiente problema:
(ENV)~/ENV$ easy_install pil
Searching for pil
Reading http://pypi.python.org/simple/pil/
Reading http://www.pythonware.com/products/pil
Reading http://effbot.org/zone/pil-changes-115.htm
Reading http://effbot.org/downloads/#Imaging
Best match: PIL 1.1.7
Downloading http://effbot.org/media/downloads/PIL-1.1.7.tar.gz
Processing PIL-1.1.7.tar.gz
Running PIL-1.1.7/setup.py -q bdist_egg --dist-dir /tmp/easy_install-3H1mTt/PIL-1.1.7/egg-dist-tmp-eVNOlg
WARNING: '' not a valid package name; please use only.-separated package names in setup.py
_imaging.c:75:20: fatal error: Python.h: No existe el fichero o el directorio
compilation terminated.
error: Setup script exited with error: command 'gcc' failed with exit status 1
El problema radica en que PIL es que parte está escrita en C, por lo que es necesario compilarlo previamente.
Proteger tu servidor SSH contra ataques de fuerza bruta
15 April 2011
Hoy he estado revisando los logs de mi servidor, y me he dado cuenta que llevan 5 días de ataques por fuerza bruta para intentar tener un acceso SSH. Seguro que a alguien le resulta útil este script:
import re
exp = re.compile(r'.*[\s]*sshd\[.*?\]:[\s]*Invalid user.*')
f = open('/var/log/auth.log')
for line in f.readlines():
if exp.match(line):
print line[:-1]
Este script nos mostrará todos los accesos fallidos que hay en el servidor. Ahora vamos a ver la forma más sencilla de impedir este tipo de ataques: fail2ban.
Fallo de autenticación en PostgreSQL utilizando Django
12 April 2011
Estoy haciendo un pequeño despliegue de una aplicación de pruebas y lo estaba haciendo con PostgreSQL. Tras crear el usuario, dar permisos y todo lo típico, me he encontrado con lo siguiente:
# python manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 438, in execute_manager
utility.execute()
File "/usr/lib/pymodules/python2.6/django/core/management/__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 220, in execute
output = self.handle(*args, **options)
File "/usr/lib/pymodules/python2.6/django/core/management/base.py", line 351, in handle
return self.handle_noargs(**options)
File "/usr/lib/pymodules/python2.6/django/core/management/commands/syncdb.py", line 52, in handle_noargs
cursor = connection.cursor()
File "/usr/lib/pymodules/python2.6/django/db/backends/__init__.py", line 75, in cursor
cursor = self._cursor()
File "/usr/lib/pymodules/python2.6/django/db/backends/postgresql_psycopg2/base.py", line 136, in _cursor
self.connection = Database.connect(**conn_params)
psycopg2.OperationalError: FATAL: la autentificación Ident falló para el usuario <<xxxx>>
Automatizar rotación de logs de Apache con logrotate
11 April 2011
Este es un tema que tenía un poco descuidado (muy mal por mi parte) y que ahora acabo de solucionarlo. logrotate permite configurar de una forma sencilla cómo, cuándo y dónde queremos hacer la rotación de los logs. Esta utilidad se suele ser usada por bastante software, como: apache2, apt, aptitude, dpkg, mysql-server, postgresql-common ó rsyslog.
En este caso, voy a explicar brevemente como podemos utilizar logrotate para los logs de nuestros sitios web. Aunque bien es cierto que existe una configuración para los logs generales de Apache, yo utilizo logs independientes para cada sitio que tengo desplegado, por lo que habrá que rotar de forma independiente cada uno de ellos.
Generar un fichero XML con DOM
6 April 2011
Ayer hablaba un poquito en general acerca de distintos tipos de interfazces para parsear documentos XML. Hoy he preparado un par de ejemplos de como generar un documento XML.
Los ejemplos están hechos en Python, el cuál es ideal para mostrar su funcionamiento. Esto se debe a que Python incluye en su librería estándar un módulo xml, por lo que no es necesario instalar nada extra. Además he utilizado el módulo xml.dom.minidom. minidom es una implementación ligera de la interfaz DOM, cuyo objetivo es ser más rápido y ligero.
Los ejemplos están disponibles aquí.
Interfaces de programación de documentos XML
5 April 2011
Como comentaba en el artículo anterior, últimamente estoy trabajando mucho con documentos XML. Con este artículo intentaré dar una visión general y muy breve acerca de qué es el XML y cómo podemos trabajar con documentos XML en un lenguaje de programación.
Parsear una web con sax y python directamente
4 April 2011
Para quien no lo conozca, SAX es una interfaz parsear XML y está disponible en la librería estándar de Python. Últimamente estoy trabajando mucho con parsers XML, así que si el tiempo lo permite escribiré algún artículo más sobre el tema.
Para parsear una url, sin necesidad de descargarla previamente y luego parsearla, podemos apoyar el parser, xml.sax, en urllib2:
import urllib2
import xml.sax
class MiHandler(xml.sax.ContentHandler):
def startElement(self, name, attrs):
print name
parser = xml.sax.make_parser()
parser.setContentHandler(MiHandler())
feed = urllib2.urlopen("http://www.menudoproblema.es/feeds/latest/")
parser.parse(feed)
Gmail Motion
1 April 2011
Habrá una cosa que nunca dejará de sorprenderme, la gente de Google. Hoy han presentado un nuevo servicio: Gmail Motion.
Con esta novedad se puede controlar Gmail realizando movimientos con el cuerpo
Diseño de interfaces gráficas con GTK y Glade
21 March 2011
Continuando con la serie de artículos acerca de GTK, voy a seguir con Glade. Glade es una herramienta que nos permite crear las interfaces gráficas de forma gráfica :)
Esta herramienta es parte oficial de Gnome y se integra bastante bien con Anjuta, aunque esto no viene al caso. Glade genera archivos xml, que después, de forma simple y sencilla podremos cargar en nuestra aplicación. Estos ficheros pueden tener cualquier nombre y/o extensión, aunque tal vez la extensión más usada sea .ui (de User Interface) y será la que yo utilice.
Dado que ya expliqué como se realiza la compilación para GTK en el primer artículo, no lo volveré a explicar. Si alguien tiene dudas puede consultarlo aquí.
Diseño de interfaces gráficas con GTK
21 March 2011
Aprovechando las prácticas de una de mis asignaturas, Informática Gráfica, voy a escribir unos artículos relacionados con interfaces gráficas, más concretamente GTK y algo más adelante, GTK y OpenGL. Como lenguaje de programación voy a utilizar C (la otra alternativa era Java, es decir, impuesto por la asignatura) y como sistema operativo utilizaré Ubuntu 10.10.
En este primer artículo vamos a ver qué necesitamos tener instalado, como crear una simple ventana y como compilar esto. Asumo que ya has programado alguna vez en C (y/o C++) y que build-essential lo tienes instalado.
Cómo compartir Internet con chroot
15 March 2011
chroot es un comando muy útil en algunas ocasiones. Este comando nos permite cambiar el directorio raíz. Es especialmente útil cuando tenemos varias distros instaladas y necesitamos ejecutar un comando en la otra distribución y no queremos (o podemos) reinciar. También se puede usar si estamos construyendo un sistema desde cero.
En este caso, voy a explicar cómo disponer de internet en la nueva raíz. En mi caso es por una razón sencilla. Instalé una versión más de Ubuntu en el portátil y debido a que tengo una Broadcom, no tenía wifi (ni posibilidad de conectarme por ethernet), con lo que tampoco podía instalar los paquetes necesarios.
Solución: arrancar con la distro que funciona, hacer un chroot en la nueva distro instalada (compartiendo internet) y hacer un apt-get.
'WSGIRequest' object has no attribute 'LANGUAGE_CODE'
14 March 2011
Un problema breve, una solución breve. Hace un poco tiempo estuve programando una página con soporte para internacionalización sobre Django 1.2 y me encontré con lo siguiente:
Request Method: GET
Django Version: 1.2
Exception Type: AttributeError
Exception Value:
'WSGIRequest' object has no attribute 'LANGUAGE_CODE'
Tras seguir la traza, llegué a la vista que estaba ocasionando el problema. En esta vista tenía algo como lo siguiente:
def view(request):
...
language = request.LANGUAGE_CODE
...
El problema: no está bien configurado el middleware. La solución:
MIDDLEWARE_CLASSES = (
...
'django.middleware.locale.LocaleMiddleware',
...
)
El blog de Álvaro
14 March 2011
Hace cerca de una semana que un colega y compañero del trabajo desplegó su blog y no he tenido tiempo ni de hacerle una mención :) ¡Por fin se ha animado! Y encima es de los míos: "si quieres un blog ... te lo programas".
Además Álvaro me está enseñando un poquito de Analítica Web, lo cual es de agradecer, porque aquí un servidor ... ni tiene mucha idea, ni lo que es peor ¡tiempo para tenerla!
Compilación cruzada de Python
8 March 2011
Hace pocos días escribía acerca de como crear un toolchain para compilar para una arquitectura distinta: MIPS. Ahora voy brevemente a contar como podemos compilar un intéprete de Python para un dispositivo integrado.
El principal problema que hay es que para compilar para arquitecturas como MIPS o ARM es necesario un parche, por lo que la compilación directa no es posible. Yo he seguido este tutorial y he usado la misma versión, Python 2.7.1, y el mismo parche y todo ha funcionado perfectamente.
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.


