Issuu on Google+

Opera 9

LINUX MAGAZINE

Cómo sacarle el máximo provecho p29

Edición en Castellano

Backtrack Damn Small Linux Gobolinux

NÚMERO 24

Zenwalk Puppy Linux Slax

NÚMERO 24 • P.V.P 6,95 €

Hotplugging

Hacks para la detección de hardware

Debian hotplug

HOTPLUGGING

Ivman

Udev

Administración de enchufado en caliente con Ivman p21 Definición de eventos con el hotplug de Debian p14 El gestor Udev en profundidad p24

Xara LX

Xara LX

Cláusula Mariposa

Simulación de 3D con gráficos vectoriales p32

Citadel

Citadel

Opera 9

Una solución groupware sencilla, flexible y libre p35

Kmediafactory

Vnc2swf

Screencasts

Netfilter

Crea tutoriales en vídeo con Vnc2swf p72

WWW.LINUX- MAGAZINE.ES

Kmediafactory DVDs de vídeo a medida p66


-JOVY8PSME$POGFSFODF&YQPo

8PSMEXJEF4FSJFT /FX:PSL

'FCSVBSZo 

XXXMJOVYXPSMEFYQPDPN

.FYJDP$JUZ

'FCSVBSZo.BSDI 

XXXMJOVYXPSMEFYQPDPNNY

#SVTTFMT

.BSDIo 

XXXMJOVYXPSMEFYQPCF

.BESJE

"QSJM o 

XXXMJOVYXPSMETVNNJUDPNFT

5PSPOUP

"QSJMo.BZ 

XXXMXOXFYQPQMVNDPNDB

4BP1BVMP

.BZ o 

XXXMJOVYXPSMECSBTJMDPNCS

.JMBO

.BZ o 

XXXMJOVYXPSMETVNNJUJU

5PLZP

.BZo+VOF 

XXXJEHDPKQFYQPMX

4FPVM

+VOFo 

XXXMJOVYXPSMELPSFBDPN

4BO'SBODJTDP

"VHVTUo 

XXXMJOVYXPSMEFYQPDPN

#FJKJOH

4FQUFNCFSo 

XXXMJOVYXPSMEDIJOBDPN

4UPDLIPMN

4FQUFNCFS 

XXXMJOVYXPSMETVNNJUTF

-POEPO

0DUPCFS o 

XXXMJOVYXPSMEFYQPDPVL

6USFDIU

0DUPCFSo/PWFNCFS  XXXMJOVYXPSMEFYQPOM

8PSMETMFBEJOH5SBEF&WFOUGPS-JOVYBOE0QFO4PVSDFJOCVTJOFTT

*/5&3/"5*0/"-.&%*"410/403


EDITORIAL

CINISMO Estimado Lector de Linux Magazine

esulta curioso cómo es la gente. El abogado José María Lancho ha creado una interesante herramienta legal para el mundo del software libre, la denominada “cláusula mariposa”. Dicho documento, a pesar de su nombre, no es técnicamente una cláusula, sino un contrato que se añade a las otras licencias y contratos con los que se comercializa un software, y que establece que dicho código, en el caso de su uso por parte de la administración de un estado, no podrá ser utilizado cuando dicho estado “proceda a efectuar un acto de agresión armada contra un tercer Estado o proceda a efectuar actos constitutivos de genocidio, crímenes de lesa humanidad o crímenes de guerra” [1]. O sea, que ni Pinochet, ni Saddam, ni Bush, ni Kim Jon-il podrían haber utilizado/podría utilizar nuestro software, o al menos no legalmente, con dicho contrato incluido en nuestro código. Y hete aquí que el mimos día de su publicación, la noticia salta en el meneame [2] y recibe 185 meneos, además unos cuantos comentarios, representativos estos de los que he oído al respecto hasta el momento, y resumibles en dos posturas: los que dicen que la cláusula mariposa contraviene la GPL, al limitar la libertad del usuario; y los que cínicamente se cuestionan la utilidad de este dispositivo legal. En el primer caso, cabría preguntarse en qué clase de mente perturbada puede caber anteponer la vida de posiblemente miles de humanos a unos ideales mal entendidos (y digo bien: MAL entendidos), y argumentar que como la Debian Free Software Guidelines, por ejemplo, menciona la “no discriminación en función de la finalidad perseguida”, pues que, bueno, no se puede recriminar a nadie que utilice la distro del espiralito para controlar el proceso de fabricación de gas sarin o de llevar el recuento de los reos en Guantánamo. En fin que, la misma palabra “libre” en “software libre” lo dice todo.

R

Nos sentimos orgullosos de nuestros orígenes como publicación, que se remonta a los primeros días de la revolución Linux. Nuestra revista hermana, la publicación alemana Linux Magazine, fundada en 1994, fue la primera revista dedicada a Linux en Europa. Desde aquellas tempranas fechas hasta hoy, nuestra red y experiencia han crecido y se han expandido a la par que la comunidad Linux a lo ancho y largo del mundo. Como lector de Linux Magazine, te unes a una red de información dedicada a la distribución del conocimiento y experiencia técnica. No nos limitamos a informar sobre el movimiento Linux y de Software Libre, sino que somos parte integral de él.

Pues no. Siento echar un jarro de agua fría sobre todos los pseudolibertarios, pero resulta que la ley, en este caso la ley internacional pertinente a los derechos humanos, está por encima de cualquier licencia, libre o propietaria. Esto significa que la prohibición de utilizar cualquier producto para la opresión y eliminación industrial de tus congéneres está implícita en todo contrato, ya sea social o no. Además, conociendo personalmente a Richard Stallman (un poquito, al menos), dudo mucho que estuviera pensando en la “libertad” de llevar a cabo limpiezas étnicas cuando escribió la GPL. Claro que ahora viene la siguiente parte: si el anteriormente mencionado derecho internacional es incapaz de hacer que los dictadores se porten como buenos chicos, ¿cómo van a ayudar unos pocos párrafos escritos por un picapleitos? La respuesta escueta: golpeando donde más duele. La respuesta más larga: nada se mueve en un vacío. Todos los países mantienen tratados comerciales con otros países, y los tiranos mantienen bienes, cuentas bancarias y propiedades fuera de sus fronteras para el día que los rebeldes cerquen el palacio y tengan que echar mano del helicóptero aparcado en el jardín trasero. ¡Qué sorpresa cuando fuesen a retirar fondos para gastillos y encontrasen sus cuentas suizas embargadas, su casa de retiro en Barbados donada a los huérfanos de San Ildefonso y su colección de coches de época subastados en ebay! ¿Pero cómo puede ser? Pues incumpliendo un contrato comercial, ya que, si bien lo de los derechos humanos muchos gobiernos se lo toman a chiste, los acuerdos comerciales son sagrados. Y una entidad privada, reclamando ante una corte arbitral reconocida, puede comprometer las posesiones que cualquier gobierno mantenga fuera de sus fronteras. Justo lo que se contempla en la “cláusula mariposa”. Y pudiendo hacerlo, ¿por qué no aplicarlo? Negarse a adoptar medidas como la propuesta por Lancho es de un cinismo rayano en lo inhumano y ade-

WWW.LINUX- MAGAZINE.ES

más estúpido. Es como si alguien se negara a parpadear dos veces, a sabiendas de que, haciéndolo, iba a dificultar el exterminio de todo un pueblo. Asimismo, cabría recordar que no se ha llegado al dulce momento en el que se encuentra el software libre gracias al cinismo, sino, más bien, por todo lo contrario: gracias al idealismo de unos pocos visionarios. Por cierto, el sobrenombre de “mariposa” no es porque los que pensamos que es una buena idea seamos unos idealistas trasnochados que triscamos entre nenúfares mientras nos salen pétalos de rosa de las axilas. Viene por el “efecto mariposa”, de la teoría del caos, que ilustra cómo un pequeño cambio en un sistema dinámico puede tener efectos enormes en otra parte del sistema. Si uno de esos efectos sirve para obstaculizar, aunque sea un poquito, los planes genocidas al próximo dictador psicópata ■ asesino que se presente, me apunto.

Paul C. Brown Director

RECURSOS [1] Para una explicación detallada de la cláusula, cómo funciona y el texto completo del contrato, ver la página 88 de este número de Linux Magazine. [2] Ítem anunciando la publicación de la “cláusula mariposa” en meneame: http://meneame.net/story/ clausula-mariposa-software-paz

Número 24

3


CONTENIDOS • Linux Magazine nº 24

PORTADA 13 Especial Hotplugging La virtualización puede ahorrarnos tiempo, dinero y esfuerzos, pero tendremos que encontrar la herramienta que más se adecúe a nuestra tarea.

PORTADA 24 Udev Después de tres años de espectativas, por fin Udev ha desbancado al sistema Dev-FS. En este artículo vamos a echarle un vistazo al gestor de dispositivos Udev del sistema Linux.

21 Ivman Un mejor conocimiento del sistema de hotplug de Linux nos abrirá las puertas de la innovación y automatización. Vamos a ver una solución personalizada para el backup en ordenadores portátiles.

PRÁCTICO 29 Opera Estable, rápido y completo: Opera 9 nos ofrece todo cuanto podamos necesitar para navegar por Internet en un compacto paquete.

32 Xara LX Los gráficos vectoriales suelen ser como los cómics: aunque pueden insinuar sombras y luces, es más o menos imposible conseguir en ellos realismo fotográfico. Pero esto podría cambiar con el lanzamiento de Xara LX como programa de código abierto.

35 Citadel

LINUX MAGAZINE 3 6 8 10 12 94 94 95 97 98

4

Editorial DVD Linux Magazine Inseguridades Noticias Kernel Eventos Información de Contacto Subscripciones Linux Local Próximo Número

Número 24

46 Python: Versiones Vamos a ver cómo podemos crear un programa en Python que emplee Gamin y Subversion para mantener seguro nuestro directorio.

50 Tcl3D

14 Debian Hotplug Debian hotplug está diseñado para poco más que cargar drivers y configurar dispositivos. La colección de scripts que se revisa en este artículo permite a Linux responder cuándo se conecta un cable o cuándo hay un teléfono móvil en las proximidades. Siga leyendo si quiere aprender a definir eventos de conexión en caliente personalizados.

DESARROLLO

El proyecto Citadel ofrece una solución groupware alternativa fácil, estable y versátil.

DESARROLLO 40 Perl:Spam Los spammers no sólo envían correos electrónicos. También sabotean los foros y blogs posteando pseudo-mensajes llenos de enlaces a motores de búsqueda falsos. Un script en Perl nos ayuda a hacer la limpieza.

WWW.LINUX- MAGAZINE.ES

Tcl3D acerca el mundo de los efectos 3D a los scripts TCL. En este artículo vamos a mostrar cómo empezar a programar scripts con gráficos en 3D.

ADMINISTRACIÓN 59 Charly Los navegadores viven en continuo peligro de ser contagiados por un sitio web peligroso. Un proxy intermedio combinado con un antivirus puede ayudar.

60 Netfilter En este artículo vamos a mostrar cómo compilar una extensión de Netfilter usando como ejemplo un cortafuegos musical.


LINUX USER 66 Ktools: Kmediafactory Si las grabaciones de vídeos y de TV tienen el ordenador de casa colapsado, grábalas en un DVD con Kmediafactory.

69 WorkSpace: OpenOffice Implementación del sistema de notación de corchetes en OpenOffice.org

72 Películas SWF con Vnc Si queremos ofrecer a los visitantes de nuestra página web algo más que un howto basado en texto, ¿por qué no publicar un tutorial grabado en vídeo con Vnc2swf?

COMUNIDAD 84 Konsultorio Si tienes algún problema de configuración, o simplemente quieres conocer mejor cómo funciona Linux, Klaus Knopper, el creador de Knoppix, te ayuda.

88 Linux Legal: Cláusula Mariposa Nos falta sensibilidad, mejor dicho, percepción para notar los acontecimientos globales. Por mucho que nuestros hábitos mentales se rijan por lo concreto, los más importantes acontecimientos acaban de suceder y están sucediendo ahora, y son globales.

■ Backtrack

74 Educación: Accesibilidad 2007

■ Damn Small

En esta nueva serie de artículos vamos a intentar dar contestación a una pregunta sencilla: ¿puede GNU Linux dar respuesta a las necesidades de síntesis de voz multilingüe de nuestros centros educativos?

■ GoboLinux ■ . . . Y muchos más. ■ Más información en pág. 6

79 Línea de comandos: Errores de red Linux posee las herramientas adecuadas para buscar y encontrar en la red errores y abrir el camino a los paquetes de datos.

82 Juegos: Postal La saga más gore, sangrienta, violenta y políticamente incorrecta de la historia de los videojuegos tiene su cenit en esta expansión que nos sitúa en el pellejo del protagonista habitual de la serie (The Postal Dude), pero esta vez aderezado con una jugosa lesión cerebral que nos dará mucho juego.

WWW.LINUX- MAGAZINE.ES

Número 24

5


DVD LINUX MAGAZINE

En el DVD de Linux Magazine…

11 MINI-DISTROS L

a diversidad de las especies es uno de los elementos esenciales para medir la salud del ecosistema del software libre. A diferencia de otros entornos del mercado informático, donde lo aparentemente deseable es que un sistema o una empresa alcance una posición dominante so pena de arriesgarse a perecer devorada por sus congéneres (lo que conlleva un mercado enfermo, diezmado por los monopolios), en el software libre la variedad de proyectos alimentan a otros proyectos nuevos o más antiguos con innovaciones y soluciones, aportando una robustez al conjunto de entes que cohabitan el espacio del open source.

BackTrack Una distro “live” (se ejecuta desde el DVD sin necesidad de instalación) que trae un completo juego de herramientas de seguridad. Permite auditar discos duros y redes, crackear redes inalámbricas y sistemas remotos, descubrir fallos de seguridad y proteger sistemas comprometidos o vulnerables. Más información en [1]

Damn Small Linux 3.1 Tal vez la mini-distro más conocida. Su infinitesimal tamaño es cuestión de leyenda. El concepto original viene de un experimento: Sus creadores querían saber “cuánto Linux” podrían meter en un CD tipo tarjeta de 50 Mbytes, por ello ese es el tamaño límite de todas las versiones de DSL. Sin embargo, gracias al buen trabajo de sus desarrolladores, DSL se ha convertido en el Knoppix de las mini-distros, la distro preferida para llevar en un pendrive o Compact Flash, logrando un perfecto equilibrio entre tamaño, velocidad y funcionalidad. Más información en [2].

GoboLinux 013 Y, afortunadamente, un entorno, a primera vista caótico como el del software libre, es el caldo de cultivo ideal para que desarrolladores individuales o pequeños grupos arranquen sus propios proyectos, suplementando según sus criterios e intereses las distros mayoritarias. Así nacen sistemas interesantísimos, que son, en una palabra, asombrosos, verdaderas joyas de ingeniería informática que logran condensar en un espacio diminuto paquetes y funcionalidades con un grado de madurez y estabilidad envidiables y que no deben faltar en el arsenal de ningún usuario, sea profesional o aficionado. En nuestro DVD especial de este mes presentamos ocho distros que pueden ejecutarse directamente desde el menú de inicio en modo live y tres más que se pueden quemarse a CD para completar su caja de herramientas Linux. A continuación detallamos las distros incluidas:

6

Número 24

GoboLinux es una distro diferente. Los artífices detrás de ella se han planteado toda una nueva filosofía en lo que se refiere al sistema de ficheros. Según sus propia palabras: “el sistema de ficheros es el administrador de paquetes”. ¿Qué significa esto? Pues que en vez de tener programas y ficheros de una misma aplicación, repartidos a lo largo y ancho del sistema de ficheros (ejecutables en /usr/bin, ficheros de configuración en /etc, medios compartidos en /usr/share, etc.) Gobo asigna un directorio a cada aplicación y vuelca todos sus componentes a ese directorio. A través de un inteligente uso de enlaces simbólicos, se consigue que todo funcione sin romper la compatibilidad con sistemas Unix tradicionales, a la vez que se simplifica la tarea de adjudicar e identificar los ficheros pertenecientes a cada aplicación. Más información en [3].

WWW.LINUX- MAGAZINE.ES

grml 0.9 Aporta un juego de herramientas completo para administradores de sistemas profesionales y para aquellos que no le tienen miedo a la terminal (aunque sí incluye un escritorio, la administración de ventanas no es, ni pretende ser, su fuerte). Gracias a un ingenioso sistema de compresión, logra empaquetar más de 2 Gbytes de software en el tamaño de un CD convencional. Más información en [4].

GParted 0.3.2 GParted es una distro de una sola aplicación: el programa Gparted del título. ¿Por qué es necesaria esta distro? Por una razón muy sencilla: Gparted es la mejor manera de crear, redimensionar, modificar y eliminar particiones en un disco duro sin romper nada. Con su modo live se evita la ejecución de cualquier cosa desde el disco duro sobre el que se está trabajando. lo cual tiene sentido en el proceso de particionado, ya que


DVD LINUX MAGAZINE

se previenen conflictos potencialmente desastrosos. Lo contrario es equivalente a tener a un cirujano operándose a sí mismo. Más información en [5].

Puppy Linux 2.12 Esta es otra mini-distro que, como Damn Small, levanta pasiones. Su peso es de entre 28 y 70 Mbytes, reducido espacio en el que se consigue meter un sistema de escritorio completo, con centenares de aplicaciones (mención especial merecen sus capacidades multimedia) y un cuidado aspecto, que poco tiene que envidiar a distros mucho más voluminosas. Más información en [6].

SabayonLinux 3.2 Sabayon es una curiosa distro de uso general basada en Gentoo. Al utilizar el sistema de

empaquetamiento base de Gentoo (que exige, en la mayoría de los casos, compilar las fuentes para la máquina en el que se ejecuta), se consigue un sistema muy estable y muy a la medida del hardware subyacente. Esto a su vez repercute en un uso óptimo de los recursos del sistema y una mayor velocidad en la ejecución de los programas. Más información en [7].

Zenwalk 4.0 Los principios que rigen el desarrollo de Zenwalk es que la distro ha de ser moderna, incorporando las últimas versiones estables de las aplicaciones; rápida, explotando todas las optimizaciones posibles; racional, limitando el número de aplicaciones a una por función; completa, implementando un escritorio funcional, así como servidores; y “evolucionario”, en el sentido de que no debería hacer falta cambiar todo el sistema para su actualización, sino que se va actualizando poco a poco, aplicación a aplicación. Más información en [8].

Y las isos de … Además de los lives citados, todos lo cuales se pueden arrancar desde el menú de inicio del DVD, incluimos las isos de: • IPCop 1.4.11 – IPCop es una distro destinada a actuar como línea de defensa de una red ante amenazas externas.

WWW.LINUX- MAGAZINE.ES

Implementada en una máquina situada entre la intranet e Internet, IPCop ofrece una seguro firewall, configuración sencilla y global y un completo juego de aplicaciones de monitorización. Su lema es “¡Los paquetes malvados se quedan aquí!”. Ver [9] • Slax-5.1.8.1 – Según sus creadores, Slax es “pequeño y bello”. Aparte del amor maternal que destilan sus desarrolladores, de casta le viene al galgo. A fin de cuentas se basa en la venerable Slackware, la más Unix de las distros Linux, la cual trae a este LiveCD toda su estabilidad y potencia. Ver[10] • VectorLinux – VectorLinux es una distro basada en binarios Slackware que alega ser “la distro binaria más rápida del planeta”. Además de optimizar todos los paquetes, el aspecto de Vector es inmejorable, con una muy cuidadosa presentación y un escritorio basado en KDE o XFCE digno de verse. ■ Ver [11].

RECURSOS [1] Sitio web de Backtrack: www. remote-exploit.org/index.php/ BackTrack [2] Sitio web de DamnSmall: www. damnsmalllinux.org [3] Sitio web de GoboLinux: www. gobolinux.org [4] Sitio web de grml: www.grml.org [5] Sitio web de Gparted: gparted. sourceforge.net/ [6] Sitio web de Puppy Linux: www. puppylinux.org [7] Sitio web de Sabayon Linux: www. sabayonlinux.org [8] Sitio web de Zenwalk: www.zenwalk. org [9] Sitio web de IPCop: ipcop.org [10] Sitio web de Slax: www.slax.org [11] Sitio web de VectorLinux: www. vectorlinux.com

Número 24

7


LINUX USER INSEGURIDADES Schlagwort sollte hier stehen

INSEGURIDADES OpenSSL El juego de herramientas OpenSSL suministra soporte para conexiones seguras entre ordenadores. OpenSSL incluye una herramienta de administración certificada y librerías compartidas que ofrecen varios algoritmos y protocolos criptográficos. Ravis Ormandy y Will Drewry de Google Security Team descubrieron un desbordamiento de búfer en la función de utilidad SSL_get_shared_ciphers(). Un atacante podría enviar una lista de ciphers a una aplicación que use esta función y sobreescribir un búfer (CVE2006-3738). Pocas aplicaciones hacen uso de esta vulnerable función y generalmente sólo se emplea cuando las

aplicaciones depuración.

se

compilan

para

Tavis Ormandy y Will Drewry también descubrieron un fallo en el código de cliente SSLv2. Cuando una aplicación cliente usa OpenSSL para crear una conexión SSLv2 a un servidor malicioso, este servidor podría hacer que el cliente se colgara. (CVE-2006-4343) Dr S. N. Henson del equipo core de OpenSSL y Open Network Security ha desarrollado recientemente una suite de pruebas ASN.1 para NISCC (www.niscc. gov.uk) que dejó al descubierto vulnerabilidades de denegación de servicio: • Determinados tipos de claves públicas pueden tomar cantidades de tiempo de proceso desproporciona-

POLITICAS DE SEGURIDAD DE LAS DISTRIBUCIONES MAYORITARIAS Distribuidor

Fuente Seguridad

Debian

Info:http://www.debian.org/security/ Lista:http://www.debian.org/debian-security-announce/ Referencia:DSA-…1)

Gentoo

Mandrake

Red Hat

Slackware

Suse

Comentario

Los avisos de seguridad actuales se incluyen en la página de inicio. Los avisos se proveen como páginas HTML con enlaces a los parches. Los avisos también incluyen una referencia a la lista de correo. Info:http://www.gentoo.org/security/en/index.xml Los avisos de seguridad actuales para Foro:http://forums.gentoo.org/ la lista Gentoo en el sitio web de Lista:http://www.gentoo.org/main/en/lists.xml seguridad de Gentoo enlazan desde la Referencia:GLSA:… 1) página principal. Los avisos se presentan en HTML con códigos para fusionar las versiones corregidas. Info:http://www.mandrakesecure.net Mandrakesoft posee su propio sitio web Lista:http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionados con Referencia:MDKSA:… 1) la seguridad. Entre otras cosas,incluye avisos de seguridad y referencias a las listas de correo. Los avisos son páginas HTML,pero no contienen enlaces a los parches. Info:http://www.redhat.com/errata/ Red Hat archiva los fallos de seguridad Lista:http://www.redhat.com/mailman/listinfo/ bajo lo que denominan erratas. A Referencia:RHSA-… 1) continuación los problemas para cada versión de Red Hat se agrupan. Los avisos de seguridad se proveen como una página HTML con enlaces a los parches. Info:http://www.slackware.com/security La página de inicio contiene enlaces al Lista:http://www.slackware.com/lists/(slackware-security) archivo de seguridad de la lista de correo. Referencia:[slackware-security]… 1) No existe información adicional sobre seguridad en Slackware. Info:http://www.suse.de/en/private/support/ Ya no existe un enlace a la página de security/index.html seguridad tras un remodelado en el sitio Parches:http://www.suse.de/en/private/ web de SuSE. Existe información en la download/updates Lista:suse-security-announce lista de correos y los avisos. Los parches de Referencia:SUSE-SA… 1) seguridad para versiones individuales de SuSE Linux se muestran de color rojo en el sitio de actualizaciones generales. Contiene una corta descripción de la vulnerabilidad que soluciona el parche.

1) Todos los distribuidores muestran correos de seguridad en el campo Subject.

8

Número 24

su

WWW.LINUX- MAGAZINE.ES

das, llevando a una denegación de servicio. (CVE-2006-2940) • Durante el análisis de ciertas estructuras ASN.1 no válidas, se manejó incorrectamente una condición de error. Esto puede llevar a un bucle que consume memoria del sistema (CVE-2006-2937). Este problema no afecta a la versión OpenSSL distribuida en Red Hat Enterprise Linux 2.1 Estas vulnerabilidades pueden afectar a aplicaciones que usan OpenSSL para analizar datos ASN.1 desde fuentes no fiables, incluyendo servidores SSL que habilitan autentificación de ■ cliente y aplicaciones S/MIME. Referencia Debian: DSA-1185-1 Referencia Gentoo: GLSA 200609-05 Referencia Mandriva: MDKSA-2006:172-1 Referencia Red Hat: RHSA-2006:0695-12 Referencia Slackware: SSA:2006-272-01 Referencia Suse: SUSE-SA:2006:058 Referencia Ubuntu: USN-353-1

X.org X.org es una implementación de código abierto del Sistema X Windows. Suministra la funcionalidad de nivel básico sobre la que se diseñan las interfaces de usuario gráficas propiamente dichas. iDefense informó de dos fallos de desbordamiento entero en la manera en la que el servidor X.org procesa los ficheros fuente CID. Un cliente malicioso autorizado podría explotar este problema y causar una denegación de servicio (el sistema se cuelga) o ejecutar potencialmente código arbitrario con privilegios de superusuario en el servidor X.org. ■ (CVE-2006-3739, CVE-2006-3740) Referencia Gentoo: GLSA 200609-07, Referencia Mandriva: MDKSA-2006:164 Referencia Red Hat: RHSA-2006:0665-3 Referencia Slackware: SSA:2006-259-01 Referencia Suse: SUSE-SR:2006:023 Referencia Ubuntu: USN-344-1

Python Python es un lenguaje de programación orientado a objetos, interactivo e interpretado. Se descubrió un fallo en la manera en la que la función repr() manipula los strings UTF-32/UCS-4. Si una aplicación escrita en Python usa la función repr() sobre datos no fiables, esto podría llevar a una denegación de servicio o posiblemente permitiría la ejecución


INSEGURIDADES

de código arbitrario con los privilegios de la aplicación Python. (CVE-2006-4980) I Referencia Mandriva: MDKSA-2006:181 Referencia Red Hat: RHSA-2006:0713-6 Referencia Ubuntu: USN-359-1

Firefox, Thunderbird y SeaMonkey Mozilla Firefox es un navegador web de Código Abierto. Mozilla Thunderbird es un cliente de correo y de grupo de noticias. Mozilla SeaMonkey es una suite que incluye navegador web, cliente de correo, cliente de noticias y editor HTML. La información que sigue a continuación llega en forma de consejos suministrados por Firefox. Dicha información está relacionada con Thunderbird y SeaMonkey. Se encontraron dos fallos en la manera en la que Firefox procesa ciertas expresiones regulares. Una página web maliciosa podría hacer que el navegador se colgara o posiblemente ejecutara código arbitrario con los permisos del usuario ejecutando Firefox. (CVE-2006-4565, CVE-2006-4566) Una página web maliciosa podría hacer que el navegador se cayera o posi-

blemente ejecutara código arbitrario como el usuario ejecutando Firefox. (CVE-2006-4571) Se encontró un error en la manipulación de eventos cronometrados por Javascript. Una página web maliciosa podría colgar el navegador o posiblemente ejecutar código arbitrario como el usuario ejecutando Firefox. (CVE2006-4253) Daniel Bleichenbacher ha descrito recientemente un error de implementación en la verificación de la firma RSA. Para llaves RSA con exponente 3, es posible que un atacante falsifique una firma que estuviera incorrectamente verificada por la librería NSS. Firefox, tal y como viene de fábrica, confía en varias Autoridades de Certificación de superusuario que usan exponente 3. Un atacante podía haber creado un certificado SSL cuidadosamente manipulado que podría estar incorrectamente verificado cuando su site fuera visitada por una víctima. (CVE-2006-4340) Se encontró un fallo en el sistema de verificación de auto-actualización de Firefox. Un atacante con la habilidad de engañar al DNS de la víctima conseguiría que Firefox descargara e instalara código malicioso. Con objeto de explotar este problema, un atacante tam-

WWW.LINUX- MAGAZINE.ES

bién necesitaría conseguir una víctima que acepte previamente un certificado no verificable. (CVE-2006-4567) Firefox no previene adecuadamente una estructura en un dominio de la inyección satisfecha en una sub-estructura que pertenece a otro dominio, los cuales facilitan el engaño a sitios web y otros ataques. (CVE-2006-4568) Firefox no carga popups bloqueados y abiertos en el contexto del dominio adecuado. Este escenario conduciría a ataques de scripting multisitio. Con idea de explotar este problema, un atacante necesitaría encontrar una sitio que estructurara su página maliciosa y convenciera al usuario de que abriera manualmente un popup bloqueado. I (CVE-2006-4569) Referencia Debian: DSA-1192-1, DSA-1191-1 Referencia Gentoo: GLSA 200609-19, GLSA 200610-01 Referencia Mandriva: MDKSA-2006:168, MDKSA-2006:169 Referencia Red Hat: RHSA-2006:0675-5, RHSA-2006:0677-5, RHSA-2006:0676-10 Referencia Slackware: SSA:2006-257-03 Referencia Suse: SUSE-SA:2006:054 Referencia Ubuntu: USN-351-1, USN-352-1

Número 24

9


NOTICIAS · Premios Linux New Media 2006

Premios Linux New Media 2006

ESPÍRITU DE COMUNIDAD La cooperación comunitaria y comercial está experimentando un importante incremento en el mundo del Software Libre. En los Premios Linux New Media de este año hemos sido los primeros en otorgar nuestro reconocimiento a la mejor combinación agua-fuego. El evento tuvo lugar en la LinuxWorld Expo celebrado en la Feria de Muestras de Colonia. POR ULI BANTLE

D

esde el 2000, todos los años Linux New Media (http://www. linuxnewmedia.com) reúne a un jurado internacional para que evalúen los trabajos más sobresalientes llevados a cabo en el ámbito del software libre. Este jurado se encuentra formado por personalidades pertenecientes al movimiento del Código Abierto, autores, periodistas, altos cargos gubernamentales y representantes de la industria. Cada año se conceden nuevos premios correspondientes a las nuevas categorías creadas que reflejan las nuevas tendencias. En la actual edición, por ejemplo, aparte de categorías de pasadas ediciones, se han premiado las mejo-

10

Número 24

res soluciones de virtualización y antispam.

Tender un Puente al Vacío En la nueva categoría “Mejor combinación de Comunidad y Comercio”, Ubuntu y Canonical de Mark Shuttleworth ganaron por sus valientes malabarismos que combinan el desarrollo basado en la comunidad y la iniciativa comercial. El tándem Trolltech/ KDE fueron los subcampeones. Las combinaciones Novell/Open Suse y Red Hat/ Fedora fueron claramente los perdedoras. Muchos observadores esperaban que Xen y VMware jugaran un papel destacado en las apuestas de la virtualización. En tér-

WWW.LINUX- MAGAZINE.ES

minos de cuota de mercado, VMware es sin duda el rey, pero Xen ha alcanzado una mayor popularidad gracias a su integración con algunas bien conocidas distribuciones Linux. El hecho de que el tercer lugar fuera otorgado al emulador Qemu, licenciado bajo GPL fue una sorpresa. Aunque el espacio ocupado en segundo lugar estaba claro, Qemu dejó atrás a OpenVZ, LinuxVserver Parallels y User Mode Linux.

Los Pesos Pesados IBM se está convirtiendo en el ganador en serie en la categoría de proveedor de hardware más amigable para Linux. Éste es la segunda vez en dos años consecutivos en que el Gran Azul consigue batir a sus competidores en esta sección. En un segundo lugar, empataron los fabricantes de CPU AMD y Intel. Este año ha sido la primera vez que el vendedor mundial de chips, Intel, ha subido al podio sustituyendo al ganador del tercer premio del pasado año, HP.

La mayor diligencia de ambos vendedores de CPU en sus esfuerzos por cooperar con los desarrolladores de Código Abierto ha sido un factor clave en sus éxitos más recientes. Entre otras cosas, Intel ha publicado recientemente drivers 3D para sus chipsets PCI Express (ver http://intellinuxgraphics. org). Ubuntu también ha sido un peso pesado en la actual edición. El jurado acordó que el autodenominado “Linux para Seres Humanos” era de lejos la distribución más amigable para el usuario final, con su derivada KDE, Kubuntu, situada en segunda posición. Su rival más próximo fue el proyecto OpenSuse de Novell. El jurado también tuvo


Premios Linux New Media 2006 · NOTICIAS

en consideración a Freespire, basado en la distribución comercial de Linspire, la versión libre de la cual se publicó este mismo año.

Especialistas Los Live CDs merecen un papel destacado y vital para la comprobación e investigación de conflictos. Seimpre se ha considerado a Klaus Knopper como el padre del Live CD, y sus compromisos y servicios a Linux fueron más que suficientes para convencer al jurado de su merecido premio especial “Contribución Sobresaliente a Linux/Código Abierto”. El mentor y patrón de la Wikipedia, Jimmy Wales, obtuvo el segundo lugar, detrás de Klaus. El tercero estuvo compartido por dos instituciones: Mozilla Foundation y el consorcio OASIS, http://www.oasis-open.org/ home/index.php, responsable de la Open Document Standard. Esto puede verse como una jugada del jurado para rendir honores a lo que muchos consideran ser al tema más controvertido del 2006, la lucha por un documento estándar libre. Y también está el hecho de que la Mozilla Foundation lanzó Firefox 2.0 coincidiendo con el tramos final de la votación de los premios. Dos millones de descargas en las primeras 24 horas son una excepcional prueba del sobresaliente éxito de los productos de los que disfruta la ■ fundación.

Premios Linux New Media 2006 Proveedor de Linux Más Amistoso 1. IBM 23,0% 2. AMD 17,0% 3. Intel 14,0% Mejor Solución de Virtualización 1. Xen 38,0% 2. VMware 35,0% 3. Qemu 10,0% Mejor Solución Anti-spam 1. SpamAssassin 69,0% 2. Bogo filter 11,0% 3. Kaspersky AntiSpam 8.0% Distribución Linux Más Amistosa 1. Ubuntu 27,0% 2. Kubuntu 13,0% 3. OpenSuse 11,0% Mejor Combinación Comercio/Comunidad 1. Canonical/Ubuntu 21,0% 2. Trolltech/KDE 17,0% 3. MySQL/MySQL Community Edition 13,0% Contribución Sobresaliente a Linux / al Código Abierto / al Software Libre 1. Klaus Knopper 12.0% 2. Jimmy Wales 10.0% 3. Fundación Mozilla 9.0% 4. OASIS (ODF) 9.0%

EL JURADO Para que los resultados sean verdaderamente satisfactorios, se requieren miembros del jurado experimentados, siendo el mejor lugar para encontrarlos allí donde se usan los productos Linux y de código abierto. El jurado para los Linux New Media Awards de este año ha incluido expertos de todas las áreas de la comunidad Linux. En cooperación con los empleados de la editorial de Linux Magazine y las otras ocho restantes publicaciones publicadas en lengua no inglesa por Linux New Media AG, este año han depositado sus votos unas 200 personas pertenecientes a todos los ámbitos del mundo de Linux. En una segunda fase del proceso de votación, los componentes del jurado eligieron productos Linux, gente y organizaciones que merecen mención especial por su innovación y originalidad en los pasados 12 meses. El jurado estuvo compuesto por los siguientes miembros: Alan Cox es un hacker del kernel desde hace mucho tiempo que habla sin remilgos. Trabaja para Red Hat, vive en Gales y mantiene un diario en galés. J. D. Frazer, más conocido bajo el nombre de Illiad, es el creador del cómic User Friendly. Bdale Garbee trabaja para Hewlett Packard Corporation, donde se encuentra desarrollando una distribución Linux. Peter Gutmann es investigador de la Universidad de Auckland, Nueva Zelanda, trabaja en el diseño de arquitecturas de seguridad criptográficas. Patricia Jung es la autora y habitualmente la mano invisible que se esconde detrás de las Noticias Linux de Linux Magazine. Trabaja como administradora de sistemas y editora en opensourcepress.de. Jon “Maddog” Hall predica sobre el Sistema Operativo libre por todo el mundo. Es el Director Ejecutivo de Linux Internacional y una de las voces más abiertas de la comunidad. Yuwei Lin investiga los aspectos sociales, culturales y económicos del Software Libre en la Universidad de Manchester. Frederick Noronha es periodista hindú basado en Goa y cofundador de BytesForAll. Escribe extensamente sobre todos los temas relacionados con FLOSS,

WWW.LINUX- MAGAZINE.ES

cubriendo tanto India como Asia. Dmitri Popov es lingüista y escritor freelance a tiempo completo. Escribe exclusivamente sobre Software de código abierto. Sus artículos han aparecido en varias publicaciones de Informática. Como desarrollador de la distribución gnuLinEx, Dario Rapisardi está inmerso en la migración masiva a Linux de la administración pública en la región española de Extremadura. Blake Ross es a sus 21 años de edad ingeniero en software y conocido por ser cofundador del proyecto Firefox. Damien Sandras es el creador y desarrollador de Ekiga, software de VoIP y vídeo conferencia. Además, forma parte del equipo principal de FOSDEM. Franz Schmid conoce los formatos Postscript y PDF como la palma de su mano, lo cual tiene sentido ya que es el desarrollador del programa de autoedición libre Scribus. Tom Schwaller fue uno de los padres fundadores de Linux Magazine y el primer director de la versión en lengua alemana. Actualmente trabaja como desarrollador bajo Linux para IBM. Rafael Peregrino da Silva es tiene un Master en Ingeniería Eléctrica y fue profesor en la Universidad Técnica de Berlín, Alemania. Hoy es Director Editorial de Linux Magazine Brasil. Arthur Skura es un veterano activista en la comunidad Linux y del Software Libre, es el director de la versión de Linux Magazine en lengua polaca. Pia Waugh es la Vicepresidenta de Linux Australia. Es una apasionada de FLOSS y trabaja muy estrechamente con las agencias gubernamentales y empresariales australianas. Warren Woodford ha estado trabajando durante 40 años en lo más puntero de la tecnología. Su contribución más reciente a la comunidad Open Source es la popular distribución MEPIS.

Número 24

11


LINUX USER NOTICIAS DEL KERNEL Schlagwort sollte hier stehen

NOTICIAS DEL KERNEL El IDE Futuro Alan Cox ha anunciado un plan puente para fusionar el soporte PATA del árbol -mm de Andrew Morton con el árbol principal del kernel en un futuro próximo. Un objetivo a más largo plazo es la eliminación completa de la capa IDE existente. Tal y como lo explica Alan: “Muchos de los drivers libata ya son más estables y funcionan mejor que los drivers/ides”. Mark Lord, el creador original y primer mantenedor del subsistema IDE, está muy a favor del plan de Alan y ha dicho: “Es hora de implementar la próxima generación de código”. No parece existir ninguna oposición seria entre los desarrolladores del kernel (para variar), aunque existen diferencias de opinión sobre la denominación de los dispositivos de disco en el futuro. Pero incluso este debate ha sido acallado por Alan, que ha declarado que éste es un tema más de udev que del kernel propiamente dicho. Aún así, el tema de los nombres es importante y udev no puede sencillamente escoger el nombre que le apetezca, ya que debe soportar usos existentes. De no hacerlo, se corre el riesgo de romper mucho software del ■ espacio de usuario.

Ext4 Mingming Cao hizo un fork para un sistema de archivos ext4 a partir del sistema de archivos ext3 el 9 de agosto. Ya

existe una fuerte presión para incluir estos parches en el árbol de Linus Torvalds “lo antes posible”, según Andrew Morton, lo que abre las puertas a todos esos parches para ext3 a los que se oponía Linus, tales como extensiones y tamaños de bloque de más de 32 bits. Andrew y otros piden una profunda limpieza de ext3 antes de que se cree un fork efectivo del código. Esto facilitaría que los desarrolladores pudieran portar enmiendas entre ambos árboles… en teoría. En la práctica, esto no es tan sencillo como parece. Si las cosas se hacen demasiado apresuradamente, se puede desestabilizar el código de ext3. Jeff Garzik sugiere que lo mejor es realizar el fork primero, realizar la limpieza sobre ext4, comprobar que todo funciona satisfactoriamente y, finalmente, migrar los cambios a ext3 después de las pruebas. Está claro que ext4 pronto estará disponible para los usuarios, y algunos se preguntarán por qué se introduce ext4 en el árbol oficial con tanta facilidad, mientras que sistemas de ficheros como Reiser4 se resisten. La respuesta corta es que los desarrolladores de ext4 son capaces de trabajar dentro del marco de desarrollo del kernel, mientras que los desarrolladores de Reiser tienen resentimientos hacia el proceso y constantemente tratan de saltárselo. Los proble-

La lista de correo del kernel de Linux comprende lo principal de las actividades de desarrollo de Linux. El volumen del tráfico es inmenso, alcanzándose a menudo los diez mil mensajes semanales. Mantenerse al día de todo lo que sucede en el desarrollo del kernel es casi imposible para una sola persona. Sin embargo Zack Brown es uno de los pocos valientes que lo intentan y gracias a él, puede leerse lo último de las discusiones y decisiones con respecto al kernel de Linux llevados de la mano de este experto. Zack ha publicado un resumen online semanal llamado “The Kernel Traffic Newsletter” durante cinco años. Linux Magazine te trae ahora la quintaesencia de las actividades del kernel de Linux del mayor especialista en el tema.

12

Número 24

WWW.LINUX- MAGAZINE.ES

mas legales de Hans Reiser y el anuncio de la venta de su empresa no han hecho más que acrecentar las dificultades. En todo caso, tanto nos guste como si no, este trato preferente es la manera en la que se lleva el mantenimiento del desarrollo del kernel en estos momentos. ■

Mantenimiento de SuperH Kaz Kojima ha renunciado al puesto de co-mantenedor de la arquitectura SuperH, una arquitectura RISC utilizada en dispositivos empotrados. Kaz ha dicho que los mayores temas de desarrollo hoy en día se refieren a hardware al que no tiene acceso, y que últimamente se está concentrando en otros proyectos. Paul Mundt, el otro co-mantenedor, ha aceptado el parche, agradeciéndole a Kaz los años de dedicación en el soporte del código e insinuando que podría ser posible conseguirle cualquier hardware que le faltase. A pesar de ello, Kaz no ha res■ pondido a la invitación.

Un GUI para git Paul Mackerras ha creado gitool, una herramienta gráfica pare crear commits git. gitool permite al usuario crear y remitir mensajes commit, muestra listas de ficheros y su estado de nuevos o modificados. Asimismo le permite escoger ficheros a visualizar en base a su estado. También lleva a cabo diffs a tres bandas entre la cabeza del árbol, cualquier cambio remitido al repositorio y cambios no remitidos. Linus Torvalds dice gustarle la herramienta, pero tiene unas cuantas objeciones importantes, incluyendo su disgusto por el nombre de la aplicación y el hecho de que gitool no es simplemente otro modo del navegador de repositorios (gitk) existente. Aparte de esto, las principales objeciones de Linus se refieren al interfaz de usuario, no a su manera de ■ interactuar con el repositorio.


Especial Hotplugging • PORTADA

Ampliamos el sistema de conexión en caliente en Linux.

CONEXIÓN EN CALIENTE La conexión en caliente es algo invisible y automático, si es que queremos que sea así. Un análisis más detenido del sistema de conexión en caliente de Linux revela interesantes oportunidades para la personalización. POR JOE CASAD acer que el software se comunique con el hardware es la tarea más ardua para cualquier sistema operativo. Además de los problemas de comunicación, encontramos que el crecimiento de la industria del PC ha conducido a una vasta proliferación de los dispositivos hardware para un sinfín de categorías de usos. Desafortunadamente, la mayoría de los fabricantes de hardware no comprometen suficientes recursos para dar soporte a los usuarios de Linux. Sin embargo, la parte positiva es que Linux y otros sistemas Unix tienen un diseño muy lógico y práctico que funciona bien con el hardware una vez lo hemos entendido. Evidentemente, el verdadero objetivo es hacer que el soporte del hardware sea tan sencillo e invisible que el usuario no se tenga que preocupar nunca por él. A medida que Linux entra en el mercado

H

del usuario doméstico no técnico, esta necesidad de configuración sin esfuerzo se hace incluso más crucial. La conexión en caliente ha sido un caballo de batalla desde hace muchos años, pero al fin es ya una realidad para Linux. Sin embargo, debido a que su objetivo es promover la configuración automática, muchos usuarios no se dan cuenta de que es posible adaptar, personalizar y ampliar el sistema de conexión en caliente de Linux. Este mes como tema de portada mostramos algunos útiles hacks relativos a dicha conexión. Nuestro primer artículo versa acerca de la ampliación del sistema de conexión en caliente. Se examinan algunos scripts que adaptan el sistema para conseguir una configuración más sencilla. Por ejemplo, vemos cómo se personaliza la configuración de red, y describimos cómo usar un demonio

para detectar un teléfono móvil con bluetooth. En nuestro siguiente artículo describimos cómo usar una herramienta como Ivman, un manejador genérico de eventos de la Capa de Abstracción de Hardware, para disparar respuestas personalizadas a eventos de conexión en caliente. Presentamos una práctica solución de backup para portátiles que verifica en primer lugar la presencia de un disco de copia de seguridad antes de lanzar el backup. Para redondear este acercamiento al mundo real de los dispositivos Linux, os presentamos un completo reportaje sobre Udev, el sistema de administración de dispositivos situado en el corazón del entorno hardware de Linux. Esperamos que disfrutéis del tema de portada de este mes acerca de los hacks en la conexión en caliente. ■

En Portada Debian Hotplug...................................... 14 Ivman...................................................... 21 Udev........................................................ 24

WWW.LINUX- MAGAZINE.ES

Número 24

13


PORTADA • Debian Hotplugging

Ampliamos el sistema de conexión en caliente en Debian, SLES 9 y RHAS 4.

A LA QUE SALTA Debian hotplug está diseñado para poco más que cargar drivers y configurar dispositivos. La colección de scripts que se revisa en este artículo permite a Linux responder cuándo se conecta un cable o cuándo hay un teléfono móvil en las proximidades. Siga leyendo si quiere aprender a definir eventos de conexión en caliente personalizados. POR MIRKO DÖLLE

E

n Debian Sarge, Suse Enterprise Linux 9, Red Hat Advanced Server 4 y sistemas más antiguos, el demonio de conexión en caliente es el punto central de contacto de todos los eventos de los dispositivos. Sin embargo, el demonio no hace mucho más que cargar drivers para los nuevos dispositivos. Incluso la simple tarea de responder cuándo está conectado o desconectado un cable de red es demasiado para la implementación utilizada en estas distribuciones. Es difícil comprender por qué la configuración de conexión en caliente de serie es tan limitada. Después de todo, la funcionalidad de conexión en caliente del kernel es perfectamente capaz de llevar a cabo un backup completamente automático en un pendrive USB conectado por un usuario, o actualizar la colección de MP3 en un teléfono móvil en las proximidades haciendo uso de unos sencillos scripts.

14

Número 24

Este artículo describe algunos trucos que podemos usar para ampliar el sistema de conexión en caliente.

Control del Cable netplugd [1] controla la detección del link en conexiones de red. El desarrollador, Bryan OSullivan, diseñó el demonio para que se denominara init. Tras arrancarlo, el proceso netplugd monitoriza cada conexión. Un script bash denominado /etc/netplug.d/netplug define la manera en la que netplugd debería responder a un cambio en el estado del link de una conexión. Pero la conexión en caliente, o más bien el script /etc/hotplug/net.agent, es el verdadero responsable de configurar los dispositivos de red. En el caso de dispositivos Ethernet, el script lanza ifup, que bien asigna una IP estática o usa DHCP para solicitar una dirección. Además de esto, el script de init /etc/init.d/networking llama a ifup

WWW.LINUX- MAGAZINE.ES

cuando se inicia el sistema, y configura todos los dispositivos de red listados en /etc/network/interfaces. Este método no tiene mucho sentido, y causa considerables retrasos. Si un usuario arranca un portátil sin conexión a red, por ejemplo, el cliente DHCP espera una respuesta que es imposible que reciba. Además de esto, un administrador no va a querer que se distribuya la configuración por demasiados sitios. Pero el demonio de conexión en caliente nos ayuda a resolver ambos problemas.

Clase Hotplug En primer lugar, necesitamos suavizar la llamada a ifup en el script init. Como todo driver de red va a disparar un evento de conexión en caliente tan pronto como se cargue y se inicialice el hardware, sólo queremos un ifup -a en el script init para configurar los dispositivos loopback (estos son los únicos dispositivos de red que no disparan un


Debian Hotplugging • PORTADA

Drivers de Bus Suponiendo un kernel con CONFIG_HOTPLUG ya compilado, el pseudo fichero /proc/sys/kernel/hotplug especifica a qué demonio debería llamar el kernel cuando un driver concreto de bus registre un nuevo dispositivo en el sistema (véase la Figura 1). Esto no significa necesariamente que el dispositivo se haya conectado físicamente al sistema. Simplemente se le comunica a hotplug que está disponible un nuevo dispositivo. Por ejemplo, el driver de la tarjeta de red tg3 puede disparar un evento de conexión en caliente cuando se carga, suponiendo que encuentre el hardware Broadcom coincidente. Por tanto, hotplug no es sólo responsable de los eventos de hotplug, sino también de conexiones “frías”, es decir, cargar

evento de conexión en caliente). Para permitir que ocurra, el Listado 1 modifica el archivo /etc/network/interfaces para asignar los dispositivos Ethernet a la clase hotplug, para evitar la configuración automática. El listado muestra las entradas para una máquina con dos NIC’s, uno de los cuales usa DHCP, y el otro tiene asignación estática de dirección. La palabra clave allow-hotplug, en lugar de la estándar auto, le indica a ifup -a que ignore estos dispositivos de red. Cuando se llama al demonio de conexión en caliente, los drivers de red pasan las variables de entorno ACTION e INTERFACE. ACTION tiene el valor register o bien unregister en función de si el driver está añadiendo o eliminando el dispositivo de red. Por su parte, INTERFACE contiene el valor del dispositivo de red en cuestión, bien sea eth0 o eth1. Si tenemos una configuración de red estática, como la configuración para eth1 del Listado 1, es discutible si la conexión

o descargar los drivers correspondientes aunque no medien cambios físicos en el ordenador. Incluso si un dispositivo tiene funcionalidades de conexión en caliente, el sistema de conexión en caliente del kernel no confía en estas capacidades. El mejor ejemplo es la tarjeta de red: de acuerdo con las especificaciones, es perfectamente posible insertar o sacar un cable de red sobre la marcha, o conectar el ordenador a una red completamente diferente. Aunque muchos drivers son capaces de detectar link a un switch u otro dispositivo de red, no pasan esta información a hotplug. La razón de esto es que los drivers del NIC no son drivers de bus, y sólo éstos últimos registran eventos de conexión en caliente.

en caliente debería configurar el dispositivo cuando esté disponible, o si el dispositivo debería esperar hasta que se conectara un cable de red. Para los servidores puede ser bastante útil asignar una dirección IP e información de rutado a la interfaz, si el servidor proporciona servicios como Bind y CUPS, con el propósito de emparejar estos servicios a una dirección IP estática al arrancar el sistema.

Nuevo Agente de Red Tiene más sentido para el sistema esperar una conexión de red antes de intentar configurar los adaptadores de red que solicitan direcciones de entidades externas. El Listado 2 muestra un fragmento de un agente de red modificado. El agente controla dinámicamente las interfaces de red configuradas en caliente. De las líneas 6 a 10, el agente determina si configura INTERFACE de manera automática, o si es una inter-

faz de conexión en caliente. Esto se hace por razones de compatibilidad, y proporciona a los administradores la posibilidad de configurar dispositivos Ethernet de manera independiente a la conexión en caliente. De las líneas 11 a 13 se determina si el dispositivo tiene una configuración estática. Nótese la palabra clave static en la línea correspondiente de /etc/network/interfaces. En este caso, queremos conectar en caliente para configurar la interfaz sin examinar el estado del link. Queremos que netplugd monitorice el estado de las interfaces de red que tienen asignación dinámica de red. Esto se controla en las líneas 14 a 22. También aseguran que se ha cargado el programa. La línea 17 es un caso especial: asigna la dirección IP 0.0.0.0 a la interfaz que habilita la interfaz. Esto se hace para eliminar toda asignación previa de direcciones y para evitar que netplugd detecte cualquier cambio en el estado del link. Aunque el LED de link pueda estar encendido en una interfaz de red inactiva (véase la Figura 2), el driver va a detectar que la interfaz esta inactiva, y no reportará el estado del link ni detectará la velocidad de transmisión. El comando de la línea 17 permite que se pase el estado, sin necesidad de que la interfaz tenga una dirección IP válida.

Listado 1: Clases de Interfaz 01 auto lo 02 iface lo inet loopback 03 04 allow-hotplug eth0 05 iface eth0 inet dhcp 06 07 allow-hotplug eth1 08 iface eth1 inet static

Figura 1: Cuando los drivers de bus registran un nuevo dispositivo, el kernel usa su funcionalidad de conexión en caliente para lanzar el demonio hotplug. Entonces Hotplug confía a un agente la responsabilidad del sistema de bus.

WWW.LINUX- MAGAZINE.ES

09

address 192.168.178.110

10

netmask 255.255.255.0

11

network 192.168.178.0

12

broadcast 192.168.178.255

13

gateway 192.168.178.1

Número 24

15


PORTADA • Debian Hotplugging

Doble Pasarela De las líneas 23 a 29 se configuran las interfaces de conexión en caliente con direcciones IP estáticas, como las especificadas en /etc/network/interfaces. Sin embargo, este método puede convertirse en un problema si la configuración estática especifica un gateway estándar (como en el Listado 1), mientras otro dispositivo de red toma su configuración de red desde un servidor DHCP. En este ejemplo la pasarela estándar se puede alcanzar vía eth1 incluso si no hay un cable conectado a la interfaz. El servidor DHCP hace uso del cable conectado a eth0 para asignar tanto la dirección IP como el nuevo gateway por defecto. Esto

puede aparecer en la tabla de rutado, lo que lleva a una situación con dos gateways por defecto, y por tanto a errores masivos de rutado. Si tenemos un ordenador portátil u otro dispositivo similar, no tiene sentido configurar la interfaz de red a menos que se conecte un cable, incluso si tenemos asignación estática de direcciones. Los cambios necesarios para controlar esta configuración con condiciones son mínimos, simplemente tenemos que eliminar el bloque de código entre las líneas 23 a 29, eliminar la condición de prueba de las líneas 11 a 13 y cambiar la línea 14 por lo siguiente: elif [ “${hotplugif}” U = “true” ]; then

Las líneas 30 a la 41 del Listado 2 prácticamente no se tocan en comparación con el agente de red de Debian Sarge. Controlan los dispositivos de red con una configuración automatizada. Sólo hay una diferencia importante con el bloque de código de las líneas 23 a 29. La prueba para verificar si ifup está ejecutándose no sólo ha de investigar la interfaz actual, como en la línea 24m, sino que tiene que tener en consideración ifup -a y ifup —all. La línea 35 se encarga de esto una vez que en las líneas 31 a 34 se ha fijado un patrón de búsqueda grep.

Modificar Netplug El demonio Netplug está diseñado para trabajar independientemente de la conexión en caliente. Para cada evento

Listado 2: Agente de Red 01 #!/bin/sh 02 03

(...)

0.0.0.0 up 19

(...)

05

if grep -q “^auto[[:space:]].*${INTERFACE

/var/run/netplugd.${INTERFACE} \ 20

netplugd.${INTERFACE}

then

07

autoif=true elif grep -q

21 22

INTERFACE}” /etc/

instalar netplugd..”

hotplugif=true

09

fi

10

if grep -q

23

fi

24

exit 0

25 elif [ “${hotplugif}” = “true”

11

26 27

fi

28

13

if [ “${hotplugif}” = “true”

29

16 17

if [ -x /sbin/netplugd ]; 30

18

debug_mesg “iface

16

ifconfig ${INTERFACE}

Número 24

IFUPARG=’\(‘$INTERFACE’\|-a\|— all\)’ 37

fi

38

if ps -C ifup ho args | grep -q “$IFUPARG”; then

39

start-stop-daemon —start

debug_mesg “Ya se está ifupeando ese interfaz.”

40

else

41

start-stop-daemon —start —background —pidfile /var/run/hotplug.net.ifup.bogu

else

s \ 42

—startas

/var/run/hotplug.net.ifup.bogu

/etc/hotplug/net.ifup

s \

—”$INTERFACE$LIFACE” —startas

/etc/hotplug/net.ifup — “$INTERFACE”

$INTERFACE se configurrá cuando el enlace esté activo”

36

debug_mesg “Y se está

—background —pidfile

then

then

then

ifupeando el interfaz.”

12

15

if ps -C ifup ho args | grep -q “$INTERFACE”; then

staticif=true

-a “${staticif}” != “true” ];

if [ “$autoif” = “true” ];

then

tatic” /etc/network/interfaces; then

35

-a “${staticif}” = “true” ];

“^iface[[:space:]]*${INTERFACE }[[:space:]]*inet[[:space:]]*s

IFUPARG=”$INTERFACE”

mesg “E: /sbin/netplugd no encontrado. Tiene que

08

34

else

“^allow-hotplug[[:space:]].*${ network/interfaces; then

14

—exec /sbin/netplugd —

]; then

-i ${INTERFACE} -p /var/run/

}” /etc/network/interfaces; 06

“auto” -a “${autoif}” = “true”

start-stop-daemon —start —background —pidfile

case $ACTION in add|register)

04

33 elif [ “${NET_AGENT_POLICY}” =

43

fi

44

exit 0

31

fi

45 fi

32

exit 0

46 (...)

WWW.LINUX- MAGAZINE.ES


Debian Hotplugging • PORTADA

del link, el demonio realiza la llamada al script /etc/netplug.d/netplug y le pasa la interfaz en cuestión, junto con el evento, bien in o bien out. El Listado 3 muestra el nuevo script Netplug, que ahora pasa eventos de link a hotplug haciendo uso de net_link como nombre del bus. La ventaja del método usado en este script es que ofrece al administrador la posibilidad de configurar respuestas a eventos de conexión en caliente de manera centralizada en hotplug. Para hotplug no existe diferencia entre que sea el kernel o Netplug quien dispare los eventos. Mientras Netplug se ejecute como root, Hotplug puede cargar siempre cualquier driver que falte, crear dispositivos y configurar dispositivos de red. Como /sbin/hotplug sólo busca al agente en el directorio /etc/hotplug denominado según el bus actual, no hay problema en añadir más sistemas pseudo-bus (véase la Figura 3). El Listado 4 muestra cómo funciona el nuevo agente de link de red /etc/hotplug/net_link.agent. Cuando se conecta el cable de red, el agente realiza una verificación (véase la Linea 6) para asegurarse de que el dispositivo es realmente un dispositivo de conexión en caliente. La línea 8 se asegura de que ningún otro proceso ifup está intentando configurar la interfaz de red. La línea 11 configura entonces la interfaz de red usando para ello net.ifup en Debian Sarge. Cuando se desconecta el cable de red, se ejecuta el bloque de código de las líneas 16 a 26. En primer lugar, en las líneas 19 a 21 el agente de enlace

Figura 2: Si el dispositivo de red se ha deshabilitado vía ifconfig o ifdown, el LED de link puede encenderse al conectar un cable, sin embargo el driver no trata de detectar la velocidad de red o reportar que se ha conectado un cable.

de red tiene que finalizar el proceso netplugd que monitoriza la interfaz y que disparó también el evento. El agente apaga entonces la interfaz de red en la línea 22 con la llamada a ifdown.

Problemas de Dirección Como se mencionó anteriormente, una interfaz de red deshabilitada no reporta ningún evento de link, lo que imposibilita a netplugd a reaccionar cuando se conecta un cable. Por otro lado, el dispositivo Ethernet mantiene su IP antigua hasta que se le asigne una nueva dirección. Esto hace imposible que vuelva a habilitar la interfaz simplemente con la orden ifconfig eth0 up, ya que crearía un nuevo registro para el dispositivo en la tabla de rutado.

Listado 3: Script Netplug 01 #!/bin/bash 02

11

;;

12

out)

03 Interface=”$1” 04 Action=”$2”

13

05

INTERFACE=”$Interface”

06 case “$2” in 07 08

export

in) export

14

export ACTION=”remove”

15

/sbin/hotplug net_link

16

;;

INTERFACE=”$Interface” 09

export ACTION=”add”

10

/sbin/hotplug net_link

17 esac

WWW.LINUX- MAGAZINE.ES

Para solventar este problema, el agente de enlace de red configura la interfaz en la línea 23 del Listado 4, asignando una dirección IP de 0.0.0.0 y habilitando la interfaz. Por supuesto, como 0.0.0.0 es una dirección IP no válida, esta configuración no tiene efecto en el rutado. netplugd responde a la asignación de la dirección 0.0.0.0 mostrando un mensaje de error tal que unexpected state DONWANDOUT for UP, para finalizar a continuación. Para contrarrestar esto, el agente de enlace de red apaga el servicio en las Líneas 19 a 21. Para continuar monitorizando la interfaz de red, y reconfigurar la interfaz tan pronto como el link esté disponible, el agente de enlace de red netplugd se vuelve a lanzar en la línea 24. En principio, netplugd soporta comodines como eth* al especificar la interfaz de red. Pero como Netplug muere cuando se deshabilita la interfaz de red, es importante ejecutar un demonio Netplug para cada interfaz. Por esto, necesitamos un /etc/netplug/netplugd.conf completamente vacío para que la interfaz monitorice a netplugd en la línea de comandos.

Eventos Bluetooth Los demonios como netplugd, que crean eventos en base a cambios en el estado lógico, son útiles para muchas otras tareas. Por ejemplo, podríamos usar un demonio para detectar un teléfono Bluetooth en las proximidades.

Número 24

17


PORTADA • Debian Hotplugging

Listado 5: bluenear 01 #!/bin/bash 02 export INTERFACE=”00:01:E3:45:31:73” 03 STATE=”away” 04 05 while true; do 06

hcitool cc ${INTERFACE} 2>/dev/null

07

if hcitool con|grep -q ${INTERFACE}; then

Figura 3: Tan pronto como los demonios adicionales se ejecutan como root, para hotplug no hay diferencia entre que sea el kernel o uno de los demonios quien dispare el evento. Se necesitan agentes adicionales para los nuevos pseudo-buses.

El Listado 5 muestra el demonio bluenear. Usa hcitool para intentar configurar una conexión a un teléfono móvil cada cinco minutos. Una vez que ha establecido el enlace, comprueba la calidad de éste, que puede variar de 0 a 255. Si la calidad es inferior a 128, supone que el telé-

fono ya no está en las proximidades, y en respuesta dispara un evento de conexión en caliente. Un agente de usuario puede capturar el evento y realizar alguna acción, como bloquear la pantalla, por ejemplo. Las líneas 6 y 7 verifican si el dispositivo Bluetooth está dentro del

08

Signal=”`hcitool lq ${INTERFACE}`”

09

hcitool dc ${INTERFACE}

10

echo Signal: $Signal

11 12

if [ “${Signal##*: }” -lt 128 ]; then

13

if [ “$STATE” != “away” ]; then

14

Listado 4: Agente Net Link 01 #!/bin/sh

16

remove|unregister)

02

(...)

17

(...)

03

case $ACTION in add|register)

18

04

(...)

05

debug_mesg “Invocando ifdown para $INTERFACE”

if grep -q

19

if [ -e

“^allow-hotplug[[:space:]].*${

/var/run/netplugd.${INTERFACE}

INTERFACE}” /etc/

]; then

network/interfaces; then 06

20

# este $INTERFACE se

/var/run/netplugd.${INTERFACE}

marca como clase hotplug 07

if ps -C ifup ho args | grep -q “$INTERFACE”; then

08

debug_mesg “Ya se está ifupeando este interfaz.”

09

else

10

start-stop-daemon

16

/sbin/hotplug user

17

fi

18

else

19

if [ “$STATE” != “near” ]; then

20

STATE=”near”

21

export ACTION=”register”

fi

22

22

ifdown “${INTERFACE}”

23

ifconfig ${INTERFACE}

24

fi

25

else

23

0.0.0.0 up 24

start-stop-daemon —start —background —pidfile /var/run/netplugd.${INTERFACE} \

s \ /etc/hotplug/net.ifup —

export ACTION=”unregister”

21

/var/run/hotplug.net.ifup.bogu —startas

15

`

—start —background —pidfile

11

kill `cat

STATE=”away”

25 26

—exec /sbin/netplugd — -i

fi

if [ “$STATE” != “away” ]; then

27

STATE=”away”

28

export ACTION=”unregister”

${INTERFACE} -p /var/run/netplug

“$INTERFACE”

26

/sbin/hotplug user

29

/sbin/hotplug user

12

fi

27

(...)

30

fi

13

exit 0

28

;;

31

fi sleep 5m

14

(...)

29

(...)

32

15

;;

30

esac

33 done

18

Número 24

WWW.LINUX- MAGAZINE.ES


Ibm y Sun •

Listado 6: usb.specialdev 01 if [ ! -e “/sys${DEVPATH}/idProduct” -o ! -e “/sys${DEVPATH}/idVendor” ]; then 02

exit 0

03 fi 04 05 read VendorID < /sys${DEVPATH}/idVendor 06 read ProductID < /sys${DEVPATH}/idProduct 07 read SerialNo < /sys${DEVPATH}/serial 08 09 for User in `cut -d”:” -f1,6</etc/passwd`; do 10

UserName=${User%:*}

11

UserHome=${User#*:}

12 13

for HpScript in ${UserHome}/.hotplug/${Vendor

rango, haciendo uso de un intento de conexión directa, hotplug cc, seguido de una llamada a la vista general de conexión hotplug con. Para ello la ID de Bluetooth debe conocerse previamente e introducirse en la línea 2. Aunque hcitool scan listaría cualquier dispositivo Bluetooth en las proximidades, el parámetro scan restringe la lista solamente a los dispositivos visibles. Una conexión Bluetooth directa añade la ventaja de ser capaz de determinar la potencia de la señal gracias a hcitool de la línea 8. Si disminuye por debajo del valor predefinido, podemos suponer que la distancia entre el dispositivo y el ordenador es demasiado grande, lo que provoca que se determine al usuario como ausente en las líneas 13 a 15. Pasa lo mismo en las líneas 26 a 28, en caso de ser imposible establecer una conexión. Tan pronto como el teléfono está en las proximidades, en las líneas 19 a 21 se vuelve a clasificar al usuario como presente.

ID}.${ProductID}*; do 14

if [ -e “${HpScript}” ]; then

15

# Ist im User-Hotplug-Script eine Seriennummer angegeben?

16 UserSerial=${HpScript##*/} 17 UserSerial=${UserSerial/${Ven dorID}.${ProductID}} 18 UserSerial=${UserSerial#:} 19

if [ -n “${UserSerial}” -a “${UserSerial}” != “${SerialNo}” ]; then

20

break

21

fi

22

if [ -x $HpScript ]; then

23

su “$UserName” -c “$HpScript add” &

24

fi

25

fi

26

done

27 done

Delegar Hotplug Muchos dispositivos USB son de un único propósito: cuando un usuario conecta un escáner, podemos suponer con cierta seguridad que quiere escanear algo. Si conecta una cámara digital, lo más probable es que quiera transferir imágenes de la cámara al ordenador. Esta causalidad hace posible automatizar ciertos procesos. Por ejemplo, si estamos interesados en automatizar el proceso de transferir información entre los ordenadores de nuestra casa y del trabajo, podemos ahorrarnos tener que teclear automatizando la transferencia. El problema en cuestión es hacer que los eventos de conexión en caliente sean accesibles al usuario. Para permitirlo necesitamos ampliar el agente de conexión en caliente USB, y el usuario tendrá que escribir un script de conexión en caliente para cada dispositivo que pretenda soportar. El Listado 6 muestra esta extensión, que debe guardarse en /etc/hotplug/usb.specialdev por los usuarios de root. Para asegurarnos de que el agente USB cumple el

WWW.LINUX- MAGAZINE.ES


PORTADA • Debian Hotplugging

cometido, el usuario de root debe añadir también una línea usb.specialdev a usb.agent en el mismo directorio. Ésta debe ser la última instrucción del bloque add al final a la derecha del archivo para asegurarnos de que el agente procesará el script de conexión en caliente definido por el usuario tras la carga e inicialización de los drivers. Las líneas 1 a 3 aseguran que las entidades registradas por hotplug son realmente dispositivos, y no meras funcionalidades del dispositivo. Es sencillo distinguirlas: sólo los dispositivos USB tienen IDs de fabricante y producto. Las líneas 5 a 7 leen esta información y los números de serie. El bucle que comienza en la línea procesa /etc/passwd línea a línea, ubicando el directorio de usuario de cada usuario. Si el script encuentra un script de conexión en caliente de usuario en el directorio .hotplug en un directorio de usuario, y si el nombre del directorio coincide con las ID’s del dispositivo que se acaba de conectar (línea 13), entonces la línea 18 verifica si el nombre del archivo contiene un número de serie y si ese número coincide con el número de serie del dispositivo. Si el script de usuario no se restringe a un número de serie específico, o si los números coinciden, hotplug llama al script de conexión en caliente en la línea 22 con los privilegios del usuario actual. Es importante para su que se usen las variables de entorno de hotplug, esto es, no proporcionar un shell de login, ya que las variables de entorno que se pasan al kernel se perderían. Además de esto, el script tiene que ejecutarse en background para eliminar el riesgo de bloqueo por parte de hotplug.

Scripts de Usuario para Conexión en Caliente El Listado 7 muestra un script de usuario para la conexión en caliente de un pendrive USB. La línea 4 verifica si es realmente un dispositivo de almacenamiento USB, y si es así, determina el nombre de dispositivo. El script confía en una serie de fun-

20

Número 24

cionalidades especiales para poder llevar a cabo las tareas encomendadas: hotplug usa la variable DEVPATH para devolver la ruta hasta los pseudo-archivos del nuevo dispositivo, aunque tenemos que añadir aquí un prefijo /sys. Si el dispositivo es un dispositivo de almacenamiento USB, existirán unos cuantos subdirectorios bajo esta ruta. Los subdirectorios se nombran con la posición del puerto y el número de host. Si el directorio en la base del árbol tiene un enlace simbólico relativo para block, el dispositivo es un dispositivo de bloque. readlink -f convierte este enlace simbólico a un nombre de ruta absoluto, por ejemplo /sys/block/sda. Y la línea 9 toma el nombre de dispositivo de esta ruta. A propósito, hay más entradas en /sys/block/sda: por ejemplo sda1, que representa la partición en un dispositivo USB.

Listado 7: Script User Hotplug 01 #!/bin/bash 02 case $1 in 03 add) 04

BlockDev=`readlink -f /sys${DEVPATH}/*:*/host*/[0-9 ]*/block 2>/dev/null`

05

if [ -z “${BlockDev}” ]; then

06 07

exit 1 fi

08 09

DevName=${BlockDev##*/}

10

echo $DevName

11

;;

12 remove) 13

;;

14 esac

RECURSOS [1] netplugd: http://www.red-bean.com/ ~bos/ [2] Scripts: http://www.linux-magazine. es/Magazine/Downloads/24/hotplug

WWW.LINUX- MAGAZINE.ES

El usuario puede añadir sus propios comandos empezando en la línea 10, y hotplug ejecuta automáticamente estos comandos con los privilegios del usuario actual cada vez que se conecta el dispositivo USB. Las opciones más obvias serían montar la partición y realizar una llamada a rsync u otra herramienta para sincronizar la información. En el caso de un escáner USB, el usuario normalmente querrá ejecutar xsane. Para una cámara, querrá transferir las imágenes de la cámara al PC y ordenar los archivos por la fecha. También tiene que guardar los scripts en el subdirectorio .hotplug bajo su directorio de usuario y asegurarse de que tienen permisos de ejecución. El nombre de archivo sigue un patrón tal que IDFabricante.IDProducto:Numerodeserie, donde las ID’s de fabricante y producto contienen cuatro dígitos y usan caracteres hexadecimales. Por ejemplo: 0d7d.1600:075218833456. Los dos puntos y el número de serie pueden sacarse del nombre si el script lanza todos los dispositivos con las ID’s de fabricante y producto en cuestión.

Conclusión El sistema de conexión en caliente es útil tal y como viene por defecto, pero es posible hacer mucho más con él si comprendemos cómo funciona. Podemos adaptar fácilmente los scripts descritos en este artículo para otros propósitos. La transferencia automática de datos, por ejemplo, puede funcionar con otros dispositivos como pueden ser los USB. Una combinación de los listados 6 y 7 con la rutina de detección del dispositivo Bluetooth del listado 5 podrían permitirnos actualizar de manera automática los archivos MP3 de un teléfono móvil que esté dentro del rango. Podríamos usar esta técnica para sincronizar la información del calendario o la agenda de contactos. No sería necesario conectar el teléfono al ordenador o lanzar la herramienta de sincronización. De hecho, el proceso funcionaría incluso sin que el ■ usuario tenga que loguearse.


Ibm y Sun Ivman • EVALUACIÓN Xen 3 • PORTADA

Hotplug con Ivman

CONEXIONES PERSONALIZADAS Un mejor conocimiento del sistema de hotplug de Linux nos abrirá las puertas de la innovación y automatización. Vamos a ver una solución personalizada para el backup en ordenadores portátiles. POR JENS-CHRISTOPH BRENDEL

E

l hotplug (conexión en caliente de dispositivos) suele considerarse una característica más bien desconocida y no especialmente receptiva a las peculiaridades del usuario. Sin embargo, construir nuestra propia solución personalizada, utilizando los componentes del sistema de hotplug de Linux, puede ser más fácil de lo que creemos. En este artículo echaremos un vistazo a cómo usar Ivman, un handler genérico para eventos de la capa de abstracción de hardware (en inglés, HAL) , para crear una respuesta propia a las conexiones en caliente. La

Figura 1: El comando lshal muestra todos los dispositivos y propiedades registradas en el Hardware Abstraction layer (HAL).

WWW.LINUX- MAGAZINE.ES

Número 24

21


PORTADA • Ivman

Listado 1: IvmConfigActions.xml (Fragmento) 01 <!— Montaje del disco de

03 <ivm:Option name=”exec” value=”echo ‘Attaching backup

backup —>

disk: ‘`date` &gt;&gt;

02 <ivm:Match name=”hal.volume.uuid”

/var/log/backup.log” /> 04 <ivm:Option name=”exec”

value=”e86236bb-d107-41cd-b8b1

value=”mount

-9caf23a5ad91”>

$hal.block.device$

aquí descrita se dirige a un problema común para usuarios de portátiles. Aunque todos los ordenadores necesitan un backup cada cierto tiempo, un sistema de backup cíclico basado en cron no es demasiado efectivo para un portátil: la batería puede agotarse cuando el backup está a punto de empezar, o podríamos estar a cientos de kilómetros de nuestro servidor, grabadora o disco backup. Un método mejor podría ser configurar nuestra máquina para controlar la conexión de un dispositivo USB y detectar, de forma autónoma, el disco con la partición de backup. Tan pronto como la partición esté disponible, el ordenador la monta en un lugar específico del sistema de archivos. Una tarea de backup asincrónica se lanza a intervalos regulares y comprueba el punto de montaje del backup antes de hacer nada más. Si el disco no se encuentra, la

tarea simplemente entra en suspensión, sin darnos dolores de cabeza.

Transmisión de Noticias Cuando un disco se conecta, el controlador recibe una señal y responde activando un interruptor. Si nuestra distribución de Linux utiliza HAL, recibirá el interruptor y lo convertirá en un evento anunciado en el D-Bus (Bus de Mensaje del Sistema). Los programas del área de usuario escuchan el bus, filtran los mensajes dirigidos a ellos y desencadenan eventos, como montar un disco. El entorno Linux incluye numerosas herramientas que evalúan la información como respuesta a un evento de hotplug. En el escritorio de Gnome, el Gestor de Volúmenes Gnome (Gnome Volume Manager) desempeña esa función, mientras que KDE utiliza Kioslaves para el mismo trabajo. Además de estas dos

Listado 2: Tarea Cron para imagen backup 01 #!/bin/sh

horaria a `date`” >>

02 if [ `grep backupdisk

/var/log/backup.log

/etc/mtab | wc -l` -gt 0 ] 03

# estupendo, disco backup

13

encontrado 04

then

05

if [ -f

2>&1 1>> /var/log/backup.log 14

/var/run/rsnapshot.pid ] 06

08 09

completada a `date`” >> /var/log/backup.log

then exit 1

15

# vamos a a crear la

16 else 17

# el disco de backup no está

echo -e “\n montado -> exit

============================== ==================== 11

>> /var/log/backup.log

12

echo “Arrancando imagen

22

fi

else imagen

10

echo “Imagen horaria

# rsnapshot ya funciona -> exit

07

/usr/bin/rsnapshot hourly

Número 24

18

exit 1

19 fi

WWW.LINUX- MAGAZINE.ES

/media/backupdisk” /> 05 <ivm:Option name=”execun” value=”echo ‘Backup-Disk detached: ‘ `date` &gt;&gt; /var/log/backup.log” /> 06 </ivm:Match>

soluciones específicas, hay otros métodos independientes, como Submount e Ivman. A diferencia de Submount, Ivman funciona en el área de usuario, y puede ser utilizado en paralelo a KDE o Gnome; es un gestor de volúmenes y automontador que nos permite arrancar comandos arbitrarios en respuesta a un evento de hardware. Si la distro que utilizamos no incluye Ivman, siempre podemos bajarla del website del proyecto.

Siguiendo estrictamente las reglas Ivman emplea un conjunto de reglas que asocia condiciones con acciones, investiga cada evento de HAL y establece dónde se cumple una condición. Cuando esto ocurre, activa una acción, que puede ser cualquier cosa: desde un simple comando a un complejo script. En las condiciones, el ruleset puede usar cualquier información conocida por la capa de abstracción de hardware. El comando Ishal nos da detalles (Figura 1). Además, está principalmente definido en dos archivos de configuración: IvmConfigActions.xml define acciones a realizar cuando se conecta un nuevo dispositivo o se inserta un medio en una unidad. IvmConfigProperties.xml contiene las reglas en cuyas condiciones están basadas las propiedades de los dispositivos. También tenemos el archivo de configuración llamado IvmConfigBase.xml, con las opciones por defecto generales. Por ejemplo, podemos usar el archivo para especificar qué usuario y grupo de Ids permitirá Ivman. Para terminar, las versiones más recientes tienen un archivo llamado IvmConfigConditions.xml,que define condiciones que el programa debe cumplir para realizar una acción específica.

Y… ¡Acción! En nuestro ejemplo de backup, queremos que el sistema responda


Ivman • PORTADA

Listado 3: Fragmento del archivo de registro 01 Attaching backup disk: Thu Jun 22 11:00:52 CEST 2006 02 Backup disk /dev/sda2 mounted in /media/backupdisk: 03 Thu Jun 22 11:03:57 CEST 2006

tions.xml es el sitio adecuado para empezar. La parte condicional de cualquier regla puede usar la llave ivm:Match para especificar una propiedad de la HAL y suministrar un valor que active una acción. El siguiente comando asignará un punto de montaje a un lápiz USB basado en el nombre del modelo:

04 05 ============================= ===================== 06 07 Arrancando imagen horaria a vie dic 29 10:46:27 CET 2006 08 echo 25958 > /var/run/rsnapshot.pid 09 ... 10 mkdir -m 0755 -p /media/backupdisk/hourly.0/ 11 /usr/bin/rsync -ax —delete —numeric-ids —relative—delete-excluded \ 12 —exclude=media/backupdisk \ 13 —link-dest=/media/backupdisk/ hourly.1/localhost/ / \ 14 /media/backupdisk/hourly.0/lo calhost/ 15 ... 16 rm -f /var/run/rsnapshot.pid 17 Imagen horaria completada a vie dic 29 11:07:19 CET 2006 18 ...

cuando se conecte un disco duro específico; así que IvmConfigAc-

<!— Montando un lápizUSB —> <ivm:Match U name=”hal.storage.model” U value=”TS64MJFLASHA”> <ivm:Option name=”exec” U value=U “mount $hal.block.device$ U /media/usbstick” /> </ivm:Match>

El signo del dólar indica que el comando de montaje preferirá utilizar la propiedad block.device de la HAL antes que el nombre. Sin embargo, una partición de backup necesitará una propiedad más específica. Podemos utilizar el volumen único de ID para detectar la partición. Además, queremos registrar los eventos de conexión y desconexión junto al informe de progreso del backup. Para esto ni siquiera necesitaremos un script: bastarán unas pocas líneas en el archivo de configuración de acciones (véase Listado 1). Por supuesto, podríamos lanzar el backup al mismo tiempo, pero sería un evento único. En nuestro caso, queremos que la máquina tome capturas regulares del sistema de archivos siempre que el disco de backup esté conectado. Para que esto pueda ocurrir, haremos que Cron arranque

el script del Listado 2 periódicamente, para comprobar si hay un disco en el punto de montaje del backup. Si así fuera, tiene que tratarse del disco correcto, según las capturas, para que se active. La salida es enviada al mismo archivo de registro donde se guarda el status del montaje del disco (Listado 3). Recomendamos tomar las capturas con la probada y conocida herramienta rsnapshot, que ahorra espacio copiando sólo los archivos modificados. Podemos, además, especificar un máximo de capturas y sobreescribir las más antiguas cuando ese número se alcance. Así prevenimos que el disco se sature y aún así tenemos una serie de registros de distintas fechas. Para recuperar bastará con copiar de vuelta los archivos.

Conclusiones Este método nos ofrece un backup regular que funciona automáticamente (exceptuando conectar el disco); es flexibe, así que refleja las necesidades de la computación portátil. Podemos realizar casi cualquier acción con dispositivos arbitrarios siguiendo este mismo procedimiento; por ejemplo, lanzar una herramienta de gestión de pistas cuando enchufamos un lector de MP3, o un visor de imágenes ■ cuando enchufemos la cámara.

RECURSOS [1] HAL: http://www.freedesktop.org/

wiki/Software_2fhal [2] Ivman: http://ivman.sourceforge.net/


PORTADA • Udev

Gestión dinámica de dispositivos con Udev

GESTOR DE DISPOSITIVOS Después de tres años de espectativas, por fin Udev ha desbancado al sistema Dev-FS. En este artículo vamos a echarle un vistazo al gestor de dispositivos Udev del sistema Linux. POR RENE REBE, OLIVER FROMMEL Y JENS-CHRISTOPH BRENDEL Linux heredó la máxima clásica de UNIX que dice “Todo es un fichero”. Esta abstracción ha permitido a los programas utilizar los nodos de dispositivos (ficheros de dispositivos) para acceder al hardware del ordenador como si se estuviese accediendo a un fichero ordinario. Estos ficheros especiales de dispositivos, que se abren, leen, escriben o se cierran utilizando las mismas llamadas al sistema

que se utilizan para acceder a los ficheros de texto, se distinguen por sus nombres, tipos (dispositivos de bloque o de carácter), y por sus números mayor y menor.

Estático Los ficheros de dispositivos se crean con el comando mknod durante la fase de instalación, suponiendo que se está

realizando una instalación normal. De este modo se crea una entrada permanente para cada dispositivo en el directorio /dev, que el administrador puede conectar al sistema en cualquier momento, lo que significa que se tendrán cientos de ellas. Este gran lío de entradas, la mayoría de las cuales no tienen ningún uso para el sistema porque hacen referencia a dis-

Hotplug en Detalle Para permitir que funcione la gestión dinámica de dispositivos, el kernel de Linux tiene que estar compilado con la opción CONFIG_HOTPLUG; las distribuciones estándar la tienen activada por defecto. Cuando un controlador de dispositivos añade o elimina lo que se denomina un Kobject del sistema, el kernel envía un mensaje notificando el cambio al servicio Udev o bien ejecuta el programa que se encuentre en

24

Número 24

/proc/sys/kernel/hotplug invocando a la función kset_hotplug (el código fuente se encuentra en lib/kobject.c). Este programa solía estar en /sbin/hotplug y luego se cambió a /sbin/udevsend, antes de ser eliminado en las versiones recientes. La clase del subsistema se pasa como un argumento. Las variables de entorno proporcionan más

WWW.LINUX- MAGAZINE.ES

detalles. Por ejemplo, ACTION soporta los valores add y remove. La variable SEQNUM se incrementa en cada llamada. DEVPATH especifica dónde se localiza la información del dispositivo en el Sys-FS, como en /devices/pci0001:01/0001:01:19.0/usb2/2-1/2-1:1.0. Y hay otros parámetros, como MAJOR, MINOR y UDEV_EVENT. Dependiendo del tipo de objeto, puede ser que se hayan exportado más variables: el fabricante y la identificación del producto para el hard-


Udev • PORTADA

ficheros de dispositivos en el espacio del usuario. Cuando se conecta o se desconecta un dispositivo, el controlador del bus (ISA, USB o PCI) señala el evento con una interrupción. En respuesta a esta interrupción, el kernel averigua los detalles Figura 1: Acciones de Udev durante la conexión en caliente, registrado por udevmonitor. del dispositivo que se acaba de conectar positivos que no existen, dificultan que bien utilizando un protocolo específico se realice un seguimiento de la para interrogar al controlador hardware, configuración. Por ejemplo, la estrucbien buscando en una dirección especítura de directorios y ficheros no indican fica (como en el área de configuración de qué dispositivos existen o cuales han una tarjeta PCI) la información que haya sido identificados de forma correcta por almacenada, el fabricante y el identificalos controladores. Además, con este dor del producto. Entonces el kernel conenfoque tradicional, el orden en el que tinúa creando un KObject para cada dislos usuarios conectan los dispositivos positivo nuevo; datos como el tipo de determina el fichero de dispositivo que dispositivo (carácter o bloque) y sus el kernel le asignará. El primer disco números mayor y menor son pasados y SCSI que se detecte se corresponderá almacenados en el KObject por medio con el fichero /dev/sda, por ejemplo; al del componente global de espacio de siguiente le corresponderá /dev/sdb y nombres del kernel, presentado en la así sucesivamente. Con este sistema, versión 2.6. un mismo elemento hardware puede A continuación el kernel hace que esta ser referenciado por distintos ficheros información se encuentre disponible a de dispositivos en momentos difetravés de Sys-FS, que reemplaza al sisrentes, y como resultado el ordenador tema de ficheros proc. Sys-FS se monta los montará en directorios distintos. normalmente en /sys. Un sistema que se encarga de crear y Para las versiones más antiguas de borrar ficheros de dispositivo al vuelo Udev, el kernel informa a los programas cuando un usuario conecta o desconecta un elemento hardware es bastante útil. Hardware En este caso, la correspondencia nombre-dispositivo no está basada en el El elemento RUN+ de esta regla estipula orden en el que el dispositivo ha sido que debería ser ejecutada cada vez que detectado, sino en un sistema de reglas se ejecute otra regla. La comunicación predefinidas. Con esto se garantiza que es llevada a cabo por medio de un socun disco duro específico siempre se ket, como se ha descrito previamente. encuentre disponible con el mismo nombre de fichero, y por ello, siempre se Dicho Gestor de Red de Gnome [3] es un montará en la misma posición del sisbuen ejemplo para ver la forma en la tema de ficheros, sin importar qué otros que estos componentes interactúan. El dispositivos compartan el bus. Gestor de Red de Gnome utiliza el serviDurante un tiempo, los sistemas Devcio HAL para monitorizar el subsistema FS y Udev han competido por el rol de de red; HAL notifica al gestor de red por ser el mejor gestor de dispositivos intelimedio del D-Bus cuando se produce gente, pero ahora hay un claro vencedor, algún cambio, por ejemplo cuando se Udev. Dev-FS ha sido eliminado recienteconecte o desconecte un dispositivo mente del kernel, quedando Udev como USB de red inalámbrico. Además de los campeón [1]. Udev se basa en el mecadispositivos físicos, HAL puede también nismo hotplug del kernel (véase el cuagestionar sistemas de ficheros y averidro Hotplug en Detalle) para crear los

WWW.LINUX- MAGAZINE.ES

del usuario del nuevo status del dispositivo llamando al programa que reside en /proc/sys/kernel/hotplug, normalmente /sbin/hotplug. Este programa carga y configura cualquier controlador que sea necesario; los identificadores a los que nos hemos referido anteriormente le indican al programa qué controladores son los que tiene que cargar. La versión moderna de Udev se comunica directamente con el kernel y efectúa llamadas a programas externos para realizar las mismas acciones de forma directa. Udev utiliza esta técnica tanto cuando el dispositivo es conectado a un sistema que esté en funcionamiento (hotplugging o conexión en caliente) como en la inicialización durante la fase de arranque (coldplugging o conexión en frío). El kernel busca los buses para los dispositivos y crea ficheros uevent basándose en los resultados. Los resultados se almacenan en el sistema virtual Sys-FS ya que no posee un sistema de ficheros de escritura en estos primeros momentos del arranque. Posteriormente, Udev genera eventos para los dispositivos encontrados en el arranque, basándose en los resultados, tal como si estos dispositivos se hubieran conectado en caliente. La Figura 1 muestra el proceso de conexión en caliente de un receptor DVB USB registrado por la herramienta de diagnóstico udevmonitor.

Abstracto guar el tipo de sistema de ficheros, incluso para las particiones LUKS [4] encriptadas. Hoy en día, HAL es el encargado de manejar la gestión del hardware en Gnome, especialmente para los dispositivos hotplug. Para ello, se ejecuta en segundo plano el proceso gnome-volume-manager. (Los usuarios de Gnome pueden ejecutar la interfaz gnome-volume-properties para configurar el gestor). Hay incluso una interfaz para el propio HAL; esta interfaz muestra una vista en forma de árbol con todos los componentes conectados (Figura 2). Para Fedora, el hal-device-manager se encuentra en el paquete hal-gnome.

Número 24

25


PORTADA • Udev

Tabla 1: Variantes de Udev Version/ Distribución

Fedora Core 5

SLES 9

SLES 10

Suse 10.0

Versión Udev

udev-084-15

udev-021-36.49

udev-085-30.5

udev-068git20050831-9

Versión HAL

hal-0.5.7-3

-

hal-0.5.6-33

hal-0.5.4-6

Script Hotplug

ninguno

/sbin/hotplug

ninguno

ninguno

Gestor de Volumenes Gnome

1.5.15-1

-

1.5.15-26.1

-

KDE Kioslave Media

si

-

si

si

Ivman

-

-

ivman-0.6.9-16.3

-

Hasta la versión 0.58 de Udev, el paquete hotplug carga el controlador y el firmware. Este enfoque, que es aplicable a distribuciones como Suse 9.x, Fedora Core 4, Ubuntu Brezzy Badger y Debian Sarge, mantiene al gestor hotplug /sbin/hotplug, que actúa de multiplexor invocando a todos los programas que hayan sido registrados en /etc/hotplug.d. Esto funcionaría bien suponiendo una instalación estándar de los paquets hotplug y Udev. A partir de la versión 0.59, Udev maneja ambas tareas. Este sistema es el utilizado por Fedora Core 5, Suse 10 y Ubuntu Dapper Drake (véase la Tabla 1).

Una Cuestión de Preferencias Los ficheros de configuración de Udev se encuentran en /etc/udev o bien en /lib/udev, como ocurre en algunas distribuciones. Las variables más importantes se almacenan en /etc/udev.conf, por ejemplo, el directorio raíz de los ficheros de dispositivos, la ruta a la base de datos interna de Udev y el directorio con las reglas para crear y nombrar a los ficheros de dispositivos: udev_root=”/dev/” udev_db=”/dev/.udevdb”

udev_rules=”/etc/udev/rules.d” udev_log=”err”

Udev proporciona dos puntos de configuración: /etc/udev/rules.d, que contiene los ficheros que gobiernan el nombrado de los nodos de los dispositivos y /etc/udev/makedev.d, que contiene los scripts con los nombres de los ficheros de dispositivos estáticos, necesarios para dispositivos tales como el puerto paralelo. Los permisos ya no residen en /etc/udev/permissions.d

Listado 2: 95userpolicy 01 <?xml version=”1.0” encoding=”ISO-8859-1”?> <!— -

Listado 1: Fichero FDI para una cámara digital 01 <deviceinfo version=”0.2”>

*- SGML -*- —> 02 <!— Este fichero .fdi impide que se automonte para cada

02 <device>

medio (dispositivos de 03 <match key=”info.bus” string=”usb”>

almacenamiento)

04 <match key=”usb.interface.class” int=”0x06”> 05 <match key=”usb.interface.subclass” int=”0x01”>

03 p.e. disquetera, CD/DVD, memoria USB, disco USB, disco duro externo. —>

06 <match key=”usb.interface.protocol” int=”0x01”>

04 <deviceinfo version=”0.2”>

07 <merge key=”info.category” type=”string”>camera</merge>

05 <device>

08 <append key=”info.capabilities” type=”strlist”>camera</append>

06 <match

09 <merge key=”camera.access_method” type=”string”>ptp</merge>

key=”storage.policy.should_mo unt” bool=”true”>

10 </match>

07 <merge

11 </match>

key=”storage.policy.should_mo unt”

12 </match>

type=”bool”>false</merge>

13 </match>

08 </match>

14 </device>

09 </device>

15 </deviceinfo>

10 </deviceinfo>

26

Número 24

WWW.LINUX- MAGAZINE.ES


Udev • PORTADA

para las versiones actuales de Udev sino que forman parte de la configuración normal de Udev.

Sintaxis de Reglas La primera parte de todas las reglas Udev especifica la condición que debe ser cumplida para que el gestor ejecute o aplique la segunda parte. En un caso sencillo, esta condición puede referirse al nombre interno que tiene el kernel del dispositivo. Por ejemplo, la condición para un teclado es KERNEL==”kbd”. Las condiciones se indican con dos signos de igualdad, como en los lenguajes de programación. Se pueden añadir más condiciones separadas por comas. Las acciones vienen dadas por un único signo de igualdad. Por ejemplo, MODE=”0660” establece los permisos. De forma similar, OWNER establecerá el propietario y GROUP el grupo. La palabra reservada NAME especifica el nombre del dispositivo y también se admiten comodines. Por ejemplo, %k representa el nombre del kernel que se comentó anteriormente. Una regla que siga este patrón podría ser de la siguiente forma: KERNEL==”isdn*”, NAME=”%k”, MODE=”0660”. Udev normalmente procesará cada regla que coincida hasta que las recorra todas. Para cancelar el procesamiento de reglas cuando encuentre una coincidente, hay que especificar last_rule como OPTIONS.

Scripts de Entrenamiento Las reglas de Udev pueden realizar llamadas a programas externos, que siempre se evalúan como condiciones. Udev no realizará la acción a menos que la llamada siga al resultado requerido. La página de ayuda contiene un ejemplo para los CD-ROMs IDE que comprueba si existe un directorio /proc para identificar el dispositivo como un CD-ROM: KERNEL==”hd[a-z]”, U PROGRAM= U “/bin/cat /proc/ide/%k/media”, U RESULT=”cdrom”, NAME=”%k”, U SYMLINK=”cdrom%e”

Figura 2: El gestor de dispositivos HAL muestra los componentes hardware en una vista en forma de árbol. La información adicional de cada dispositivo aparece muy bien detallada.

Udev llama a /bin/cat para mostrar el contenido del fichero media de todos los dispositivos cuyos nombres comiencen con hd. Si el nombre contiene cdrom (RESULT), mantendrá el fichero de dispositivos (NAME=”%k”), pero adicionalmente utilizará SYMLINK para crear un enlace simbólico a cdrom. El %e especifica el siguiente decimal libre, en el caso de que exista un fichero con el mismo nombre. Esto conduce a la generación de enlaces simbólicos como los siguientes: /dev/cdrom -> hdc /dev/cdrom1 -> sr0

Con números de serie de dispositivos únicos se permite que el sistema genere nombres estables para los dispositivos hotplug, sin importar a qué puerto estén conectados ni el orden en el que hayan sido conectados.

Propiedad del Propietario La aplicación más común para personalizar las reglas de Udev consiste en cambiar los nombres de los dispositivos de forma individual o bien establecer permisos especiales de ficheros. Imaginemos que se desea dar al usuario acceso de escritura a los discos duros

WWW.LINUX- MAGAZINE.ES

USB: Fedora resuelve este problema permitiendo que Udev asigne como propietario de los ficheros al usuario conectado al escritorio. El servicio Udev puede facilitar la resolución de problemas gracias a su nivel de registro configurable; el valor por defecto de err solamente muestra los errores, info hace que Udevd muestre más información y con debug se generará bastante más información. Estos valores se pueden introducir en el fichero de configuración o se puede usar una utilidad para establecerlos en tiempo de ejecución: udevcontrol log_priority=debug. El comando de control reload_rules indica al servicio Udev que procese de nuevo las reglas modificadas.

Conclusiones Udev es un sistema complejo que comprende varias capas: un servicio, scripts hotplug y herramientas para manejar los eventos. El sistema Udev soporta la gestión dinámica de dispositivos en los sistemas Linux modernos para reflejar la demanda del hardware actual. Toma las diversas dependencias en consideración, como las dependencias que existen entre las particiones y los discos duros y gestiona los dispositivos hotplug actuales.

Número 24

27


PORTADA • Udev

Aunque la mayoría de las distribuciones utilizan actualmente Udev, el paquete está aún en desarrollo. Esto implica que los programadores pueden añadir funcionalidades nuevas o bien pueden descartar algunas de las actuales (incluyendo el propio binario udev). En algunos casos, las diferencias entre las versiones de una misma distribución son grandes, por lo que la mayoría de la documentación de Internet está obsoleta.

S i s e u t i l i z a l a ve rs i ó n d e U d ev p ro p o rc i o n a d a p o r l a d i s t r i b u c i ó n , n o s e e n c o n t ra r á n i n g u n a d i f i c u l t a d . Pe ro s i u n o m i s m o intenta modificar la c o n f i g u ra c i ó n , n o h a b r á m á s a l t e r n a t i va q u e l e e r l o s s c r i p t s p ro p o rc i o n a d o s c o n e l p a q u e t e. Pueden encontrarse algunas notas sobre cómo programar reglas de Udev en [2], aunque estas páginas ■ no son muy precisas.

RECURSOS [1] Sitio web de Udev: http://www.kernel.

org/pub/linux/utils/kernel/hotplug/ udev.html [2] Escribiendo Reglas para Udev : http://

reactivated.net/writing_udev_rules. html [3] Gestor de Red de Gnome: http://www.

D-Bus D-Bus es un sistema de comunicación que permite a las aplicaciones de escritorio interactuar entre ellas mismas y con las capas subyacentes del kernel y las capas del hardware. El sistema DBus es un servicio IPC (Interprocess Communication o Comunicación Interprocesos) y proporciona la infraestructura que ayuda a las aplicaciones a comunicarse entre ellas y con partes del sistema operativo. Aunque hay mecanismos UNIX de IPC, están restringidos para las señales, los cauces y elementos de este tipo. El modelo D-Bus puede sonar familiar, ya que las soluciones de la competencia han estado presente desde hace algún tiempo: Corba, DCOM de Microsoft y cientos de otros proyectos, por ejemplo. Tanto KDE como Gnome experimentaron originalmente con sus propias implementaciones de Corba. KDE presentó el sistema DCOP hace ya algún tiempo, mientras que Gnome aún posee elementos Corba en su sistema de componentes Bonobo.

comunicación entre dos aplicaciones. Los desarrolladores de aplicaciones normalmente no recurren a la librería, prefiriendo la API basada en Glib Libdbus-Glib, que proporciona una API de C orientada a objetos. A este nivel, las capacidades de D-Bus se aproximan a un sistema de bus, como sugiere su nombre. El proceso del servidor, dbus-daemon, se ejecuta en segundo plano y queda a la espera de solicitudes de conexión por parte de las aplicaciones que se registran para tipos de eventos específicos, conexión y desconexión de hardware, por ejemplo. Cuando sucede un evento, el servicio D-Bus envía un mensaje a través del bus y la aplicación en cuestión responde consecuentemente. Sistema Global o Por Sesión Básicamente, los sistemas que utilizan D-Bus poseen dos buses imple-

mentados por un único proceso servidor: el bus del sistema y el bus de sesión. El bus del sistema se ejecuta en tiempo de arranque y permanece activo incluso si no hay ningún usuario conectado al sistema. Se habilita un proceso servidor para el bus de la sesión después de completar el proceso de conexión por medio de la GUI gráfica de una sesión de escritorio. Desde la línea de comandos se le pueden proporcionar al servidor dbus los parámetros —system y —session para estos dos modos. Para ejecutar el servicio el paquete DBus incluye la herramienta dbus-launch, que se encarga de establecer las variables de entorno necesarias, entre otras cosas. La mayoría de las distribuciones ejecutan el servicio D-Bus en modo sesión cuando se ejecuta una sesión X.

No importa cual sea su postura personal sobre Corba, la mayoría de los desarrolladores que simplemente quieren programar una aplicación de escritorio quedan abrumados con Corba. Incluso el applet más sencillo de Gnome requiere amplios conocimientos de la compleja arquitectura de componentes, razón por lo que Bonobo ha estado tanto tiempo entre la espada y la pared. La idea era que D-Bus fuera más simple y que no ocupara mucha memoria. La librería subyacente Libdbus sólo proporciona funciones que soportan la

28

Número 24

Figura 3: Las interacciones de los componentes siguen este esquema.

WWW.LINUX- MAGAZINE.ES


Opera 9 • PRÁCTICO

Exploramos Opera 9

UNA NOCHE EN LA OPERA Estable, rápido y completo: Opera 9 nos ofrece todo cuanto podamos necesitar para navegar por Internet en un compacto paquete. POR MIRKO ALBRECH

H

an pasado doce años desde que la compañía noruega Opera Software ASA lanzó su primer navegador Web, y en cada nueva versión ha presentado nuevas funcionalidades revolucionarias. Opera nació como un competidor de tan sólo 1.3 MB frente a los grandes de aquella época, como Internet Explorer y Netscape Navigator. Aunque siempre ha venido ofreciendo funcionalidades únicas. De hecho, los navegadores de otras compañías aún carecen de estas funcionalidades especiales, tales como las miniaturas rápidas de pestañas o el excelente scroll con las flechas de teclado. A pesar de que Opera es un software de código cerrado, el navegador se ejecuta en diferentes sistemas operativos, y Linux también disfruta de una versión desde hace muchos años.

Primero lo Primero Descargar e instalar Opera 9 es realmente sencillo. Si los repositorios de nuestra distribución favorita no incluyen

el programa, podemos descargarlo desde la página Web de Opera [1]. La página tiene paquetes para todas las distribuciones principales, pudiéndose usar el administrador de paquetes de nuestra distribución para instalarlo. Si nuestra distro no está en la lista, tenemos disponible un paquete RPM con estáticos, que debería funcionar. La primera vez que ejecutamos Opera se abre una ventana con las condiciones de uso y se solicita confirmación (lo cual es una visión no muy usual para los usuarios habituados al Software Libre). Cuando arranca el navegador, veremos que Opera nos proporciona cajas de búsqueda para megapáginas como Google, Amazon y Ebay. Una cosa buena que hemos apreciado es que se ha mejorado la integración con KDE. El navegador usa el sistema de colores por defecto e incluso menús transparentes si así los hemos seleccionado en el Control Center de KDE. El trato con el menú de tipos de letra es un poco complicado, aunque los menús son

WWW.LINUX-MAGAZINE.ES

legibles, al contrario que en Opera 8. Podemos seleccionar (Tools | Preferences | Advanced | Fonts) para configurar los tipos de letra para que coincidan con los de KDE si fuera necesario.

Personalización Si seleccionamos Tools | Preferences | Search se abre un cuadro de diálogo donde podemos configurar algunas preferencias de navegación. Por ejemplo, los lectores del Reino Unido pueden preferir abrir http://www.google.co.uk en lugar de http://www.google.com al presionar g. Como alternativa, podemos navegar hasta una página y presionar entonces el botón derecho para desplegar un menú desde donde podemos establecer un atajo. Si creamos la entrada wp para Wikipedia.com, por ejemplo, podemos teclear luego wp clavebusqueda en la caja de direcciones para que Opera nos lleve a la página correspondiente de la Wikipedia. Es complicado imaginar una manera más rápida y sencilla de obtener resultados de búsqueda.

Número 24

29


PRÁCTICO • Opera 9

Figura 1: Opera 9 ofrece diversas opciones de impresión.

Nuevas Funcionalidades Opera inserta un pequeño icono en la barra de sistema de KDE. Puede pulsarse el icono para esconder Opera manteniendo las principales funcionalidades del programa desde un menú desplegable. Si lo cerramos de la manera tradicional, la función de arranque rápido desaparece igualmente. Además de este sencillo método para crear un nuevo campo de búsqueda rápida, Opera Software ha vuelto a introducir todo un conjunto de novedosas funcionalidades en la versión 9. (Véase el cuadro titulado “Nuevas Funcionalidades en Opera 9”). La integración de BitTorrent, prometida para la versión 8.5, se ha hecho por fin realidad en el navegador (véase la Figura 2). Si tecleamos b searchkey en el cuadro de direcciones, Opera

Nuevas Funcionalidades en Opera 9 • Widgets: pequeños asistentes basados en Ajax • Bloqueador de contenidos amigable • Políticas de seguridad específicas para cada página Web • Cliente integrado para BitTorrent • Posibilidad de añadir cuadros de búsqueda para cualquier buscador • Visualización de páginas Web como miniaturas para facilitar la navegación • URL opera:config para una minuciosa personalización • Destaca los resultados de búsqueda • Función de papelera mejorada • Integración mejorada con KDE

30

Número 24

Figura 2: Descargamos archivos con el soporte integrado para BitTorrent en Opera.

busca en la red de intercambio de archivos y añade las descargas a la lista de transferencias, eliminando la necesidad de otros programas. El bloqueador de contenidos es otra útil nueva funcionalidad. Para utilizarlo simplemente tenemos que pulsar el botón derecho del ratón sobre una página Web, seleccionamos Block content así como los banners que no queremos volver a ver. Podemos dirigirnos a Tools | Preferences | Advanced | Content | Blocked content para administrar las entradas de los anuncios que hemos bloqueado. Esto funciona a la perfección en páginas de noticias, dando al usuario una vista ordenada del contenido real. Nótese que el bloqueador de contenidos puede cambiar el diseño de la página si ésta está sobrecargada de anuncios. En muchos casos, Opera inserta rellenos de colores. Sin embargo, el bloqueador no es capaz de eliminar los anuncios integrados en marcos de texto normal. Podemos también configurar políticas de seguridad de las páginas en función a éstas. Pulsamos el botón derecho sobre una página de Internet (no sobre una imagen) para que aparezca el menú de esa página. Pulsamos sobre Edit site preferences para que aparezca una plétora de configuraciones que controlan el comportamiento del navegador respecto a los cookies, pop-ups, plugins, Javascript y otras funcionalidades de seguridad. Podemos incluso configurar la identificación del navegador de manera individual para cada página Web.

Diversión y Juegos La nueva funcionalidad más vistosa es la adición de widgets, a los que posible-

WWW.LINUX-MAGAZINE.ES

mente estemos acostumbrados gracias a Karamba o GDesklets (véase la Figura 3). Estos miniprogramas basados en Ajax [2] se instalan fácilmente vía Widgets | Add widgets. Para cada widget, podemos especificar si el programa va a ejecutarse en segundo plano o esconder otras ventanas. La variedad de elección es sorprendente, desde relojes con diseño Opera, pasando por paneles y listas de cosas por hacer, hasta completos editores de HTML. La calidad varía desde las útiles hasta las inútiles completamente prescindibles. Como nota positiva, los usuarios de Opera pueden probar con seguridad lo que necesitan en realidad, ya que los widgets se desinstalan tan fácilmente como se instalan. Aunque tenemos dudas de si estas extensiones relativamente útiles se consolidarán por sí mismas. Después de todo parece una tendencia de los sistemas operativos el integrar sus propios sistemas de gadgets.

Ajuste Fino Además de esta presentación más obvia, Opera 9 incluye mejoras en un gran número de detalles. Por ejemplo, la función de búsqueda en la página Web, [Ctrl] + [F], usa resaltado a dos colores, marcando con amarillo la coincidencia actual, y el resto en verde. Sin embargo, si Opera está usando el tema de KDE, las coincidencias se muestran en el color elegido para ello en KDE. No es necesario sumergirse en el archivo de sistema opera6.ini con un editor de texto. Podemos teclear opera:config para abrir una pulcra página que soporta la edición


Opera 9 • PRÁCTICO

de las preferencias. Si no estamos completamente seguros de lo que estamos configurando, deberíamos evitar tocarla, o dirigirnos a los foros de Opera en [3] y [4] para conocer las opciones. Opera 9 ofrece una vista previa de las páginas Web que están en segundo plano cuando posamos el cursor del ratón sobre la pestaña correspondiente (véase la Figura 4). Esto nos ayuda a localizar rápidamente la página que necesitamos sin necesidad de pulsar realmente en esa pestaña y meternos en ella. Si cerramos accidentalmente una o más pestañas, podemos recuperarlas de la papelera y restablecer la vista. El fabricante también afirma haber mejorado las funcionalidades de impresión y administración de plugins. Varios plugins muy famosos funcionaron a la primera en nuestro laboratorio, pero otros usuarios han reportado problemas con la impresión en los foros ([3],[4]).

Todo Incluido Opera es una completa suite para Internet que incluye email, chat IRC, feeds RSS y módulos de lectura de news además del navegador. Una cosa que hemos apreciado es el hecho de que las entradas del menú no se muestran para las partes de la suite que no se han usado previamente, aunque se instalan cuando ejecutamos un componente por primera vez. Los módulos se presentan como nuevas pestañas, que pueden controlarse como paneles laterales. El método no demasiado convencional para ordenar el correo electrónico por el nombre de usuario, u otros criterios, puede ser confuso si estamos más habituados a un método de organización basado en carpetas, pero en el fondo, si lo pensamos tiene sentido, ya que se elimina la necesidad de definir innumerables reglas para los filtros.

Figura 4: Opera 9 ofrece una vista previa de las páginas Web en segundo plano al posar el ratón en la pestaña correspondiente.

Las mejoras en los módulos se restringen a detalles en Opera 9. Por ejemplo, hay algunas mejoras en la integración IMAP. Y el programa incorpora un menú de smileys para aquellos que gusten de adornar sus correos electrónicos. El módulo Newsfeed lee ahora feeds Atom 1.0, y los archivos DCC se pueden enlazar en ventanas de chat. Podemos verificar en el Changelog [5] la lista completa de mejoras.

Conclusiones

Opera recibe su versión 9 con una completa gama de funcionalidades en un pequeño tamaño de programa. Es sorprendente cómo los programadores han sido capaces de ensamblarlo todo en un paquete de 5 MB. Mientras que sus competidores continúan hinchando sus programas, Opera permanece ligero y rápido. Sin embargo, este exhaustivo paquete de programas podría mejorarse con una agenda de direcciones más completa, y sería muy bienvenida la inclusión del soporte para importar emails Figura 3: Los widgets de Opera pueden ejecutarse fuera del y direcciones de otras popunavegador. lares herramientas.

WWW.LINUX-MAGAZINE.ES

El navegador de Opera es extremadamente estable y no problemático. Los usuarios pueden acceder a las preferencias fácilmente vía menús contextuales. Los desarrolladores han continuado resolviendo antiguos problemas de renderizado, aunque el navegador puede aún tropezar con alguna página particularmente complicada. Tras una corta curva de aprendizaje, los nuevos usuarios no tendrán problemas para navegar, o en aplicar las funcionalidades avanzadas de búsqueda para los problemas de la vida diaria. Los usuarios avanzados agradecerán el minucioso control que proporciona Opera, que permite grandes posibilida■ des para personalizarlo.

RECURSOS [1] Página Web de Opera: http://www. opera.com [2] Ajax: http://en.wikipedia.org/wiki/ Ajax_%28programming%29 [3] Foros de Opera: http://my.opera.com/ community/forums/index.dml [4] Comunidad Opera: http://my.opera. com/community/ [5] Changelog: http://www.opera.com/ docs/changelogs/linux/900/

Número 24

31


PRÁCTICO • Xara LX

Gráficos vectoriales en pseudo-3D

ESPACIO PROFUNDO Los gráficos vectoriales suelen ser como los cómics: aunque pueden insinuar sombras y luces, es más o menos imposible conseguir en ellos realismo fotográfico. Pero esto podría cambiar con el lanzamiento de Xara LX como programa de código abierto. POR PETER KREUSSEL

S

i comparas el esfuerzo que implica dibujar una escena en 3D, o bien usando un sistema de modelado 3D, te darás cuenta enseguida de que eres más rápido trabajando según el viejo método. Con un ordenador, lo más cerca que puedes estar de la sensación de trabajar con lápiz y papel es usar una tableta de dibujo con un editor de bitmaps, como Gimp. Pero con gráficos vectoriales, que se pueden escalar libremente sin afectar la calidad, a los artistas les suele resultar difícil implementar sombras o degradados de reflejos de luz. Las aplicaciones de gráficos vectoriales (como Inkscape) sólo permiten degradados lineales, radiales o cónicos, que no consiguen representar el tipo de iluminación y las sombras que producen objetos con formas más complejas.

32

Número 24

El programa profesional Adoble Illustrator incluye una herramienta, Malla de degradado, que permite a los artistas representar degradados complejos. Divide los objetos en una cuadrícula con campos a los que podemos asignar diferentes valores de color; después Illustrator calcula las transiciones para que sean suaves. Y, en realidad, no importa lo potente que pueda ser esta herramienta; sigue sin ser del todo adecuada para conseguir realismo en los efectos de iluminación espacial. Xara, que tiene a sus espaldas diez años de historia como programa comercial de Windows, muestra un potencial sorprendente. Para creerme, basta con echar un vistazo a la galería de imágenes de la web de Xara [1].

Presentación de Xara A finales del 2005 los diseñadores decidieron publicar una versión gratuita y de

WWW.LINUX-MAGAZINE.ES

código abierto, para Linux y Mac OS, del programa comercial de Windows Xara Xtreme. Xara LX tiene la mayor parte de las características de la versión de Windows, excepto las tecnologías con licencia, como las paletas Pantone. Según los autores de Xara, la actual versión 0.7 está “casi completa”. Lo cual significa que casi todas las herramientas de dibujo incluidas en la versión de Linux funcionan igual que en Windows. Los esfuerzos para desarrollar Xara LX están dando fruto muy rápido. Hace dos meses no estaba disponible ni siquiera una función para imprimir. Ahora, en el website de sus programadores se informa de que Xara está casi terminado. Actualmente es todo lo estable que se puede esperar de una Beta; y si todo avanza al mismo paso que en el anterior desarrollo, podemos esperar una herramienta de confianza que aguanta las exi-


Xara LX • PRÁCTICO

Figura 1: Este es el secreto para dibujar vectores espaciales realistas: diferentes tipos de degradados transparentes, que dan una apariencia natural a las sombras.

gencias profesionales para dentro de un año (más o menos) desde ahora. La página tiene un archivo binario y un autopackage de Xara LX [2]. El código fuente, junto con instrucciones para acceder al repositorio de Subversion, están disponibles en [3]. Xara trabaja sobre wxWidgets, que puedes instalar antes que el programa, si es que no los tenías ya en tu sistema.

Plano, pero bien Cuando arrancas Xara LX por primera vez, uno se pregunta cómo un programa con un interfaz de usuario tan plano puede crear los dibujos fotorrealistas del directorio de Ejemplos. La mayoría de herramientas de este programa están disponibles también en Inkscape. En el aspecto del dibujo, hay muy poca distancia entre Inkscape y Xara, aunque éste tiene una función Snap to object (adaptar al objeto), lo que supone una gran ventaja. Las otras diferencias son más difíciles de encontrar; hará falta mirar entre las herramientas de Xara Shadow, Transparency y Bevel . La herramienta Shadow (“Sombra”) crea un molde de sombra realista, como Adobe Illustrator. Si arrastras un objeto con ella, Xara crea una sombra para reflejar la distancia a la que lo arrastraste, utilizando bordes suaves para reflejar el tipo de sombra que arroja en el ambiente. El sombreado aumenta enormemente la apariencia natural de un dibujo.

Si hay sombras, es porque hay luz, está claro: y la luz que crea sombras en los objetos provoca también brillos. Las caras iluminadas aparecen más brillantes; las que no lo están serán más oscuras. El degradado de color, habitualmente con formas complejas, existe en todas partes a partir de los bordes. Naturalmente, los degradados de color son extremadamente difíciles de representar con vectores. El método de Adobe Illustrator, con mallas de degradado, es una opción para implementar degradados complejos. Xara utiliza un principio diferente: se implementan como objetos pequeños y semitransparentes, superpuestos con la forma básica. En principio, no hay nada que te impida utilizar este sistema con Inkscape. La gran ventaja de Xara es que tiene un catálogo de tipos de degradado mucho mayor. Además de la transparencia plana, el programa soporta degrada-

dos lineales, esféricos, elípticos, cónicos y con forma de diamante para objetos transparentes (ver Imagen 1). Junto a los multidimensionales, definidos por dos o tres puntos de referencia (fila central, derecha, a la derecha del todo), Xara también permite dos patrones fractales (fila de abajo, a la izquierda del todo). Todos los degradados de transparencia pueden ser iterados (fila de abajo, izquierda). Además se pueden convertir los valores de brillo en bitmaps para las transparencias del objeto (fila de abajo, derecha). La superficie de un modelo 3D realista suele estar basada en una fotografía: el renderizado aplica una textura cuadrada con veteado de madera por toda la superficie del modelo, igual que usando un mosaico. El problema que surge con este método es que los mosaicos basados en fotografías no pueden ser yuxtapuestos sin que se noten las uniones (ver Imagen 2, dcha). Xara resuelve este problema de la yuxtaposición aplicando un algoritmo que suaviza los bordes. La opción Repeat inverted elimina los bordes en las junturas (Figura 2, izq). Este método también sirve para los mosaicos en bitmap que se utilizan como base para efectos de transparencia (Imagen 2, fila de abajo, a la derecha del todo).

Aplicaciones prácticas La Imagen 3 muestra un sencillo ejemplo de dibujo con efecto espacial: una manzana con brillos y sombras que reflejan la fuente de luz. Las partes más brillantes u oscuras se pueden dibujar fácilmente con la herramienta de dibujo (a la derecha en la Imagen), y las puedes colorear para reflejar la luz ambiental. La herramienta de pluma (que suaviza los

Figura 2: Objetos con un rellenado basado en un mosaico con detalles fotográficos darán al dibujo una apariencia realista, cuando Xara haya suavizado los bordes.

WWW.LINUX-MAGAZINE.ES

Número 24

33


PRÁCTICO • Xara LX

Figura 3: Xara aplica un objeto semitransparente sobre la forma básica para conseguir brillos y sombras. Un degradado de color que encaje dará el toque fotorrealista.

bordes), combinada con un degradado elíptico (cuyo tamaño puedes manejar interactivamente definiendo el centro y dos radios), permite que las transiciones sean suaves. Así se consigue una representación realista de los brillos y de las sombras que la luz arroja debajo de la manzana. La herramienta Shadow añade la sombra que una verdadera manzana provocaría en la mesa. Para conseguir el efecto de veteado usé una foto de un trozo de madera. El Repeat Inverted suaviza las transiciones entre las piezas del mosaico en el efecto repetido de veteado. Los dibujos en la galería de imágenes de Xara de [2] muestran todos el mismo simple principio: superponer una forma básica con múltiples obje-

tos, la mayoría transparentes, para reflejar la acción de la luz y la sombra en el mundo real. La Imagen 4 muestra un pequeño fragmento de una de las muestras gráficas que acompañan la distribución de Xara. La capa inferior de la capota del mini azul es un simple degradado lineal. Algunas sombras y reflejos colocados a mano dan a la imagen un aspecto perfectamente fotorrealista. Aunque hace falta mucha práctica y habilidad para crear dibujos realistas como la Imagen 4, sólo una cosa distingue a Xara de las herramientas de modelado 3D: donde éstas usan raytracing para calcular sombras y brillos perfectos, Xara da al artista control directo sobre los efectos. Y las herramientas de rellenado y potentes transparencias del programa lo convierten en el mejor apoyo que un artista podría pedir.

Conclusiones

Figura 4: Se pueden imitar fácilmente los efectos de reflejo en la capota de un coche con un simple degradado y algunas sombras puestas a mano… Suponiendo que tengas suficiente talento artístico.

34

Número 24

Xara aporta un buen número de interesantes funciones al mundo Linux. No se le debería ver como un competidor de Inkscape. Éste crea gráficos en formato SVG, un estándar de Internet. El paquete

WWW.LINUX-MAGAZINE.ES

Inkscape incluye ahora un editor XML que soporta manipulación de los archivos a bajo nivel, y así consigue su propio grupo objetivo específico. Al revés que una herramienta como Inkscape, Xara está destinado principalmente a artistas gráficos que valorarán los efectos del programa y los degradados fotorrealistas. La sección Business Designs de la galería de [1] demuestra que la versión comercial de Xara nace para diseñar productos profesionales como portadas o embalajes. Y la velocidad de su proceso de desarrollo arroja muy pocas dudas de que la versión libre para Linux pronto estará preparada para estas tareas. Para aquellos que no requieran estas características superiores, merece la pena probar cuanto antes Xara LX; después de todo, la instalación del autopackage o del archivo ■ binario es un juego de niños.

RECURSOS [1] Galería de Imágenes de la versión comercial de Xara (Xara Xtreme):

http://www.zara.com/gallery [2] Archivo binario para descargar:

http://www.xaraxtreme.org/ download [3] Código fuente y acceso SVN: http://

www.xaraxtreme.org/developers/ general/source_code_building.html


Citadel • PRÁCTICO

Iniciación al servidor groupware Citadel

CASTILLO DE CINCO ESTRELLAS El proyecto Citadel ofrece una solución groupware alternativa fácil, estable y versátil. POR JON WATSON.

C

itadel [1] es una solución groupware sencilla y versátil con una alta integración y llena de potentes funcionalidades. Cuando los compañeros administradores estén aún peleando con Kolab2 y Horde, nosotros podemos tener nuestra instalación de Citadel ya configurada y ejecutándose con seguridad. Incluye un servidor de groupware “Exchange-killer”, una BBS accesible por Web y telnet y una suite PIM en línea que hace uso del protocolo estándar GroupDAV. No vamos a necesitar el manual del administrador de sistema y tampoco necesitaremos invertir demasiado tiempo. El Easy Install de Citadel de 45 minutos implica únicamente presionar el botón unas cuantas veces y tener un conocimiento muy básico de nuestro sistema. Tropezamos con Citadel después de tirar la toalla intentando hacer funcionar Kolab2. Fue un afortunado incidente, porque descubrimos que es más potente que Kolab2 y significativamente más fácil de configurar. La página Web de Citadel, http://www. citadel.org, alberga toda la información y los archivos que vamos a necesitar para echarlo a andar. Encontraremos soporte en la enormemente activa comunidad de UNCENSORED! BBS [2], la BBS de Citadel más antigua del planeta.

La Historia de Citadel En 1987 comienza la vida de Citadel como un porte de UNIX de las plataformas BBS Citadel-CP/M y Citadel-86. Sin embargo, según las palabras de Art Cancro, el creador del Citadel moderno, “no era difícil darse cuenta que reescribirlo sería más fácil, por lo que comencé a escribir una implementación de Citadel para Unix (que durante un tiempo se llamó Unixrooms)”. El proyecto surgió por la necesidad de tener una BBS dedicada a la conversación libre. UNCENSORED! BBS, la primera BBS en usar esta nueva implementación, abrió sus puertas a comienzos de 1988. Alrededor de mediados de 1990, el surgimiento de Internet amenazó la existencia de UNCENSORED!, como lo hizo con el resto de la comunidad BBS telefónica. Como respuesta, Art conectó UNCENSORED! a Internet y comenzó a trabajar en una interfaz Web llamada WebCit. El proyecto creció, y mientras Citadel retuvo su interfaz texto y Web, también abarca hoy día funcionalidades de groupware, con email IMAP y POP, calendario, tareas, lista de contactos y mucho más.

¿Por Qué Citadel? Citadel es extremadamente fácil de instalar y configurar, especialmente si consideramos la enorme gama de funcionalidades. Podemos tener soporte para correo electrónico, calen-

WWW.LINUX-MAGAZINE.ES

dario, tablones de anuncios, listas de correo, mensajería instantánea y foros de discusión desde una única instalación. La arquitectura única de Citadel es parte de la razón de su éxito. Una configuración de Citadel se organiza alrededor de contenedores denominados habitaciones (Rooms). Según su página Web “…una habitación puede usarse como carpeta de correo electrónico, foro de discusión, chat en tiempo real, lista de correo, calendario, libreta de direcciones y fuente RSS…” o cualquier combinación de estos elementos. Una habitación funciona de manera parecida a un foro en Internet que tenga discusiones de un único tema. Cualquier usuario del nodo puede participar en la discusión. Las habitaciones de Citadel pueden organizarse en plantas floors. Una planta es un conjunto de habitaciones. Una funcionalidad heredada es que las habitaciones pueden compartirse entre nodos. Para aquellos suficientemente viejos como para acordarse de Fidonet y otras echonets, el concepto de las habitaciones conectadas de Citadel les resultará familiar. Sin embargo, al contrario de las típicas echonets del pasado, cada nodo puede comenzar una nueva habitación conectada simplemente creando el espacio y ofreciéndolo a otros nodos. No tenemos que buscar al coordinador de Fidonet o comenzar un proceso de

Número 24

35


PRÁCTICO • Citadel

Citadel. Una vez que tengamos nuestro sistema en marcha, podremos explorar muchas otras funcionalidades para encontrar nuestros propios trucos y sacar provecho de esta versátil herramienta.

Instalar Citadel

distribución para proporcionar un entorno de compilación que funcione. Comenzamos la instalación con: curl http://U easyinstall.citadel.org/U install | sh

Si no tenemos curl por alguna razón podemos usar wget en su lugar:

El código fuente de Citadel, bajo la GPL de GNU, puede wget -q -O - http://U compilarse directamente tal easyinstall.citadel.org/U Figura 1: Citadel incluye un magnifico asistente Easy Install. cual. Sin embargo, existe una install | sh manera más sencilla. Citadel votación. La habitación está disponible para incluye un asistente Easy Install, que podeTal y como dicen los documentos, el Easy Inscualquier nodo que quiera participar. mos usar bien como una nueva instalación o tall es muy sencillo, pero no demasiado Otra característica muy útil de una habitacomo una actualización. Necesitamos acceso rápido. En ocasiones, como cuando está desción es que cada habitación de un nodo de al ssh/telnet como root en nuestro servidor cargando e instalando la base de datos BerkeCitadel tiene su propia dirección de correo conectado a Internet para poder utilizar el ley DB, parece que se haya quedado colgado. electrónico. Una habitación llamada Dogs en asistente Easy Install. No hay que preocuparse, la instalación contimi servidor, por ejemplo, tendrá la dirección Los pasos siguientes funcionaron en nuesnuará su camino. de correo room_dogs@jonzdev.com. Los tras pruebas sin problemas. Sin embargo, Tras el requisito de la descarga e instalación correos mandados a esta dirección aparecen recomendamos darse una vuelta por la de la base de datos y las librerías comenzará en la habitación Dogs tanto si está conectada página de Easy Install de Citadel http://easyla instalación. Sus desarrolladores han puesto como si no. Todas las plantas y habitaciones install.citadel.org antes de instalarlo en nuesmucha atención en crear un instalador que pueden aparecer en nuestra lista de carpetas tro sistema. hace las preguntas adecuadas y proporciona IMAP de Kontact. Lo hemos instalado en un Unixshell las opciones por defecto correctas. Citadel, La fuerte integración de las herramientas VPS http://www.unixshell.com ejecupor ejemplo, no presupone que queremos de Citadel tiene interesantes ventajas para los tando Debian 3.1 y el kernel 2.6.16.13usar los servidores incorporados POP, IMAP y usuarios atareados. Por ejemplo, para alguien xenU (SMP). En el momento de escribir SMTP. En lugar de esto, pregunta si nos gusque esté siempre de viaje el único aparato estas líneas, la última versión de Citadel taría usarlos. Pasa lo mismo con el puerto del que llevará siempre encima es el teléfono que permite Esay Install es la 6.82. Para servidor Web que va a ejecutar WebCit. Si ya móvil. Casi cualquier teléfono de hoy día instalarla bajo Debian necesitamos el estamos ejecutando Apache en el puerto 80, tiene funcionalidades de envío de email. Si paquete build-essential, así como curl y podemos indicarle simplemente a WebCit queremos mandarnos tareas cuando van surlibssl-dev (sólo necesarios si queremos que escuche en un puerto alternativo, para giendo, podríamos enviarlas directamente habilitar SSL en nuestra instalación de poder dejar intacta la configuración existente. por email. Sin embargo, no todos los servicios Citadel). Tomamos nota del nombre de usuario del de agenda en línea tienen la funcionalidad de Si tenemos un sistema Debian, tendremos administrador que hayamos elegido, contesemail-tarea, o si la tinenen forma parte de tipo que instalar los paquetes que necesite nuestra tamos unas sencillas preguntas sobre los serde servicio premium. Con Citadel, configurar un sistema como este es trivial. En primer lugar creamos una planta y la marcamos como privada, de manera que sólo podamos verla nosotros. Luego creamos dos habitaciones en esa planta: todo_casa y todo_trabajo. Cada habitación tiene su propia dirección de correo electrónico. Ahora, con un sencillo movimiento de dedos y muñeca, podemos mandar un correo a room_todo_casa@jonzdev.com, y Citadel coloca un mensaje en esa habitación. Podemos entonces acceder a la lista bien a través de WebCit o directamente en las carpetas IMAP dentro de Kontact. Seremos capaces de llevar a cabo muchos otros trucos útiles una vez tengamos el sistema funcionando. Este artículo describe Figura 2: WebCit es una sencilla e intuitiva herramienta para configurar Citadel. cómo instalar y configurar un servidor de

36

Número 24

WWW.LINUX-MAGAZINE.ES


Citadel • PRÁCTICO

vicios a arrancar al iniciar, y ya somos los orgullosos propietarios de una nueva instalación de Citadel ubicada en tuservidor.com, o tuservidor.com:XXXX si hemos elegido un puerto alternativo.

Citadel puede configurarse bien a través de WebCit o mediante interfaz de texto, pero es preferible WebCit (véase la Figura 2). Para poder usar los servidores de correo de Configurar Citadel Citadel vamos a tener que indiCitadel tiene un número casi infinito de posicarle alguna información bles configuraciones, sin embargo, no tenebásica. Nos logueamos en la mos un número infinito de páginas para este instalación de WebCit con el artículo. Por tanto, nos concentraremos en nombre de usuario de adminisconfigurarlo con las siguientes suposiciones: trador que elegimos al instalar • Queremos usar los servidores IMAP, POP y y pulsamos sobre el enlace SMTP propios de Citadel. Administration abajo a la • Queremos usarlo principalmente como un izquierda. servidor de groupware. Pulsamos en los enlaces de • Vamos a configurarlo vía Web mediante la nombres de dominio y de Figura 4: Configuramos el SMTP de Kontact. interfaz WebCit. configuración de correo. Para Independientemente de cómo vayamos a poder recibir correo electrónico desde investigación de las opciones de usar Citadel, debemos saber algo refeInternet, tenemos que indicarle los configuración del sitio. rente al login. Lo más viejo en la instaladominios en los que queremos recibir Configurar Kontact ción es que se loguea a local4 por email. Ponemos el dominio primario en defecto. Como la mayoría de los sistemas el campo Local host aliases y pulsamos Aunque WebCit proporciona una interfaz no tienen configurado local4, esto signien el botón Add. Repetimos esto para Web muy funcional para todas las funcionalifica que Citadel se loguea directamente todos los dominios para los que deseadades de Citadel, a veces es mejor disponer en nuestra terminal. No hay nada más mos que acepte correo electrónico. de la potencia de un cliente PIM local. Esta molesto que loguearse en modo texto en No se requiere ninguno de los otros herramienta entiende WebCAl, GroupDAV e nuestra terminal cuando estamos campos de esa pantalla, pero si quereIMAP, y se comenta algo referente a una haciendo otras tareas. Por tanto, el primos hacer uso de los Smart hosts, Spaherramienta de terceros que conecta con MS mer paso es indicarle que se loguee mAssassin o alguna de las otras opcioOutlook que está en camino. Configurar Kondesde cualquier otro lugar. Estamos segunes, ponemos la información requerida tact para que funcione con Citadel usando el ros que Citadel proporciona un buen número en el cuadro correspondiente. protocolo GroupDAV es realmente sencillo. de maneras de hacer esto. Una solución senOtra área de la configuración que En nuestro caso estamos usando Kontact cilla es editar nuestro archivo /etc/syslog.conf puede ser de interés es la pestaña Edit 1.2, que incluye Kmail 1.9.1. Lo mencionay apuntar local4 a un archivo de log. sitewide configuration | Network tab. Si mos porque cuando accedemos al calendario estamos intentado ejecuy la lista de tareas, existe un pequeño bug del tar POP, IMAP o SMTP, que tenemos que ser conscientes para que las configuraciones por funcione correctamente. Para los noveles, sin defecto en esta página embargo, veamos cómo se configura la deben ser las correctas, cuenta IMAP. casi con toda probabiliKontact es básicamente una aplicación dad. Sin embargo, aquí es paraguas que engloba todos los demás prodonde podemos apagar gramas PIM de KDE. Para llegar a la servicios, cambiar puerconfiguración de Kmail pulsamos sobre el tos y configurar toda una icono de correo y seleccionamos Tools | Confivariedad de otras opciogure Kmail. nes de red. Recibir Email Disponemos de toda una variedad de configuPulsamos sobre el icono Accounts y luego raciones distintas en las sobre el botón Add. Vamos a usar una cuenta pestañas de esta página, IMAP, pero podemos seleccionar POP si quepero estamos lidiando remos. Pulsamos en el botón OK y rellenasólo con el mínimo para mos el nombre de cuenta (sólo es para mospoder tener en marcha trarlo, no importa cómo le llamemos), nuesnuestro sistema de grouptro login de Citadel, contraseña de Citadel y la ware. Una vez que tenedirección de host de Citadel. Si hemos confimos esto configurado, gurado el servidor de correo en un puerto no merece la pena invertir estándar, debemos asegurarnos de que introFigura 3: Configuramos el correo IMAP de Kontact para Citadel. tiempo en una minuciosa ducimos el puerto en el campo Port. Si esta-

WWW.LINUX-MAGAZINE.ES

Número 24

37


PRÁCTICO • Citadel

Figura 5: Configuramos el calendario y tareas.

mos usando IMAP podemos pulsar en el icono circular de refresco, junto a la pestaña Namespaces, y Kmail pedirá al servidor los valores de los espacios de nombres Personal, Other Users y Shared. Como podemos apreciar en la captura de pantalla, nuestro espacio de nombre Personal es INBOX/ y el Shared es Main Floor/. Si hemos configurado SSL o TLS en nuestro servidor, podemos pulsar sobre la pestaña Security y luego en el botón What the Server Supports para que Kmail adivine la configuración correcta. Comprobamos cualquier otra opción que queramos, y pulsamos sobre el botón OK.

Enviar Email Ahora que podemos recibir correo electrónico, necesitamos un servidor para poder mandarlo. Para usar el servidor SMTP propio de Citadel, pulsamos sobre la pestaña Sending y luego sobre el botón Add. Seleccionamos SMTP y pulsamos sobre OK. Al igual que con la configuración de IMAP, introducimos un nombre (sólo para mostrar) y nuestra dirección de host de Citadel, amén de asegurarnos de que tenemos el puerto correcto en el campo Port. Nuestro servidor Citadel requiere autenticación para poder combatir los intentos de los spammers de usarlo como relay abierto. Pulsamos sobre Server requires authentication e introducimos nuestro nombre de usuario y la contraseña en los campos correspondientes. Si hemos instalado SSL u otro protocolo de seguridad, podemos pulsar sobre la pestaña Security y el botón Check What the Server Supports para configurar rápidamente estas opciones. Configuramos cualquier otra opción que queramos y pulsamos sobre OK. Ya deberíamos ser capaces de enviar y recibir correo electrónico desde el nuevo servidor de Citadel. Pulsamos sobre el icono Check

38

Número 24

Mail de nuestra barra de Kontact y vemos qué ocurre. Si recibimos errores de conexión o autenticación, debemos volver a verificar la configuración e intentarlo de nuevo.

mos que seleccionar al menos un recurso de calendario y tareas, pero podemos habilitar todos sin ningún problema.

Configurar el Calendario y las Tareas.

El proceso de configurar contactos es muy similar a configurar el calendario y tareas. Para comenzar, pulsamos sobre el icono Contacts de Kontact. Abajo a la izquierda hallaremos un panel denominado Address Books. Pulsamos sobre el botón Add bajo éste. Con una ligera sensación de déjà vu, seleccionamos el elemento GroupDav Server (por ejemplo, Open Groupware) y pulsamos OK. Introducimos el nombre de usuario, contraseña y la URL que introdujimos para el calendario y tareas, y luego pulsamos el botón Update Folder List. De nuevo, seguimos los pasos del proceso para el calendario y tareas y habilitamos al menos un contacto. Si vamos a compartir una libreta de direcciones, deberíamos habilitar al menos un elemento Global Address Book.

El correo electrónico está bien, pero tener acceso universal a nuestra información de PIM es de un valor incalculable. Para añadir Citadel como recurso de calendario, pulsamos en el icono Calendar de Kontact y pulsamos el botón Add bajo el campo Calendar. Nosotros hemos preferido el protocolo GroupDAV, por lo que en la ventana que aparece, seleccionamos la opción Group-DAV Server (por ejemplo OpenGroupware) y pulsamos OK. Introducimos un nombre para mostrar en el campo Name, y las credenciales de Citadel en la sección GroupDAV Server. Nuestro nombre de usuario y contraseña son las mismas que usamos en Citadel para el correo electrónico, pero la URL es ligeramente distinta. Nuestra URl de Group-DAV es nuestra URL HTTP de Citadel (incluyendo el puerto no estándar si no estamos trabajando sobre el puerto 80) con el apéndice /groupdav. En nuestro caso, resulta como dirección estándar de la instalación de GroupDAV de Citadel algo como http://www.jonzdev.com/groupdav. (Nótese que jonzdev.com es el dominio de desarrollo y puede apuntar a cualquier parte del planeta en otro momento. Esta URL es muy probable que no esté en funcionamiento para cuando se vaya a imprimir este artículo). Si nuestro Citadel está en el puerto 2000, por ejemplo, nuestro URL de GroupDAV es: http://www.jonzdev.com:2000/groupdav. Para asegurarnos de que las configuraciones son correctas, pulsamos sobre el botón Update Folder List. A pesar del hecho de que ya hemos introducido nuestro nombre de usuario y contraseña en la sección del servidor GroupDAV, se nos pedirá esta información de nuevo. La introducimos y deberíamos ver cómo nuestra ventana Folder Selection se llena de objetos de calendario y tareas con cuadros de chequeo a su lado. Existen algunos bugs que aparecen durante el proceso, y en muchos casos, Kontact muestra más de un recurso de calendario y tareas. Si verificamos los cuadros de chequeo junto a un recurso de calendario y tareas se supone que se habilita ese recurso. Sin embargo, si verificamos varios cuadros de chequeo parece que no hace efecto. El cuadro no se mantiene marcado y el recurso no se añade a la lista de recursos. En lugar de verificar el cuadro de chequeo junto al recurso de calendario y tareas, pulsamos con el botón derecho y seleccionamos habilitar. Tene-

WWW.LINUX-MAGAZINE.ES

Configurar Contactos

WebCit y Kontact Mientras añadimos y editamos citas de calendario, tareas y registro de contactos, podemos echarle un vistazo a los cambios con WebCit. Para ello, nos logueamos con nuestra cuenta en WebCit y comprobamos cómo aparecen los elementos en la interfaz Web. Citadel nos ofrece acceso completo a toda la información PIM y de correo electrónico desde la Web. Nótese que los cambios realizados ya sea con Konqueror o con WebCit tardan unos minutos en sincronizarse. Esto depende fundamentalmente de la periodicidad con la que verificamos nuestra cuenta de correo, ya que todo se sincroniza al realizarse una comprobación de la cuenta. Podemos configurar Kontact para que esta verificación se realice a intervalos de 5 minutos para asegurarnos de que todo se guarda con frecuencia.

Conclusión Citadel tiene una larga historia como versátil servidor groupware Open Source. Este sistema ofrece email, mensajería instantánea, calendario, servicios BBS y otras funcionalidades en un paquete altamente integrado. Por último, señalar que su arquitectura hace extremadamente fácil concebir e ■ implementar soluciones a medida.

RECURSOS [1] Proyecto Citadel: http://www.

citadel.org/ [2] UNCENSORED! BBS: Hacer Telnet o Web a uncensored.citadel.org


DESARROLLO • Perl: SPAM

Un script Perl que protege los foros frente al spam

REPE(R)LE-SPAM Los spammers no sólo envían correos electrónicos. También sabotean los foros y blogs posteando pseudomensajes llenos de enlaces a motores de búsqueda falsos. Un script en Perl nos ayuda a hacer la limpieza. POR MICHAEL SCHILLI

R

ecientemente, mi pequeño foro propio en perlmeister. com ha atraído mucho la atención de los spammers de enlaces. Estos parásitos de la Web apuntan sus bots a herramientas software para foros, como phpBB o aplicaciones de blog como Wordpress, bombardeándolas con posts que contienen poco más que enlaces a páginas de póker y sexo. Los spammers tratan de engañar a los visitantes para que pulsen en los patrocinadores de sus páginas, pues intentan embaucar a los principales motores de búsqueda, los cuales puntúan la importancia de una página en función de los enlaces que apuntan a ésta.

Echándole la zancadilla al Spambot Los conocidos como comentarios spam [2] pueden reducirse restringiendo la posibilidad de postear a usuarios registrados. Aunque este obstáculo también puede asustar a usuarios legítimos que tienen reparos en cuestiones de privacidad. Por otra parte, moderar cada comentario antes de que aparezca en la página puede ahuyentar a los spammers, pero el esfuerzo requerido para esto es inmenso, sin mencionar los inevitables retrasos que dificultan las discusiones. Los sistemas Captchas (“Introduzca el número mostrado con el tipo de letra distorsionada”) nos ayudan a asegurarnos de que realmente hay un ser humano al otro lado de la conexión y no un ordenador. Los captchas no tienen por qué ser

40

Número 24

WWW.LINUX- MAGAZINE.ES

tan complicados como en la mayoría de páginas Web, como demuestra el blog de Jeremy Zawodny. A los usuarios se les pide simplemente que introduzcan la palabra “Jeremy” en un campo separado. La mayor parte de los bots fallan al intentarlo, puesto que se concentran en el amasijo infestado y no pueden adaptarse a personalizaciones que sólo funcionan en un pequeño porcentaje de la muestra. Además, algunos bots no entienden en realidad la interacción entre JavaScript y el DOM del navegador. Esto significa que incluso un trivial cambio local en el software del foro, con JavaScript que ofusque mantendría los bots lejos. Las Figuras 2 y 3 muestran una extensión trivial de phpBB que añade un botón para hacer una primera clasificación entre posteadores y spammers. Los bots spammers ignoran el botón, o aceptan el valor por defecto, delatándose como spammers. Si a un posteador humano se le pasa cambiar el botón, aparece un mensaje de error (véase la Figura 3) indicándole que tiene que cambiar la posición para poder postear. Los mensajes posteados en sí mismos permiten también detectar spam. Si el mensaje tiene un gran número de enlaces y poco texto, podemos suponer que probablemente es spam. Por supuesto, los falsos positivos pueden ser un problema, y queremos evitar etiquetar como spam comentarios de usuarios legítimos. Es bastante probable que el usuario se enfade si se borran sus comentarios, por lo que consecuentemente podemos terminar perdiendo usuarios que se marchen a otros foros.

Correo para el Moderador Para foros sin demasiado tráfico, el método de moderación basado en email


Perl: SPAM • DESARROLLO

proporciona una técnica útil para reducir el spam. El script posting-watcher, que se ejecuta como un trabajo de cron, hace peticiones de manera regular a la base de datos Mysql que utiliza phpBB en el sistema de foros para descubrir entradas no leídas en la tabla phpbb_posts, y captura sus ID’s, junto con una clave aleatoria, en el disco local. Tras hacer esto, el script envía un mensaje con la información más importante del post al moderador (véase la Figura 4). El moderador puede simplemente ignorar los mensajes con posts legítimos. Si el comentario resulta ser spam, el moderador puede pulsar el botón de responder en el lector de correo, el cual envía el correo de vuelta al script. Éste lee entonces la clave aleatoria guardada en el correo, verifica la caché del archivo para localizar la correspondiente ID del comentario phpBB, y envía una indicación a la página Web para que elimine el comentario usando la interfaz de administración Web que proporciona el software para foros phpBB. Podría haber modificado las tablas de la base de datos de phpBB directamente, pero es preferible hacerlo de esta manera para evitar efectos colaterales. Tras eliminar el mensaje, el script envía un mensaje de confirmación de vuelta al moderador. La Figura 6 muestra el procedimiento completo. En base a este método, todos los posts son mostrados primeramente (incluyendo el spam) por phpBB, siendo el spam rápidamente eliminado sin demasiado esfuerzo. Como las comunicaciones con el moderador hacen uso del correo electrónico, es un método extensamente usado hoy día. El esfuerzo adicional es insignificante para foros con bajo nivel de tráfico, y como efecto colateral, el moderador se entera automáticamente de qué es lo que se cuece en su foro.

Evitar el Uso Incorrecto Tanto el monitor de la base de datos ejecutado regularmente por el cronjob, como el mensaje scraper eliminador de comentarios se implementan en el mismo script, posting-watcher. Cuando el script es llamado con el parámetro -c (check), busca en la base de datos nuevos posts y envía un correo electrónico al moderador por cada nuevo post que encuentra. Cuando se lanza con el parámetro de línea de comandos -k, el script aguarda un correo electrónico con una clave de eliminación vía STDIN. Puede que se esté preguntando por qué el correo electrónico no contiene la ID del comentario sin más. Para asegurarse que posting-watcher entienda que el mensaje de eliminación de spam se originó por el moderador (en lugar de por un desaprensivo), se genera una clave aleatoria cuando se envía el mensaje, que no puede adivinarse fácilmente, y se guarda dicha clave en un archivo local (véase la Figura 5), junto con la ID del comentario a investigar. Si el moderador envía el mensaje de vuelta, el script extrae la clave aleatoria y hace uso de la tabla para verificar si esa clave se asignó al comentario que se está moderando. Sólo intentará borrar el post si se cumplen las condiciones.

Dígaselo con Flores

El software para foros phpBB distribuye la información del foro sobre más de 30 tablas Mysql. Los comentarios se guardan en phpbb_posts, pero no el cuerpo de texto del mensaje. En su lugar, phpBB usa la columna post_id en la tabla phpbb_posts para establecer un enlace entre phpbb_posts y otra tabla, phpbb_posts_text, y asociar de esta manera el post con el texto completo del mensaje (véase la Figura 8). Las consultas que enlazan dos tablas de esta manera son fáciles de tratar con SQL. Dicho esto, la mezcla resultante de Figura 2: Un nuevo conmutador mantiene los bots a raya. Perl y SQL no es precisamente elegante, siendo esta la razón por la cual los desarrolladores tienden ahora a usar wrapper orientados a objetos de Perl Figura 3: Si un usuario olvida conmutar el botón de “Spammer” sobre las bases de a “User”, aparece un mensaje para indicarle el error datos relacionales.

WWW.LINUX- MAGAZINE.ES

Figura 1: Un spammer ha acampado en este foro.

Este método implica usar métodos de objetos para realizar las consultas a la base de datos y manipular la información contenida en ella. No se necesita SQL. Puede que recuerde cuando se habló de Class::DBI en [5], pero justamente se acaba de lanzar un nuevo framework: Rose, que no sólo es más flexible, sino que ofrece mejor rendimiento en términos de velocidad. Este framework, disponible desde CPAN, usa la abstracción Rose::DB para comunicarse con las bases de datos, y Rose::DB::Object para acceder a las filas en las tablas de las bases de datos.

Relaciones Como muestra el Listado 1 PhpbbDB.pm, no es necesario introducir manualmente los nombres de las columnas de la tabla, simplemente debe definirse el wrapper objeto-relacional .auto_initialize() que permite que Rose busque autónomamente en sistemas de bases de datos populares (MySQL, Postgres,…), y origine automáticamente los métodos necesarios para crear una capa de abstracción. Normalmente, los enlaces entre tablas en bases de datos relacionales se implementan por medio de una clave externa en una columna extra, pero phpBB actúa aquí a su manera, usando dos claves primarias, llamadas ambas post_id (véase Figura 8). Es una pena, porque Rose tiene un administrador convencional que supone relaciones entre tablas convencionales (de manera parecida a Ruby on Rails). Si todo se configura de modo estándar, podemos simplemente realizar la llamada a Rose::DB::Object::Loader y dejar que Rose se ocupe automágicamente de todo lo demás. Si Rose encuentra una tabla denomi-

Número 24

41


DESARROLLO • Perl: SPAM

Figura 4: El moderador del foro puede verificar el mensaje y decidir si mantener o descartar el post.

nada phpbb_posts (en plural), crea una clase llamada PhpbbPost (en singular). Los nombres con guión bajo resultan nombres de clase CamelCase. Por tanto, no es necesario que PhpbbDB.pm llame a __PACKAGE_->meta->table(‘phpbb_top ics’);, pues Rose supone automáticamente el nombre de la tabla de

phpbb_topics, basándose en el nombre de la clase de PhpbbTopic. Si Rose detecta una clave externa denominada post_text, busca otra tabla llamada post_texts. Enlaza entonces las dos clases PhpbbPost y PostText usando una relación “muchos a uno” (N:1). Nótese que los nombres de las tablas están siempre en plural (post_texts), mientras que los nombres de las columnas para claves externas en relaciones 1:1 y N:1 están en singular.

Recibir Ayuda Si el esquema de base de datos de una aplicación no sigue esta convención, podemos modificar el administrador de convenciones o pasar a ayudar a Rose. De esta manera, de la línea 50 en adelante del Listado 1 PhpbbDB.pm se especifican las relaciones entre la tabla

phpbb_posts y las tablas phpbb_posts_text y phpbb_topics, haciendo uso de add_relationships para ello. La relación text (en la línea 51) especifica una relación “uno a uno” (1:1) entre la tabla phpbb_posts y la tabla phpbb_posts_text. Nótese que el nombre de la tabla no está aquí en plural, ya que phpBB usa el singular. Rose le sigue la corriente sin problemas, pues la definición de PhpbbPostsText definía explícitamente el nombre de la tabla como phpbb_posts_text. “Uno a uno” significa que cada fila en phpbb_posts se asocia con una fila en phpbb_posts_text y viceversa. Existen también relaciones de tipo “uno a muchos” (1:N), “muchos a uno” (N:1) y “muchos a muchos” (N:N). Lo importante es hacer la llamada a add_relationships antes de llamar a auto_initia-

Listado 1: PhpbbDB.pm 01 ############################## ############# 02 package Phpbb::DB; 03 ############################## ############# 04 use base qw(Rose::DB); 05 __PACKAGE__->use_private_regis try(); 06 __PACKAGE__->register_db( 07 driver => ‘mysql’, 08 database => ‘forum_db’, 09 host => ‘forum.db.host.com’, 10 username => ‘db_user’, 11 password => ‘XXXXXX’, 12 ); 13 14 ############################## ############# 15 package Phpbb::DB::Object; 16 ############################## ############# 17 use base qw(Rose::DB::Object); 18 sub init_db { Phpbb::DB->new(); } 19 20 ############################## #############

42

Número 24

21 package PhpbbTopic; 22 ############################## ############# 23 use base “Phpbb::DB::Object”; 24 __PACKAGE__->meta->auto_initia lize(); 25 26 ############################## ############# 27 package PhpbbPostsText; 28 ############################## ############# 29 use base “Phpbb::DB::Object”; 30 __PACKAGE__->meta->table( 31 ‘phpbb_posts_text’); 32 __PACKAGE__->meta->auto_initia lize(); 33 34 ############################## ############# 35 package PhpbbPost; 36 ############################## ############# 37 use base “Phpbb::DB::Object”; 38 39

WWW.LINUX- MAGAZINE.ES

__PACKAGE__->meta->table(‘phpb b_posts’); 40

41 42 43 44 45 46 47 48 49 50 51 52 53 54

__PACKAGE__->meta->add_relatio nships( text => { type => “one to one”, class => “PhpbbPostsText”, column_map => { post_id => ‘post_id’ }, }, topic => { type => “one to one”, class => “PhpbbTopic”, column_map => { topic_id => ‘topic_id’ }, } );

__PACKAGE__->meta->auto_initia lize(); 55 __PACKAGE__->meta->make_manage r_class( 56 ‘phpbb_posts’); 57 58 1;


Perl: SPAM • DESARROLLO

lize(). De otra manera Rose no creará los métodos de relación necesarios en auto_initialize(). Esta abstracción wrapper aplicada casi automáticamente permite al desarrollador hacer la petición del valor de, digamos, la columna post_id en una clase PhpbbPost usando el método post_id(), y gracias a la relación creada previamente, hacer la llamada a la cadena de métodos text()->post_text() para acceder a la cadena de texto del comentario, que se localiza en la tabla phpbb_posts_text pero enlazada con phpbb_posts. En la distribución CPAN del módulo se encuentra disponible una descripción detallada del wrapper de la base de datos orientada a objetos Rose, así como ejemplos prácticos. Y encontraremos un excelente tutorial sobre Rose en [4].

Generador de Claves Para poder soportar las peticiones colectivas estilo SELECT en una tabla abstraída, se le indica a la clase PhpbbPost en la línea 71 de PhpbbDB.pm que cree la clase PhpbbPost::Manager, de la que el método query() realiza la consulta. Nótese que la sintaxis de esta consulta es una construcción sorprendentemente limpia en puro Perl (véanse las líneas 99 y 100 de posting-watcher): [post_id => {gt => $latest}]. La consulta se corresponde con SELECT ...WHERE post_id > $latest. Si la búsqueda tiene éxito, el método get_phpbb_posts() devuelve una referencia a un array que contiene los objetos coincidentes de la clase PhpbbPost. Gracias a los métodos post_id(), text()->post_text() y topic()-> topic_title(), y las relaciones definidas en las tablas, los objetos devuelven la ID del comentario, su título y el texto como cadenas. El script posting-watcher usa esta información para rellenar un email

Figura 5: El contenido del archivo caché que guarda la clave aleatoria y las correspondientes ID’s de los comentarios.

que se envía al moderador con el contenido. La caché persistente, que mapea las ID’s de los comentarios a las claves aleatorias mencionadas anteriormente, se implementa con el módulo Cache::FileCache de CPAN. Como se especifica en la línea 25, las Figura 6: El eliminador de contenido spam usa el correo elecentradas se tornan obsotrónico para comunicarse con el moderador. letas tras 14 días y son tratadas entonces como si se aceptaran. El método purge() (línea Arte ASCII por Email 37) limpia dichas entradas obsoletas. La ID del último mensaje a moderar se Para asegurarse que los mensajes guarda en la línea 129 bajo la clave relativos a los nuevos posts que recibe el _latest en la caché, que mapea las claves moderador tienen un formato adecuado, aleatorias con las ID’s de los comentarios la función format_post definida en la para los correos electrónicos mencionalínea 170 sitúa la ID, el título y el texto dos anteriormente. La función check() en un cuadro ASCII mostrado en la del Listado 2 posting-watcher extrae la ID Figura 4. El cuadro se crea sin mucho del último post de la caché bajo investiproblema por el módulo Text::ASCIITable gación en ese momento, y realiza una de CPAN. Como el texto contiene consulta SQL que devuelve todos los tabuladores y otros caracteres no posts con ID’s más recientes. imprimibles, la expresión regular de la La cadena de la clave de 32 bytes en forlínea 190 los filtra, insertando puntos en mato hexadecimal se crea con la función su lugar. Antes de que el texto se genkey() en la línea 138. Usa un método introduzca en el cuadro, el módulo copiado del módulo Apache::Session de Text::Wrap fija el ancho de la línea a 60 CPAN, que pasa la hora, caracteres. Por último, la dirección de memoria, format_post inserta la un número aleatorio y la clave secreta en la última ID del proceso a través línea de la tabla ASCII. de un hash MD5 dos Se añade una línea de veces para generar un Subject: al correo parámetro aleatorio. electrónico, permitiendo Esta combinación que el moderador crea una clave única presione la tecla Reply en casi 100%, que es a la el cliente de correo para vez muy difícil de predevolver la clave como decir. Quien la sepa parte de la línea de puede borrar el comenasunto (con “Re:...” tario que se ha mapeañadido) al eliminador ado a la clave en la de spam. caché del foro. El script El Asesino en posting-watcher envía Serie de CPAN la clave al moderador y, si el moderador msg_remove de la línea envía de vuelta la clave 205 ejecuta el eliminador al script, éste lanza un de pantalla agente que elimina el WWW::Mechanize post del foro mediante usando un mecanismo la simulación de los plugin desarrollado por clics del ratón en la mi compañero en Yahoo, Figura 7: Tablas de las bases interfaz gráfica de Joe McMahon, que hace de datos que usa el software administración del uso del módulo de foros phpBB. foro. WWW::Mechanize::Plug-

WWW.LINUX- MAGAZINE.ES

Número 24

43


DESARROLLO • Perl: SPAM

Figura 8: El inusual enlace entre dos tablas del software de foros phpBB.

gable de CPAN. El módulo soporta la construcción de sencillos plugins que pueden ser subidos y compartidos en CPAN para extender WWW::Mechanize

con útiles funcionalidades. Por ejemplo, WWW::Mechanize::Pluggable::Phpbb añade los métodos phpbb_login y phpbb_post_remove a WWW::Mechanize para loguearse como usuario del navegador virtual en el administrador del foro Phpbb, y presionar los botones adecuados para eliminar un post identificado por su ID. msg_remove envía entonces un correo al moderador para confirmar que se ha completado el trabajo (véase la Figura 9).

Instalación Para asegurarnos de que los correos enviados a la cuenta Unix del eliminador de spam se reenvían a posting-watcher, necesitamos un archivo .forward con el

siguiente contenido en el directorio home del mencionado usuario: | /full/path/to/posting-watcher-kill.sh. Ahora se dispone de una línea de comandos en el script ejecutable, posting-watcher-kill.sh: #!/bin/sh /full/path/to/posting-watcher -k

La razón de esto es que el archivo .forward no puede manejar opciones en línea de comandos, sólo programas a secas o llamadas a script. Debemos asegurarnos de que introducimos nuestros propios valores en las líneas 16 a 25 de posting-watcher con

Listado 2: posting-watcher 001 002 003 004 005 006 007 008 009 010 011

#!/usr/bin/perl -w use strict; use PhpbbDB; use Cache::FileCache; use Digest::MD5; use Mail::Mailer; use Mail::Internet; use Text::ASCIITable; use Text::Wrap qw(wrap); use Getopt::Std; use WWW::Mechanize::Pluggable; 012 getopts(“kc”, \my %opts); 013 014 my $FORUM_URL = “http://foo.com/forum”; 015 my $FORUM_USER = “forum_user_id”; 016 my $FORUM_PASS = “XXXXXXXX”; 017 018 my $TO = ‘moderator@foo.com’; 019 my $REPL = ‘forumcleaner@foo.com’; 020 my $EXPIRE = 14*24*3600; 021 022 my $cache = Cache::FileCache->new({ 023 cache_root => “$ENV{HOME}/phpbb-cache”, 024 namespace => “phpbb-watcher”, 025 }); 026 027 $cache->purge(); 028 029 if($opts{k}) {

44

Número 24

030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048

my @data = <>; my $body = join ‘’, @data; if($body =~ /\[delete-key (.*?)\]/) { my $id = kill_by_key($1); my $mail = Mail::Internet->new(\@data); if($mail) { my $reply = $mail->reply(); $reply->body( [���Deleted posting $id.\n\n”, @data]); $reply->send() or die “Reply mail failed”; } } } elsif($opts{c}) { check(); } else { die “Use -c or -k”; }

############################# ############## 049 sub kill_by_key { 050 ############################# ############## 051 my($key) = @_; 052 my $id = $cache->get(“key$key”); 053 if(defined $id) { 054 msg_remove($id); 055 } else { 056 die “Invalid key $key”;

WWW.LINUX- MAGAZINE.ES

057 } 058 059 return $id; 060 } 061 062 ############################# ############## 063 sub check { 064 ############################# ############## 065 my $latest = $cache->get(“_latest”); 066 $latest = -1 unless defined $latest; 067 my $new_posts = 068 PhpbbPost::Manager->get_phpbb _posts( 069 query => 070 [ post_id => { gt => $latest } ] 071 ); 072 073 foreach my $p (@$new_posts) { 074 my $id = $p->post_id(); 075 076 my $key = genkey(); 077 078 mail($id, format_post($id, 079 $p->text()->post_text(), 080 $p->topic()->topic_title(),


Perl: SPAM • DESARROLLO

direcciones de correo válidas, la URL del foro y el nombre de usuario y clave del administrador del foro. El cronjob que verifica la base de datos del foro en busca de nuevos comentarios cada 15 minutos se llama tecleando crontab -e, y añadiendo */15 * * * */full/path/to/posting-watcher -c. Lo importante es asegurarse de que el script encuentra el módulo PhpbbDB.pm. Si se guarda PhpbbDB.pm en una ubicación diferente al resto de módulos Perl, podemos apuntar posting-watcher al directorio de módulos especificando use lib ‘/path/to/moduledirectory’. Podemos extender el script para que borre automáticamente los posts que

RECURSOS [1] Listados de este artículo: http:// www.linux-magazine.es/Magazine/ Downloads/24 [2] Benjamin Trott, “Comment Spam” http://www.sixapart.com/about/ news/2003/10/comment_spam.html [3] Software de foros phpBB: http:// phpbb.com

Figura 9: Confirmación de la eliminación.

cumplan un criterio específico (que contengan más de un cierto número de links, o ciertas palabras clave, por ejemplo) sin pedir permiso al moderador. ■ ¡Lucha al spam!

[4] Excelente tutorial sobre Rose: http:// search.cpan.org/dist/Rose-DB-Object/ lib/Rose/DB/Object/Tutorial.pod [5] Michael Schilli, “¡Ve a por él! Búsqueda de escritorio en Perl”, Linux Magazine número 12: http:// www.linux-magazine.es/issue/12/ Perl.pdf

Listado 2: posting-watcher (continuación) 081 082 083 084 085 086 087

$key), $key ); $cache->set(“key$key”, $id, $EXPIRE);

$latest = $id; } $cache->set(“_latest”, $latest); 088 } 089 090 ############################# ############## 091 sub genkey { 092 ############################# ############## 093 return Digest::MD5::md5_hex( 094 Digest::MD5::md5_hex( 095 time(). {}. rand(). $$)); 096 } 097 098 ############################# ############## 099 sub mail { 100 ############################# ############## 101 my($id, $body, $key) = @_; 102 103 my $m = Mail::Mailer->new(‘sendmail’) ;

104 105 106

$m->open({ To => $TO, Subject => “Forum News (#$id) [delete-key $key]”, 107 From => $REPL }); 108 109 print $m $body; 110 } 111 112 ############################# ############## 113 sub format_post { 114 ############################# ############## 115 my($id, $text, $topic, $key) = @_; 116 117 my $t = Text::ASCIITable->new( 118 {drawRowLine => 1}); 119 120 $t->setCols(‘Header’, ‘Content’); 121 $t->setColWidth(“Header”, 6); 122 123 $Text::Wrap::columns=60; 124 125 $text =~ s/[^[:print:]]/./g; 126 127 $t->addRow(‘post’, “#$id”); 128 $t->addRow(‘topic’, $topic);

WWW.LINUX- MAGAZINE.ES

129

$t->addRow(‘text’, wrap(“”, “”, $text)); 130 $t->addRow(‘key’, “[delete-key $key]”); 131 132 return $t->draw(); 133 } 134 135 ############################# ############## 136 sub msg_remove { 137 ############################# ############## 138 my($post_id) = @_; 139 my $mech = 140 WWW::Mechanize::Pluggable->ne w(); 141 $mech->get($FORUM_URL); 142 143 $mech->phpbb_login($FORUM_USE R, 144 $FORUM_PASS); 145 $mech->get( 146 “$FORUM_URL/viewtopic.php?p=$ post_id”); 147 $mech->phpbb_post_remove($pos t_id); 148 }

Número 24

45


DESARROLLO • Python

Perder ficheros es algo que nos pasa a todos, tarde …

MÁXIMA SEGURIDAD Vamos a ver cómo podemos crear un programa en Python que emplee Gamin y Subversion para mantener seguro nuestro directorio. POR JOSE MARÍA RUÍZ

¿

Quién no ha borrado algo sin querer alguna vez? ¿o ha modificado un fichero y después ha olvidado el porqué? Se supone que los ordenadores están aquí para ayudarnos, pero muchas veces se convierten en nuestra peor pesadilla.

Los desastres ocurren Cuando comencé a escribir para esta revista mantenía todos los ficheros de los artículos en directorios en mi sistema de ficheros. Después de un par de números comenzaron a aparecer los problemas. ¿Cuándo hice esto y por qué? ¿Acaso esa función era errónea? ¿Por qué cambié el último párrafo? Y lo peor de todo, en un par de «rm -rf» borré artículos completos que no pude recuperar. Menos mal que Linux Magazine es de papel y pude recuperarlos, pero ¡a la vieja usanza, a mano! El hombre es el único animal que tropieza dos veces con la misma piedra. Así que como estaba «anestesiado», como describe Alan Cooper en su libro «The Inmates are Running the Asylum», volví a las andadas, porque claro… todo el mundo usa los ficheros de esta manera ¿no?. No tardaron en ocurrir nuevos desastres. Reconozcámoslo, el sistema de ficheros es bastante tonto. Ni todas las papeleras de reci-

46

Número 24

claje del mundo te pueden librar de cometer errores. De hecho, ni tan siquiera es capaz de guardar versiones o metadatos de forma coherente. Desgraciadamente estamos anestesiados, se nos ha enseñado que esto debe ser así. Los creadores de sistemas de ficheros se afanan inútilmente en hacerlos más rápidos, pero se olvidan que el objetivo final del sistema de ficheros es almacenar información. Y cuanto más segura esté esa información, mejor. Para realizar este programa necesitamos instalar Subversion y el soporte para Python de Gamin.

Sistemas de control de versiones En lo más profundo de la más escondida cueva de hackers se fue desarrollando durante unos 15 años la solución a este problema. Crear grandes programas es algo ya bastante complicado de por sí como para encima tener que asegurarse de que el código fuente de los mismos no se pierda y sea utilizable. Por ello apareció CVS, Concurrent Version System (ver Recurso [1]). Con él es posible mantener código fuente en un servidor seguro, realizar cambios sobre él de forma controlada y lo más importante: poder desha-

WWW.LINUX- MAGAZINE.ES

cer los cambios. CVS ha sido el sistema de control de cambios por excelencia durante muchos años. Con el tiempo, sus defectos fueron convirtiéndose en pequeños precios que la gente se acostumbró a pagar (de nuevo un software «anestesió» a sus usuarios). Por sorprendente que parezca, CVS no permite renombrar ficheros. Si quieres renombrar un fichero debes borrarlo y crear uno nuevo con el nuevo nombre, perdiendo toda la información relacionada con el fichero original. Ante tal situación, y hace apenas unos años, comenzaron a aparecer alternativas a CVS. Estas alternativas fueron diseñadas para poder almacenar cualquier tipo de fichero, no sólo ficheros de texto. Una de esas alternativas es Subversión, al que denominaré a partir de ahora SVN (ver Recurso [2]). Los desarrolladores de SVN tuvieron claro desde un principio que debían permitir a la gente sacar provecho de su trabajo. Lo diseñaron para poder ser extendido y reutilizado desde distintos lenguajes de programación. Su diseño es absolutamente modular. Podemos almacenar información en SVN pero ahora surge un problema ¿qué información debemos almacenar?


Python • DESARROLLO

Gamin Imaginemos que tenemos una cantidad de ficheros que son especialmente importantes para nosotros, o ¿acaso nadie los tiene? Incluso los programas tienen ficheros que son imprescindibles para ellos. ¿Cómo podría controlarse la situación de esos ficheros? La solución simple y errónea consiste en hacer un programa que constantemente compruebe los ficheros. Básicamente, el programa debería arrancar, volverse un daemon, y cada cierto tiempo comprobar el estado del fichero. A esta técnica se le denomina polling, y la verdad es que es una solución a medias (ver Figura [1]). Digamos que comprobamos el estado del fichero cada 10 minutos. Si justo después de la última comprobación el fichero desaparece, tardaremos 10 minutos en darnos cuenta de este hecho. Si el fichero es importante, habremos vivido durante 10 minutos en la felicidad sólo para darnos cuenta de que nuestro sistema no nos ha advertido de nada hasta que era demasiado tarde. Para solucionar este otro problema de los sistemas de ficheros tradicionales Sillicon Graphics Interactive (SGI) diseñó para su sistema UNIX IRIX el programa FAM (File Alteration Monitor, ver Recurso [3]). FAM permite automatizar la monitorización de ficheros, de forma que si un fichero es utilizado podemos indicarle al programa que ejecute una acción. FAM, al igual que pasaba con CVS, también posee fallos debido a que fue diseñado para sistemas más primitivos que los actuales. No sólo eso, como todo buen proyecto de una gran empresa está sobredimensionado. Posee un número enorme de características claramente innecesarias para un sistema normal. Gnome empleaba FAM, pero necesitaba algo mejor. Por ello sus desarrolladores crea-

Figura 2: Versiones de ficheros en SVN.

ron Gamin (ver Recurso [4]). Gamin posee un diseño más simple, sólo desarrolla un subconjunto de actividades que realizaba FAM. Fue creado para ser una librería que los programas de Gnome pudieran usar para controlar el estado del sistema de ficheros, mientras que FAM es todo un sistema basado en un daemon.

Cocinemos con estos ingredientes Tenemos Gamin, SVN y un problema. ¿Cómo podríamos tener controlado un directorio cuyo contenido no sólo no queremos perder accidentalmente, sino del que además queremos guardar los cambios que realicemos sobre él? Vamos a crear un programa Python que, ejecutándose en segundo plano, controle los cambios que realicemos a una serie de directorios. De esta forma, cada vez que abramos un fichero y lo guardemos no sólo se almacenará en el sistema de ficheros, sino que Subversion se encargará de almacenarlo en un repositorio.

¿Alguien ha tocado algo? Comencemos con Gamin, y con un ejemplo que aparece en el FAQ de su sitio web, lo podemos ver en el Listado [1]. Gamin funciona de la siguiente manera. Creamos un monitor que será el encargado de controlar la situación. Este monitor acepta rutas del sistema de ficheros a las que asociamos una función, tradicionalmente denominada callback. Los callback son funciones que pasamos a un programa para que él las ejecute cuando lo determine oportuno, generalmente en respuesta a un evento. Estos pasos se realizan en el siguiente código: mon = gamin.WatchMonitor() mon.watch_directory(“.”,callback)

El primer parámetro de watch_directory() le indica al monitor, que hemos llamado mon, el directorio a controlar. En este caso es el mismo directorio en el que está el programa. Gamin posee dos métodos: • watch_directory(), para directorios • watch_file(), para ficheros Una vez que hemos «enganchado» un monitor a un fichero o directorio, Gamin se dedica a comprobar si se han efectuado cambios en el mismo. A estos cambios se les denomina eventos. Para gestionarlos poseemos dos métodos: • handle_one_event() gestiona un evento

WWW.LINUX- MAGAZINE.ES

Figura 1: Comunicación Asíncrona vs Polling.

• handle_events() gestiona todos los eventos El primero es bloqueante, mientras que el segundo no lo es. ¿Qué significa esto? Una función es bloqueante cuando al ejecutarse para el programa. Es como si todo se parase para que se ejecute la función. Una no bloqueante no requiere que se «paren máquinas». event_pending() nos indica si existen eventos a tratar cuando devuelve un número mayor que 0. Guardamos en ret el valor que nos devuelve y usamos un if para ver si existen eventos. Si se da tal caso, procesamos el primero de los eventos de forma bloqueante, y después todos los restantes de forma no bloqueante. Cuando ejecutamos la acción asignada a una ruta, la función callback recibe dos parámetros: la ruta que se ha visto afectaba por el evento y el tipo de evento.

Listado 1: Ejemplo de uso de Gamin 01 02 03 04 05 06 07

#!/usr/bin/env python import gamin import time def callback(path, event): print “Ha ocurrido el evento %s en el fichero %s” % (event, path)

08 09 mon = gamin.WatchMonitor() 10 mon.watch_directory(“.”, callback) 11 time.sleep(1) 12 ret = mon.event_pending() 13 if ret > 0: 14 ret = mon.handle_one_event() 15 ret = mon.handle_events() 16 mon.stop_watch(“.”) 17 del mon

Número 24

47


DESARROLLO • Python

Subversion en 5 minutos Ya sabemos cómo usar Gamin, ahora toca SVN. Subversion se comporta de forma muy parecida a CVS. Un directorio se importa a un repositorio, que no es más que un sitio donde almacenar ficheros en un servidor. Figura 3: Probamos nuestro sistema.

Debido a que Gamin debe ser compatible con FAM, el tipo de evento se indica mediante un número. En nuestro caso la salida es la que aparece en la Figura [1]. ¿Qué nos indican esos números? ¿8 y 9? Por no complicar el código no he introducido una tabla de traducción. He puesto en la Tabla [1] todos los códigos y su significado correspondiente. Para finalizar, con stop_watch() paramos el monitor y eliminamos el objeto con del. Este sencillo ejemplo muestra el uso de Gamin, que como hemos podido comprobar, no es excesivamente complicado.

Subversion, a diferencia de CVS, guarda versiones de directorio y ficheros. De esta forma puede registrar cambios como el movimiento de un fichero. Subversion asigna un número de versión a cada cambio, de forma que de un mismo fichero tendremos muchas versiones, ver Figura [2]. Cuando un directorio ha sido importado debemos realizar un checkout. De esta forma obtenemos no sólo los ficheros originales, sino también los necesarios para el funcionamiento de SVN. Estos ficheros especiales se almacenan en directorios ocultos de nombre .svn.

Listado 2: Programa de ejemplo 01 02 03 04 05 06 07 08 09 10 11

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

#!/usr/local/bin/python import import import import

sys os gamin time

## Acciones def commit(fichero): os.system(‘svn commit ‘+fichero+’ -m \’’+ time.asctime() +’\’’) def delete(fichero): commit (fichero) def crea (fichero): pass def cambiado (fichero): commit(fichero)

def nada(fichero): pass

eventos = { 1 : cambiado, #”GAMChanged”, 2 : delete, #”GAMDeleted”, 3 : nada, #”GAMStartExecuting”, 30 4 : commit, #”GAMStopExecuting”, 31 5 : crea, #”GAMCreated”,

48

Número 24

32 6 : nada, #”GAMMoved”, 33 7 : nada, #”GAMAcknowledge”, 34 8 : nada, #”GAMExists”, 35 9 : nada #”GAMEndExist” 36 } 37 38 39 def callback(ruta, evento): 40 eventos[evento](ruta) 41 42 def main(ruta): 43 mon = gamin.WatchMonitor() 44 mon.watch_file(ruta, callback) 45 46 try: 47 print “Monitorizando %s, pulsa Ctrl-C para salir.” % ruta 48 while 1: 49 ret = mon.event_pending() 50 if ret > 0: ret = mon.handle_one_event() 51 time.sleep(1) 52 except KeyboardInterrupt: 53 pass 54 55 print “Dejamos de monitorizar “,ruta 56 mon.stop_watch(ruta) 57 del mon 58 59 if __name__ == “__main__”: 60 61 main(“.”)

WWW.LINUX- MAGAZINE.ES

Cuando se quiere informar de un cambio sobre un fichero se realiza un commit. Cuando se realiza esta acción se añade un mensaje de texto informando de la acción que hemos realizado. Con el commit se genera una nueva versión de fichero. A la última versión se le llama siempre HEAD y a la anterior PREV. Para que un fichero, que no estaba cuando se importó el directorio a SVN, pase a pertenecer al repositorio debemos añadirlo mediante la orden add. Si queremos borrar un fichero debemos ejecutar un del, y para moverlo o renombrarlo un move. Estas son las acciones más comunes. Ahora bien, ¿cómo controlamos todo esto? SVN nos permite crear repositorios locales en nuestro propio sistema de ficheros, así que vamos a crear uno en nuestro home, en mi caso en /home/josemaria/subversion (usando el shell). > svnadmin create /home/U josemaria/subversion >

¡Así de sencillo!, ya tenemos nuestro repositorio listo para trabajar. Digamos que tenemos un directorio donde guardamos ficheros muy importantes: > ls fichero-importante.txtU foto-importante.jpg > svn import . file:///home/U josemaria/subversion -mU “Importamos ficheros” Añadiendo foto-importante.jpg AñadiendoU fichero-importante.txt Commit de la revisión 1. >

Listo, ya tenemos nuestros ficheros importantes en nuestro repositorio. ¿No es muy complicado, verdad? Pero tenemos un problema con este directorio, el que hemos importado, resulta que no está preparado para funcionar con SVN. Debemos hacer un checkout, que creará los mismos ficheros que hemos importado. Podemos hacer el checkout en cualquier sitio. > svn checkout file:///home/U josemaria/subversion A subversion/foto-importante.jpg


Python • DESARROLLO

A subversion/U fichero-importante.txt Revisión obtenida: 1 > ls fichero-importante.txtU foto-importante.jpg subversion/

Ahora tenemos un directorio llamado subversion, es el directorio que hemos usado como repositorio. Dentro de él estarán nuestros ficheros importados, así que vamos a meternos en él, modificaremos el fichero fichero-importante.txt y haremos un commit. > cd subversion > cat > fichero-importante.txt Hola Linux Magazine ^D > svn commitU fichero-importante.txt -mU “Saludo a LM” Enviando fichero-importante.txt Transmitiendo contenido deU archivos . Commit de la revisión 2. >

Y listo, ya tenemos nuestro nuevo commit. A cada revisión se le asigna un número y vamos por la revisión 2. ¿Y si queremos recuperar la revisión 1 (la original)? > svn update -r 1U fichero-importante.txt U fichero-importante.txt Actualizado a la revisión 1. >

Ahora hemos vuelto a la revisión 1 de fichero-importante.txt. Una de las mejores características de SVN es que podemos pedirle por ejemplo la última revisión a fecha de ayer. De esta forma podemos olvidarnos de los números de revisión.

Python y SVN Digamos que queremos hacer un checkout de nuestro directorio… ¡pero desde Python claro!. Hacía un rato que no veíamos aparecer a nuestro lenguaje favorito. El soporte para Python en SVN era bastante rudimentario. Básicamente crearon una función Python por cada función C. Esto es bastante problemático debido a que tienes que ser tú quien gestione la memoria, una tarea que Python ya suele realizar por nosotros. Gracias al proyecto Summer Of Code de Google Walter Mundt (ver Recurso [5]), se ha estado trabajando en el enlace entre Python y SVN durante 2006. Pero desgraciadamente, y a pesar de que incluso aparecen ejemplos de uso de Python con SVN en libro «Version Control with Subversion», la inestabilidad y falta de documentación de estas librerías no son las adecuadas. Así que he decidido sacarme un as de la manga. ¿Por qué no invocar los comandos SVN como si estuviésemos en la linea de comandos? Y eso vamos a hacer. Crearemos una clase Python que encapsule la ejecución de estos comandos. ¿Pero qué comandos nos interesan realmente? Pues los siguientes: • commit • del • add • move

Al horno Con nuestros ingredientes listos, ahora sólo queda juntarlos de forma correcta. Gamin nos permite saber cuándo algo ha cambiado y SVN nos permite almacenar cambios. Lo que tenemos que hacer es asignar a eventos de Gamin acciones de SVN a través de un programa en Python. Gamin monitoriza directorios o ficheros. Si borramos un fichero del directorio eso implica un cambio en el directorio. Como hemos podido ver, se debería ejecutar un svn del para borrar ese fichero también de SVN.

Tabla 1: Códigos devueltos por Gamin 1 2 3 4 5 6 7 8 9

GAMChanged El fichero ha cambiado GAMDeleted El fichero ha sido borrado GAMStartExecuting Un fichero se ha comenzado a ejecutar GAMStopExecuting Un fichero se ha dejado de ejecutar GAMCreated El fichero ha sido creado GAMMoved Se ha movido el fichero (nunca se da) GAMAcknowledge Se genera después de cancelar un monitor GAMExists Se genera cuando se activa un monitor sobre un fichero GAMEndExist Se genera cuando se termina de listar un directorio

WWW.LINUX- MAGAZINE.ES

Figura 4: Nuestro programa reaccionando al cambio.

Esto nos lleva a tener que tomar una decisión. Consideraremos que cualquier cambio en el directorio supondrá un commit, para no hacer el programa excesivamente grande. El código del programa se encuentra en el Listado [2], y podemos ver lo que ocurre cuando se ejecuta. En la Figura [3] cambiamos el contenido del fichero ejemplo1.txt, y en la Figura [4] se puede ver cómo este cambio dispara un commit al SVN. El programa funciona en primer plano, por ejemplo podemos arrancarlo en un terminal dentro del directorio que queremos tener resguardado. Irá mostrando por el terminal las acciones que se vayan realizando sobre los ficheros.

Conclusión Es una pena que Subversion (SVN) no tenga un soporte mejor para Python. Había pensado crear para este artículo un graficador de actividad de Subversion, pero me resultó imposible. Esperemos que en los próximos meses el esfuerzo que están desarrollando los desarrolladores de Subversion dé sus frutos. Yo seré el primero en hacer uso de sus desarrollos. Gamin está bien, pero posee limitaciones. Pretende ser un sustituto perfecto de FAM pero de menor potencia. El problema es que FAM fue diseñado hace muchos años. En los sistemas BSD hace tiempo que se posee el sistema Kqueue, que permite realizar las mismas acciones que FAM pero con mayor flexibilidad. La comunidad Linux desarrolló el sistema epoll con el mismo objetivo. Está claro que Python es cada vez más la opción preferida por los proyectos de soft■ ware libre.

RECURSOS [1] http://http://www.nongnu.org/cvs/ [2] http://subversion.tigris.org [3] http://oss.sgi.com/projects/fam/ [4] http://www.gnome.org/~veillard/ gamin/ [5] http://2006.planet-soc.com/ subversion

Número 24

49


DESARROLLO • Tcl3D

Modelos Tridimensionales en los Scripts TCL con Tcl3D

SCRIPTS GRÁFICOS Tcl3D acerca el mundo de los efectos 3D a los scripts TCL. En este artículo vamos a mostrar cómo empezar a programar scripts con gráficos en 3D. POR CARSTEN ZERBST

L

os PCs actuales tienen potencia de proceso suficiente como para poder manejar imágenes 3D que antes sólo podían proporcionar las Silicon Graphics. De este modo queda abierto para cualquiera el mundo de la programación 3D. Los desarrolladores de OpenGL proporcionan una API en C esencial, pero gracias a la nueva extensión Tcl3D de Paul Obermeier [2], comenzar con OpenGL se ha convertido en algo bastante sencillo. Tcl3D ofrece acceso a los comandos OpenGL desde TCL. Brian Paul desarrolló su herramienta de controles OpenGL poco después de la primera aparición de OpenGL. Sin embargo, los desarrolladores de Tcl tenían que utilizar C para escribir las funciones necesarias que les permitieran crear o iluminar los modelos. Tcl3D elimina esta necesidad, proporcionando a los scripts un acceso directo a la API OpenGL. Soporta incluso extensiones como OpenGL 2.0, la librería Nvidias CG Shader o el soporte para joystick SDL [4]. Para instalar Tcl3D hacen falta tener dis-

50

Número 24

ponibles el intérprete Tcl, la librería OpenGL y probablemente CG y SDL. OpenGL está disponible como una implementación software, Mesa [5] o como una aceleración hardware correspondiente con la tarjeta gráfica. Dependiendo del fabricante, puede ser una implementación abierta en el controlador X11 o una variante propietaria, por ejemplo ATI o Nvidia.

Una Instalación Sencilla Tcl3D es fácil de instalar. La página web en [2] proporciona tanto los ficheros fuente como los binarios precompilados para Linux. La versión actual es la 0.3. Como el resto de las extensiones de Tcl, Tcl3D puede residir en cualquier parte del sistema de ficheros, tan sólo habrá que incluir la ruta completa en el script. Se puede instalar la extensión en una de las rutas por defecto, de modo que se pueda encontrar en la variable Tcl $auto_path. Además de la librería 3D Tcl3D, es conveniente instalar el paquete con los ejem-

WWW.LINUX- MAGAZINE.ES

plos de programación. Este paquete contiene cerca de 100 programas con ejemplos útiles que le ayudarán a la hora de programar. Los directorios redbook14 y NeHe son un buen punto de partida si se es nuevo en el mundo de OpenGL. El primero contiene los ejemplos de la Guía de Programación en OpenGL [6], denominada Redbook (libro rojo) por el color de sus pastas, mientras que el otro contiene los ejemplos del tutorial de OpenGL disponible en [8].

Con Comandos de Sobra OpenGL y las librerías que lo acompañan contienen cerca de 300 comandos que cubren un amplio rango de funciones para mostrar modelos 3D, comprendiendo coordenadas, líneas, triángulos y cuadrados. Las rutinas para las esferas o los cubos simplemente crean la “piel”. Un sistema CAD o la librería Open Cascade CAD [9] serán una buena elección en modelos de construcción más complejos.


Tcl3D • DESARROLLO

El Bluebook (libro azul) [7] describe la API OpenGL; la versión en línea o alguna edición antigua son más que suficientes para la mayoría de los casos. Tcl3D utiliza los mismos nombres de comandos que Tcl y del mismo modo, la forma en que las funciones Tcl se corresponden con las funciones en C son autoexplicativas: la documentación contiene detalles precisos por si fueran necesarios. La ventaja de esta solución es que los ejemplos programados en C se pueden portar fácilmente a Tcl. Para comenzar es imprescindible tener unos buenos ejemplos, sobre todo si se quiere ver algo más que una simple ventana negra en la pantalla. Las tres dimensiones proporcionan más oportunidades de equivocarse. Si se olvida la iluminación o se enfoca la cámara virtual en una dirección equivocada, no se verá nada.

Montando la Escena El código del Listado 1 crea el ejemplo “Hola mundo” en OpenGL, que se muestra en la Figura 1, un triángulo y un cuadrado. La línea 8 solicita la extensión Tcl. Si Tcl3D no está instalado en la ruta normal, la línea 6 muestra cómo modificarla. El elemento 3D es creado con el comando togl en la línea 71. Las opciones -with y -height deberían resultar familiares de otros elementos Tk; a continuación le siguen las otras opciones específicas de OpenGL. La opción -double habilita el doble búfer; es decir, OpenGL dibuja una imagen nueva en un búfer y luego sustituye la imagen de la pantalla con la imagen del búfer para evitar los parpadeos a la hora de dibujar la escena. Los parámetros -createprop, -reshapeproc y -displayproc basados en tres proce-

dimientos Tcl al elemento, llaman una vez a Createproc en la inicialización, Reshapeproc cuando se redimensione y Displayproc cuando haya que dibujar la pantalla. El primer procedimiento de las líneas 11 a la 14 se llama tclCreateFunc. Se encarga de inicializar OpenGL; sólo se requiere que se ejecute una vez por cada programa. Un principio de diseño es que las opciones se aplican hasta que se modifiquen. Si se ha establecido el color para una forma a rojo, OpenGL coloreará todos los objetos siguientes de rojo, sin importar si hay diez o diez mil. El color de fondo establecido en la línea 13 por glClearColor se aplica a cada pantalla. En las líneas siguientes, de la 17 a la 48, el script define la función tclDisplayFunc. Tcl3D utiliza esta función cada vez que tenga que dibujar la pantalla. Después de

Listado 1: El “Hola Mundo” en OpenGL 01 #!/usr/bin/wish 02 # Ejemplo simple Tcl3d basado en el 03 # tutorial de OpenGL de http://nehe.gamedev.net 04 05 # Ampliar la ruta de búsqueda si es necesario: 06 # lappend auto_path /home/cz/tcl3d0.3 07 08 package require tcl3d 0.2 09 10 # Establece unos cuantos valores iniciales, que se llaman cuando se crea la ventana 11 proc tclCreateFunc {toglwin} { 12 glShadeModel GL_SMOOTH ;# habilita transiciones de color smooth 13 glClearColor 0.1 0.7 1 0.5 ;# define color de fondo 14 } 15 16 # crea y muestra un modelo 3D 17 proc tclDisplayFunc {toglwin} { 18 # Borra el color y los búffers de profundidad 19 glClear [expr {$::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT}] 20 21 # Establece coordenadas

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

iniciales glLoadIdentity glTranslatef -1.5 0.0 -10.0 # Dibuja un triángulo rojo glColor3f 1 1 0 glBegin GL_TRIANGLES glVertex3f 0.0 1.0 0.0 glVertex3f -1.0 -1.0 0.0 glVertex3f 1.0 -1.0 0.0 glEnd # Esquinas con colores distintos glTranslatef 3.0 0.0 0.0 ;# reinicio glBegin GL_QUADS glColor3f 1.0 0.0 0.0 ;# Primera esquina roja glVertex3f -1.0 1.0 0.0 glColor3f 0.0 1.0 0.0 ;# Segunda esquina verde glVertex3f 1.0 1.0 0.0 glColor3f 0.0 0.0 1.0 ;# Tercera esquina azul glVertex3f 1.0 -1.0 0.0 glColor3f 1.0 1.0 1.0 ;# Cuarta esquina blanca glVertex3f -1.0 -1.0 0.0 glEnd

43 44 45 46 # Muestra nuevos modelos 47 $toglwin swapbuffers 48 } 49

WWW.LINUX- MAGAZINE.ES

50 # Calcula la vista para el modelo, 51 # si cambia el tamaño de la ventana 52 proc tclReshapeFunc {toglwin b h} { 53 # evita la división por cero 54 set h [expr {$h<1 ? 1 : $h}] 55 56 # Establece la vista 57 glViewport 0 0 $b $h 58 glMatrixMode GL_PROJECTION 59 glLoadIdentity 60 61 # Calcula y habilita la perspectiva 62 set angle 46 63 set perspective [expr{double($b)/double($h)}] 64 set von 0.1 65 set bis 100.0 66 gluPerspective $angle $perspective $from $to 67 glMatrixMode GL_MODELVIEW 68 } 69 70 # Dibuja la ventana 71 togl .toglwin -width 640 -height 480 \ 72 -double true -createproc tclCreateFunc \ 73 -reshapeproc tclReshapeFunc\ 74 -displayproc tclDisplayFunc 75 pack .toglwin -expand 1 -fill both

Número 24

51


DESARROLLO • Tcl3D

Figura 1: El código del script del Listado 1 crea un modelo 3D simple compuesto por un sencillo triángulo coloreado y un cuadrado multicolor.

que glClear haya borrado el contenido de la pantalla anterior en la línea 19, se dibujan el triángulo y el cuadrado. Al mismo tiempo, glLoadIdentity borra las coordenadas de comienzo y la rotación glTranslatef previas y establece unas coordenadas nuevas de comienzo. El sistema de coordenadas se muestra en la Figura 2: el eje X e Y describen la pantalla, y el eje Z añade la profundidad. La línea 26 llama a la función glColor3f para establecer el color del objeto a rojo: los valores del color son tomados según el modelo RGB, con valores entre 0 y 1 (rojo, verde y azul). El bloque de las líneas 27 a 31 definen el primer triángulo con tres vértices desde glBegin GL_TRIANGLES hasta glEnd. El script puede especificar varios triángulos entre las funciones glBegin y glEnd. La mayoría de las superficies se pueden obtener usando triángulos, pero OpenGL posee otras primitivas gráficas, como pun-

Figura 3: La esfera del Listado 2 está compuesta por 2600 elementos. A pesar de esto, se puede mover suavemente utilizando el ratón y el teclado

tos, líneas y cuadrados. Como ejemplo, véase el cuadrado de las líneas 34 a 44. Después de llamar a glTranslatef para definir el sistema de coordenadas inicial, aparece otra lista de coordenadas entre glBegin y glEnd. Para dibujar un cuadrado, hay que asegurarse de que los cuatro puntos pertenecen al mismo plano. En caso contrario, OpenGL no mostrará el cuadrado correctamente y aparecerán huecos en la geometría.

Objetos con Gradientes de Colores La descripción del cuadrado también contiene una definición de color para cada vértice, provocando que OpenGL pinte un gradiente de color en la superficie del cuadrado. Ahora que la forma está completamente definida, swapbuffers copia la imagen producida en el búfer a la ventana mostrándose el primer gráfico en OpenGL (véase la Figura 1).

Figura 2: Cuestión de vistas: sin la vista adecuada, el observador no verá nada en OpenGL. La vista emula una cámara en una escena virtual, pero sólo muestra los objetos entre los dos planos.

52

Número 24

WWW.LINUX- MAGAZINE.ES

La función tclReshapeFunc (líneas de la 52 a la 68) se invoca cada vez que se redimensione la ventana, definiendo el modelo visual. De ello se encarga la librería de utilidades de OpenGL (Glu), que proporciona la función gluPerspective. La vista se denomina viewport (véase la Figura 2). El visor se encuentra en las coordenadas iniciales y muestra una sección del modelo 3D definido por la altura y anchura de la ventana. En la línea 62 se define el ángulo de 46º correspondiente

Listado 2a: Lista de Visualización 01 # Establece los valores iniciales y crea la lista de visualización. 02 # Llamada cuando se crea la ventana 03 proc tclCreateFunc {toglwin} { 04 # Fondo negro 05 glClearColor 0.0 0.0 0.0 0.0 06 07 # Algunos ajustes 08 glClearDepth 1.0 09 glEnable GL_DEPTH_TEST 10 glShadeModel GL_FLAT 11 glDepthFunc GL_LEQUAL 12 glHint GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST 13 14 sphere 100 ;# Se crea la lista de visualización únicamente una vez 15 }


Tcl3D • DESARROLLO

Figura 4: En vez de usar un script para crear cada elemento individualmente en un modelo 3D, los programas OpenGL pueden cargar y mostrar modelos 3D preconstruidos.

al campo de visión del ojo humano. El viewport tan sólo muestra aquellas partes del modelo especificadas que se encuentren en el campo de visión, líneas 64 y 65. Al contrario que en una fotografía, las secciones delante o detrás de este sector no aparecen desenfocadas, sino que quedan completamente invisibles. El Listado 1 presenta dos defectos. Por un lado, la tercera dimensión no es visible, ya que el observador tan sólo puede ver el modelo desde una única perspectiva. El segundo inconveniente del código del Listado 1 es el rendimiento. El procedimiento tclDisplayFunc redefine el modelo 3D cada vez que se repinta la pantalla. Esto puede estar bien para modelos pequeños, pero la secuencia podría ser demasiado lenta, incluso con 100 triángulos solamente.

Figura 5a: El proceso comienza con una red simple de triángulos que juntos forman un modelo con forma de esfera.

Movimiento

Transformación

Un segundo ejemplo que dibuja una esfera de unos 2600 triángulos (Figura 3) muestra este problema. Tener que redibujar la esfera consume demasiado tiempo. Para evitarlo, el procedimiento tclCreateFunc (Listado 2a) crea una lista de visualización. Ésta contiene figuras geométricas precalculadas que el programa puede invocar cada vez que las necesite. Utilizando esta lista se mejora el rendimiento, ya que la creación de una forma puede tardar de 10 a 1000 veces más tiempo que el simple hecho de mostrarla, dependiendo de la complejidad de la misma. La esfera (sphere) (Listado 2b) crea primero una lista y luego la rellena con los triángulos, de forma similar a como se ha hecho en el primer ejemplo. Dependiendo de la latitud, los triángulos cambian de color; para ello el script utiliza el script hls2rgb [12].

En vez de insertar la esfera en una posición determinada, las funciones Tcl3D glTranslatef y glRotatef establecen un sistema de coordenadas nuevo y una orientación nueva (Líneas de la 6 a la 9). Si las variables de posición y orientación cambian, la esfera se mueve a una posición diferente. En vez de cambiar la posición del observador, el script realmente mueve el modelo completo. Para interpretar la interacción del usuario, el script utiliza la técnica de ligado de Tk en combinación con funciones callback. Estas funciones reaccionan ante los eventos producidos por el ratón y por el teclado. Pulsando los cursores se consigue que la esfera se mueva. La rueda del ratón modifica la distancia; manteniendo pulsado el botón izquierdo del ratón mientras se gira la rueda se rota

Listado 2b: Creando un Modelo Esfera 01 proc sphere {radius} { 02 set edge 10 03 set ::displayliste [glGenLists 1] 04 glNewList $::displayliste GL_COMPILE 05 for {set l 0} {$l <= 360} {incr l 5} { 06 for {set b -90 } {$b <= 90} {incr b 5} { 07 # Posición en el arco 08 set lr [expr {$l/180.0 * $::PI}] 09 set br [expr {$b/180.0 * $::PI}] 10 # Establece el color para el

siguiente elemento 11 set hue [expr {sin($br/3.0)}] 12 eval glColor3f [hls2rgb $hue 1 1] 13 14 # Inserta triángulo 15 glBegin GL_TRIANGLES 16 glVertex3f \ 17 [expr {$radius*cos($l r)*cos($br)}]\ 18 [expr {$radius*sin($l r)*cos($br)}]\ 19 [expr {$radius*sin($br)}] 20 glVertex3f \ 21 [expr {$radius*cos($l r)*cos($br)}]\

WWW.LINUX- MAGAZINE.ES

22 [expr {$radius*sin($l r)*cos($br) +$edge}] \ 23 [expr {$radius*sin($br)}] 24 glVertex3f \ 25 [expr {$radius*cos($l r)*cos($br)}]\ 26 [expr {$radius*sin($l r)*cos($br)}]\ 27 [expr {$radius*sin($br) +$edge}] 28 glEnd 29 } 30 } 31 glEndList 32 }

Número 24

53


DESARROLLO • Tcl3D

Figura 5b: Un wrapper hace que el objeto parezca una esfera, escondiendo cualquier arista.

la esfera. Estas funciones también llaman a .toglwin postredisplay para forzar que se redibuje la escena después de que se haya completado la acción. Los usuarios interesados en imprimir en alta resolución sus resultados de Tcl3D podrán agradecérselo a Ian Gay por su proyecto tclgl2ps [10]. El programa crea documentos Postscripts genuinos y escalables, ofreciendo a los usuarios la posibilidad de crear impresiones de alta calidad.

Listado 2c: Mostrando el Modelo Esfera 01 proc tclDisplayFunc {toglwin} { 02 # Borra la pantalla y el búffer de profundidad 03 glClear [expr {$::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT}] 04 05 # Establece las coordenadas iniciales 06 glLoadIdentity 07 glTranslatef $::Posx $::Posy $::Posz 08 glRotatef $::Rotx 1.0 0.0 0.0 09 glRotatef $::Roty 0.0 1.0 0.0 10 glRotatef $::Rotz 0.0 0.0 1.0 11 12 # Llama a la lista de visualización 13 glCallList $::displayliste 14 15 $toglwin swapbuffers 16 }

54

Número 24

Figura 5c: Una textura apropiada convierte la superficie del objeto en una piedra con aspecto realista.

Texturas Los modelos 3D están hechos principalmente de triángulos, que se crean fácil y rápidamente. Sin embargo, harían falta millones de triángulos para poder emular detalles como la ropa o los ojos. Las imágenes complejas pueden aplicarse a los modelos 3D utilizando un proceso consistente en la aplicación de texturas. Las tarjetas gráficas modernas disponen de bastante memoria para éstas. La aplicación de la iluminación les da el último toque. El método de iluminación estándar proporcionado por OpenGL es tan atractivo como las luces de neón, pero hay otras alternativas. Incluso los modelos sencillos que utilizan unos cuantos triángulos pueden parecer bastante realistas si se les aplica una textura adecuada (Figuras 5a, 5b y 5c). Para permitirle a OpenGL que monte los mapas de bits para que reflejen la geometría, hay que proporcionarle las instrucciones específicas de qué poner y dónde ponerlo. Aquí es donde las dimensiones entran en conflicto: el sistema de coordenadas tridimensional X-Y-Z del triángulo con el sistema de coordenadas bidimensional S-T utilizado por la textura. El comando glTexCoord2f le indica a OpenGL qué parte de la textura (S, T) tiene que aplicar a la siguiente coordenada geométrica (X, Y, Z) definida. El Listado 3 muestra las partes importantes del código fuente. El programa principal inserta la función tclCreateFunc como -createproc dentro del elemento OpenGL. La librería llama a esta función para crear el contenido del elemento. La función carga la textura y crea la geometría. Los mapas de bits para las texturas se encuentran normalmente en el disco duro y las representaciones realistas utilizan fotografías de

WWW.LINUX- MAGAZINE.ES

las superficies. Se pueden encontrar texturas en Mayang [13], si se están buscando algunas de madera véase [14]. Cualquier mapa de bits puede utilizarse como textura, sin embargo, la longitud del lado debe de ser potencia de dos, por ejemplo 256 por 512. Para evitar los antiestéticos bordes que se producen por la repetición del patrón, es posible aplicar un filtro de Gimp para la creación de un patrón sin bordes (Filters | Map | Make seamless).

Soluciones Desafortunadamente, no existe en OpenGL ninguna función para cargar los mapas de bits directamente desde el disco duro; de hecho, el proceso requiere tres pasos. Primero, el script obtiene el mapa de bits utilizando el estilo típico de Tk image create photo -file nombre_fichero. Los programas Tk

Figura 5d: La estructura de la superficie de una piedra no depende de su forma. Una foto bidimensional de la superficie es suficiente como textura.


Tcl3D • DESARROLLO

utilizan normalmente este procedimiento para cargar mapas de bits para los botones. La construcción ifcatch de las líneas 9 a la 11 producen un mensaje de error en el caso de que el script falle a la hora de realizar la carga del fichero. Lo siguiente es mover el mapa de bits desde Tk hasta OpenGL. Tcl3D posee una función para ello; cargando una imagen Tk en un vector OpenGL. Primero, tcl3dVector crea un vector en la línea 17; su tamaño se define en función del ancho y el alto de la imagen multiplicado por el número de canales. Las imágenes normales tienen un canal para el rojo, otro para el verde y un último para el azul; algunas tienen un canal más para la transparencia (canal alfa). En la línea 18, la función tcl3dPhoto2Vector copia el contenido de la imagen al vector. Ahora hay dos versiones de la imagen, el vector OpenGL y

la imagen Tk. La línea 19 borra esta última para ahorrar espacio. Obviamente, OpenGL distorsionará el mapa de bits en la mayoría de los casos para hacerla coincidir con la geometría. Para ello, interpola los espacios entre puntos; el comando glTexParameteri suministra una interpolación lineal simple en las líneas 22 y 23. Luego glBindTexture crea un objeto textura a partir del vector existente (línea 28).

Texturas y Más Además de los mapas de bits, las texturas incluyen información adicional como la altura, la anchura y el tipo. En la línea 32 glTexImage2D aplica estos datos a la imagen desde el vector OpenGL creado anteriormente. Las texturas normalmente se localizan en la memoria de la tarjeta gráfica, con lo que la tarjeta podrá aplicar los datos a la figura geométrica sin necesidad de acceder a la memoria principal. El código de la línea 35 borra el

vector OpenGL que contiene la imagen para liberar memoria. Al contrario que Java, OpenGL no posee un recolector de basura que elimine las variables creadas. Por ello, hay que borrar de forma explícita cualquier variable creada en los pasos intermedios, como el vector. De otra forma, la memoria principal y la gráfica tenderían a llenarse, ralentizando la animación. Lo siguiente que el programa tiene que hacer es crear la figura geométrica y decorarla con la textura (de la línea 38 a la 42). Para crear un área con textura, OpenGL necesita los vértices del triángulo, el vector normal a los vértices y la posición en el mapa de bits. El vector normal es un vector de módulo uno, perpendicular a la superficie y apunta hacia arriba; por lo que, con el vector normal se define la superficie. OpenGL necesita este valor para calcular la iluminación y los reflejos. En el ejemplo, la función renderSphere de

Listado 3: Texturas 01 02 03 04 05 06

# Se llama una única vez proc tclCreateFunc {toglwin} { # unos ajustes glEnable GL_TEXTURE_2D glEnable GL_DEPTH_TEST glPolygonMode GL_FRONT_AND_BACK GL_FILL

07 08 # Carga la imagen en Tcl 09 if [catch {image create photo -file “worked_stone_8180226.JPG”} phImg] { 10 error “Error loading file: $phImg” 11 } 12 13 # Crea un vector OpenGL con el mapa de bits a partir de la imagen Tcl 14 set w [image width $phImg] 15 set h [image height $phImg] 16 set n [tcl3dPhotoChans $phImg] 17 set pTextureImage [tcl3dVector GLubyte [expr {$w * $h * $n}]] 18 tcl3dPhoto2Vector $phImg$pTextureImage 19 image delete $phImg ;# Bild aus Tcl löschen 20 21 # Especifica la interpolación 22 glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER $::GL_LINEAR 23 glTexParameteri GL_TEXTURE_2D

GL_TEXTURE_MAG_FILTER $::GL_LINEAR 24 25 # Crea la textura del vector OpenGL con el mapa de bits 26 set ::g_textureID [tcl3dVector GLuint 1] 27 glGenTextures 1 $::g_textureID 28 glBindTexture GL_TEXTURE_2D [$::g_textureID get 0] 29 30 if {$n == 3} {set type $::GL_RGB 31 } else { set type $::GL_RGBA} 32 glTexImage2D GL_TEXTURE_2D 0 $n $w $h 0 $type GL_UNSIGNED_BYTE $pTextureImage 33 34 # Borra el vector OpenGL con el mapa de bits 35 $pTextureImage delete 36 37 # Crea la lista de visualización... 38 set ::g_sphereDList [glGenLists 1] 39 glNewList $::g_sphereDList GL_COMPILE 40 # ...y la rellena con la geometría y la textura 41 renderSphere 0.0 0.0 0.0 1.5 $::resolution 42 glEndList 43 }

WWW.LINUX- MAGAZINE.ES

44 45 # Crea la esfera de triángulos con la textura 46 proc renderSphere {r p} { 47 [...] 48 # Calcula el vector normal 49 set normalX [expr {cos($theta2) * cos($theta3)}] 50 set normalY [expr {sin($theta2)}] 51 set normalZ [expr {cos($theta2) * sin($theta3)}] 52 glNormal3f $normalX $normalY $normalZ 53 54 # Proyección cilíndrica de la textura 55 glTexCoord2f [expr {-1.0 * ($j/double($p))}] \ 56 [expr { 2.0 * ($i+1)/ double($p)}] 57 58 # Calcula las coordenadas de posición 59 set posX [expr {$r * $normalX}] 60 set posY [expr {$r * $normalY}] 61 set posZ [expr {$r * $normalZ}] 62 glVertex3f $posX $posY $posZ 63 [...] 64 }

Número 24

55


DESARROLLO • Tcl3D

la línea 46 crea una esfera formada por múltiples tiras de triángulos (Figura 5a), donde el número de tiras es variable. La versión completa se encuentra disponible en el sitio web de Linux Magazine; el Listado 3 ofrece una muestra del procesamiento de la textura. El ángulo theta2 representa la latitud y theta3 la longitud (de las líneas 49 a la 51). Primero, el script calcula el vector normal. Esto es bastante simple para la esfera. Luego glTexCoord2f (línea 55) especifica qué punto de la textura se aplica a qué punto de la figura geométrica. La esfera requiere una proyección que pegue la textura plana a la superficie curva. El ejemplo utiliza una proyección cilíndrica simple.

Textura de Piedra Los resultados se muestran en la Figura 5c. El marco cuadrado del mapa de bits (Figura 5d) ha sido contraído para formar triángulos en los polos. Finalmente, glVertex3f especifica las coordenadas del punto del marco en la esfera para completar la definición de un punto.

El resto del código fuente define los triángulos para estas coordenadas y luego crea la superficie de la esfera. La Figura 5a solamente muestra las aristas. La textura (Figura 5d) convierte esta figura geométrica simple en una imagen bastante realista (Figura 5c).

Luces y Acción Se ha usado la iluminación estándar con la fría estética de una luz de neón. Como todo lo demás en OpenGL, la iluminación es una característica que se puede definir hasta el último detalle. El color de un objeto se ve influenciado tanto por las luces ambientales o los focos con colores y posiciones, como por el material de la superficie. Para los materiales, se pueden definir tanto los colores normales del cuerpo como los colores de los reflejos. Por ejemplo, el Listado 4 muestra fragmentos del código fuente que definen una imagen completa. Los usuarios pueden elegir el color de la esfera, la iluminación y los reflejos. El script parece

familiar con sus funciones tclCreateFunc (línea 13), tclReshapeFunc (reducida) y tclDisplayFunc (línea 37). tclCreateFunc en la línea 22 utiliza glEnable para habilitar la iluminación definida por el usuario y luego posiciona el primer foco, GL_LIGHT0 (de la línea 23 a la 25). Luego, glEnable habilita el material (líneas 28 y 29). La luz y el color están definidos por el procedimiento color (línea 47). Primero, tclCreateFunc llama a la función del color; la GUI utiliza esta función cada vez que el color cambie. El procedimiento color establece el color de la fuente de luz GL_LIGHT0 con el comando glLightfv de la línea 49. La función color2liste (línea 65) convierte el color desde la representación hexadecimal #fe0000 a RGB 1.0, 0.0, 0.0. Además de la iluminación, el color de la figura juega un rol importante. El grupo de funciones glMaterial se encargan de ello. Para la esfera del ejemplo,

Listado 4: Luces y Colores 01 02 03 04 05 06 07 08 09 10 11 12

#!/usr/bin/wish package require tcl3d # Colores iniciales set ambient #00d0d0 set specular #ffff00 set material #eeeeee set emission #000000 set shinines 25.0 # Establece la posición de la luz # Llamada una única vez durante la inicialización proc tclCreateFunc {toglwin} { # Color de fondo glClearColor 0.0 0.0 0.0 0.0

13 14 15 16 17 #glPolygonMode GL_FRONT_AND_BACK GL_LINE 18 glShadeModel GL_SMOOTH 19 glEnable GL_DEPTH_TEST 20 21 # Definición inicial de la luz 22 glEnable GL_LIGHTING 23 glEnable GL_LIGHT0 24 set light_position {1.0 1.0 1.0 0.0} 25 glLightfv GL_LIGHT0 GL_POSITION $light_position 26 27 # Habilita los parámetros

56

Número 24

específicos de luz del material 28 glColorMaterial GL_FRONT GL_DIFFUSE 29 glEnable GL_COLOR_MATERIAL 30 31 # inicializa los colores 32 color 33 } 34 35 # Dibuja una esfera nueva. 36 # Llamada cada vez que se muestra. 37 proc tclDisplayFunc {toglwin} { 38 # Borra la geometría previa 39 glClear [expr {$::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT}] 40 # Crea la esfera 41 glutSolidSphere 1.0 32 32 42 glFlush 43 } 44 45 # Establece el color del material 46 # Llamada cada vez que se cambia el color 47 proc color {args} { 48 # Color de la luz 49 glLightfv GL_LIGHT0 GL_AMBIENT [color2liste $:: ambient]

WWW.LINUX- MAGAZINE.ES

50 51 # Color del material para los reflejos 52 glMaterialf GL_FRONT GL_SHININESS $::shinines 53 glMaterialfv GL_FRONT GL_SPECULAR [color2liste $:: specular] 54 55 # Color como fuente de luz 56 glMaterialfv GL_FRONT GL_EMISSION [color2liste $:: emission] 57 58 # Color de la superficie 59 glColor4fv [color2liste $:: material] 60 61 .fr.toglwin postredisplay 62 } 63 64 # Convierte color HEX a RGB 65 proc color2liste {color} { 66 set retval {} 67 set liste [winfo rgb . $color] 68 foreach c $liste { 69 lappend retval [expr {$c / 65535.0}] 70 } 71 return $retval 72 }


DESARROLLO • Tcl3D

Figura 6: Este modelo de un biplano procede de un programa CAD. El script Tcl3D importa el fichero objeto y lo utiliza en OpenGL.

GL_SHININESS y GL_SPECULAR establecen el color y la intensidad de los reflejos (líneas 52 y 53). Los reflejos son esas partes de la luz que el cuerpo refleja directamente desde la fuente de luz hacia el observador. El tamaño y el brillo dependen de la superficie; por ejemplo una bola de billar pulida posee reflejos más pequeños y más brillantes que una esfera de madera. La mayoría de los cuerpos no emiten luz por ellos mismos, pero es posible utilizar OpenGL para representar bombillas y luces de neón.

Para ello se utiliza GL_EMISSION (línea 65), especificando la luz emitida por el cuerpo. Por último, glColor4fv (línea 59) define un color, que se aplicará a la próxima figura geométrica que se vaya a definir. tclDisplayFunc crea una esfera nueva cada vez que se invoca. Para ello, dibuja con una función de la librería GLUT (Utilidades GL): glutSolidSphere (línea 41) una esfera de triángulos con un radio y una resolución específicas. Como esto siempre va seguido del procedimiento color, adopta el material y el color de la superficie que se definen allí. El resto de la ventana se compone de elementos Tk normales, como botones para cambiar los colores.

Texturas de Terceros El método descrito consiste en un script que crea, mueve e ilumina una figura geométrica y la cubre con texturas. Sin embargo, el procedimiento para mover una imagen de un vehículo completo o una casa puede ser bastante complejo. Herramientas como Ayam [15] o Blender [11] facilitan el proceso. Proporcionan un sistema CAD especial para modelos de superficie e incluso soportan la modificación y confección de texturas.

Gracias a la librería GLM de Nate Robins, los scripts OpenGL pueden importar modelos, siempre que estén en formato “Object Wavefront” (.obj). Esta librería forma parte del paquete Tcl3D, aunque está disponible para otros lenguajes de programación. El legendario aeroplano Kitty Hawk de los hermanos Wright sirve de ejemplo en la Figura 6. El modelo VRML de [16] puede convertirse en un fichero .obj utilizando Blender [11] (se puede descargar desde [3]). El Listado 5 lee un fichero obj y visualiza el modelo en la pantalla. En la inicialización, tclCreateFunc (línea 3) carga el modelo, se dibuja con la función glmReadObj en la línea 20. glmFacetNormals y glmVertexNormals (líneas 21 y 22) calculan los vectores normales que necesita OpenGL. El modelo está listo para mostrarse ahora. En la línea 26 tclDisplayFunc dibuja el modelo llamando a glmDraw en la línea 37, utilizando las opciones SMOOTH y MATERIAL. ¡Y esto es todo!. En vez de definir miles de triángulos individualmente, el script carga un modelo com■ pleto en sólo unos pasos.

RECURSOS [1] OpenGL: http://www.opengl.org

Listado 5: Cargando un modelo wavefront 01 # Establece los valores iniciales y genera la lista de visualización. 02 # Llamada cuando se crea la ventana. 03 proc tclCreateFunc {toglwin} { 04 # Fondo negro 05 glClearColor 0.1 0.7 1 0.5 06 07 # Algunos ajustes 08 glClearDepth 1.0 09 glEnable GL_DEPTH_TEST 10 glShadeModel GL_SMOOTH 11 glDepthFunc GL_LEQUAL 12 glHint GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST 13 14 glEnable GL_DEPTH_TEST 15 glEnable GL_LIGHTING 16 glEnable GL_LIGHT0 17 18 # Lectura del fichero 19 set filename “untitled.obj” 20 set ::objId [glmReadOBJ $fileName] 21 glmFacetNormals $::objId 22 glmVertexNormals $::objId 90.0

58

Número 24

23 } 24 25 # Muestra el modelo 3D 26 proc tclDisplayFunc { toglwin } { 27 # Borra la pantalla y el búffer de profundidad 28 glClear [expr $::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT] 29 30 # Establece la posición inicial 31 glLoadIdentity 32 glTranslatef $::Posx $::Posy $::Posz 33 glRotatef $::Rotx 1.0 0.0 0.0 34 glRotatef $::Roty 0.0 1.0 0.0 35 glRotatef $::Rotz 0.0 0.0 1.0 36 37 glmDraw $::objId [expr $::GLM_SMOOTH | $::GLM_MATERIAL] 38 $toglwin swapbuffers 39 }

[2] Tcl3D: http://www.tcl3d.org [3] Togl: http://togl.sourceforge.net [4] SDL: http://www.libsdl.org [5] Mesa: http://www.mesa3d.org [6] Mason Woo, Jackie Neider y Tom Davis, “OpenGL Programming Guide” (Redbook): Addison-Wesley [7] Dave Shreiner, “OpenGL Reference Manual” (Bluebook): Addison-Wesley sowie http://www.rush3d.com/ reference/opengl-bluebook-1.0 [8] Nehe: http://nehe.gamedev.net [9] Open Cascade: http://www. opencascade.org [10] Tclgl2ps: http://www.sfu.ca/~gay/ tclgl2ps.zip [11] Blender: http://www.blender.org [12] Descargas para este artículo: http:// ftp.linux-magazin.de/pub/listings/ magazin/2006/07/3D-Skripting [13] Texturas gratuitas de Mayang: http:// www.mayang.com/textures/ [14] Woodgrains: http://www. woodworking.org/WC/woodsampler. html [15] Ayam: http://ayam.sourceforge.net [16] Modelo 3D del Kitty Hawk: http:// www.ocnus.com/models/Vehicles/

WWW.LINUX- MAGAZINE.ES


La Columna de Charly • ADMINISTRACIÓN

El Día a Día del Administrador de Sistemas: Weird Mind

TÚNELES ¿Qué tienen en común las dos semanas de vacaciones de Charly en Holanda con una sesión SSH? A primera vista, nada de nada. Pero estaría mintiendo como un bellaco. POR CHARLY KÜHNAST

L

a gente de la parte baja del Rhin alemana tienen una actitud ambivalente con respecto a sus vecinos holandeses de la frontera. Pero a mí personalmente me caen bien; incluso tuve una novia de este país, de Zwolle. Y como Holanda tiene una buena oferta de hotspots de Internet, decidí dirigirme a la provincia costera de Holanda del Norte. Desafortunadamente, no encontré a nadie… habían ido a ver el Mundial a Alemania [1], pero por lo menos eso me libró de hacer el tonto intentando hablar holandés con los locales. El acceso a Internet estaba disponible, no en nuestro día de fiesta local como dije antes, pero caminando encontré un pequeño café que disponía de conexión a la Red. El hotspot WLAN prometía acceso a cualquiera, por supuesto, previo pago. Hay formas de colarse en este tipo de instalaciones, pero eso habría sido injusto, así que pagué. Por desgracia, no estoy de acuerdo con los operadores hotspot (quienes deben estar forrados ahora que tienen las tarifas airtime) en su comprensión del término conexión a Internet. Podría sobrevivir con un proxy obligatorio, pero todo, excepto el HTTP(S), POP e IMAP estaba bien restringido. Utilizo Mutt para tener acceso a algunos buzones de correo que funcionan bajo una consola en mi servidor, lo que significa que simplemente tengo que conectarme con SSH.

SYSADMIN Singwall . . . . . . . . . . . . . . . . . . . . .60 Le mostramos cómo compilar sus propias extensiones de Netfilter.

Figura 1: Weird Mind en mi servidor de casa me permite hacer un túnel mediante políticas restrictivas de Internet.

Afortunadamente, tenía cargada una herramienta que enruta SSH mediante HTTP en mi servidor web. El programa viene con unas cuantas opciones [2]. Pero, para resumir un poco el tema, mi servidor ejecuta Weird Mind [3], una herramienta que es fácil de instalar pero que sólo se comunica mediante SSH 1.

Apache, quédate en casa Tras desempaquetar el archivo tar, copié los ficheros weirdmind.html, weirdmind.jar y props a un directorio accesible por Apache. Tenía que cambiar unas cuantas opciones en weirdmind.html, comenzando por el servidor al que Weird Mind se conecta. También hay que especificar la ruta al fichero props: <param name=server” value= U “127.0.0.1”> <param name=”properties_url” U value=”http://127.0.0.1/U weirdmind/props”>

Actualmente props es el fichero de configuración para el cliente SSH, que está escrito en Java. La configuración está bien comentada y la que trae por defecto es bas-

WWW.LINUX-MAGAZINE.ES

tante adecuada para utilizarla de vez en cuando con SSH. Sin embargo, para el servicio SSH es importante el soporte de autenticación mediante contraseñas, en sshd_config: PasswordAuthentication yes

Volviendo a Holanda, tan sólo utilicé el navegador para cargar el weirdmind.html en mi servidor de casa y ya no había quien me parase construyendo castillos de arena en la playa. Lo admito, nadie me obligó a llevar 40 libras en hardware hasta ese país, pero ¡sólo de pensar que tenía que pasar dos semanas enteras sin hacer nada tum■ bado al sol era demasiado para mi!

RECURSOS [1] Sitio oficial de la FIFA World Cup de Alemania 2006: http://fifaworldcup. yahoo.com/06/en/ [2] Herramientas remotas: http:// anyterm.org/compared. Htm [3] Weird Mind: http://www.tam.cornell. edu/Computer.old/remoteaccess/ weirdmind/

Número 24

59


ADMINISTRACIÓN • Netfilter

Compilación de un módulo de cortafuegos Netfilter

CANTARES En este artículo vamos a mostrar cómo compilar una extensión de Netfilter usando como ejemplo un cortafuegos musical. POR MARK VOGELSBERGER

Un Cortafuegos que Canta Las entradas del registro del cortafuegos mantienen a los administradores informados de los paquetes que se procesan, pero desde un punto de vista fisiológico y psicológico, tener que revisar los ficheros de registro todos los días puede llegar a ser tedioso, pudiéndose perder información importante. Por supuesto, son necesarios los ficheros de registro, pero ¿por qué no tener un sistema de alerta secundario? El módulo Singwall descrito en este artículo proporciona un medio para que los administradores escuchen el tráfico de red en tiempo real. Singwall es una extensión del cortafuegos Netfilter que reproduce sonidos. El cortafuegos pita cuando llega un paquete variando el tono del sonido según el puerto al que llegue.

Colgados El modelo de Netfilter permite a los desarrolladores programar módulos del kernel que se conectan a la cadena de ejecución de los paquetes de red. La primera tarea que tiene que realizar el módulo es registrar una función para la gestión del evento. Este registro le indica al kernel lo que el módulo quiere hacer. El registro se gestiona por medio de dos funciones: nf_register_hook(struct nc_hook_ops*) y nf_unregister_hook(struct nc_hook_ops*). Esta última elimina la función. Es importante descargar el módulo, ya que si se produjera un fallo se originarían bastantes errores del kernel. A la hora de registrar una función la clave se encuentra en la estructura nc_hook_ops:

N

etfilter es el subsistema del kernel de Linux que se encuentra detrás de las herramientas del cortafuegos como la famosa Iptables. El subsistema Netfilter proporciona la estructura necesaria para el filtrado de paquetes y la traducción de direcciones, ofreciendo una serie de eventos para la pila de los protocolos de red. Para el acceso al subsistema Netfilter el usuario dispone de diversos comandos, scripts e interfaces de aplicación, incluyendo herramientas como Shorewall y Firestarter, así como Iptables. Por lo tanto,

60

Número 24

no hay que ser programador para acceder a la potencia de Netfilter. Sin embargo, si se está predispuesto a programar un poco, se pueden utilizar las funciones de gestión de eventos incluidas en Netfilter para crear módulos a medida para el cortafuegos. Este artículo muestra los pasos requeridos para compilar un módulo Netfilter personalizado. Para ello nos basaremos en el ejemplo de un cortafuegos “musical” que reproduce un sonido cada vez que llegue un paquete. No obstante, los conceptos que aparecen son también aplicables a otras aplicaciones de Netfilter.

WWW.LINUX-MAGAZINE.ES

struct nf_hook_ops { struct list_head list; nf_hookfn *hook; struct module *owner; int pf; int hooknum; int priority; };

Esta estructura proporciona toda la información que el kernel necesita para instalar la función. La primera entrada de la estructura se utiliza para la gestión de la lista enlazada. La función se almacena a sí misma como un puntero en hook. Posteriormente el kernel de Linux utilizará este puntero a la función para invocar al módulo. El campo owner almacena el módulo correspondiente; este campo también se encuentra en diversas estructuras del kernel.


Netfilter • ADMINISTRACIÓN

Elección del Protocolo

Análisis de Paquetes

Las últimas tres entradas de la estructura nc_hook_ops son de interés particular: pf especifica la familia del protocolo (nivel de red OSI) en el que está interesada la función. linux/socket.h contiene una lista de valores pf posibles. El valor PF_INET está reservado para IPv4, porque el sistema de protocolo IPv4 es el protocolo de red utilizado por el módulo Singwall. El valor hooknum especifica la posición donde se conecta la función. Estas funciones están numeradas, y una macro les asigna el nombre. Los valores posibles para IPv4 están listados en linux/netfilter_ipv4.h. Se desea que el cortafuegos reproduzca diferentes sonidos ante diferentes tipos de paquetes entrantes y salientes. Dos funciones se encargarán de ello: hooknum= NF_IP_LOCAL_OUT para los paquetes salientes y hooknum= NF_IP_LOCAL_IN para los paquetes entrantes. El último campo de la estructura nf_hook_ops especifica la prioridad con la que el kernel debería insertar la función en la lista de funciones. Netfilter procesa las funciones basándose en su prioridad. El valor priority para IPv4 también se detalla en linux/netfilter_ipv4.h. Puede asignarse un valor priority= NF_IP_PRI_FIRST para Singwall de modo que se coloque a la función en lo alto de la lista.

El análisis de paquetes que se desea que el cortafuegos del ejemplo realice puede ser gestionado utilizando un búfer socket. La estructura compleja sk_buff es proporcionada por linux/skbuff.h. Esta estructura utiliza un puntero data que apunta a los datos de red y extrae información para la gestión. En el caso de datos TCP, el cortafuegos extrae primero la cabecera TCP, la cual le proporciona el número del puerto. El valor de retorno de la función especifica qué clase de acciones de postprocesamiento hay que aplicarle al paquete. Los valores de retorno, que se listan en linux/netfilter.h, incluyen algunos como NF_DROP y NF_ACCEPT. NF_DROP elimina el paquete después del procesamiento, mientras que

NF_ACCEPT permite que el paquete pase. Esta configuración hace que sea bastante sencillo escribir un cortafuegos mínimo. Si al filtro no le gusta el aspecto de un paquete que está inspeccionando, la función devolverá NF_DROP y el kernel se encargará de hacer el trabajo sucio. El cortafuegos de este ejemplo siempre devuelve NF_ACCEPT, ya que simplemente analiza los datos de red sin realizar ningún filtrado.

Opus 1 Como obertura, Singwall etiquetará los paquetes UDP, TCP e ICMP con tonos diferentes. En el caso de TCP, un segundo tono señalará el puerto, indicando de este modo el servicio subyacente basándose en el análisis de la cabecera TCP.

Argumentos Puede encontrarse un prototipo de función, o de la función de gestión de eventos para ser más precisos, en linux/netfilter.h: typedef unsigned int nf_hookfn( unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *) );

El argumento crítico y, de hecho el único argumento relevante para Sinmgwall, es el segundo de la lista: skb. Éste es un puntero a la estructura sk_buff (un búfer socket). El kernel utiliza esta estructura de datos de red crítica para transferir los datos de forma eficiente entre las capas de red individuales.

Figura 1: El kernel utiliza una función Netfilter para pasar los paquetes entrantes a Singwall. El módulo analiza el protocolo, calcula la frecuencia y escribe el resultado en un búfer circular.

WWW.LINUX-MAGAZINE.ES

Número 24

61


ADMINISTRACIÓN • Netfilter

La estructura tcphdr almacena los datos de la cabecera. Para extraer el número del puerto, Singwall lee el campo dest. Primero hay que convertir el valor al formato de byte de la máquina. La función ntohs(unsigned short int netshort) se encarga de esto, devolviendo el número de puerto como un entero. El proceso de análisis de paquetes se muestra en la Figura 1. Un problema en la interfaz hombre/ máquina impide una implementación directa. El tráfico de red es normalmente tan rápido que el oído humano no sería capaz de registrar los pitidos individuales. Para frenarlo, Singwall implementa un búfer circular de longitud RING_SIZE. La función func escribe los tonos a reproducir en este búfer. Dos contadores almacenan la posición del próximo tono a ser reproducido

(tone_counter) y la posición de la siguiente entrada libre (tone_pos_counter). Si los paquetes de red llegaran tan rápidos que tone_pos_counter y tone_counter se desincronizaran sobrepasando el valor de umbral RANGE_SYNC, el código lo resincronizaría, estableciendo el valor de tone_pos_counter a tone_counter. En la Figura 2a se puede ver el búfer circular. Esta solución ignora bastantes paquetes en el caso de que haya un tráfico de red pesado, pero tal y como demuestran las pruebas de campo, el hecho de ignorar paquetes no tiene por qué significar que se dejen de escuchar las conexiones. La implementación del cortafuegos de este ejemplo que proponemos no presenta ningún problema a la hora de seguir las sesiones típicas de navegación

por la web. Aunque un ping 127.0.0.1 -f o una descarga masiva producirían múltiples resincronizaciones, este hecho no supone ningún problema para la aplicación. Singwall utiliza el altavoz del PC para reproducir los tonos. El código hace que el altavoz suene a la frecuencia requerida (aunque hemos tenido algunos problemas con ciertos altavoces en ordenadores modernos). Se ha decidido utilizar una duración de tono de 20 milisegundos. esto supone un compromiso entre una gestión rápida y la posibilidad de oír el tono, pues es importante evitar perder más paquetes de los necesarios. Por supuesto, hay que evitar que el cortafuegos bloquee el tráfico de red mientras reproduzca el tono de 20 milisegundos. Un hilo del kernel que procese el búfer circular y reproduzca los tonos pro-

Listado 1: Singwall 001 002 003 004 005

#include <linux/version.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> #include <linux/init.h> #include <linux/tcp.h> #include <asm/io.h> #include <linux/inet.h>

006 007 008 009 010 011 #if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,16) 012 #include <linux/in.h> 013 #include <linux/ip.h> 014 #endif 015 016 #define RING_SIZE 500 017 #define SYNC_RANGE 100 018 MODULE_LICENSE(“GPL”); 019 020 static wait_queue_head_t wq; 021 static int thread_id; 022 static DECLARE_COMPLETION(on_exit); 023 024 static struct nf_hook_ops nfho_out,nfho_in; 025 026 u16 tone[RING_SIZE]; 027 int tone_counter; 028 int tone_pos_counter; 029 030 void update_tone_pos_counter(void)

62

Número 24

{

055

031 if(tone_pos_counter<RING_SIZE -1) tone_pos_counter++; 032 else tone_pos_counter=0; 033 } 034 035 void update_tone_counter(void) { 036 if(tone_counter<RING_SIZE-1) tone_counter++; 037 else tone_counter=0; 038 } 039 040 void check_syncing(void) { 041 int counter; 042 if ((abs((tone_pos_counter tone_counter+RING_SIZE) 043 % RING_SIZE))>SYNC_RANGE) 044 { 045 counter=tone_counter; 046 047 while (((abs((counter tone_counter+RING_SIZE) 048 % RING_SIZE))<=SYNC_RANGE)) 049 { 050 tone[(counter%RING_SIZE)-1]=0 ; 051 counter++; 052 pr_debug(“ %d”,(counter%RING_SIZE)-1); 053 } 054 pr_debug(“SingingFirewall: Resyncing %d<—-%d!\n”,

WWW.LINUX-MAGAZINE.ES

tone_counter,tone_pos_counter ); 056 tone_pos_counter=tone_counter ; 057 } 058 } 059 060 static int thread_code(void *data) { 061 [...] 062 } 063 064 unsigned int hook_func( 065 unsigned int hooknum, 066 struct sk_buff **skb, 067 const struct net_device *in, 068 const struct net_device *out, 069 int (*okfn)(struct sk_buff *)) 070 { 071 struct tcphdr *thead; 072 struct sk_buff *sk=*skb; 073 u16 port; 074 char check; 075 076 check=0; 077 if (sk->nh.iph->protocol ==IPPROTO_TCP) 078 079 {tone[tone_pos_counter]=100; check=1;} 080 if (sk->nh.iph->protocol == IPPROTO_UDP)


Netfilter • ADMINISTRACIÓN

porciona el paralelismo necesario para asegurarse que el tráfico de red continuará sin interrupción. El hilo incluye un bucle while que se ejecuta cada 10 milisegundos. Este ejemplo lo hace sin producir bloqueos entre las acciones paralelas; en el peor de los casos, el cortafuegos podría perder algunos tonos o sobreescribirlos, lo que es aceptable desde el punto de vista musical. El hilo, y por ello el bucle infinito, se pararán cuando el módulo se descargue. La Figura 2b muestra cómo cooperan la función y los hilos para gestionar el búfer circular.

¡Hagámoslo Cantar! El Listado 1 implementa los conceptos descritos. El módulo necesita incluir dos ficheros para la versión 2.6.16 o posteriores del kernel. El bloque if de las líneas 11

a la 14 se encarga de incluir estos ficheros adicionales. A continuación el módulo define los valores para la gestión del búfer circular: RING_SIZE y SYNC_RANGE. Estos valores se pueden modificar para reflejar los requerimientos particulares de cada caso. Si la macro DEBUG está definida cuando se realice la compilación, el sistema mostrará mensajes en el fichero /var/log/messages. Hay que tener en cuenta que el módulo registrará los valores para tone_counter y tone_pos_counter, por lo tanto se crearán una gran cantidad de mensajes en el fichero de registro. Estos datos son útiles en la fase de depuración del programa, ya que muestran cómo el módulo sincroniza el búfer circular en el caso de que no pueda seguir el tráfico de red cuando éste sea voluminoso.

La rutina init del módulo (en la línea 140) fija primero los dos contadores del búfer circular a cero. A continuación init ejecuta el hilo, encolándolo (líneas 147 a 149). Finalmente, se registra la función para paquetes IPv4 entrantes y salientes. La rutina de limpieza de la líneas 166 deshace estos pasos, eliminando de forma limpia el módulo del kernel. Para asegurarse, la línea 171 contiene un comando especial que deshabilita el altavoz.

Comprobante de Protocolos La función (líneas 94 a 138) comprueba el protocolo basándose en la entrada sk->nh.iph->protocol en el búfer del socket que se le pasa (líneas 107 a 112). Si Singwall reconoce el protocolo, entonces manda una frecuencia al búfer circular (Línea 115).

Listado 1: Singwall (continuación) 081 {tone[tone_pos_counter]=200; check=1;} 082 if (sk->nh.iph->protocol == IPPROTO_ICMP) 083 {tone[tone_pos_counter]=300; check=1;} 084 if (!check) return NF_ACCEPT; 085 086 update_tone_pos_counter(); 087 check_syncing(); 088 pr_debug(“Tone Pos Counter: %d\n”, tone_pos_counter); 089 090 check=0; 091 if (sk->nh.iph->protocol == IPPROTO_TCP) { 092 thead=(struct tcphdr *) (sk->data + (sk->nh.iph->ihl * 4)); 093 port=ntohs(thead->dest); 094 switch( port ) 095 { 096 case 21 : {tone[tone_pos_counter]=1000; check=1;break;} 097 case 22 : {tone[tone_pos_counter]=1500; check=1;break;} 098 case 80 : {tone[tone_pos_counter]=2000; check=1;break;} 099 case 443: {tone[tone_pos_counter]=2500; check=1;break;}

100 101 102 103 104 105

} if (check) { update_tone_pos_counter(); check_syncing(); pr_debug(“Tone Pos Counter: %d\n”, tone_pos_counter); } } return NF_ACCEPT; }

106 107 108 109 110 111 int init_module() { 112 int counter; 113 for (counter=0; counter<=RING_SIZE-1; counter++) 114 tone[counter]=0; 115 tone_counter=0; 116 tone_pos_counter=0; 117 118 init_waitqueue_head(&wq); 119 thread_id=kernel_thread(threa d_code, NULL, CLONE_KERNEL); 120 if(thread_id==0) return EIO; 121 122 nfho_out.hook = hook_func; 123 nfho_out.hooknum = NF_IP_LOCAL_OUT; 124 nfho_out.pf = PF_INET; 125 nfho_out.priority = NF_IP_PRI_FIRST;

WWW.LINUX-MAGAZINE.ES

126 127 nfho_in.hook = hook_func; 128 nfho_in.hooknum = NF_IP_LOCAL_IN; 129 nfho_in.pf = PF_INET; 130 nfho_in.priority = NF_IP_PRI_FIRST; 131 132 nf_register_hook(&nfho_out); 133 nf_register_hook(&nfho_in); 134 return 0; 135 } 136 137 void cleanup_module() { 138 if(thread_id) kill_proc(thread_id, SIGTERM, 1); 139 wait_for_completion(&on_exit) ; 140 nf_unregister_hook(&nfho_in); 141 nf_unregister_hook(&nfho_out) ; 142 outb(inb_p(0x61) & 0xFC, 0x61); 143 }

Número 24

63


ADMINISTRACIÓN • Netfilter

Listado 2: Makefile 01 02 03 04 05 06 07 08 09 10 11

Figura 2a: La función almacena los tonos pendientes en un búfer circular. Antes de que el búfer se desborde, resync elimina algunos datos.

Si el paquete es un paquete TCP, las líneas 120 a 136 generan una segunda frecuencia que coincide con el número de puerto. Si se desea pueden añadirse más servicios a la lista de puertos. Las funciones update_tone_pos_counter() (línea 30) y update_tone_counter() (línea 35) se encargan de actualizar los contadores. La función check_syncing() (línea 40) sincroniza los dos punteros. Utilizar una función para esto puede parecer poco elegante, pero es una solución que funciona bien, es estable y delega claramente las responsabilidades.

El makefile del Listado 2 ayuda a compilar el módulo, y si se introduce como root insmod singwall.ko se cargará en el kernel. Entonces el cortafuegos empieza inmediatamente a tocar su concierto, haciendo sonar el altavoz del PC en armonía con el tráfico de red. Como estaba previsto, el tono refleja la naturaleza del dato. Es bastante sencillo distinguir entre las páginas web normales y las encriptadas, por ejemplo. El tono para las conexiones HTTPS es más alto que el tono de los sitios webs que no están encriptados, siendo fácil detectar la diferencia, incluso si no se

#Debug messages? #EXTRA_CFLAGS+=-DDEBUG ifneq ($(KERNELRELEASE),) obj-m := singwall.o else KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules endif

tiene una formación musical. También es fácil distinguir entre los paquetes SSH y FTP. Si se eliminan las etiquetas de comentario de la línea 2 del fichero makefile, se puede compilar éste en modo de depuración. Si se ejecuta el módulo en modo de depuración se obtendrán miles de entradas en el fichero de registro… muy útil en caso de problemas, pero no es recomendable su uso en condiciones normales. Diviértase con el concierto y si se harta de tanta música, con teclear rmmod sing■ wall mandará callar al cantante.

RECURSOS [1] Netfiter: http://www.netfilter.org [2] Descargas: ftp//ftp.linux-magazine. com/Magazine/Downloads/71/ Singwall

Figura 2b: Mientras la función llena el búfer circular con entradas, un hilo paralelo del kernel lee los datos y reproduce los tonos en el altavoz del PC.

64

Número 24

WWW.LINUX-MAGAZINE.ES


Bienvenidos a Linux User Esta es la sección dedicada a la presentación de software interesante y útil que nos ayuda en nuestro quehacer diario con el escritorio Linux. Aquí aprenderemos a utilizar software estándar de una manera más eficiente, adquiriremos valiosos conocimientos y descubriremos nuevas y apasionantes aplicaciones.

Ktools: Kmediafactory

66

Si las grabaciones de vídeos y de TV tienen el ordenador de casa colapsado, grábalas en un DVD con Kmediafactory.

openOffice

69

Vamos a mostrar un sistema universal para ejecutar cambios en documentos de texto, que de paso servirá para obtener experiencia práctica en la programación de macros para OpenOffice.

Screencasts Vnc2swf

72

Si queremos ofrecer a los visitantes de nuestra página web algo más que un howto basado en texto, ¿por qué no publicar un tutorial grabado en vídeo con Vnc2swf?

Educación: Accesibilidad 2007

74

En esta nueva serie de artículos vamos a intentar dar contestación a una pregunta sencilla: ¿puede GNU Linux dar respuesta a las necesidades de síntesis de voz multilingüe de nuestros centros educativos?

Línea de comandos: Errores de red

79

Linux posee las herramientas adecuadas para buscar y encontrar en la red errores y abrir el camino a los paquetes de datos.

Juegos: Postal 2

82

La saga más gore, sangrienta, violenta y políticamente incorrecta de la historia de los videojuegos tiene su cenit en esta expansión que nos sitúa en el pellejo del protagonista habitual de la serie (The Postal Dude), pero esta vez aderezado con una jugosa lesión cerebral que nos dará mucho juego.

WWW.LINUX- MAGAZINE.COM

ISSUE 52 MARCH 2005

67


LINUX USER • DVD Factory

Creación de DVDs de vídeo con Kmediafactory

DVD FACTORY Si las grabaciones de vídeos y de TV tienen el ordenador de casa colapsado, grábalas en un DVD con Kmediafactory. POR MARCEL HILZINGER

N

o se necesita ser un experto para pasar las grabaciones de vídeo y TV tomadas durante las vacaciones a un DVD. Una herramienta simple para Linux es Kmediafactory de KDE [1], del autor finlandés Petri Damsten, la cual permite crear un DVD de vídeo en sólo tres pasos.

Instalación Aunque la instalación de Kmediafactory es un proceso bastante sencillo, hay que asegurarse de que determinado número de dependencias se encuentren solucionadas (Xin, Dvdauthor, Mjpegtools, Libdvdread, Dvd-slide-show). Si se utiliza Suse, es buena idea usar como fuente de instalación YAST, o añadir el repositorio App/Smart. Kmediafactory puede instalarse junto con los paquetes multimedia requeridos. Los usuarios de Ubuntu pueden hacer uso del comando sudo-apt-get install kmediafactory para dejar esta

66

Número 24

herramienta de autor de DVD en sus discos duros. Este comando supone que se han habilitado los repositorios Universe y Multiverse. Los usuarios de Fedora Core encontrarán los paquetes multimedia necesarios en el repositorio Livna [2]. Kmediafactory se encuentra en [3]. La wiki de Kmediafactory [4] dispone de una guía de instalación detallada para distribuciones Linux. Si se desea usar el plugin para copiar las grabaciones DVB en DVDs de vídeo también será imprescindible la herramienta Demux, Projectx [5], basada en Java. Su instalación queda explicada en el cuadro titulado “Instalación de Projectx”.

Comenzamos Para arrancar Kmediafactory se pulsan [Alt] + [F2] y se introduce Kmediafactory. Es posible añadir un script de procesamiento de vídeo en Tools. En el momento de escribir este artículo, la

WWW.LINUX- MAGAZINE.ES

única versión que se encuentra disponible es un módulo de entrada de DVB para Kmediafactory. Los usuarios con la versión 0.5.1 del programa notarán que dicho módulo se encuentra ya integrado. Para actualizarse a la versión más reciente puede descargarse el plugin vía Tools | Get new tools.

Problemas con Ubuntu El módulo DVB Add falló en la posición “No audio found”. Como solución, le dije a Projectx que primero dividiera la grabación de DVB en sus componentes vídeo y audio (para hacerlo, se hace clic en Quick Start en Projectx). A continuación introduje el siguiente comando: mplex

- o film.mpeg

- f

8 U

video.m2v audio.mp2 Esto crea un fichero compatible con DVD titulado film.mpeg. Luego el programa convierte el fichero vía Add Video sin ningún tipo de problemas.


DVD Factory •LINUX USER

El primer DVD Dependiendo de la configuración de que se disponga, el menú Media contendrá los siguientes elementos: Add DVB, Add slideshow, Add DV y Add video (Figura 1). Se seleccionará Add DV para películas importadas directamente desde la cámara y Add DVB para grabaciones de TV digital. Para los formatos restantes hacemos clic en Add Video. En teoría, Kmediafactory debería permitir manipular cualquier formato de películas que a su vez pueda manejar Ffmpeg. En nuestro laboratorio sin embargo, el programa leyó algunos ficheros de vídeo que no fue capaz de convertir. Haciendo clic en una de las selecciones emerge el diálogo Open-Kmediafactory. La casilla de comprobación Multiple files create multiple titles es importante. Si se marca esta casilla, Kmediafactory creará un título para cada fichero de vídeo. Si no se tiene cuidado con esto puede hincharse el menú del DVD. Según si se marcó o no el cuadro, podrán usarse una o varias entradas bajo la epígrafe Selected Medium. El segundo paso consiste en seleccionar un diseño en Template (Figura 2). Es recomendable no dejarse intimidar por las vistas anticipadas en Preview 1, Preview 3 y Preview 6, el producto acabado no es ni la mitad de malo de lo que las vistas anticipadas podrían llevarte a creer. Haciendo clic sobre Preview se podrá echar un vistazo al verdadero menú del DVD. Al hacer clic sobre Get more… se accede a más tomas descargables desde Internet. Con clic derecho sobre la plantilla se especifica la imagen de fondo y la música para el menú DVD. También puede modificarse el tamaño de la fuente si fuera necesario. El último paso consiste en seleccionar el formato de salida requerido en Output y pulsar Start. Para el primer test, DVD directory es nuestra mejor apuesta. Luego puede comprobarse el DVD con el reproductor integrado, Xine, o Kaffeine antes de copiarlo mediante Tools | DVD preview. Para copiar el DVD se selecciona K3b Project. A continuación, Kmediafactory arrancará automáticamente la herramienta de copiado de KDE después de

crear la imagen DVD. Mientras se está trabajando, se muestran un indicador de progreso separado para cada DVD, además de otro indicador de progreso para el proyecto completo en la parte inferior de la página. Si Kmediafactory se cuelga Figura 1: La ventana principal en Kmediafactory incluye 4 elementos mientras está de menú para añadir ficheros de vídeo. convirtiendo un vídeo a formato DVD, se debería ficheros DV. Kmediafactory estuvo intentar convertir el fichero con intentando crear subtítulos a partir de Ffmpeg en la línea de comandos. El la información de marca de tiempo en comando para la conversión del la película, aunque esto solamente fichero a través de Ffmpeg es como funcionó una sola vez de los 10 intensigue: tos realizados. El programa se mantuvo colgado en el paso en Adding ffmpeg -i fihcerooriginal.avi U subtitles… o en Creating Menus. Para - target pal - dvd U solventar este problema se hace clic ficherodvd.mpg en el vídeo DV que se está añadiendo debajo de Media y se selecciona ProEn este caso, el programa KDE solaperties | Remove para eliminar los submente creará los menús. En nuestro títulos. laboratorio este método evitó muchos Este problema fue común en todas cuelgues de Kmediafactory. las versiones de Kmediafactory, sin Nos surgió otro problema con los importar la distribución usada.

Instalación de Projectx Para configurar y usar Projectx se precisa un kit de desarrollador Java (JDK) junto con un entorno de tiempo de ejecución (JRE). En Suse Linux se instalarán los paquetes java-1_5_0-sun y java1_5_0-sun devel. Los usuarios de Ubuntu descubrirán sun-java5 y sunjava5-jdk en el repositorio Multiverse. Para instalar los paquetes Java damos al comando sudo apt-get install sunjava5-jdk sin olvidar introducir el siguiente comando: sudo update - alternatives U —config java Con ello se seleccionará el recién instalado Sun Java como el programa Java preferente. Fedora Core dispone de un método más indirecto para Sun Java. En [6] puede encontrarse un detallado How-to. Se

descargan

los

ficheros

WWW.LINUX- MAGAZINE.ES

ProjectX_Source_eng_0.90.4.oo.zip y ProjectX_Language_Pack_090.4.oo.zip desde la página de inicio de ProjectX. Se desempaquetan estos dos ficheros en el mismo directorio, ProjectX_Source_eng_090.4.oo.zip. A continuación añadimos los ficheros de lenguaje. Éstos deberían encontrarse en el directorio ProjectX_Source_090.4/ resources/. Luego damos al comando sh build.sh en el directorio ProjectX_source_0.90.4 para compilar las fuentes y crear el binario ProjectX.jar. Para arrancarlo puede introducirse lo siguiente: java

- jar

ProjectX.jar

Para asegurarnos de que Kmediafactory encuentra el programa hay que especificar la ruta completa al fichero .kde/share/apps/kmediafactory/tools/kmf_dvd_edit.sh bajo JAR=”” .

Número 24

67


LINUX USER • DVD Factory

Figura 2: A la colección de plantillas de Kmediafactory le vendría bien unos cuantos añadidos.

Detalles Útiles Si nuestra herramienta se ejecuta en Three Step Mode, todos los DVDs parecerán más o menos lo mismo. El programa crea un menú con capítulos para la primera película, listando las otras entradas una debajo de la otra. Para cambiar el título principal del menú del DVD se selecciona Project | Options, y se introduce un nombre intuitivo en Title. Para cada DVD puede especificarse un directorio y un formato Pal o NTSC. Kmediafactory almacenará los resultados. Kmediafactory divide automáticamente los vídeos DV y algunos formatos de vídeo en capítulos. Si se necesitan modificar los cometidos de los capítulos o crear tareas manuales, puede hacerse con un clic derecho en un medio que haya sido añadido y se selecciona Properties. Con otro nuevo

Figura 4: El módulo de muestra de diapositivas de Kmediafactory incluye algunas funciones útiles.

clic también sobre Properties se arranca el editor Kmediafactory (Figura 3). El editor puede usarse para definir los capítulos y especificar la imagen de vista anticipada. Para ello, se seleccionan Add y el título en el tiempo de arranque. Con clic derecho en un capítulo existente se despliega un menú en el que puede especificarse la longitud automática del capítulo. También es útil el módulo de presentación de diapositivas (Figura 4). A pesar de que, a diferencia con Mandvd [7], no ofrece una selección de modos de transición del back-end dvd-slideshow explotando solamente una diminuta fracción del potencial, el módulo de muestra de diapositivas hace un buen uso de las habilidades que tiene. Por ejemplo, el programa genera selecciones de capítulo para muestras de diapositivas y analiza la información

Exif para las imágenes individuales en una escueta descripción. Por defecto, el módulo de diapositivas salva las imágenes originales. Así, un DVD con las instantáneas de las vacaciones no sólo sirve para enseñárselo a los amigos y parientes, sino que también sirve como un medio para backups.

Conclusiones Aunque la configuración característica de Kmediafactory no puede competir con el software propietario de un DVD comercial de Windows o un Mac OS X, sí que posee una interfaz agradablemente intuitiva y simple. Con un aumento en la mejora de su estabilidad y con la ayuda de sus talentosos diseñadores para crear más plantillas, Kmediafactory tiene una elevada pro■ babilidad de éxito.

RECURSOS 1] Página de Inicio: http://susku. pyhaselka.fi/damu/software/ kmediafactory/ [2] Repositorio Livna: http://rpm.livna. org/configuration.html [3] Paquetes Fedora: http://deadbabylon. de/files/rpms/kmediafactory/ [4] Guía de Instalación: http://susku. pyhaselka.fi/damu/software/ kmediafactory/documentation.html [5] Projectx en Sourceforge: http:// sourceforge.net/projects/project-x [6] Sun Java y Fedora: http:www. fedorafaq.org/

Figura 3: El editor de capítulos (Chapter Editor) de Kmediafactory está oculto, pero es muy útil.

68

Número 24

WWW.LINUX- MAGAZINE.ES

[7] Mandvd: http://www.kde-apps.org/ content/show.php?content=38347


OpenOffice • LINUX USER

Implementación del sistema de notación de corchetes en OpenOffice.org

WORKSPACE Vamos a mostrar un sistema universal para ejecutar cambios en documentos de texto, que de paso servirá para obtener experiencia práctica en la programación de macros para OpenOffice. POR DMITRI POPOV

L

a herramienta Cambios de OpenOffice.org es la piedra angular para la edición en colaboración. Aunque resulte fácil de entender y utilizar, presenta un par de serios inconvenientes. En primer lugar, Cambios funciona bien sólo cuando trata con formatos originales de OpenOffice.org. Si nuestros colaboradores usan Microsoft Office, no existe ninguna garantía de que los cambios sobrevivan a la conversión hacia delante y hacia atrás. Si usan cualquier otro procesador como AbiWord, TextMaker o KWord considérate un auténtico desafortunado. En segundo lugar, Cambios no es la solución más elegante y a veces llega incluso a resultar realmente incómoda. Afortunadamente no hay por qué soportar estas limitaciones, ya que pueden implementarse soluciones alternativas para marcar los cambios en un documento. Esta alternativa es conocida como bracket notation (notación de corchete).

Aunque no se trate de una idea nueva , actualmente sí que está mejor explicada e implementada por la gente que se encuentra detrás del blog Get Humanized [1].

¿Cómo funciona Bracket Notation? La solución bracket notation cuenta con un juego de reglas que usan corchetes para marcar los cambios. Permite seguir tres tipos de cambios: sustitución, borrado y comentario. También existe la inserción , aunque puede ser considerada una forma de sustitución en la que se reemplaza o sustituye nada por algo. Estas modificaciones pueden marcarse fácilmente en un texto mediante corchetes cuadrados. Por ejemplo, se marca el texto para sustituir, se coloca el texto que se desea eliminar entre corchetes y el texto de sustitución en corchetes inmediatamente después:

WWW.LINUX- MAGAZINE.ES

mano

- > m[a][o]no

- > mono

Para marcar una inserción se colocan corchetes vacíos donde se desea situar el nuevo texto, seguido por el texto que se quiere insertar: mno - > m[][o]no mono

- >U

Para marcar un borrado se dispone el texto que se desea eliminar entre corchetes: una mono un mono

- > un[a] mono

- > U

Y para añadir un comentario el texto iría entre corchetes después de dobles corchetes vacíos: Comentario: [ ][ ]U [Comentarios aquí]

Número 24

69


LINUX USER • OpenOffice

nombre al nuevo módulo, (por ejemplo NotaciónCorchetes), se pulsa Aceptar y luego Editar. Esto abre el IDE OOoBasic, donde pueden escribirse macros. Lo primero que hay que hacer en la macro Comentario es definir tres variables como objetos: oDoc, oText y oCursor: Sub Comentario() Dim oDoc As Object, U oText As Object Dim oCursor As Object

Figura 1: Creación de un módulo separado para macros de notación de corchetes.

Todo esto está muy bien, pero hay una pequeña pega. Mientras que el sistema de notación de corchetes es simple y elegante, sin embargo, escribir todos esos símbolos y seguirles la pista puede resultar un poco molesto. Pero no hay que desesperarse, ya que puede usarse un juego simple de macros OOoBasic para convertir el sistema de notación de corchetes en una potente herramienta de rastreo de cambios que sea incluso fácil de usar.

Construcción de Macros Comenzaremos con la macro más básica que permite insertar comentarios o marcas como un comentario en un segmento de texto seleccionado. Para mantener todo ordenado y limpio, se comienza creando un módulo separado para las macros relacionadas con la notación de corchetes. En OpenOffice.org Writer se selecciona Herramientas | Macros | Organizar Macros | OpenOffice Basic y después se pulsa en el botón Administrar. En la ventana Organizador se elige la carpeta Mis Macros | Standard y se pulsa el botón Nuevo. Se le da un

A continuación se especificarían qué son esos objetos: oDoc=ThisComponent oText=oDoc.Text oCursor=oDoc.CurrentController.U getViewCursor`

Este código define oDoc como el documento activo, oText como el texto en el documento, y oCursor como el texto actual seleccionado. Una vez completada esta definición, el siguiente paso es convertir el texto seleccionado en un comentario: oCursor.String=U “[][][“ & oCursor.String & “]”

Por último, para hacer que el comentario sea más fácil de localizar, se cambia el color a azul:

oCursor.CharColor=U RGB(0,0,250)

La macro Comentario completa se muestra en el Listado 1. La parte más interesante es que, si no se ha seleccionada nada, la macro simplemente inserta el corchete comentario, pudiéndose añadir el texto después. Ahora que ya hemos aprendido lo básico, podemos crear fácilmente una macro que marque la operación de borrado. Éste es casi idéntico al código Comentario, con la única excepción de que el carácter color es diferente (Listado 2). El último paso consiste en escribir una macro que marque las sustituciones. Aunque ésta comparte bastante código con las dos macros precedentes, cuentas con un funcionamiento ligeramente distinta. A diferencia de las macros Eliminar y Comentario, la macro que nos ocupa, Reemplazar, requiere que el usuario realice algún tipo de entrada: una vez marcado el texto que se desea sustituir, hay que decirle a la macro lo qué es lo que se desea insertarse en su lugar. Una manera de hacerlo es añadiendo un diálogo de introducción de datos a la macro que contenga un único campo. Cuando el usuario introduce una corrección en el campo y pulsa Aceptar, la macro insertará los corchetes oportunos que contienen la corrección. Añadir un diálogo de introducción de datos es fácil y sólo requiere tres líneas de código:

Listado 1:Macro Comentario 01 Sub Comentario() 02 Dim oDoc As Object, oText As Object 03 Dim oCursor As Object 04 oDoc=ThisComponent 05 oText=oDoc.Text 06 oCursor=oDoc.CurrentController.get ViewCursor 07 oCursor.String=”[][][“ & oCursor.String & “]” 08 oCursor.CharColor=RGB(0,0,250) 09 End Sub Figura 2: Trabajando con macros en el IDE de OpenOffice.org Basic.

70

Número 24

WWW.LINUX- MAGAZINE.ES


OpenOffice • LINUX USER

Listado 2: Macro Eliminar 01 Sub Eliminar() 02 Dim oDoc As Object, oText As Object 03 Dim oCursor As Object 04 oDoc=ThisComponent 05 oText=oDoc.Text 06 oCursor=oDoc.CurrentController.ge tViewCursor 07 oCursor.String=”[“ & oCursor.String & “]” 08 oCursor.CharColor=RGB(250,0,0) 09 End Sub

InputMsg=”Introducir corrección” InputTitle=”Corrección” InputReturn=U InputBox (InputMsg, InputTitle)

Lo más importante aquí es la variable InputReturn, que contiene la entrada del usuario actual. La macro Reemplazar completo se muestra en el Listado 3. Una vez que las tres macros están hechas, se guardan y se cierra OOoBasic.

Figura 3: Asignación de macros a los botones de la barra de herramientas de Notación de Cocrchetes.

las barras de herramientas, ya que se encuentran disponibles en el formato de 16x16 píxeles requerido por OpenOffice.org. Para añadir un icono a uno de los botones, se selecciona la macro de la lista de comandos en la barra de herramientas Notación, se presiona y se mantiene pulsado el botón Modificar, luego

Listado 3: Macro Reemplazar

Toques Finales

01 Sub Reemplazar()

Para facilitar el uso de las macros, puede añadirse una barra de herramientas Writer separada con los iconos adecuados. Se selecciona Herramientas | Personalizar… y se hace clic en la solapa Barras de Herramientas. Se pulsa el botón Nuevo, se da un nombre a la barra de herramientas (por ejemplo “Notaciones de Corchetes”) y se selecciona OpenOffice.org Writer de la lista Guardar en. Para añadir un botón a la nueva barra de herramientas se pulsa el botón Añadir, se selecciona el módulo de la macro NotaciónCorchetes en la subventana Categoría, se elige la macro deseada desde la lista Comandos y se pulsa Añadir. El proceso se repite con las otras macros de notación de corchetes. Para hacer que la barra de herramientas parezca más profesional y sea más fácil de usar, debería añadirse un icono a cada botón. Los iconos Silk [2] están perfectamente adaptados para su uso en

02 Dim oDoc As Object, oText As Object 03 Dim oCursor As Object 04 oDoc=ThisComponent 05 oText=oDoc.Text 06 oCursor=oDoc.CurrentController.ge tViewCursor 07 InputMsg=”Introducir corrección” 08 InputTitle=”Corrección” 09 InputReturn=InputBox (InputMsg, InputTitle) 10 oCursor.String=”[“ & oCursor.String & “][“ & InputReturn & “]” 11 oCursor.CharColor=RGB(0,250,0) 12 End Sub

se selecciona Cambiar Icono. Pulsando el botón Importar, se añade el icono deseado, seleccionable en la lista de iconos, y se pulsa Aceptar. Una vez nos satisfaga la barra de herramientas se pulsa Aceptar y ya estará listo para usar.

Conclusión Mediante el uso de un simple juego de macros puede implementarse fácilmente el sistema de notación de corchetes en OpenOffice Writer. Debido a que los cambios se graban en el texto a través de un sistema de corchetes ordinario, los usuarios que dispongan de otros programas de procesador de textos podrán ver los cambios e incluso macros equivalentes implementadas para sus propios entornos. Pero para que este sistema funcione hay que estar de acuerdo con las reglas de otros compañeros, asegurarse de que todo el mundo en el mismo grupo de trabajo entiende las reglas y su uso, y que el sistema por sí no esté abierto a la interpretación. Y, evidentemente, usar texto llano como formato de ■ trabajo.

RECURSOS [1] Bracket Notation: http://www. humanized.com/weblog/2006/06/30/ collaboration_made_simple_with_bra cket_notation/ [2] Iconos Silk: http://www.famfamfam. com/lab/icons/silk/

WWW.LINUX- MAGAZINE.ES

Número 24

71


LINUX USER • Screencasts Vnc2swf

Screencasts con Vnc2swf

ARRIBA EL TELÓN Si queremos ofrecer a los visitantes de nuestra página web algo más que un howto basado en texto, ¿por qué no publicar un tutorial grabado en vídeo con Vnc2swf? POR KRISTIAN KISSLING

U

na popular teoría establece que cuanto más sentidos dediques al aprendizaje, más probable será que recuerdes lo importante. Los desarrolladores de software han puesto a funcionar este principio con una nueva generación de guías de usuario multimedia. Vnc2swf [1] es una herramienta de grabación de pantalla de Código Abierto que permite capturar actividades de pantalla y almacenar los resultados en una película (los llamados screencasts). Incluso puede añadirse una componente audio a la demo. Una vez finalizado puede publicarse el nuevo tutorial en la página web personal. Vnc2swf crea una película Flash a partir de una sesión VNC. Para verla se necesita un plugin Flash Player para el navegador (ver Plugin Flash Player).

Figura 1: El puerto VNC estándar es el número 5900. Con un clic sobre “Start” se le dice a Vnc2swf que grabe la actividad del escritorio.

72

Número 24

Para grabar una sesión VNC se arranca un servidor VNC para presentar el contenido de la pantalla en una ventana separada. Luego se usa Vnc2swf para grabar los contenidos de la ventana. El programa crea un fichero SWF que luego es empotrado en un fichero HTML que puede verse con un navegador.

Instalación Vnc2swf requiere Python 2.3 ó 2.4 y el paquete Pygame a juego (o sea: python2.3pygame o python2.4-pygame).

Vnc2swf viene en dos versiones: una versión C y una variante Python. Los desarrolladores han dejado de trabajar con la versión C, de modo que hay que asegurarse de descargar la versión Python cuando se visite la página web en [1]. Para desempaquetar el fichero se escribe tar xvzf pyvnc2swf-0.8.2.tar.gz, luego se cambia al nuevo directorio. Ahora sólo se necesita el servidor VNC. Para arrancar una sesión local bien se introduce el comando krbf, para lo que

Plugin Flash Player En Octubre de 2006 se editó finalmente para Linux Flasplayer 9; se encuentran disponibles tanto la versión independiente como una variante plugin. La versión beta de la herramienta puede descargarse desde la página de descargas de Adobe en [2]. Si el antiguo Flasplayer 7 se encuentra instalado en tu sistema, puedes cambiarte al directorio ~/.mozilla/plugins o bien a /usr/lib/firefox/plugins y eliminar los ficheros almacenados en el directorio – libflashplayer.so, por ejemplo. Si usas un navegador distinto, necesitarás

WWW.LINUX- MAGAZINE.ES

localizar el directorio de plugins correspondiente. A continuación, se desempaqueta el plugin del navegador en la línea de comandos a través del comando tar xvzf FP9_plugin_beta_101806.tar.gz. El número al final del fichero puede variar dependiendo de la fecha de publicación. Cambia al directorio creado mediante este paso y copia el fichero libflashplayer.so a uno de los directorios de plugins del navegador como se mencionó anteriormente. Para esto necesitarás privilegios de superusuario.


Screencasts Vnc2swf • LINUX USER

Figura 2: Se arranca una demostración abriendo el fichero de salida en el navegador, no la versión SWF, evidentemente, sino la página HTML.

será necesario introducir una password, o bien puede instalarse X11vnc usando el administrador de paquetes.

Primeras Pruebas Ha llegado el momento de hacer una primera prueba. Se arranca X11vnc en la línea de comandos (o krfb si se prefiere). Para ello se introduce x11vnc —display :0. Luego se arranca Vnc2swf cambiando al directorio que se desempaquetó y escribiendo: /vnc2swf.py -o nosound.swf U localhost:0

La opción -o nosound.swf configura el nombre del fichero de salida. Personalmente elegí nosound porque Vnc2swf no graba sonido. La opción localhost:0 hace referencia a la ventana VNC del escritorio local. Una vez introducido el comando debería verse un cuadro de diálogo como el de la Figura 1. Las configuraciones en el cuadro de diálogo deberían valernos. A continuación se hace clic en Start, se mueve el ratón de aquí para allá, se escribe una frase en nuestro editor de textos favorito y se pulsa Stop. Hemos acabado: La primera película ya está enlatada. Para verla se arranca el navegador y se apunta al fichero nosound.html en el mismo directorio que el programa vnc2swf.py. Los resultados deberían ser algo parecido a lo que puede verse en la Figura 2.

servidor VNC con la opción -scale : x11vncscale 0.5 —display :0 arranca el servidor VNC con una pantalla de la mitad de tamaño, pero hay que recordar que este proceso requiere más potencia de la CPU. Como alternativa, puede cambiarse el comando de la línea de parámetros para decirle al programa que grabe una única ventana. Otro programa Python en el mismo directorio que vnc2swf maneja esto. Mientras se esté en el directorio se escribe ./recordwin.shohnesnd.swf: el cursor cambia de forma para convertirse en una cruz. Tras arrancar X11vnc se hace clic en la ventana que desea grabarse. Será necesario pulsar [Crtl] + [C] para parar, ya que recordwin.sh no tiene una GUI.

Banda Sonora Para añadir un comentario personal a la grabación se arranca el fichero SWF, y al mismo tiempo, para grabar la propia voz se usa un micrófono. Para este paso serán necesarios Sox [3] y Lame [4]. Se conecta el micrófono a su enchufe en la tarjeta de sonido y se aumenta el volumen de grabación. Para hacer esto en KDE, por ejemplo, se ejecuta kmix, se hace clic en el botón Mixer, se arrastra el control de diapositiva del micrófono debajo de Inputs y se habilitan los botones LED rojo y verde. Los comandos de la grabación son parecidos a lo siguiente: rec -c 2 -r 44100 -t wav - | U lame - recording.mp3

La señal de entrada se convierte primero a un fichero WAV y luego se redirige a un fichero MP3, que he llamado recording.mp3. La película y el comentario pueden ser grabados al mismo tiempo. Si esto resulta demasiado problemático se graba en primer lugar la película y se dobla el comentario.

./edit.py -o withsnd.swf U -a recording.mp3 nosound.swf

El comando crea un nuevo fichero titulado withsnd.swf que contiene la película y la banda sonora. Si se dobla un fichero podrá observarse, que los sonidos se cortan ligeramente más tarde que las imágenes. Claro que, sólo es posible comentar lo que se ve una vez se haya visionado, y esto genera automáticamente un retraso. Para sincronizar de nuevo imágenes y sonido se cortan un par de segundos al comienzo de la banda sonora especificando la opción -S cuando se mezclen. El comando que sigue a continuación corta los cinco primeros segundos de la banda sonora: ./edit.py -S 5.0s -o U withsnd.swf -a U recording.mp3 U nosound.swf

Conclusiones Aunque Vnc2swf funciona como pretendían sus desarrolladores, no es, sin embargo, una solución ideal de grabación de pantalla. Los usuarios de Linux tendrán que esperar una herramienta basada en GUI apropiada que grabe imagen y sonido al mismo tiempo. Pero hasta entonces, Vnc2swf proporciona una solución acepta■ ble.

CONSEJOS Si usas XGL/Compiz, escribe :1 como el número de presentación en lugar de :0. El cuadro de diálogo Vnc2swf sugerirá incorrectamente el puerto 5901, pero habrás de cambiarlo al anterior 5900.

RECURSOS [1] Vnc2swf: http://www.unixuser.org/ ~euske/vnc2swf/

Acortando los Resultados Posiblemente se haya observado que la película que se está viendo es más grande que la ventana del navegador. En este caso, puede reducirse la escala arrancando el

Otra herramienta Python ayuda a combinar el fichero de sonido con la película: edit.py (Figura 3). De nuevo, la herramienta se localiza en el mismo directorio que vnc2swf.py. El siguiente comando enlaza la banda sonora con el fichero SWF:

Figura 3: Se usa el comando “edit.py” para doblar la película del escritorio con una banda sonora.

WWW.LINUX- MAGAZINE.ES

[2] Flashplayer 9: http://labs.adobe.com/ downloads/flashplayer9.html [3] Sox: http://sox.sourceforge.net/ [4] Lame: http://lame.sourceforge.net

Número 24

73


LINUX USER • Educación

Lectores de pantalla para consola

ACCESIBILIDAD EN 2007 En esta nueva serie de artículos vamos a intentar dar contestación a una pregunta sencilla: ¿puede GNU Linux dar respuesta a las necesidades de síntesis de voz multilingüe de nuestros centros educativos? POR JUAN RAFAEL FERNÁNDEZ GARCÍA.

H

an pasado casi dos años desde que en abril y mayo de 2005 escribíamos nuestro Accesibilidad en 2005, publicado en los números 6 y 7 de la revista (y consultable en la web) [1]. Revisando esos artículos, recordamos que el objetivo era hacer una presentación de las tecnologías disponibles en aquel momento, muy poco conocidas, entonces y ahora, contra la opinión generalizada de que no existían soluciones adaptativas en GNU Linux. Ya hicimos la presentación general, y en lo general tiene vigencia aún. Es el momento de profundizar en uno de los temas tratados, el de la síntesis de voz y los lectores de pantalla, para comprender y evaluar las aplicaciones existentes. ¿Por qué centrarnos en este tema? Por tres razones: porque es imposible tratar todos los aspectos con la necesaria profundidad para que el estudio sea útil ; porque los avances más importantes se han producido en este campo, y porque la generalización de proyectos de bilingüismo ha introducido una nueva exigencia en el sistema educativo. La síntesis de voz no es sólo importante [2] desde el punto de vista de la integración, sino también desde el aprendizaje de idiomas. Hay una utilidad evidente en que el ordenador del alumno pueda sintetizar textos en inglés, francés, alemán, catalán o italiano además de en castellano. ¡Poder escuchar un texto mientras se lee, todas las veces que se quiera! ¡O disponer al fin de un diccionario de pronunciaciones hablado libre!

74

Número 24

Los docentes han de ser conscientes de las enormes posibilidades que les ofrece la presencia de las TIC en sus aulas. Perseguimos que se forme una opinión fundada sobre medios y herramientas. Algunas de las conclusiones del análisis (si son válidas y convincentes y alguien desea aplicarlas) estarán fuera de su alcance, porque requerirán un trabajo de administración de la máquina o de la red del centro que no le competen. Y es posible que las aplicaciones no estén instaladas ni disponibles en las versiones actuales de las distribuciones. Pero todos sabemos que los protagonistas informados son muy poderosos. Y lo que es una posibilidad pedagógica para los profesores y alumnos se debe traducir (y normalmente se traduce) en una exigencia para los responsables de las distribuciones.

Voces y motores Empecemos por el principio. ¿Qué hace un lector de pantalla? Un complejo conjunto de tareas que con frecuencia es realizado por varias aplicaciones especializadas distintas: seleccionar los fragmentos de texto que queremos escuchar, convertir esos fragmentos a un formato que incluye información sobre cómo debe pronunciarse su síntesis (pensemos que este proceso implica conocimiento sobre los fonemas de una lengua y sobre su entonación o distintos acentos regionales o de clase), convertirlos a un formato de sonido que puede imitar una voz masculina o feme-

WWW.LINUX- MAGAZINE.ES

nina, enviar el fichero a la salida de audio. Una advertencia práctica: como es habitual en un mundo donde abundan las propuestas más o menos completas, lo que no abunda es la imaginación, y el campo de nombres en el que se mueven los autores a la hora de bautizar sus creaciones es bastante reducido. Como tienen que ver con el habla y el discurso, los nombres giran en torno a speakUP, espeak, emacspeak, speech-tools, speech-dispatcher, multispeech, multispeech-up, speechd-up, speechd-el. Como quiera que se refieren a soluciones independientes deberemos tener mucho cuidado para evitar confusiones. Pocas cosas le gustaría más al autor que entrar en el detalle del proceso de síntesis en todos su pasos, pero, por cuestiones de espacio, hemos de dejar como ejercicio voluntario para el lector interesado la lectura del fichero info de festival, con el glorioso detalle (análisis del texto, marcado de las partes del lenguaje, segmentación por sintagmas, entonación, duración, síntesis, envío al sistema de sonido… qué fascinante todo). En consecuencia pongámonos en modo esquema: nos limitaremos a señalar que un lector de pantalla no es nada sin un motor de síntesis de texto a voz (TTS son las siglas de Text To Speech); que existen distintos motores de síntesis por software, y que utilizan diferentes formatos de voz incompatibles. ¿Qué motores TTS? Descartamos de entrada epos y freeTTS, el primero porque está orientado a las lenguas eslavas (checo y eslovaco), el


Educación • LINUX USER

segundo porque hace casi dos años que no se actualiza y no nos proporciona nada que no proporcionen los restantes motores. Nos quedan, clasificados por idiomas • para el español: festival [3], eSpeak [4] (muy rudimentario para el español), ircha_tts (+ mbrola [5]) • para el francés: cicero, lliaphon (ambos con voces mbrola) • para el alemán: Hadifix (txt2pho con voces mbrola) y eSpeak • para el italiano: festival, eSpeak • para el inglés: festival, flite, eSpeak, freephone (+ mbrola) Seguimos en modo esquema: festival será nuestro motor de preferencia si la máquina permite su uso y si hay voces para nuestra lengua. Un motor no es nada sin voces, ¿de qué voces disponemos? Existen voces privativas de alta calidad, que gracias al esfuerzo de la ONCE funcionan en GNU/Linux y que la ONCE facilita a sus socios [6]. Vamos a centrarnos, como siempre, en las que nos permiten las libertades esenciales (las voces mbrola limitan algunas libertades, pues prohíben los usos comercial y militar[7]; como bendicen el uso educativo, las podremos utilizar a la espera de alternativas plenamente libres de calidad [8]). Dos formatos de voz son los más importantes: las voces festvox [9] (las que utiliza festival), y las voces de mbrola. Hagamos una nueva lista, esta vez de voces: • español – el_diphone (para festival); es1, es2, es4, mx1, mx2 (mbrola) • inglés – kal_diphone, ked_diphone, rab_diphone (voces de 16 bits para festival; existen también varias voces de 8 bits); en1, en1mrpa, us1, us1mrpa, us2 (mbrola; para en1, us1 y us2 hay adaptadores (wrappers) para su uso con festival); festvox_cmu_us_slt_arctic_hts, festvox_cmu_us_awb_arctic_hts, festvox_cmu_us_jmk_arctic_hts, festvox_cmu_us_bdl_arctic_hts (para versiones nuevas de festival, con un formato diferente), etc.

Figura 2: TTS en Oralux.

Figura 1: El directorio /proc de SpeakUP.

• italiano – lp_diphone, pc_diphone (festival) • francés – fr3, fr4, fr5, fr7 (estas dos con acento belga), ca1, ca2 (para mbrola, estas dos últimas con acento canadiense) • alemán – de6 (mbrola) ¿Cómo saber si funciona festival? Fácil echo ”hola colega” |U festival —tts —languageU spanish —pipe

Si se escucha, y el acento es razonable, habrá funcionado la síntesis TTS. ¿Y el francés, para el que no disponemos de voces festvox? cat texto_en_francés.txt |U /usr/share/cicero/bulktalk.py

Vemos que contamos con un número aceptable de voces. Nuestro problema no es la existencia o no de voces, sino su incompatibilidad y la falta de calidad de muchas. La falta de espacio nos obliga a posponer a la segunda entrega el examen del trabajo que se está realizando en la actualidad para paliar esta situación. Lectores de pantalla, motores TTS, voces, tenemos las piezas del puzzle, es el momento de ver cómo encajan, iniciamos la explo-

WWW.LINUX- MAGAZINE.ES

ración de las tecnologías existentes. Comencemos por las soluciones tradicionales, los lectores de pantalla para consola.

SpeakUP Saben lo que nos gustan las paradojas; ¡hemos encontrado una nueva! El lector de pantalla SpeakUP es un producto más del proyecto SpeakUP [10], que reúne aplicaciones de accesibilidad para consola. ¿En qué consiste el lector de pantalla SpeakUP? Creado por Kirk Reiser and Andy Berdan, se trata de un conjunto de parches al núcleo Linux que proporcionan funciones de accesibilidad desde el inicio del sistema. Esta característica tiene aspectos positivos y negativos. Por un lado requiere que la distribución incluya de forma generalizada un núcleo ya parcheado, lo cual causa problemas de mantenimiento y actualización: es difícil que una distribución se atreva a mantener una compilación del núcleo que no esté respaldada por un número importante de desarrolladores y de personas que puedan llevar un control de errores o informes de seguridad. En el aspecto positivo, la omni-disponibilidad teórica de la solución la hace inmediatamente utilizable cuando se usan lynx o vim o cualquier otra aplicación que funcione en modo texto. ¿Qué distribuciones incorporan SpeakUP[11]? Janina Sajka mantiene una versión modificada de Fedora (en estos momentos de FC6), SpeakupModified.Org, con isos descargables y con un almacén de paquetes rpm. En el mundo Debian, Shane Wegner ha

Número 24

75


LINUX USER • Educación

sudo speechd-up &

Figura 3: Distribución especializada Oralux.

creado paquetes actualizados con el núcleo 2.6.18, e imágenes para descargar. Hemos instalado en nuestro ordenador la imagen parcheada y la hemos añadido como una opción más en el menú grub. No ha funcionado. ¿Por qué? Porque hay que indicarle el dispositivo que va a realizar la síntesis de voz. SpeakUP está pensado para ser utilizado con sintetizadores de voz por hardware, y el listado de sintetizadores que funcionan se enumera en la página web. Pero para nuestro estudio habíamos decidido utilizar síntesis por software. El procedimiento variará dependiendo de si se ha compilado speakUP como un módulo o directamente en el núcleo; en el caso que nos ocupa deberemos añadir el parámetro speakup_synth=sftsyn a la línea kernel del grub title 2.6.18-speakup-686 root (hd0,0) kernel /boot/U vmlinuz-2.6.18-speakup-686U root=/dev/hda1 roU speakup_synth=sftsyn initrd /boot/U initrd.img-2.6.18-speakup-686

¿Ahora? Tampoco. La síntesis de voz por software no funciona en el inicio (la síntesis por hardware sí). Claro, hay que esperar a la carga de los programas que realizan la síntesis. ¿Cómo sabemos que está activo speakUP? Porque añade todo un subdirectorio con información al directorio /proc (figura 1). Para que nos funcione la síntesis por software debemos instalar dos paquetes adicionales: speech-dispatcher (del que ya hablaremos) y speechd-up (una interfaz entre speakUP y speech-dispatcher creada por los desarrolladores de este último y que permite utilizar motores de síntesis como festival o flite). El instalador Debian de speechd-up crea por nosotros los también necesarios dispositivos /dev/softsynth y /dev/synth; ahora es el momento de ejecutar

76

Número 24

Sigue sin funcionar (los registros muestran errores del sistema de audio «ALSA: Setting channel count to 1», «ALSA: cannot set channel count (Invalid argument)» y «ERROR: spd_audio failed to play the track» tanto si elegimos la salida festival como flite). Aunque el sistema funciona, identifica los textos que debe generar, y sintetiza la voz, no logramos oirlo (ya volveremos sobre las causas, pero en este caso speakUP no tiene la culpa). ¿Fácil, no? Pues no. Todo muy complicado. Nos encontramos ante un sistema que tiene sentido si se utiliza en combinación con un sintetizador por hardware, que en este uso funciona desde el arranque y no nos ocasiona las complicaciones que acabamos de experimentar. De todas formas, incluso en este caso, tiene dos defectos muy graves para nuestros intereses: el cambio de idiomas y voces sólo puede producirse estáticamente, en la configuración de speech-dispatcher (este cambio además sólo es posible en versiones muy recientes del software, que quizás no estén disponibles en nuestra distribución) y está limitado por el segundo defecto: no reconoce UTF-8, la codificación común de todas las distribuciones modernas. Tenemos que seguir buscando.

Emacspeak, multispeech, speechd-el El segundo tipo de solución que vamos a evaluar es un conjunto de desarrollos que, como algunas orquídeas, tienen en común el organismo en el que habitan: emacs. Para comprender cómo funciona emacspeak y el resto de las aplicaciones del título de la sección hay que comprender qué es emacs. Editing MACroS, o el Extensible MACro System, fue el primer paso de Richard Stallman en la construcción del proyecto GNU (sí, el GNU de GNU/Linux, el origen de todo). Mucho más que un editor de textos, se trata de un entorno de trabajo escrito en Lisp que ha ido añadiendo funcionalidades hasta merecer el chiste que ya contamos en alguno de los primeros números: emacs sería un buen sistema operativo, lástima que carezca de un buen editor de textos. En primer lugar vamos a presentar emacspeak, «el escritorio oral completo»[12]. Pero hemos aprendido de las peripecias anteriores, ¿verdad? No queremos complicadas instalaciones y configuraciones. ¿Cómo podemos ver emacspeak trabajando si los autores de nuestra distribución no lo han preinsta-

WWW.LINUX- MAGAZINE.ES

lado o si no queremos pelearnos con las profundidades de la administración de un sistema GNU/Linux? Hay una solución: ¡usemos un disco live! Sugiero descargar la versión más reciente de la distribución especializada Oralux [13], en estos momentos las versión 0.7 alpha, y reiniciar el ordenador. Antes de iniciar el sistema con el disco vivo podemos leer la información html proporcionada en el CD (figura 2). Tras el inicio típico de todos los knoppix (figura 3) escucharemos cantar al gallo Oralux (que se note que es una distribución francesa), y el sistema nos hará una serie de preguntas por escrito y oralmente. En primer lugar nos permitirá elegir el idioma del menú, modificar el teclado, seleccionar o no un dispositivo braille, etc. En tanto a lo que nos interesa, el «entorno de interfaz oral de usuario», podremos elegir (supongo que tras que se detecte que no contamos con hardware de síntesis ni braille [14]) entre un escritorio emacspeak o multispeech; elegido éste se nos ofrece sucesivamente utilizar multispeech, flite, cicero TTS o DecTalk. Seleccionaremos emacspeak. Emacspeak, de T. V. Raman, aporta una capa oral sobre emacs. El punto fuerte de la versión 25.0 es el cumplimiento completo de las especificaciones de la W3C sobre las hojas de estilo auditivas. Pero escuchemos a Raman (la siguiente no es una cita literal, sino una paráfrasis adaptada y resumida): «Emacspeak introduce varias mejoras e innovaciones con respecto a los lectores de pantalla ordinarios; a diferencia de estos, que verbalizan el contenido visual de una pantalla, Emacspeak lee la información subyacente. Por ejemplo, cuando otro lector de pantalla se utiliza para leer una aplicación de calendario, el resultado es que el usuario invidente oirá una secuencia sin sentido de números; por el contrario Emacspeak lee la fecha relevante de un modo fácilmente comprensible. En la interfaz de usuario se utilizan cambios en las características e inflexiones de las voces, combinados con un uso apropiado de iconos sonoros, para crear el equivalente de la estructura espacial, los tipos de letra y los iconos gráficos, tan importantes en la interfaz visual.» La cita es larga, pero toca cuestiones esenciales. De todos modos no vamos a usar emacspeak directamente. Recordemos que necesitamos responder también al multilingüismo. Una segunda opción, más apropiada para los objetivos de nuestra investigación, es multispeech, de Igor B. Poretsky, «un servidor de habla para emacspeak multi-


Educación • LINUX USER

lingüe». Permite utilizar hasta seis idiomas: portugués del Brasil, inglés, francés, alemán, ruso y español. Podemos probarlo desde el disco de Oralux (además es compatible con speakUP gracias al paquete multispeech-up). ¿Y qué sintetizadores hardware funcionan? El listado que proporciona el paquete emacspeak-ss (los habituales, no vamos a enumerarlos aquí). ¿Y emacspeak y complementos funcionan con voces sintetizadas por software? Sí (el motor flite, con la ayuda de la interfaz eflite). Problema: flite sólo proporciona una voz, y en inglés. ¿Funciona con speech-dispatcher? Podemos decir que sí, gracias a speechd-up, pero como avisan los propios autores «esta interfaz no es en absoluto óptima y sufre de muchos problemas. No obstante es posible que algunos usuarios la encuentren útil». Qué miedo. Hay un tercera opción independiente dentro del mundo emacs, que me parece un paso adelante: instalar el paquete speechd-el (y el paquete complementario sound-icons, también preparado por el checo Milan Zamazal). ¿Cómo funciona? Una vez instalado se lanza emacs y se ejecuta ESC-x speechd-speak INTRO

A partir de ese momento el sistema lee los ficheros que abrimos (la figura 4 muestra el cursor en la línea que acaba de leer), lo que escribimos, las órdenes que ejecutamos… ¿Qué aporta speechd-el? La facilidad de configuración y la integración directa con speech-dispatcher. ¿Hemos terminado? ¿Hemos descubierto la aplicación que buscábamos, funcional, sencilla, multilenguaje? Hay una comparativa entre SpeakUP y Emacspeak en el sitio del proyecto SpeakUP[15]. Recogemos su análisis y lo completamos con las opiniones escuchadas y las propias. Lo bueno y lo malo de emacspeak, multispeech o speechd-el tienen que ver con su integración con emacs. Aquello que funciona adecuadamente en emacs funcionará de forma brillante en las aplicaciones que le aportan una capa oral; pero ¿qué ocurre con las aplicaciones para consola que no tienen nada que ver con emacs (lynx, vi, centericq?) Sencillamente que tendremos problemas. Hay una segunda dificultad, más decisiva. El de emacs es un mundo sui generis, diferente al de las interfaces de usuario que se han convertido en estándares. Un usuario avanzado de emacs no se dignará en tocar el ratón: todo se hace más rápido con combina-

Figura 4: Speechd-el para emacs.

ciones de teclas (lo cual por cierto es positivo para personas que tienen dificultades para manejar el ratón). Pero también es verdad lo contrario: nada está donde los usuarios habituales nos hemos acostumbrado a encontrarlo, ni se llama como se suele llamar. Digamos, en conclusión, que la curva de aprendizaje tiene una pronunciada cuesta en su inicio. Nada amigable si el grueso de los usuarios viene cargado de hábitos de otros sistemas operativos.

Conclusión parcial Si lo que llevamos visto es la respuesta de GNU Linux al problema de la síntesis de voz, sería el momento de comenzar a preocuparnos. 1.- No tiene sentido que una aplicación se ocupe de todo el proceso, desde el análisis del texto que debe sintetizarse hasta la salida de sonido específica para todos y cada uno de los sintetizadores, sea por hardware, sea de software. Es decir, se nos plantea la necesidad de una interfaz unificada intermedia entre los lectores de pantalla y el software o hardware de síntesis. 2.- El problema del sonido. No nos ha aparecido porque hemos examinado las aplicaciones en situaciones abstractas, pero cualquier usuario de dará de bruces con él: luchan en GNU Linux varios sistemas de sonido (OSS, alsa, esound, arts, jack…) y las aplicaciones pugnan por bloquear los dispositivos de salida. Esto, que sería sólo molesto si a la vez que escuchamos un CD

WWW.LINUX- MAGAZINE.ES

de música queremos jugar a un juego multimedia, es trágico (sencillamente el sistema no va a funcionar) si necesitamos comunicarnos con la máquina por medio del sonido. 3.- La codificación. No está suficientemente documentado (todavía) pero es un problema que es probable que antes o después se nos presente. Las distribuciones modernas han optado por utilizar codificaciones UTF-8 de forma predeterminada. Pues bien, los motores de voz actuales (con la excepción de eSpeak) esperan una entrada de 8 bits, a veces exclusivamente iso-8859-1 (el antiguo estándar europeo occidental, también llamado latin1). Es necesario que en algún momento del proceso intervenga un conversor de codificaciones. Por ilustrar el problema con un ejemplo concreto, señalemos que festival sólo acepta entradas de 8 bits; la tarea de las funciones presentes en recode.scm, del paquete festival-freebsoftutils, es llamar a la aplicación externa iconv para realizar la conversión. Y presupone que la entrada va a ser UTF-8. La fuente de problemas es múltiple: si el sistema espera UTF-8 y enviamos latin1, el conversor de UTF-8 dará error y el proceso no tendrá éxito; si el sistema espera latin1 y enviamos UTF-8 sin la participación de un conversor (es el caso de la mayor parte de los motores utilizados de forma directa), tampoco tendremos síntesis. Pero es que, además, el problema es estructural: en las lenguas latinas el problema no es más que

Número 24

77


LINUX USER • Educación

molesto, pero la síntesis de lenguas en las que los caracteres ocupan más de un byte ahora mismo no es posible. 4.- Supongamos que la interfaz unificada de salida de los sintetizadores existe, sea más o menos perfecta, y un adelanto ha ido apareciendo a lo largo de esta primera entrega: se llama speech-dispatcher. Supongamos también que el problema del sonido se resuelve (veremos cómo en la siguiente entrega). Y que nuestras necesidades sólo tienen que ver con lenguas occidentales, y que con los conversores y un poco de cuidado, y a la espera de mejores voces, nos apañamos. O sabemos idiomas y nos manejamos aceptablemente con una interfaz en inglés. A pesar de todo esto, pienso que estaríamos aceptando un fracaso.

Hablo ahora en primera persona, a partir de la experiencia de un usuario que durante años ha preferido el trabajo en la consola por su velocidad y su potencia. Aún en la actualidad tiendo a abrir una terminal a la menor oportunidad (allá cada cual con sus inercias). Sin embargo, cada vez tengo más claro que limitar el acceso de las personas con problemas de visión a la consola es reducirlos a un ghetto. Por mucho que avancen las aplicaciones para consola, el grueso del desarrollo se está realizando en proyectos como Gnome y KDE. Nuestro desafío, y el desafío de la comunidad, es la accesibilidad para todos de aplicaciones como Firefox u OpenOffice. No necesitamos una aplicación adaptada, accesible en consola, para cada tarea, sino que las aplicaciones de uso general sean

plenamente accesibles. Es un enfoque radicalmente distinto; implica que de una vez seamos capaces de analizar de forma abstracta la interfaz de usuario y de pensar que no tiene porqué ser exclusivamente gráfica, que por ejemplo, el concepto de iconos puede ser gráfico o auditivo, o que al fin se utilice adecuadamente el html (o el xml del Open Document Format) como lo que es desde su creación, un lenguaje de marcas con carga semántica, leíble de distintos modos según la hoja de estilos que se utilice.

Y en el próximo número… ¿Cómo se resuelven los problemas planteados? ¿Nos queda alguna esperanza? No se pierdan la continuación de esta apasionante ■ serie de artículos.

NOTAS [1] Linux Magazine guarda la versión pdf de todos los artículos de la sección de educación. Los citados se pueden descargar en los enlaces http://www.linux-magazine.es/ issue/06/ y http://www.linux-magazine.es/ issue/07/. Asímismo el autor aloja versiones accesibles (en html) en http://people. ofset.org/jrfernandez/edu/n-c/a11y_1/ index.html y http://people.ofset.org/ jrfernandez/edu/n-c/a11y_2/index.html. [2] Digamos mejor clave, condición sine qua non para que una distribución sea educativa, porque una distribución que no atiende a la diversidad no será nunca una distribución educativa. [3] Festival (http://www.cstr.ed.ac.uk/projects/ festival/) es un proyecto de la Universidad de Edimburgo. En estos momentos la versión incluida en Debian es la 1.4.3-17.2, bastante anticuada (por citar un ejemplo, no permite utilizar las voces nuevas en el formato MultiSyn). En las páginas de partes de error hay hace tiempo un aviso para que se cree el paquete de la versión 1.95 (http://bugs.debian.org/327541); sin embargo, Alan W Black puso a disposición de todos una versión 1.96-beta (http:// www.speech.cs.cmu.edu/awb/fftest/ festival-1.96-beta.tar.gz) hace ya casi dos años. En este aspecto no se está al día en absoluto. Lamentamos no poder analizar con algo de detalle el motor de voz; simplemente diremos que quien lo utilice debería instalar también festival-freebsoftutils (seguimos en modo esquema: leer el fichero info). [4] http://espeak.sourceforge.net, un motor plenamente libre (incluido en Debian). Hay un análisis muy interesante de Nickolay V. Shmyrev en la lista de festival-talk (6 de

78

Número 24

septiembre de 2006). [5] http://tcts.fpms.ac.be/synthesis/mbrola. html. Hay paquetes Debian preparados por Igor B. Poretsky y Gilles Casse, en el almacén de Oralux. [6] Loquendo (http://www.loquendo.com/) o TTSynth, el antiguo IBM ViaVoice (http:// www.ttsynth.com/)… hay un conjunto de enlaces, privativos o libres, en http://wiki. tiflolinux.org/index.php/ Sintesis_de_voz_en_linux_listado. En la próxima entrega escribiremos acerca de las importantes aportaciones de la ONCE al mundo del software libre. [7] La licencia de mbrola y sus voces puede leerse en http://tcts.fpms.ac.be/synthesis/ mbrola.html. [8] En el próximo número trataremos con el detalle que merecen los proyectos de creación de voces libres para el castellano y el catalán. [9] http://www.festvox.org/. [10]El proyecto SpeakUP: http://fl. linux-speakup.org/; la página del lector de pantalla SpeakUP: http://fl.linux-speakup. org/speakup.html. Hay un Speakup HOWTO en http://www.tomass.dyndns. org/~stivers_t/Speakup-HOWTO/ Speakup-HOWTO.html (de Thomas Stivers, 2004) y un The Speakup User’s Guide For Speakup 2.0 and Later, de Gene Collins, de 2005 (http://fl.linux-speakup. org/spkguide.txt).

listado de tareas realizables: http:// emacspeak.sourceforge.net/applications. html. Fuentes de multispeech: ftp://ftp. rakurs.spb.ru/pub/Goga/projects/ speech-interface/current (hay paquetes en el almacén de Oralux). [13]Oralux: http://oralux.org/. Casi tan interesante como la distribución es su almacén de paquetes Debian deb http://oralux.net/packages unstable main non-free contrib.Oralux no es la única distribución orientada hacia las personas con problemas de visión, pero entiendo que es la que más está contribuyendo (gracias a Gilles Casse) a las distribuciones generalistas, puesto que como hemos visto, no se limita a seleccionar aplicaciones ya existentes, sino que crea sus paquetes propios y se esfuerza porque esos paquetes lleguen en concreto a Debian. Para una alternativa hispana podemos mirar Lazarux, derivada de Ubuntu, presentada por quetzatl en http://www.tiflolinux.org/ ?q=node/39 (la 2.0-4 es de agosto del 2006). Se puede descargar por el momento en http://www.grupomads.org/ download/ (grupo que, por lo que entiendo, está relacionado con la Universidad de la Coruña).

[11]SpeakupModified: http:// speakupmodified.org/. Núcleos para Debian: http://people.debian.org/~shane/ speakup/kernel/.

[14]Según la documentación, un tanto obsoleta, las opciones son speakUP, preinstalado sin sudor ni lágrimas!, emacspeak, y un tercero, yasr. Yasr, Yet Another Screen Reader, es un lector de pantalla escrito por Mike Gorse, descrito como «ligero y portable»: http://sourceforge.net/projects/yasr/; hay paquete Debian, de Mario Lang, y versión modificada por Gilles Casse.

[12]http://emacspeak.sourceforge.net/. Raman se ha molestado en enumerar un

[15]Concretamente en http://fl.linux-speakup. org/faq.html.

WWW.LINUX- MAGAZINE.ES


Línea de comandos: Errores de red • LINUX USER

Herramientas de diagnóstico de Red

A TRAVÉS DE LA RED Linux posee las herramientas adecuadas para buscar y encontrar en la red errores y abrir el camino a los paquetes de datos. POR HEIKE JURZIK

O

btener ayuda puede salir muy caro si la conexión a Internet falla inesperadamente o cuando no se puede tener acceso a los ordenadores de la red local. Varias herramientas de la línea de comandos pueden ayudar a investigar conflictos en la red. ping y trace route comprueban la disponibilidad de otros ordenadores; puede contactarse con los servidores con host y dig; netstart ayuda a descubrir qué está ocurriendo en el sistema.

¿Quién Soy Yo? La herramienta ifconfig permite comprobar la propia interfaz de red del ordenador personal. Esta práctica utilidad no sólo presenta información de la configuración actual, sino que también ayuda a configurar la interfaz. Para presentar las configuraciones actuales se ejecuta /sbin/ifconfig sin ningún parámetro. Como el programa reside en /sbin, que habitualmente no se encuentra en $PATH del usuario, será necesario especificar la ruta completa. El Listado 1 muestra el comando y la salida para cada interfaz secciones separadas. En este ejemplo el ordenador posee una tarjeta de

red (eth0) con una dirección IP de (inet addr) 10.195.34.14. Pueden verse los detalles de la dirección de emisión del programa (Bcast), y la máscara de red (Mask). La etiqueta UP muestra el número de paquetes recibidos, y TX el número de paquetes transmitidos. Adicionalmente, se encuentra configurada la interfaz loopback (lo), que es la que da acceso interno a los usuarios a la máquina a través de la dirección IP 127.0.0.1 y el nombre de localhost. La tercera interfaz de esta lista es una conexión DSL, ppp0; el ordenador tiene una dirección en Internet de 11.22.33.44.

¿Quiénes son los demás? Gracias a una práctica invención llamada Domain Name Service, nadie está obligado a recordar las complejas direcciones IP. En su lugar pueden usarse nombres de dominios para contactar con los ordenadores. dig o host

en la línea de comandos permiten comprobar si la configuración DNS está funcionando adecuadamente. Ambas herramientas esperan bien un nombre de dominio o bien una dirección IP como argumento, y la resolución del nombre funciona en ambas direcciones. El Listado 2 es un ejemplo de una petición dig. Además de QUESTION SECTION, dig también presenta una ANSWER SECTION. La dirección IP para el nombre de dominio pasó a dig seguido de A. Para resolverlo en la dirección opuesta, es decir, desde una dirección IP a un nombre de dominio, es necesario especificar la opción -x.

Figura 1: Ping permite comprobar si la máquina está accesible.

WWW.LINUX- MAGAZINE.ES

Número 24

79


LINUX USER • Línea de comandos: Errores de red

Listado 1: Salida ifconfig 01 $ /sbin/ifconfig

10

02 eth0 Link encap:Ethernet HWaddr 00:30:48:70:4B:40

11

03

04 05 06 07

08 09

inet addr:10.195.34.14 Bcast:10.195.34.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 (...) RX packets:1162180567 errors:0 dropped:449 overruns:0

carrier:0 (...)

12 lo Loopback 13

Link encap:Local

inet addr:127.0.0.1 Mask:255.0.0.0

14

(...)

15 ppp0 Link encap:Point-Point Protocol 16

inet addr:11.22.33.44 P-t-P:11.22.33.55 Mask:255.255.255.0

17

(...)

frame:0 TX packets:2046191782 errors:0 dropped:0 overruns:0

La herramienta host no necesita un parámetro para especificar la dirección a resolver, aunque tampoco ofrece tanta información como dig. Acepta IPs y nombres de dominios sin protestar. Hay un ejemplo en el Listado 3: algunos nombres de dominio comparten a menudo la misma dirección IP, cuando un servidor web hospeda diferentes páginas, por ejemplo. Al mismo tiempo, un nombre de dominio puede resolver a múltiples direcciones IP: raramente usa sitios webs como Google o eBay, por razones de rendimiento usa múltiples servidores.

Ping-Pong El comando ping permite comprobar si una máquina se encuentra activo. El programa espera una dirección IP o un nombre de host como entrada, y mide la respuesta del destino. Para comprobar si está funcionando la conexión a Internet puede hacerse ping a una

Listado 2: Ejemplo de dig 01 ]$ dig www.linux-magazine.es

15 ;; AUTHORITY SECTION:

02

16 linux-magazine.es. IN NS ns2.m-online.net.

82832

17 linux-magazine.es. IN NS ns1.m-online.net.

82832

03 ; <<>> DiG 9.3.1 <<>> www.linux-magazine.es 04 ;; global options:

¿Bien Conectado? Si tu ordenador no se encuentra conectado directamente a Internet, sino que se usa un router, puede ejecutarse el comando route para obtener la tabla routing. Es preciso introducir de nuevo la ruta completa para este comando. Las salidas de las direcciones IP en lugar de nombres de hosts configura adicionalmente el parámetro -n. La salida desde este comando es una tabla con el destino como primera columna (Destination). La última columna contiene la interfaz a través del cual se enviarán y recibirán los paquetes. En nuestro ejemplo (Listado 4), todos los paquetes enviados a las direcciones IP que comienzan con 10.195.34 usan la interfaz de red eth0. La conexión a Internet se muestra en la segunda línea; si la dirección destino no comienza con 10.195.34, el paquete será enviado primero a 10.195.34.5 (el router) que se ocupará de remitirlo a su destino.

80

Número 24

máquina fuera de la propia red, tal como ping -c 8 www.google.com. El programa envía paquetes ICMP al ordenador especificado, el cual, habitualmente, responderá con paquetes ICMP. Si no se especifica ningún parámetro adicional, la prueba continuará hasta que deje de hacerse ping pulsando el atajo de teclado [Ctrl] + [C]. La opción -c número permite restringir el número de paquetes a intercambiar. Después de completarse el intercambio de paquetes, ping presenta estadísticas con los tiempos de viaje, que adicionalmente dirán el número de paquetes que se han perdido (Figura 1). ping es una muy buena manera de aislar algunos errores de comandos: • Si se arranca el programa y no ocurre nada pero se ve un mensaje de error tal como ping: unknown host www.google.de poco tiempo después probablemente sea por que hay un problema DNS. En este caso hay que intentar hacer ping a una dirección IP para comprobar las configuraciones de red. • Si todo es un poco lento y ping no proporciona ninguna salida primero, aunque luego muestra la salida normal, el primer servidor de nombres puede que no se encuentre disponible o bien podría tener algún otro pro-

printcmd

05 ;; Got answer: 06 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29166

18

07 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

20 ns1.m-online.net. 68887 IN A 212.18.0.8

08 09 ;; QUESTION SECTION: 10 ;www.linux-magazine.es. IN A 11 12 ;; ANSWER SECTION: 13 www.linux-magazine.es. 85779 IN A 212.227.96.14 14

19 ;; ADDITIONAL SECTION:

21 ns2.m-online.net. 68884 IN A 212.18.3.8 22 23 ;; Query time: 2409 msec 24 ;; SERVER: 194.25.0.69#53(194.25.0.69) 25 ;; WHEN: Mon Jan 2007 26 ;; MSG SIZE

1 21:18:31

rcvd: 135

Listado 3: Nombre de Dominio con Múltiples IPs $ host www.google.com www.google.com is an alias for www.l.google.com. www.l.google.com has address 66.102.9.104 www.l.google.com has address 66.102.9.147

WWW.LINUX- MAGAZINE.ES


Línea de comandos: Errores de red •LINUX USER

Figura 2: La herramienta traceroute muestra las estaciones intermedias en ruta desde tu ordenador a la estación destino.

blema. En este caso, el segundo servidor de nombres de la configuración entra en funcionamiento después de una corta demora. • Si no ve ninguna respuesta, el cortafuegos puede estar bloqueando los paquetes ICMP por el lado objetivo. • packet loss no significa automáticamente que se tenga un problema, el objetivo del router podría estar ocupado.

La Ruta Adecuada Aunque ping nos dice si se puede llegar hasta un servidor, sin embargo no ofrece información acerca de la ruta que siguen los paquetes a través de la red. Para encontrarla se necesita la herramienta traceroute. De nuevo habrá que pasar la dirección IP o el nombre de host a la herramienta (Figura 2). Al igual que ping, traceroute envía paquetes traza a través de la red. Los paquetes tienen un tipo de “fecha de caducidad” (TTL=Time to Live, o Tiempo de vida). Cuando un paquete alcanza un host, éste envía un mensaje de error a la máquina fuente y rechaza el paquete. Si el paquete es válido, decrementa el TTL y envía el paquete a la siguiente estación en ruta. Los mensajes de error rastrean la ruta. traceroute incrementa el TTL en cada etapa para permitir que los paquetes viajen a una estación más. Un paquete con un TTL de 2 alcanzará la segunda dirección intermedia. TTL 3 alcanzará la tercera, y así sucesivamente. traceroute repite esta transmisión tres veces para cada máquina, y espera tres segundos para que cada máquina individualmente responda. traceroute puede tomar diferentes rutas. Si se envía a la misma máquina dos veces y se ven diferentes direcciones intermedias, no hay que preocuparse. Si se ven asteriscos

Figura 3: mtr combina la funcionalidad de las utilidades ping y traceroute.

como en la Figura 2, probablemente se alcanzará un cortafuego en ruta, aunque los paquetes simplemente pueden desaparecer. traceroute usa por defecto paquetes UDP, aunque especificando la opción -l podrán usarse paquetes ICMP. Si la salida contiene una cadena de asteriscos inusualmente larga, puede suponerse que la herramienta ha caído a merced de todos esos cortafuegos. En este caso, debería probarse con tcptracerote, un programa que transmite paquetes TCP configurados para usar el puerto 80, el puerto al que escuchan la mayoría de los servidores web. Si se sabe que el destino no ejecuta un servicio web, hay que especificar el puerto. Para contactar con una máquina a través del puerto 22 (SSH), se escribe lo siguiente: $ tcptraceroute target 22

Otras Herramientas mtr es una ingeniosa combinación de ping y traceroute. Es preciso especificar la máquina destino cuando se arranca. La salida resul-

tante muestra la ruta tomada por los paquetes, presentándose las estaciones individuales y continuando con ping hasta que se abandone cuando se pulse [Q]. Como alternativa, puede especificarse un número determinado de paquetes; por ejemplo, mtr -c 12 targets abandona mtr después de enviar una docena de paquetes al destino. netstat es otro programa que permite descubrir errores en la configuración de red. Sin ningún parámetro, vuelve al estado de sockets abiertas. El parámetro -e ofrece información adicional sobre el UID, -p suministra información sobre el PID y el nombre del programa que abrió el socket. -a muestra todos los servicios, bien servicios activos o sockets de servidores escuchando conexiones. Si solamente se está interesado en conexiones TCP, puede especificarse adicionalmente la opción -t. El ejemplo en el Listado 5 muestra la ejecución de los servicios FTP y SMTP. Un usuario ha abierto una conexión FTP a la máquina y otro está navegando por la ■ web.

Listado 4: Tabla de Enrutado 01 $ /sbin/route -n 02 Kernel IP routing table 03 Destination

Gateway

Genmask

Flags Metric Ref Use Iface

05 10.195.34.0

0.0.0.0

255.255.255.0 U

06 0.0.0.0

10.195.34.5 0.0.0.0

UG

0

0

0 eth0

0

0

0 eth0

Listado 5: Salida de netstat $ netstat -atp | less Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State (…) tcp

0

0 *:ftp

*

LISTEN -

tcp

0

0 *:smtp

*

LISTEN - (…)

WWW.LINUX- MAGAZINE.ES

Número 24

81


LINUX USER • Juegos

Postal 2: Apocalypse Weekend

EL CARTERO HA VUELTO La saga más gore, sangrienta, violenta y políticamente incorrecta de la historia de los videojuegos tiene su cenit en esta expansión que nos sitúa en el pellejo del protagonista habitual de la serie (The Postal Dude), pero esta vez aderezado con una jugosa lesión cerebral que nos dará mucho juego. POR VICENTE CARRO

L

o primero que hay que aclarar de este juego es que es una expansión comercial de Postal 2. Por lo tanto, es absolutamente indispensable tener Postal 2 o Postal 2: Share the Pain para poder instalarlo y jugarlo. Tras este pequeño inconveniente, pues pensamos que esta joya debería haber salido al mercado como un juego completo independiente, nos encontramos ante el mejor Postal de la saga, y no sólo por el apartado gráfico. Apocalypse Weekend [1] hereda casi todas las características de sus antecesores, pero hay dos importantes diferencias a tener en cuenta:

Escenarios más cerrados En juegos anteriores lo habitual era poder pasearnos por toda la ciudad y hacer las

misiones, hasta cierto punto, en el orden que quisiésemos. De hecho, la saga postal [2] fue la semilla de los actuales juegos “Gran Theft Auto” y similares, en los que se puede jugar por enormes extensiones de terreno, ciudades y alrededores. Sin embargo, en Apocalypse Weekend esta libertad se ha visto reducida notablemente. Hemos pasado de poder movernos por toda una ciudad a movernos por fases muy grandes. Pero no es tan grave como parece, ya que alguna de esas fases son de hecho barrios de la ciudad, con lo que el resultado final es que la ciudad sigue ahí, aunque no se nos permita ir adonde queramos, sino adonde deberíamos ir. Es más, con el cambio hemos ganado en extensión, ya que la suma de terrenos de las actuales fases es muchísimo mayor que las anteriores ciudades enteras.

Tenemos guión

Figura 1: Preparándonos para la matanza de elefantes.

82

Número 24

Si hay más terrenos que antes y la ciudad es jugable, ¿por qué se ha limitado la libertad de movimiento? La respuesta es muy sencilla: porque en este juego sí hay guión (cosa que no había como tal en los anteriores). Así que la única manera viable de conducir la historia es limitando los pasos de

WWW.LINUX- MAGAZINE.ES

nuestro protagonista. Además, el guión sigue la tónica de la saga y nos sorprende a cada nuevo paso haciendo uso intensivo de los efectos colaterales de tener una lesión cerebral. Y es que Postal Dude comienza el juego en la cama de un hospital, con la cabeza vendada debido a una herida bastante seria. Los que hayan completado el juego anterior sabrán a qué se debe esta herida y no lo vamos a revelar por si alguien todavía se lo está terminando…

Yo mutilo, tú mutilas, él mutila… La saga del juego se hizo famosa debido a las enormes posibilidades de hacer el “cafre”. Se han heredado todas esas opciones en este título, pero se han aumentado en número, calidad y sadismo. Por ejemplo, algo que ha sido mimado por sus desarrolladores ha sido el motor de mutilación. En la versiones anteriores podíamos mutilar a los transeúntes de manera general (cortar la cabeza, un brazo, etc). Sin embargo, ahora podemos hacer trocitos más pequeños y con mas precisión. Esto, que parece una tontería sádica, hará desternillarse de risa a más de un grupo de amigos. Además creemos, lejos de ser psicólogos, que despedazar a algún enemigo especialmente problemático debe tener algún efecto catártico en los jugadores. Por otro lado, lógicamente, dejar jugar a un niño con este juego sería, desde nuestro punto de vista, una enorme falta de respon-


Juegos • LINUX USER

sabilidad; especialmente porque el propio juego no está recomendado a menores de 18 años.

Variedad Otro de los puntos fuertes del juego es la variedad que se le ha dado en su desarrollo. Cambiarán los ambientes, los enemigos, los objetivos a cumplir… incluso cambiará la realidad (gracias a nuestra lesión cerebral). A lo largo de la historia pasaremos por el hospital, por la ciudad, un restaurante chino, un zoológico de elefantes, una base militar, la casa de Vince, un particular infierno y mucho más. También los desarrolladores han querido hacer algunos guiños a ciertos juegos famosos como son Silent Hill y Resident Evil, entre otros. Como ejemplo de estos guiños hay una secuencia al principio del juego en la que Postal Dude camina por un pasillo, y de pronto las paredes, techo y suelo, así como todos los objetos se muestran oxidados, llenos de sangre y sustancias misteriosas, tal y como es habitual en la saga Silent Hill cuando se pasa al “otro lado”. Por su parte, los objetivos de cada fase pueden ir desde tener que llegar de un punto A a un punto B, hasta tener que exterminar la población de elefantes del zoológico pasando por eliminar a toda una célula de terroristas islámicos. Mención especial para la misión “Vinces house”, en la que tendremos que defender la casa de Vince de una invasión zombie en toda regla. Magistral hasta el punto de que los juegos de zombies habituales deberían tomar notas de esta fase.

Cambio de enemigos Si bien en los anteriores Postal los enemigos eran las distintas comunidades y grupos que habitaban en la ciudad, en este juego el enemigo principal ha cambiado: pelearemos contra zombies.

Sin razón aparente la ciudad está siendo infestada de zombies, así que tendremos que encargarnos de ellos sin compasión… al fin y al cabo ya están muertos. Pero no será cosa fácil, ya que los zombies solo morirán si destruimos su cabeza. Cortarles la cabeza, quemarlos, golpearlos o dispararles no servirá para nada. Es más, cortarles la cabeza será una idea terriblemente mala, ya que el zombie seguirá “vivo” y tendremos que Figura 3: El gore es el punto fuerte de Apocalypse Weekend. buscar su cabeza por el suelo para poder destruirla mientras su cuerpo nos golcidad a la saga. También ya ha sido anunpea. No faltará tampoco Gary Coleman, ciado que en un futuro aparecerá Postal 3: pero esta vez hará su aparición como un Catharsis, con cambios drásticos en todos zombie muy molesto con afición por lanlos aspectos y haciendo uso del motor zarnos objetos varios como tijeras o incluso Source de Half Life 2. granadas de mano. Conclusión Sin embargo, no todos los enemigos serán zombies ya que en ciertas ocasiones Siendo la última y mejor parte de la saga los acontecimientos nos abocarán a luchar Postal, este juego hará las delicias de todos contra humanos: militares, servicios de sus fans , ofreciéndoles numerosas seguridad o terroristas (Osama incluido), mejoras, guión, mucha variedad y además de contra cualquier transeúnte que diversión a raudales. Para los que no crea que somos una amenaza para su seguconozcan la saga, deberían echarle un ridad. vistazo a este gran juego repleto de gore. Niños y personas sensibles deberían, por el Técnica contrario, escapar de él como del diablo, ya Todos los apartados de Apocalypse Weeque los términos moderación, buen gusto y kend han sido mejorados con respecto a “políticamente correcto” no están en el Share the Pain (el anterior título de la saga). diccionario de los chicos de Running with ■ Gráficamente se nota una mejora de las Scissors. texturas del juego y todo parece más sólido. El motor físico y de ragdolling (que los Puntuación muñecos se muevan en las caídas como si Lo mejor tuvieran un esqueleto real) se han mejo• Tremendamente rado muchísimo, y ahora, el peso de las divertido extremidades puede hacer que si matamos • Ideal para relajarse a un enemigo en un tejado, su cadáver • Tiene guión :) vaya dando tumbos hasta el final del tejado y finalmente se deslice y caiga hasta el Lo peor suelo. El audio mantiene su nivel, pero se • Es de pago han añadido más comentarios (en • Necesita Postal 2 o Postal 2: Share the inglés) y la escasa música es prinpain cipalmente ambiental.

8.5

• Está en inglés

Futuro

Figura 2: Al estilo Silent Hill pasamos al “otro lado”.

Postal es una saga muy fructífera con muchísimas ventas a pesar de estar prohibido en algunos países. Además, se está rodando una película [3] del juego que está siendo dirigida por el “director” Uwe Boll (culpable de Alone in the dark, House of the Dead y otras perlas), que independientemente del resultado final dará mucha publi-

WWW.LINUX- MAGAZINE.ES

RECURSOS [1] Página oficial de Apocalypse Weekendhttp://gopostal.com/postal2/aw. php [2] Página oficial de Postal http://www. gopostal.com/ [3] Página oficial de la películahttp:// www.postal-the-movie.com/

Número 24

83


COMUNIDAD · Konsultorio

EL CONSULTORIO DE KLAUS Klaus Knopper es el creador de Knoppix y co-fundador de la LinuxTag Expo. Trabaja en la actualidad

como

profesor,

programador y consultor. Si tiene algún problema de configuración, o simplemente quiere conocer mejor cómo funciona Linux, no dude en escribir sus preguntas a:

preguntas@linux-magazine.es.

Fedora Core 5 He instalado recientemente Fedora Core 5, concretamente la versión de productividad, en un AMD Athlon 1300 haciendo uso de la versión Lite en un unidad DVD. Aunque la instalación se realizó sin problemas, no puedo montar el disco para cualquier otro uso después de la instalación. Sería útil estudiar el mensaje de error en este caso, pero mis suposiciones son: 1. Existe un punto de montaje (directorio vacío) que se supone debe estar ubicado en un sitio desde donde podemos

84

Número 24

ver qué hay en un DVD montado. Normalmente suele ser /media/dvd o una ruta similar. 2. Existe un archivo de dispositivo que coincide con esta unidad. Una grabadora de DVD conectada como maestro en un slot IDE/ATAPI secundario suele denominarse /dev/hdc, mientras que una unidad SATA sería algo como /dev/scd0 o /dev/sr0. 3. Vemos el contenido del archivo de texto /etc/fstab y verificamos la presencia de una línea aproximadamente como la siguiente: /dev/hdc /media/dvd U iso9660 ro,users,noauto 0 0

El significado de esta línea viene a ser algo como “El contenido del DVD del dispositivo /dev/hdc puede verse en /media/dvd después de que algún usuario lo haya montado como sólo lectura (ro), pero no puede montarse de manera automática en el arranque (noauto), y no se le hará copia de seguridad ni verificación de datos corruptos”. Si una línea como esa está presente en /etc/fstab, debería funcionar sin problemas el montaje de un DVD desde una cuenta sin privilegios: mount /media/dvd

Algunas herramientas de detección de hardware añaden esta línea tan pronto como se inserta el medio. Determinados escritorios incluso crean iconos para que el montaje sea tan sencillo como un par de clics. Si verificamos Properties de nuestro escritorio, podremos ver si se usaron el dispositivo y punto de montaje correctos para montar la unidad, y podemos cambiarlos si hay algún error.

WWW.LINUX-MAGAZINE.ES

Sondeo de Drivers Sería posible que explicara cómo averigua Knoppix qué drivers debe usar para una configuración hardware de un PC determinado. Me imagino una enorme tabla de base de datos en el ciberespacio que lista los drivers necesarios para cada elemento del hardware. ¡Pero sólo en mis sueños! Sondear los componentes puede ofrecer el nombre que el fabricante ha decidido incluir, pero ¿cómo determinar qué se necesita para hacer funcionar este componente? ¿Cree que llegará el día en que cualquier PC funcionará sin problemas con impresoras y escáners con cualquier distribución de Linux? El archivo que está buscando es /usr/share/misc/pci.ids. (Véase también http://pciids.sf.net/). La mayor parte de los componentes hardware PCI tienen unas id’s de fabricante y producto expresadas como dos números hexadecimales. Sólo tenemos que teclear: lspci -n

o, para una salida más detallada: lspci -v

Esto es válido también para dispositivos que no son en realidad PCI. Con kernels más antiguos, el kernel tenía su propia clase de id’s pci, con el nombre del producto incluido en su código. Como en la actualidad existen MUCHOS componentes hardware, este método se mostraba como una pérdida de espacio, por lo que se implementó un nuevo esquema que mantiene la tabla legible fuera del kernel, y las id’s de


Konsultorio • COMUNIDAD

fabricante y producto se leen desde el bus del sistema. Para la detección del hardware, aún seguimos necesitando un mapeo entre esas id’s del PCI y el nombre del módulo del kernel a cargar por modprobe. El /hwsetup de Knoppix usa una tabla de texto pci.ids modificada para buscar los nombres de los módulos a partir de las id’s del PCI y simplemente carga los módulos listados allí. Pero esto se hace sólo para los casos especiales en los que o bien no tenemos un mapeo o se detecta erróneamente con otras herramientas. El demonio Udev, que es el moderno “plug&play” de la detección hardware en Linux, usa una funcionalidad que se ha compilado en el kernel, o más bien, dentro de cada módulo individual, desde hace varias versiones. Hacemos lo siguiente: modinfo ipw2100

(Si no tenemos este módulo, elegimos alguno diferente). Aparte de alguna información posiblemente útil sobre los parámetros del módulo, licencias y autores, este comando muestra también una lista de alias pci para el módulo (por ejemplo, qué tarjetas se supone que pueden controlarse con éste). Cada vez que Udev escanea el sistema y detecta hardware que no se ha activado previamente, revisa la lista de módulos para emparejar la ID PCI de fabricante y producto y cargar el módulo que contenga la “mejor elección” para esa tarjeta. ¿Suena bien? Desafortunadamente, el driver perfecto no siempre gana el concurso Udev para determinar qué módulo cargar con un componente hardware. Algunas veces Udev carga un módulo que dice reconocer un cierto dispositivo, pero luego no es así. En otras ocasiones hay módulos concurrentes para el mismo dispositivo. Actualmente estamos investigando cómo gestionar estos casos con las tarjetas wifi en Knoppix, ya que también se controlan con Udev. Algunas veces, cuando hay sólo unas pocas elecciones (como con los controladores USB), la mejor manera parece ser simplemente cargar todos los módulos disponibles uno a uno y dejar que los módulos que no funcionan fallen en silencio. En Knoppix, podemos verificar en el script /linuxrc esta sencilla detección de hardware basada en ensayo y error, si no tenemos disponible otro tipo de escaneo hardware o sistema de carga

de módulos más elaborados.

Problemas con Audacity Hola, he comenzado a leer Linux Magazine hace escasamente un par de meses y encuentro sus artículos realmente interesantes. Quisiera comentarle un problema que tengo con Audacity. Puedo hacer funcionar a Audacity tras una instalación del sistema, pero después de un día o poco más, me aparee un mensaje que reza “Ocurrió un error al inicializar la capa de audio I/O. No es posible reproducir o grabar sonido”. He intentado desinstalar y reinstalar, pero me aparece el mismo mensaje. De igual manera, cuando pulso sobre OK y arranca el programa, me voy a Edit > Preferences para ver los dispositivos I/O, pero no hay ninguno. ¿Cómo puedo hacer que me funcione Audacity? O más bien la pregunta sería ¿cómo puedo hacer que los dispositivos I/O vuelvan a Audacity? ¿Por qué me desaparecen los dispositivos I/O tras un par de días? Tengo constancia de un problema similar que ocurre sólo desde que Udev apareció en prácticamente todas las distros. Tradicionalmente, en Unix/Linux “todo es un archivo”. Esta filosofía significa que vamos a encontrar un archivo de dispositivo para casi cualquier componente hardware (excepto para los dispositivos de red, que pertenecen a un subsistema diferente) en el directorio /dev. Podemos probar con: ls -l /dev/dsp /dev/mixer

Este comando nos da una lista de los archivos de dispositivo usados por la mayoría de los programas de grabación y reproducción de audio (excepto para los dispositivos más nuevos ALSA, que se ubican en /dev/snd/*). Cada uno de estos archivos debe tener un driver concordante (o más bien, un módulo del kernel) activo. Si los archivos de dispositivo se han eliminado o remplazado por un mal funcionamiento de un programa o script, podemos intentar volverlos a crear como root, por ejemplo, intentando recuperarlos con:

mknod /dev/mixer c 14 0 chmod 666 /dev/dsp /dev/mixer

probamos lo siguiente: dd if=/dev/dsp of=/dev/null U bs=4k count=1

(esto graba 4 kilobytes de datos de audio desde la tarjeta de sonido). Si no conseguimos que aparezca un mensaje de error, probablemente hay un driver que funciona tras el archivo de dispositivo. Si aparece un mensaje de error como “error al abrir el dispositivo /dev/dsp”, entonces tenemos que cargar el módulo correcto de la tarjeta de sonido. Esta es la parte complicada. Tendremos que averiguar cual es el módulo correcto que cargar, ejecutar modprobe nombredelmodulo para cargar el driver y añadir nombredelmodulo a /etc/modules para tenerlo autocargado al arrancar. Es más fácil ejecutar la herramienta de detección de hardware preferida de nuestra distro a intentar averiguar qué módulo corresponde a la tarjeta de sonido. Ahora bien, como ya he mencionado, también disponemos del método tradicional. Con el nuevo sistema de administración del hardware Udev, el demonio udevd cargará (o al menos debería cargar) el módulo correcto de la tarjeta de sonido de manera automática, y también debería crear un archivo de dispositivo en /dev, por lo que no deberíamos tener que teclear los comandos mknod. Pero si udevd no es capaz de reconocer la tarjeta, no se cargará ningún módulo, y también faltará el archivo de dispositivo. Los archivos aparecerán tan pronto como carguemos el módulo de sonido para nuestra tarjeta. Esto también puede explicar la des-

mknod /dev/dsp c 14 3

WWW.LINUX-MAGAZINE.ES

Número 24

85


COMUNIDAD · Konsultorio

aparición de los dispositivos. Si hemos actualizado la distro y estamos usando Udev, los viejos scripts automáticos pueden estar intentando descargar aún los módulos de kernel “no usados”. Para Udev, descargar el driver significa también eliminar el archivo de dispositivo, y cuando no hay archivo de dispositivo para el sonido, el kernel tampoco autocarga el módulo de sonido si alguien accede al archivo. Yo intentaría los siguientes pasos para averiguar por qué deja de funcionar el soporte para el sonido tras pocos días. 1. Nos aseguramos de que el módulo de sonido de la tarjeta está cargado. 2. Nos aseguramos de la presencia de /dev/dsp y /dev/mixer. Si no están, pero los archivos de dispositivo /dev/snd/* sí están allí, probablemente necesitemos cargar también los módulos puente ALSA -> OSS. modprobe snd-pcm-oss modprobe snd-mixer-oss

Si udevd se está ejecutando, debería crearnos ahora /dev/dsp y /dev/mixer. 3. Verificamos la configuración de Audacity (o de otras herramientas multimedia) en busca de la presencia de una configuración que tenga un dispositivo de sonido existente. Un campo vacío no siempre significa “use el valor por defecto”. En caso de duda, pruebe /dev/dsp como dispositivo de sonido para grabar y/o reproducir. Si nuestro programa es compatible con ALSA, podemos usar también los dispositivos ALSA de /dev/snd/. 4. Verificamos que los dispositivos de sonido no están bloqueados por otro programa o demonio de sonido, como artsd o esd.

Herramientas Libres Para Disco Duro En primer lugar, decirle que está haciendo un soberbio trabajo con Knoppix. Es mi preferido absoluto en cuanto a live cd’s. Aunque en nuestra oficina trabajamos con una red de thin clients completamente libre, nos estamos encontrando cada vez más con el problema de discos duros que se estropean. Estaría interesado en conocer herramientas en software libre para Linux que puedan recuperar información o arreglar discos duros estropeados. Arreglar discos duros con errores únicamente a través de soluciones software, con una sencilla interfaz gráfica, todo

86

Número 24

en uno, es complicado de llevar a cabo debido a que la herramienta siempre va a necesitar saber algo del hardware y de la manera en que se guardó la información en el disco duro. Existen algunas herramientas, principalmente en línea de comandos, que podemos usar para las diferentes etapas del rescate de datos. Podemos comenzar haciendo una copia 1:1 de la partición del disco duro para trabajar con ella. Esto debería ser uno de los primeros pasos, ya que con los discos duros “parcialmente rotos”, cada acceso a sectores defectuosos, incluso si es sólo en modo de lectura, puede incrementar el daño. En general, deberíamos trabajar siempre con una copia de la información que queremos rescatar. dd-rescue /dev/hda1 hda1.img

hda1.img es una copia bit a bit de la primera partición de nuestro disco duro principal IDE conectado a la primera controladora IDE. Las herramientas de reparación del sistema de archivos pueden trabajar ahora sobre esta copia en lugar de sobre el disco duro. Esto es de vital importancia, ya que las estructuras de datos defectuosas a veces no pueden repararse sobre el disco duro roto debido a los sectores en los que no se puede escribir. Al usar la copia, en la que se puede escribir sin problema alguno, permitimos a las herramientas de reparación del disco que cambien verdaderamente el sistema de archivos a uno que se pueda montar (al menos, este es el objetivo de la mayoría de las tareas de reparación). Si la tabla de particiones del disco está rota y no puede ser reparada por testdisk (una excelente herramienta de reparación y análisis de la geometría del disco duro), tendremos que copiar el disco duro entero con dd-rescue en lugar de sólo la partición que queremos salvar. En función del tipo de sistema de archivos a rescatar que tenía la partición, podríamos intentar ejecutar las herramientas de reparación, que dependen de este sistema de archivos, por ejemplo con dosfsck para sistemas de archivo DOS/FAT12/FAT16/FAT32, e2fsck para sistemas ext2, o reiserfsck para Reiserfs. Puede que tengamos que usar —rebuild-tree y —rebuild-sb con la anteriormente mencionada copia de la partición como argumento. Precaución: si la partición no es dispositivo de bloque, se necesita en ocasiones alguna opción “force” para permitir que el programa trabaje en un fichero.

WWW.LINUX-MAGAZINE.ES

Si la estructura del sistema de archivos se reparó con éxito, debería ser posible montar como loopback la copia del sistema de archivos: mkdir -p /media/rescue mount -o loop,ro -t U filesystemtype hda1.img U /media/rescue

Esto nos permite acceder al árbol de sistema de archivos directamente y generar un archivo tar: cd /media/rescue tar -zcpPvf U /tmp/rescued-hda1.tar.gz ./

En algunos casos no se recupera la estructura del sistema de archivos. Si un sistema de btree + sistema de archivos como reiserfs o xfs se daña gravemente, tendremos información que estaba en archivos y directorios dispersos por todo el sistema, y tendríamos que buscar de manera manual el comienzo y el fin de los archivos. En este punto es donde el rescate de datos puede ser caro y requerir mucho tiempo, ya que lo que hay que hacer es buscar el comienzo y fin de las estructuras lógicas de datos y ponerlas otra vez en archivos de manera manual, y la información no está siempre en un bloque continuo. Si tenemos suerte, hay herramientas de ayuda para los tipos de información específicos, como photorec, que busca contenido de tipo JPEG y vídeo en fragmentos de información en crudo. Cuando buscamos tipos arbitrarios de información, tendremos que usar en ocasiones un editor hexadecimal como lde o hexedit, buscar tipos de firma de archivos, y usar nuestra mejor suposición de lo largo que era el archivo a la hora de salvar los datos en archivos. Este proceso puede ser muy complicado, ya que con los sistemas de archivos con journaling, a menudo hay muchas copias de un único archivo de una partición en varios estados de finalización. Tendremos que encontrarlos todos y guardarlos, y ver el que tiene mejor pinta. Si sabemos algo de Perl, puede ser útil automatizar este proceso ■ con un script.


Linux Legal • COMUNIDAD

Programación para la paz

CLÁUSULA MARIPOSA Nos falta sensibilidad, mejor dicho, percepción para notar los acontecimientos globales. Por mucho que nuestros hábitos mentales se rijan por lo concreto, los más importantes acontecimientos acaban de suceder y están sucediendo ahora, y son globales. POR JOSÉ MARÍA LANCHO

U

no de ellos, la Organización Mundial del Comercio es la mayor obra de ingeniería colectiva que han emprendido los gobiernos de los hombres. Una decisión que conecta a más de 6000 millones de seres humanos, con una estructura económica de reglas estables, implacables con logros ciertos y con costos humanitarios que algunos sentimos inasumibles.

El Nacimiento de un Sistema Complejo La globalización económica, sus reglas legales y su eficaz mundo de ensoñaciones consumistas ha demostrado ser extraordinariamente sensible a la variación de sus condiciones iniciales, en gran medida impredecible y demostrando su práctica imposibilidad de mantener el equilibrio con la energía del propio sistema. La globalización, no obstante, ha coincidido con la fractura de las instituciones en muchos Estados, y así, regiones inmensas del planeta se encuentran en una situación de crisis humanitaria tan extrema que no encontraríamos referentes ni siquiera en el siglo XX, el siglo de los genocidios.

WWW.LINUX-MAGAZINE.ES

Número 24

87


COMUNIDAD · Linux Legal

La idea de que en ese código global de códigos, a que responde la llamada sociedad del conocimiento, alguien pudiera introducir su objeción de conciencia de forma eficaz, la idea de que una persona introdujera su oposición a que el producto de su genio pudiera ser utilizado con fines de Estado criminales y que esa objeción tuviera efectos exigibles en derecho, era una posibilidad que los Estados no habían ni supuesto. Que una sola conciencia pudiese contar, a nivel planetario, que una variable tan mínima desde el punto de vista del sistema, pudiera tener efectos sobre grandes estructuras sociales, dio el nombre a este contrato de licencia. Idea romántica o no, la posibilidad de cambiar el mundo por medio de un acto de inteligencia es también un acto de necesidad, y en estos tiempos, de último recurso.

Lepidópteros para una teoría social del caos De acuerdo, tenemos la gran familia humana que está por primera vez conectada de forma sincrónica y global, constituyendo un sistema complejo e inestable además de insatisfactoriamente injusto. Hay, al menos, dos variables identificables en ese sistema: La primera se refiere a que el sistema se sostiene sobre información que tiene un efecto técnico, la tecnología. Una parte sensible de la información es la informática, que hace universalmente conectivo el conocimiento, que hace que buena parte del conocimiento alcance un efecto técnico. La informática es un tipo de lenguaje y por tanto un sistema de gramática de reglas o código. La segunda: un sistema de reglas legales que de forma más o menos eficiente condicionan el comportamiento de los individuos y las distintas colectividades. Debido a que las reglas legales prevén en buena parte la forma en que los individuos se interrelacionan con el conocimiento y la tecnología, hay un punto en que los dos códigos legal e informático se tocan necesariamente vinculando un código con otro. Ya hemos identificado la variable sobre la que un programador puede

88

Número 24

actuar introduciendo un pequeño cambio, como el contrato que aquí se propone, en las mismas bases o condiciones iniciales de este sistema inestable y caótico. El que ese pequeño cambio pueda ser capaz de poner en marcha una cadena de eventos que tengan, necesariamente, un efecto multiplicativo y que puedan cambiar la estructura del propio sistema, veremos que no es un supuesto que se explique únicamente sobre la naturaleza caótica del sistema, aunque de ahí hemos obtenido la denominación que se ha propuesto: cláusula mariposa.

Una propuesta contractual Este contrato que se propone como licencia anexa va a dar la posibilidad al programador de incorporar a la licencia principal, de su elección, un segundo contrato de una sola cláusula que le garantice que su software no va a ser utilizado por un Estado en una guerra de agresión, o como instrumento incluso mediato que posibilite o facilite a ese Estado la comisión de crímenes contra la humanidad. Esta cláusula va a otorgar un poder eficaz a la conciencia del individuo como no lo tiene actualmente ninguna institución de Naciones Unidas. La finalidad de este contrato es: primero, no producir interferencia jurídica ninguna en el ámbito jurídico civil y privado entre las partes y tampoco deformar o interferir con el tipo de licencia abierta o propietaria que el productor de software decida incorporar a su obra. Segundo, aprovechar el sistema internacional privado de reglas para sujetar a un Estado con un compromiso contractual, libremente aceptado por él, que en caso de que no se cumpla, pueda ser demandado en una instancia diferente a sus Juzgados y Tribunales nacionales y sus sistemas de inmunidad, impunidad y excepciones soberanas. 1) El derecho de propiedad intelectual nos permite excluir un determinado uso a la Administración adquirente. Los titulares de software están ya familiarizados con este tipo de determinaciones, tanto para combatirlas como para ejercerlas, llegando a establecer obligaciones tan concretas como el número de puestos para los

WWW.LINUX-MAGAZINE.ES

que el software está autorizado a ser utilizado, restricción de aplicaciones e incluso su exportación a determinados países. En este caso se prohíbe el uso en los servicios públicos de un Estado que comete el ilícito internacional de una guerra de agresión. 2) La normativa sobre arbitraje nos permite determinar un fuero (lugar e institución ante la que se discutiría el incumplimiento de este contrato) al que someter al Estado infractor del contrato internacional de software. En realidad la posibilidad de obligarse en un contrato es un ejercicio de soberanía, una vez obligado, esta vez a someterse a un arbitraje en caso de incumplimiento, no puede recurrir al poder soberano para zafarse de sus obligaciones. Estos supuestos se han verificado numerosas veces y Estados Unidos ha expresado más de una vez que un acuerdo de arbitraje es una excepción al principio de inmunidad soberana. La cláusula arbitral, así mismo importante, nos permite establecer el derecho material aplicable, que en este caso no es otro que la equidad y además la posibilidad de fijar la existencia de daños punitivos, es decir daños ejemplarizantes, de carácter sancionador privado. Una sanción civil que sería ejecutable prácticamente en cualquier lugar del Planeta y cuyo resultado sería destinado a fines humanitarios. Esta posibilidad que otorga el arbitraje de establecer el derecho material entre las partes, permite escapar a las restricciones que el derecho interno establece sobre materias de carácter indisponible. De hecho los más importantes Estados, como Estados Unidos, ya han establecido que el arbitraje entre un Estado y una empresa o particular es una excepción al principio de soberanía (para empezar podemos citar los arbitrajes de BP contra Libia, Texaco/Calasiatic contra Libia en 1978 y Liamco contra Libia, en este caso LIAMCO consiguió en 1980 la ejecución de su sentencia arbitral en cuatro países diferentes). 3) El derecho fundamental de objeción de conciencia. Configurado de una forma abierta no está restringido a los periodistas sino a cualquier creador intelectual (artículo 20 de la Cons-


COMUNIDAD · Linux Legal

CONTRATO ANEXO DE LICENCIA: “El licenciador excluye cualquier uso del software cedido en las Administraciones Públicas del Estado adquirente en los supuestos de que el Estado proceda a efectuar un acto de agresión armada contra un tercer Estado o proceda a efectuar actos constitutivos de genocidio, crímenes de lesa humanidad o crímenes de guerra. El incumplimiento de cualquiera de estas prohibiciones que quedan conectadas con los derechos cedidos, supondrá automáticamente la terminación, sin necesidad de previa notificación, de la licencia principal del software cedido y en consecuencia la inmediata revocación de los derechos concedidos y la abstención de su ejercicio dentro de las Administraciones Públicas. En todo caso permitirá la exigencia de daños y perjuicios al Licenciatario ante la Corte Arbitral de Tecnologías Pacíficas sita en París o en Zurich, a libre elección del demandante, sometiéndose a las normas de arbitraje de esa Corte, otorgando la capacidad para ser parte coadyuvante e incluso principal en defecto del licenciante, a cualquier perjudicado, posibilitando, en todo caso la exigibilidad y otorgabilidad de daños punitivos y daños coercitivos suficientes para detener la utilización no autorizada del software, todo ello con independencia de las responsabilidades criminales de las personas naturales implicadas, y utilizando exclusivamente la equidad como criterio determinador de la respuesta arbitral a que ambas partes aceptan someterse. La utilización del programa licenciado supone la aceptación de los términos de este contrato como expresión

90

Número 24

contractual autónoma de cláusula de conciencia del titular del software. Las partes hacen expresa renuncia de una segunda instancia revisora de la sentencia arbitral”. La razón de que la propuesta no adopte la forma de cláusula adicional del contrato principal y lo haga, en cambio, en la forma de contrato autónomo añadido consecutivamente a la licencia básica, es doble: por un lado la norma aplicable a estos contratos, el Convenio de Roma, examina el contrato internacional como una unidad básica de cara a la asignación de la ley aplicable, es decir que las obligaciones y derechos de un contrato se vinculan con una sola ley, con lo que no puede diferenciarse dentro del contrato un fuero o ámbito normativo diferenciado. Si un contrato contiene una cláusula que pretende sea verificada en una jurisdicción distinta de la del resto del contrato, tendría muy serios problemas de legalidad. Por eso este es un contrato diferenciado. Se añade además la pregunta necesaria de ¿Qué Estado se atreverá a dejar de firmar un contrato porque incluya esta cláusula prohibiendo un uso criminal del software? Sería como reconocer que su intención es la de violar leyes que él mismo, por otros tratados, por necesidad de legitimidad natural se ha comprometido a respetar, leyes como las que garantizan el derecho humano básico.

Compatibilidad objetiva con la GPL. 1)En el caso específico del software libre no sirve, ni puede servir para guerras de agresión, para el genocidio o para crímenes contra la humanidad. En eso estamos de acuerdo todos. Lo diga este contrato o no. No existe esa libertad (estoy seguro de que cualquier Free Software Guidelines está de acuerdo), ni en el ámbito de la GPL ni en ningún otro. La libertad de aniquilar las libertades no es una libertad, no digamos de eliminar colectivos, razas, etnias… Lo único que introduce este contrato es la posibilidad de obtener daños punitivos en una instancia arbitral sobre un Estado que hace este tipo de cosas y cuenta en su administración con el software del demandante. 2) En

WWW.LINUX-MAGAZINE.ES

el supuesto de que un Estado sea un chico malo y siga utilizando ese software a pesar de todo, bueno la sociedad civil sólo llegará a obtener una condena indemnizatoria millonaria y ejecutarla en cualquier país del mundo donde “el chico malo” tenga fondos. No creo que le haga mucha gracia, sobre todo cuando se produzcan numerosas demandas y condenas. 3) El movimiento de software libre está para ocupar con valores la nueva tierra que los avances tecnológicos van aportando, antes de que lo hagan los Estados desaprensivos y las empresas obsesionadas sólo con los beneficios.

¿Cómo se usa? Es un contrato sencillo, justo y gratuito, al programador no le va a causar problemas y sin duda le va a permitir dormir mejor por las noches. Basta con anexar el contrato al de licencia principal del software, como un contrato más. Conceptualmente la cláusula mariposa es parte de la programación, es parte del contenido creativo del programa, como elemento de conciencia, como efecto buscado desde la voluntad creadora del autor. Los creadores de tecnología tienen por ello una responsabilidad: asegurar que los frutos de su obra no servirán para que un Estado criminal acometa crímenes a gran escala y quede impune por ello. Apoyar esta iniciativa no tiene coste alguno para nadie y tendrá consecuencias muy positivas sobre nuestro ■ futuro.

EL AUTOR

titución) y posee una especial protección. Esto hace que el interés objeto de tutela arbitral se encuentre más estrechamente ligado con la legitimidad del licenciador defendiendo su propio derecho. Jurídicamente, el derecho de un autor a poder exigir este contrato, que prohíbe vincular su uso con fines criminales, es un derecho de objeción de conciencia a una guerra de agresión, y por tanto un derecho fundamental de la persona. El modelo de contrato que se propone es el siguiente:

José María Lancho es abogado y fundador de la Asociación Legalventure (http://www.legalventure. com/) un grupo de abogados que pretende estudiar la relación del derecho y la tecnología como factores de cambio social en España. Asimismo, José María es miembro fundador del Observatorio de Neutralidad Tecnológica (http:// neutralidad.es/), dedicado a la denuncia de abusos contra los usuarios en materia tecnológica.


ยกHazte con tus ejemplares atrasados! #13

#14

#15

#16

#17

#18

#19

#20

#21

W W W. L I N U X - M A G A Z I N E . E S / AT R A S A D O S


¡pídelos ya! el REPOSITORIO

de conocimientos LINUX más COMPLETO

¡No esperes a que se agoten! #22

#23

W W W. L I N U X - M A G A Z I N E . E S / AT R A S A D O S


EVENTOS

I Concurso Universitario de Software Libre

Conferencia Internacional de Software Libre 3.0

Fecha: 1 Sep. - Junio 07

Fecha: 07-09 Febrero 07

Ciudad: Sevilla, España Web: http://concurso-softwarelibre.us.es

Calendario de Eventos Evento 14. DFN-Cert-Workshop Conferencia Internacional Software Libre SCALE 5x Vancouver PHP Conference 2007 LinuxWorld OpenSolutions New York Open Source Developers' Conference FOSDEM 2007 PyCon 2006 IT Underground Conférence PHP Québec UKUUG Spring 2007 Conference FOSE 2007 5th International Linux Audio Conference ETech Conference 2007 International Lisp Conference 2007 fisl 8.0 Web 2.0 Expo 2007 LinuxWorld España Debconf 7

Fecha: 24-25 Feb 07 Ciudad: Bruselas, Bélgica

Ciudad: Badajoz, España Web: www.freesoftwareworldconference.com

Fecha 7-8 Febrero 7-9 Febrero 10-11 Febrero 12-13 Febrero 14-15 Febrero 20-22 Febrero 24-25 Febrero 24-26 Febrero 08-09 Marzo 14-16 Marzo 19-21 Marzo 20-22 Marzo 22-25 Marzo 26-29 Marzo 01-04 Abril 15-18 Abril 15-18 Abril 18-19 Abril 17-23 Junio

FOSDEM 2007

Ciudad Hamburgo, Alemania Badajoz, España Los Ángeles, CA, EE.UU. Vancouver, Canadá Nueva York, EE.UU. Netanya, Israel Bruselas, Bélgica Addison,TX, EE.UU. Praga, Rep. Checa Montreal, Canadá Manchester, R.U. Washington, DC, EE.UU. Berlín, Alemania San Diego, CA, EE.UU. Cambridge, R.U. Porto Alegre, Brasil San Francisco, CA, EE.UU. Madrid, España Edinburgo, R.U.

Web: http://www.fosdem.org

Sitio Web www.cert.dfn.de/events/ws/2007/ www.freesoftwareworldconference.com/ www.socallinuxexpo.org http://vancouver.php.net/node/360 www.linuxworldexpo.com/live/14 www.osdc.org.il/2007 www.fosdem.org us.pycon.org http://itunderground.org http://conf.phpquebec.com www.ukuug.org/events/spring2007 www.fose.com www.kgw.tu-berlin.de/~lac2007 http://conferences.oreillynet.com/etech www.international-lisp-conference.org http://fisl.softwarelivre.org/8.0/www/ www.web2expo.com http://linuxworldsummit.com.es www.debconf.org

Información de Contacto Director Paul C. Brown

Director Editorial Paul C. Brown

Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz, Alberto Planas, Jose A. García, Ana Mª Ferreiro

Jefe de Producción Juan Miguel Ramírez

Traductores Paqui Martín Vergara, Paul C. Brown, Víctor Tienda, Oliver Kurz.

Subscripciones: www.linux-magazine.es/magazine/subs

Maquetación Fran Sánchez Diseño de Portada Pinball info@pinball-werbeagentur.de Publicidad www.linux-magazine.es/pub/ Para España Marketing y Comunicaciones anuncios@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Paul C. Brown pbrown@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Para el Resto del Mundo Brian Osborn ads@linux-magazine.com Tel.: (+49) 6509 910 495 Fax.: (+49) 6509 910 497

94

Número 24

Precios Subscripción España: Europa: Resto del Mundo - Euros: Tel.: Fax.: subs@linux-magazine.es

54,90 € 64,90 € 84,90 € (+34) 951 010 556 (+34) 951 010 516

Linux Magazine Linux New Media Spain, S.L. Avda. Juan López Peñalver, 21 29590 - Campanillas Málaga ESPAÑA info@linux-magazine.es Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516

www.linux-magazine.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania

WWW.LINUX- MAGAZINE.ES

Si bien se toman todas las medidas posibles para garantizar la precisión del contenido de los artículos publicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en la revista. Asimismo, Linux Magazine no comparte necesariamente las opiniones vertidas por sus colaboradores en sus artículos. El riesgo derivado del uso del DVD y el material que contiene corren por cuenta del lector. El DVD es estudiado escrupulosamente para confirmar que está libre de virus y errores. Copyright y Marcas Registradas © 2007 Linux New Media Spain, S.L. Linux New Media Spain S.L. prohíbe la reproducción total o parcial de los contenidos de Linux Magazine sin su permiso previo y por escrito. Linux es una Marca Registrada de Linus Torvalds. Impreso en Alemania Impresión: Dierichs Druck + Media GmbH Distribución: SGEL Depósito Legal: MA-116-2005 ISSN edición impresa: 1576-4079 ISSN edición online: 1699-2237


Más del 30% de descuento respecto al precio de portada: Consigue 12 números por 54’90 Euros y todos los DVDs ¡Gratis!

A diferencia de otras publicaciones, Linux Magazine no llenará tu buzón de recordatorios para que renueves tu subscripción. Ésta se renovará automáticamente cada año. Recibirás una confirmación aproximadamente 30 días antes del final de tu periodo de subscripción, pero no se requiere que hagas nada para seguir suscrito.

¡No te pierdas Linux Magazine nunca más! La subscripción te asegura que recibas los conocimientos Linux de más alta calidad en tu domicilio cada mes.

Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripción en cualquier momento. Te abonaremos el precio de todos los números que no hayas recibido. Sin preguntas, sin fechas de cancelación, sin problemas.

Linux Magazine es algo más que una revista de Linux. Patrocinamos grupos, congresos, proyectos y eventos relacionados con el Software Libre. Suscribiéndote a Linux Magazine garantizas que podamos seguir apoyando al Software Libre allá donde haga falta.


LINUX LOCAL

LINUX LOCAL Leyenda inux Local es el directorio de servicios y empresas de Linux cerca de ti. ¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuentra quién ofrece qué y dónde. El directorio se divide en regiones autónomas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Utiliza la leyenda de la derecha para encontrar la empresa que ofrece el servicio que precises. Linux Local es tu guía de servicios Linux.

L

1.- Hardware 2.- Software / Desarollo 3.- Formación 4.- Soporte / Consultoría 5.- Servidores 6.- Redes 7.- Migración 8.- Hospedaje

Andalucía Logo

Empresa

Correo-e

Web

1

2 3 4 5 6

Gesinfo

info@gesinfoweb.com

www.gesinfoweb.com

BitRock

info@bitrock.com

bitrock.com





Properly Software

info@properly.es

www.properly.es/site





GuadaGames

vicentecarro@guadagames.com

www.guadagames.com



Virtua

comercial@virtua.es

www.virtua.es

Empresa

Correo-e

Web

IWS

iws@iws.es

www.iws.es

Empresa

Correo-e

Web

Mono::labs

contacte@monolabs.com

www.monolabs.com

Datum

info@datum.ws

www.datum.ws

Opentia

comercial@opentia.es

www.opentia.es



 



7 8

  

  

Cataluña Logo

1

2 3 4 5 6 



7 8

   

Madrid Logo

1

2 3 4 5 6   

 



7 8  



  

  

  

¿Por qué no está su empresa en este directorio? LINUX MAGAZINE llega a miles de empresas, profesionales y usuarios cada mes. Si tiene servicios o productos Linux que ofrecer ¡Llámenos! Tlf.: +34 951 010 556 Fax: +34 951 010 516 anuncios@linux-magazine.es

WWW.LINUX- MAGAZINE.ES

Número 24

97


PRÓXIMO NÚMERO

PRÓXIMO NÚMERO CRIPTO-TRUCOS

EL EFECTO VISTA

Con un creciente número de datos confidenciales guardados en medios digitales, no es sólo por el hardware por lo que tenemos que temer en caso de hurto o extravío. El hecho es que la pérdida de información personal (contraseñas bancarias, números de cuentas, etc.), corporativa, gubernamental o militar puede tener consecuencias nefastas para el usuario o la organización para la que se trabaja. Una de las medidas de defensa pasa por la encriptación de los datos guardados en el medio. En el número 25 de Linux Magazine veremos exactamente y con detalle cómo se lleva a cabo el proceso. En nuestro primer artículo, David Gascón, el creador del sistema de redes P2P realmente anónimas, Marabunta, analiza en profundidad las soluciones más comunes para encriptar un disco duro, explicando las ventajas y desventajas de cada una de ellas y los pasos a seguir para su implementación. Sin embargo, de poco serviría mantener información protegida en los discos duros, pero accesible en las copias de seguridad. Por ello, en el segundo artículo, abordamos la encriptación de datos en medios extraíbles, como los CDs. Mantenga su datos a buen recaudo con Linux Magazine.

Vista ya está en la calle y plantea un montón de nuevos problemas para los que pretenden trabajar con ambos sistemas, Vista y Linux. ¿Qué pasa con la incorporación de máquinas Vista en redes híbridas Windows/Linux? ¿Seguirá funcionando Grub en mi ordenador personal? ¿Se podrá acceder a las particiones de Vista? ¿Y qué hay de Samba? El mes que viene analizamos el impacto de Vista desde la perspectiva del usuario obligado a vérselas con los dos sistemas.

SERVIDORES DE CORREO Todos los administradores de sistemas con un mínimo de pedigrí conocen las complicaciones que supone la configuración de Sendmail y Qmail. Pero existen alternativas comerciales de pago que pueden facilitar la tarea de servir correo, aportando interesantes funcionalidades groupware y que además resultan más sencillas de configurar. Para averiguarlo, dos de nuestros administradores más veteranos, Jörg Fritsch y Patrick Nest, pusieron a prueba tres servidores, Axigen, Kerio y Merak, en los estrictos laboratorios de Linux Magazine.

A LA VENTA: MARZO 2007 98

Número 24

WWW.LINUX- MAGAZINE.ES



Linux Magazine - Edición en Castellano, Nº 24