Latest entries

Configurando avisos automáticos por correo en Fail2Ban

written by uve

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

 

Full entry >>

Instalando PIL dentro de VirtualEnv

written by uve

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.

Full entry >>

Proteger tu servidor SSH contra ataques de fuerza bruta

written by uve

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.

Full entry >>

Fallo de autenticación en PostgreSQL utilizando Django

written by uve

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>>

Full entry >>

Automatizar rotación de logs de Apache con logrotate

written by uve

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.

Full entry >>

Generar un fichero XML con DOM

written by uve

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í.

Full entry >>

Interfaces de programación de documentos XML

written by uve

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.

Full entry >>

Parsear una web con sax y python directamente

written by uve

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)

Full entry >>

Gmail Motion

written by uve

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

Full entry >>

Diseño de interfaces gráficas con GTK y Glade

written by uve

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í.

Código fuente

Full entry >>

Diseño de interfaces gráficas con GTK

written by uve

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ódigo fuente

Full entry >>

Cómo compartir Internet con chroot

written by uve

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.

Full entry >>

'WSGIRequest' object has no attribute 'LANGUAGE_CODE'

written by uve

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',
    ...
)

Full entry >>

El blog de Álvaro

written by uve

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!

Full entry >>

Compilación cruzada de Python

written by uve

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.

Full entry >>

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é.