febrero 15, 2012

Referencia cruzada en Django

Django está diseñado para nuestra comodidad, si bien algunas veces se hace dificil encontrar exactamente lo que necesitamos, este es el caso de las referencias cruzadas:

En el caso de tener un campo ForeignKey o ManyToManyField existen ocasiones en que queremos seguir esta relación para obtener los campos relacionados de la otra, un ejemplo que me ha sucedido recientemente es que al hacer uso del objeto de paginacion (Paginator) si quieres obtener las referencias necesitas realizar otra consulta (en un bucle for por ejemplo) con el objeto final que quieres mostrar, esto provocaba que la optimización del paginator (solo se trae los registros a mostrar) se fuera a paseo obligando a procesar toda la tabla y hacer n bucles mas con la tabla que nos interesa. Esto se resuelve haciendo uso del objeto referencia RelatedManager.

Imaginando que tenemos un objeto llamado cesto y un objeto llamado peras que tiene como foreingkey un cesto si queremos localizar las peras del cesto de esta forma llamariamos a pera.cesto_set.all()
Esto es muy útil pues podemos delegar esta parte de la lógica en la plantilla consiguiendo una aplicación bastante mínima:
{% for pera in peras %}
  {{ pera.tipo }}
    {% for cesto in pera.cesto_set.all %}
       {{ cesto.nombre }}
    {% endfor %}
{% endfor %}

diciembre 16, 2011

Compilar SQUID 2.7 en Ubuntu 10.10 con OpenSSL 1.0.0

En la nueva rama de OpenSSL 1.0.0 el soporte para SSL v2 ha sido eliminado, SSLv2 es un protocolo obsoleto que contiene múltiples fallos de seguridad que son fácilmente explotables, por tanto su uso debe ser evitado.

El problema ocurre cuando queremos compilar programas con versiones antiguas que hacen en su código uso de este protocolo, este es el caso de querer compilar desde código SQUID2.7 sobre una Ubuntu 10.10, obtendremos un error similar a:
ssl_support.o: In function `sslCreateServerContext':
/usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c:451: undefined reference to `SSLv2_server_method'
ssl_support.o: In function `sslCreateClientContext':
/usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c:614: undefined reference to `SSLv2_client_method'
collect2: ld returned 1 exit status

La solución pasa por parchear el código o eliminar las partes que requieren de funciones sslv2 tal como se puede observar en el siguiente patch
--- /usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c.orig     2011-12-16 12:54:54.000000000 +0100
+++ /usr/src/proxy/squid-2.7.STABLE9/src/ssl_support.c  2011-12-16 12:55:15.000000000 +0100
@@ -446,10 +446,12 @@
     ERR_clear_error();
     debug(83, 1) ("Initialising SSL.\n");
     switch (version) {
+#ifndef OPENSSL_NO_SSL2
     case 2:
        debug(83, 5) ("Using SSLv2.\n");
        method = SSLv2_server_method();
        break;
+#endif
     case 3:
        debug(83, 5) ("Using SSLv3.\n");
        method = SSLv3_server_method();
@@ -609,10 +611,12 @@
     ERR_clear_error();
     debug(83, 1) ("Initialising SSL.\n");
     switch (version) {
+#ifndef OPENSSL_NO_SSL2
     case 2:
        debug(83, 5) ("Using SSLv2.\n");
        method = SSLv2_client_method();
        break;
+#endif
     case 3:
        debug(83, 5) ("Using SSLv3.\n");
        method = SSLv3_client_method();

Para aplicarlo podemos copiar el contenido anterior en un archivo y ejecutar: patch -p0 < parche.txt

noviembre 27, 2011

octubre 26, 2011

Deshabilitar ipv6 en ubuntu 11.10 GNU/Linux 3.0.0

Parece que en los ultimos kernel algo ha cambiado que ya no es posible deshabilitar el soporte IP v6 a través de los métodos tradicionales, vease:
  • Método 1, NO FUNCIONA. Añadir la configuración al núcleo (supuestamente funcional en Ubuntu 10.04 y 10.10):
    vi /etc/sysctl.conf
    # IPv6
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 1
    
    Recargamos la configuración y vemos si está aplicada con:
    sysctl -p
    cat /proc/sys/net/ipv6/conf/all/disable_ipv6
    
  • Método 2. NO FUNCIONA. Deshabilitar los módulos (supuestamente funcional en Ubuntu 9.04 y anteriores):
    vi /etc/modprobe.d/aliases
    alias net-pf-10 ipv6 off
    alias net-pf-10 off
    alias ipv6 off
    Reiniciamos
    reboot
    
  • Método 3. FUNCIONA Como posiblemente todo esto no nos haya funcionado:
    vi /etc/default/grub
    << GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    >> GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash ipv6.disable=1”
    
    Recargamos la configuración del grub y reiniciamos:
    update-grub
    reboot
    

octubre 14, 2011

Backup y recuperación del MBR y tabla de particiones

Backup a un archivo del mbr, particiones y lista legible:
dd if=/dev/sda of=sda.mbr bs=512 count=1
fdisk -l > particiones.txt
Recuperación a disco:
dd if=sda.mbr of=/dev/sda bs=512 count=1