linux magazine - edición en castellano, nº 03

100
Firewalls Guarddog Analizadores de Registros Shorewall Bridgewall Domótica Perl Autopsy Vigilancia KDM/GDM Domótica Controla tu casa con un Jabberbot Perl p42 Ruby Rails Una infraestructura web diferente p32 NÚMERO 3 P.V.P 4,95 PHP Ejecución desde la linea de comandos CCCP Autores al Gulag con Paul C. Brown KRecipe La cocina KDE de cada día CSI del CPU p55 Análisis de equipos comprometidos con Autopsy WWW.LINUX - MAGAZINE.COM.ES KDM/GDM Configuración del arranque X LINUX MAGAZINE NÚMERO 03 Edición en Castellano FIREWALLS Seguridad para todo el mundo Configuración sencilla con Guarddog p11 Implementa un cortafuegos puente p14 Registros con Logfile p18 Shorewall Configura iptables de sin complicaciones p22

Upload: linux-new-media-spain-sl

Post on 23-Mar-2016

329 views

Category:

Documents


16 download

DESCRIPTION

Puesto a la venta enero de 2005 Tema de Portada: Cortafuegos.

TRANSCRIPT

Page 1: Linux Magazine - Edición en Castellano, Nº 03

Firew

alls

Gu

ard

do

g A

na

lizad

ore

s de

Re

gistro

s Sh

ore

wa

ll Brid

ge

wa

ll Do

tica

Pe

rl Au

top

sy Vig

ilan

cia

KD

M/G

DM

DomóticaControla tu casa con

un Jabberbot Perl p42

Ruby RailsUna infraestructura web

diferente p32

NÚMERO 3 • P.V.P 4,95 €

PHPEjecución desde lalinea de comandos

CCCPAutores al Gulagcon Paul C. Brown

KRecipeLa cocina KDE de cada día

CSI del CPU p55

Análisis de equipos comprometidos

con Autopsy

W W W . L I N U X - M A G A Z I N E . C O M . E S

KDM/GDMConfiguración delarranque XL

INUX M

AGAZIN

E

NÚMERO 03

Edición enCastellano

FIREWALLSSeguridad para todo el mundo

Configuración sencilla con Guarddog p11

Implementa un cortafuegos puente p14

Registros con Logfile p18

ShorewallConfigura iptables de

sin complicaciones p22

Page 2: Linux Magazine - Edición en Castellano, Nº 03

Linux va a CeBITMuestre sus productos y servicios en la sección

especial dedicada a Linux en CeBIT 2005:

Por cuarto año consecutivo, un gran número de

compañías y proyectos de código abierto van a

presentar sus soluciones de software, productos

y servicios en LinuxPark.

En CeBIT 2005, LinuxPark será de nuevo el punto

de visita obligatoria para lo directivos TI, espe-

cialmente aquellos provenientes de las PYMEs y

de la administración pública. Sólo hay un sitio en

CeBIT con toda la información sobre las tecnolo-

gías de código abierto más novedosas y como

explotarlas de manera efectiva: LinuxPark.

Su empresa también puede beneficiarse enor-

memente de esta plataforma, ideal para la pro-

moción de sus soluciones de código abierto.

La solución perfecta para su presenciaferial:

• Comuníquese directamente con una gran

variedad de clientes potenciales

• Anúnciese en un campaña promocional ante-

rior a la feria de gran envergadura

• Realice su propia presentación en el

LinuxForum

• Aprenda de ponentes de primera categoría

• Consolide sus relaciones con la comunidad

Linux internacional

• Benefíciese del contacto con socios y patroci-

nadores de reconocido prestigio en el sector

• A su disposición: paquetes feriales todo inclui-

do desde 4 m2

Consiga más información en +49 (0) 26 02 16 01374 ó[email protected]

Patrocinado por: Presentado por:

Page 3: Linux Magazine - Edición en Castellano, Nº 03

EDITORIALEscritorios

3www.linuxmagazine.com.es Número 03

Todo elmundopiensa

que está asalvo. Nadiepiensa que lepuede tocar aél/ella. Losaccidentes de

coche ocurren a los demás, los demáscontraen enfermedades incurables, a losdemás se les ven introducirse virus ensus sistemas. La desgracia tiene uncurioso efecto distanciador.

Pero que nadie se crea invulnerable,todo lo contrario: como la sección deinvulnerabilidades demuestra mes ames, los fallos de seguridad que “per-miten ejecutar código aleatorio” abun-dan en el sistema operativo Linux. Escierto, no más que en otros sistemas,pero, como me recuerda a cada oportu-nidad mi esposa cada vez que hablamosde cambiarnos de casa: “No vayamos acompararnos con lo que no queremosser”. Y, sí, es una gran ventaja que hayatanta gente auditando y probando el soft-ware de manera abierta y se publiquenlos resultados para que nos curemos ensalud. Defender la protección a través dela ocultación es como defender aquellode, bueno, sí, las alas del avión estánpegadas con chicle… pero no se caeránsi no se lo decimos a nadie.

Sin embargo, el peligro existe en elámbito de la informática y no sólo vienebajo la forma de virus, troyanos y“jaquens” aburridos, de los que buenacuenta damos en este número y, portanto, sobre los que no me voy a expla-yar. Hablo de otro peligro, mucho másinsidioso contra el cual no te puedes pro-teger configurando un firewall, deshabi-litando servicios o blindando el sistema.Y no importará el sistema que utilices, yasea Linux, Windows, Mac o BSD, siem-pre estarás a la merced de uno de susataques, los cuales vienen sin avisar ysin motivo aparente.

Hablo de los abogados.

El ataque te puede venir en la formade carta de SCO reclamándote el pago deun impuesto revolucionario que a santode qué, o te puede llegar como aviso decitación a juicio por no pagar una facturade un servicio telefónico que porsupuesto no has contratado ni muchomenos utilizado. A mí me llegó una dedichas cartas hace un par de días.

69,72 euros es el motivo de que mequieren arrastrar a juicio los ilustresseñores letrados. Esta gente son los encar-gados de perseguir a toda esa panda desinvergüenzas internautas que rehúsapagar servicios de ADSL que no funcio-nan, facturas emitidas después de bajas omisteriosos cobros por servicios no con-tratados, el cual, como digo, es mi caso.

Su cliente, WANADOO S.L., aseguraque servidor contrató un servicio de tele-fonía llamado rimbombantemente“Premier Plus”. Ahora bien, servidor noes ningún lince legal, pero creo que sincontrato firmado no hay tu tía… Y esto loconfirmó mi abogado, que sí lo es. (He dedecir que mi abogado es de los buenos. Esun encanto, lo puedes sacar de la jaula ytodo y no se pleitea con nadie a no serque le caiga realmente mal).

Ni que decir tiene que ni servidorjamás ha contratado, suscrito, solicitado,ni mucho menos disfrutado de esteexcelso servicio. Pero eso da igual. Undía vas caminando por la calle, te caeuna maceta en la cabeza y te quedas enel sitio; o administras un sistema parauna importante firma y un estúpidoscript-kiddie logra cargarse todo la basede datos de clientes y proveedores, juntocon el fichero donde guardabas tus par-tidas de Quake; o un día estás sentado entu casa y, mira por donde, te meten unpleito… Y ¡plas! Te has convertido enuna estadística. De humano te has trans-formado en una cifra en las listas de laDGT o de las crecientes casos de abusospor parte de operadores de telefonía.

Si no pago 69,72 euros antes del día 11del corriente (enero), me arrastrarán ajuicio, me demostrarán culpable, pedirán

La Amenaza Fantasma

Nos sentimos orgullosos de nues-

tros orígenes como publicación, que

se remonta a los primero días de la

revolución Linux. Nuestra revista

hermana, la publicación alemana

Linux Magazin, fundada en 1994,

fue la primera revista dedicada a

Linux en Europa. Desde aquellas

tempranas fechas hasta hoy, nues-

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

ción del conocimiento y experiencia

técnica. No nos limitamos a infor-

mar sobre el movimiento Linux y de

Software Libre, sino que somos

parte integral de él.

Estimado Lector de Linux Magazine

Paul C. Brown

Director

la pena capital para mi y mis allegados y,de paso, escupirán sobre mi tumba. Lopeor de todo es que para mandarles unburofax jurando que no he sido yo,Correos me cobra 20 euros, perder unamañana de trabajo para ir a juicio puedecostar unos 50 euros, aparcar en el cen-tro 4 euros. La minuta del abogado mepuede salir por 300 euros. Que el juezme de la razón, no tiene precio, peropara todo lo demás, Mastercard.

La solución fácil: pagar los 69,72 eurosy olvidarse. Pero, haciendo esto ¿no dejoabiertas la puertas a más chantajes porparte de las operadoras y sus caneslegales?

Así que ya sabéis: una vez instaladovuestro firewall, deshabilitado serviciosinnecesarios y blindado vuestro sistemasiguiendo los buenos consejos de LinuxMagazine… ¡cuidado con los abogados!

Page 4: Linux Magazine - Edición en Castellano, Nº 03

4 Número 03 www.linuxmagazine.com.es

NOTICIAS

Inseguridades ....................................................................................6

Negocios ................................................................................................8

Correo ......................................................................................................9

PORTADA

Especial Cortafuegos ..................................................................10

Guarddog .............................................................................................11KDE ofrece una aplicación que simplifica en gran medida laconfiguración de un cortafuegos.

Bridgewall ...........................................................................................14Los cortafuegos pueden implementar como routers, perotambién pueden filtrar a nivel de puente.

Logfile ....................................................................................................18Analizar los datos de ataques puede ser tan importantecomo evitarlos.

Shorewall ............................................................................................22Shorewall Simplifica la configuración de iptables del kernel.

DESARROLLO

La librería SDL (III).........................................................................27Abordamos el control del protagonista y de los enemigos ennuestro juego.

Ruby Rails ...........................................................................................32Una infraestructura para aplicaciones web diferente

Interfaces ............................................................................................37Integramos la librería menu.h en una clase que simplifica lacreación de interfaces con el usuario.

Jabberbot ............................................................................................42Controla las luces de tu casa a distancia con perl y un jabberbot.

PHP en Línea ....................................................................................46PHP no sólo sirve para programar aplicacionesc web. Vemoscomo escribir programas para la línea de comandos.

Python y la RAE ..............................................................................49Creamos un diccionario de interfaz minimal que consultapalabras en la web de la RAE.

18 ShorewallCuando los usuarios piensan en su estación de trabajo encasa olvidan normalmente la seguridad. Pero el peligroacecha, esperandogolpear a los despre-venidos. Shorewallayuda a los usuarioshabituales de Linux amantener a los intru-sos fuera.

14 Bridgewall

Normalmente los cortafuegos se implementan como routers,pero no tiene por qué ser así. Los filtros a nivel del bridge

tienen una seriede ventajas quepuede añadirlasa su red en unaetapa más tardíasin necesidad decambiar la con-figuración de loscomponentes dered.

11 GuarddogEl programa KDE Guarddog promete una configuración fácildel cortafuegos de Linux con tan solo unos cuantos clics.Guarddog ayuda alos usuarios inex-pertos a protegersus máquinas, eincluso redes com-pletas, contra losatacantes.

ContenidoLINUX MAGAZINE

Page 5: Linux Magazine - Edición en Castellano, Nº 03

5www.linuxmagazine.com.es Número 03

SYSADMIN

La Columna de Charly ...............................................................54Los mejores trucos y consejos del SysAdmin.

Autopsy ................................................................................................55En esta segunda parte dedicada al análisis forense, estudia-mos un ordenador comprometido con Autopsy.

Suspend ...............................................................................................59La hibernación de un ordenador consiste en volcar la RAM aswap y después recuperarla. Analizamos el software parahacerlo.

LINUX USER

KHotkeys ............................................................................................64Implementar gestos de ratón y teclas personalizadas bajoKDE es fácil con KHotkeys.

DeskTOPia: Krecipe .....................................................................67Un recetario digital para el escritorio KDE.

Configuración: KDM/GDM .....................................................73Aprendemos como configurar el arranque gráfico de Linux.

Curso de Programación:XUL (III) .......................................76Un lenguaje sencillo para programar interfaces web.

Educación:WIMS (III) ..................................................................81Un ejemplo práctico de clases con WIMS.

Comandos: su y sudo ..................................................................84

Ser root es imprescindible... de vez en cuando. su y sudoayudan a no abusar.

Tipografía con LaTeX (III)..........................................................87Documentos de aspecto profesional con LaTeX.

COMUNIDAD

Humor ...................................................................................................92

Proyectos ............................................................................................95

Eventos .................................................................................................97

Contacto ..............................................................................................97

Próximo Número ..........................................................................98

59 Suspend

Casi todas las placas bases tienen la característica de controlde energía, diseñada para apagar el ordenador y ponerlo en

modo suspendido. Enla vida real, esta ca-racterística no siem-pre funciona. Linuxtiene varias alternati-vas para tratar desolucionar el proble-ma.

32 Ruby RailsLa mayoría de las bibliotecas web hacen que el 90 por cientodel trabajo sea fácil y el resto imposible. Rails, un infraestruc-tura de códi-go abiertoprogramadoen Ruby, eslo bastanteflexible comopara teneréxito con ese10 por cientorestante.

LINUX MAGAZINEContenido

64 KHotkeysLos gestos con el ratón y los atajos con el teclado añadenvelocidad y simplicidad a las operaciones con el PC. Losgestos de ratón solíanser coto privado de losusuarios de Opera yde Mozilla, peroKHotKeys las ofreceahora a Konquerorpara usuarios de KDE3.2 o superior. Inclusopodemos lanzar pro-gramas no-KDE conKHotKeys.

Page 6: Linux Magazine - Edición en Castellano, Nº 03

usuarios de Ruby 1.6.x deberán ac-tualizar sus versiones. �

-Referencia Mandrake:

MDKSA-2004:128

�KernelEl kernel Linux se encarga de llevar acabo las funciones básicas del sistemaoperativo.

Se ha descubierto un fallo de ausenciade serialización en unix_dgram_recvmsg

que afecta a kernels anteriores al 2.4.28.Un usuario local podría potencialmenteaprovecharse de una condición de carre-ra para hacerse con privilegios de root.Se pueden consultar más detalles sobreestos problemas en la base de datos delproyecto de Vulnerabilidades yExposiciones Comunes (CommonVulnerabilities and Exposures o CVE -http://cve.mitre.org). Véase CAN-2004-1068.

Paul Starzetz de iSEC descubrió variosfallos en el cargador binario ELF, fallosque afectan a kernels anteriores a 2.4.28.Un usuario local podría utilizar estos fa-llos para conseguir acceso de lectura abinarios sólo ejecutables o posiblementeconseguir privilegios (CAN-2004-1070,CAN-2004-1071, CAN-2004-1072 y CAN-2004-1073).

Se descubrió un fallo en la configu-ración de límites TSS que afecta a loskernels para las arquitecturas AMDAMD64 e Intel EM64T anteriores a2.4.23. Un usuario local podría provocaruna ataque de denegación de servicio ocuelgue del sistema o, posiblemente,conseguir privilegios (CAN-2004-0812).

Se ha descubierto un fallo de desbor-damiento de entero en la funciónubsec_keysetup en el driver Broadcom5820 cryptonet. En los sistemas que utili-cen este driver, un usuario local podríaprovocar un ataque de denegación deservicio (o cuelgue del sistema) o utilizarel fallo para adquirir privilegios (CAN-2004-0619).

Stefan Esser descubrió varios fallos,incluyendo desbordamientos de búfersen el driver smbfs en kernels anteriores a

2.4.28. Un usuario local podría provocarun ataque de denegación de servicio(cuelgue) o utilizar el fallo para escalarprivilegios. Para poder explotar estefallo, el atacante necesitaría tener el con-trol de un servidor Samba (CAN-2004-0883 y CAN-2004-0949).

SGI descubrió un error en el cargadorelf que afecta a los kernels anteriores a2.4.25 que podría activarse con un bina-rio malformado. En arquitecturas dife-rentes a x86, un usuario local podríacrear un binario malicioso que provocaraun ataque de denegación de servicio ocuelgue (CAN-2004-0136).

Conectiva descubrió fallos en driversUSB que afectaban los kernels anterioresa 2.4.27 que utilizaban las funcionescopy_to_user en estructuras no inicia-lizadas. Estos fallos podrían permitir ausuarios leer pequeñas cantidades de lamemoria del kernel (CAN-2004-0685). �

-Referencia Red Hat: RHSA 2004:549-10

-Referencia Suse: SUSE-SA:2004:042

�Plugin Java de SunLa seguridad en los entornos del pluginJava de Sun y Blackdown Java puede sersobreseído para conseguir el acceso apaquetes arbitrarios, lo que permitiríaque applets sin confianza llevaran a caboacciones sin restricciones en sistemahuésped.

El proyecto de Vulnerabilidades yExposiciones Comunes (CommonVulnerabilities and Exposures o CVE -http://cve.mitre.org) ha asignado elnombre CAN-2004-1012 y CAN-2004-1029 a este problema.

Tanto Sun como Blackdown proporcio-nan implementaciones del Kit deDesarrollo Java (JDK) y el entorno de eje-cución Java (JRE). Ambas implementa-ciones contienen un plugin Java que per-mite la ejecución de applets Java en unentorno restringido en navegadores web.

Todos los plugins Java están sujetos auna vulnerabilidad que permite el accesono restringido a paquetes Java.

Un atacante remoto podría embeberun applet Java malicioso en una páginaweb y engañar a un víctima para que lavisualizase. Este applet podría sobreseerlas restricciones de seguridad y ejecutarcualquier comando o acceder a cualquierfichero con los permisos del usuariovisualizando la página web.

Inseguridades

6 Número 03 www.linuxmagazine.com.es

NOTICIAS Inseguridades

�Cyrus-imapdEl servidor Cyrus IMAP es un servidor decorreo electrónico eficiente y altamenteescalable. Se han descubierto múltiplesvulnerabilidades en los analizadores deargumentos de los comandos partial yfetch del servidor. El proyecto deVulnerabilidades y ExposicionesComunes (Common Vulnerabilities andExposures o CVE - http://cve.mitre.org)ha asignado el nombre CAN-2004-1012 yCAN-2004-1013 a este problema.También existen problemas de desbor-damiento de búfers en el código ‘imapmagic plus’ que son vulnerables de serexplotados (CAN-2004-1011 y CAN-2004-1015).

Un atacante podría explotar estas vul-nerabilidades para ejecutar código arbi-trario con los permisos del usuario queejecuta el servidor Cyrus IMAP. Noexiste ninguna solución por el momentopara este problema. Todos los usuariosde Cyrus IMAP deberán actualizar susservidores a la última versión. �

-Referencia Debian:

DSA-597-1 cyrus-imapd

-Referencia Gentoo:

GLSA 200411-34 /cyrus-imapd

-Referencia Suse: SUSE-SA:2004:043

�RubyRuby es un lenguaje de scripts interpreta-do para la creación de programas orien-tados a objetos de manera fácil y rápida.El módulo CGI de Ruby puede ser utiliza-do para crear aplicaciones web.

Los desarrolladores de Ruby encon-traron y arreglaron un fallo del móduloCGI que permitía su activación remota.Esta vulnerabilidad podía, en teoría,provocar un bucle infinito. Una atacanteremoto podría activar la vulnerabilidad através de una aplicación web Rubyexpuesta y provocar que el servidor uti-lizara recursos de CPU innecesarios, loque podría causar un ataque por dene-gación de servicio. Mitre ha asignado elnombre CAN-2004-0983 a este problema.

No existe solución para este problemaen el módulo CGI de Ruby. Todos los

Page 7: Linux Magazine - Edición en Castellano, Nº 03

La solución inmediata es deshabilitarlos applets Java en los navegadores web.Todos los usuarios de Sun JDK deberánactualizar sus versiones. �

-Referencia Gentoo:

GLSA 200411-38/Java

�BNCBNC es un proxy de devolución desesiones IRB. Leon Juranic descubrióque BNC no siempre protege a los búfersde la sobreescritura. Esto podía serexplotado por un servidor malicioso IRCpara desbordar un búfer de tamaño limi-tado y ejecutar código arbitrario en elhost cliente. El proyecto deVulnerabilidades y ExposicionesComunes (Common Vulnerabilities andExposures o CVE - http://cve.mitre.org)ha asignado el nombre CAN-2004-1052 aeste problema. �

-Referencia Debian: DSA-595-1 bnc

-Referencia Gentoo: GLSA 200411-24/

BNC.

�ez-ipupdateez-ipupdate es una utilidad para actua-lizar información de nombres de hostspara un gran número de servicios deDNS dinámicos. Ulf Harnhammar, delProyecto de Auditorías de Seguridad deDebian, descubrió una vulnerabilidad deformato de cadena en ez-ipupdate. Aeste problema se la ha asignado el MitreCVE CAN-2004-0980. �

-Referencia Debian: DSA-592-1 ez-ipu

date

-Referencia Gentoo: GLSA 200411-20/

ez-ipupdate

�SambaSamba es una implementación SMB/CIFSabierto y libre que permite unainteroperabilidad sin fisuras de serviciosde ficheros e impresión con clientes SMB/CIFS. Se han identificado varias vulnera-bilidades en Samba recientemente.

Existe un problema con el demonio delservicio de compartición de ficheros deSamba, el que permite a un usuarioremoto hacer que el servicio consumamucha potencia de computación, lo quepodría conllevar potencialmente uncuelgue al consultar nombres de ficheroscon comodines especiales.

Este ataque puede tener éxito si eldemonio Samba está en ejecución y un

usuario remoto tiene acceso a una com-partición (aunque sólo sea en modo lec-tura). A este problema se la ha asignadoel Mitre CVE CAN-2004-0930.

Stefan Esser descubrió un problema enel manejo de cadenas Unicode en elmanejo de ficheros Samba que podríaconllevar un desbordamiento de pilaremoto y podría permitir a usuariosremotos inyectar código en el procesosmbd. A este problema se le ha asignadoel Mitre CVE CAN-2004-0882.

Los paquetes actualizados no son vul-nerables a estos problemas. Se recomien-da que todos los usuarios de Samba seactualicen a la última versión. �

-Referencia Gentoo: GLSA 200411-21/

samba

-Referencia Mandrake:

MDKSA-2004:136

-Referencia Red Hat: RHSA-2004:632-17

-Referencia Suse: SUSE-SA:2004:040.

�sudosudo es un programa que aporta privile-gios de superusuario limitados a usua-rios específicos. Liam Helmer notó quesudo no limpia el entorno lo suficiente.Algunas funciones de bash y la variableCDPATH se siguen pasando al programaen ejecución como usuario privilegiado.

Este hecho deja el sistema vulnerablea la posibilidad de que un atacantepueda encontrar una manera de sobre-cargar las rutinas del sistema. A esteproblema se le ha asignado el Mitre CVECAN-2004-1051.

Estas vulnerabilidades sólo pueden serexplotadas por usuarios a quienes se leshaya otorgado privilegios de super-usuario limitados. Se recomienda actua-lizar los paquetes sudo instalados. �

-Referencia Debian: DSA-596-2 sudo

-Referencia Mandrake:

MDKSA-2004:133

7www.linuxmagazine.com.es Número 03

Inseguridades NOTICIAS

Distribuidor Fuente Seguridad ComentarioDebian Info:http://www.debian.org/security/ Los avisos de seguridad actuales se in-

Lista:http://www.debian.org/debian-security-announce/ cluyen en la página de inicio. Los avisos

Referencia:DSA-…1) se proveen como páginas HTML con

enlaces a los parches. Los avisos también

incluyen una referencia a la lista de

correo.

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

Mandrake Info:http://www.mandrakesecure.net Mandrakesoft posee su propios sitio web

Lista:http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionadas con

Referencia:MDKSA:… 1) la seguridad.Entre otras cosas,incluye

de avisos seguridad y referencias a las

listas de correo.Los avisos son páginas

HTML,pero no contienen enlaces a los

parches.

Red Hat 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.

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

Suse 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 el parche soluciona.1) Todos los distribuidores muestran correos de seguridad en el campo Subject.

Políticas de seguridad de la Distribuciones Mayoritarias

Page 8: Linux Magazine - Edición en Castellano, Nº 03

Negocios

8 Número 03 www.linuxmagazine.com.es

NOTICIAS Negocios

� IBM Dona PatentesIBM es año sí y año también la compañíaque más patentes registra a nivel mundial.El año 2004 no fue una excepción: el GranAzul registró 3.248 patentes, 1.314 másque los de cualquier otra empresa.

Afortunadamente, IBM también tieneun compromiso contraído con la comu-nidad del software libre y, en virtud deello, el 11 de enero de este año, publi-caron una nota de prensa declarandoque donaban 500 de estos patentes a losdesarrolladores del código abierto, paraser utilizados “en cualquier proyecto quese conforme a la definición de softwarede fuente abierta acuñada por la OpenSource Initiative (OSI)”.

Algunos de los patentes cedidos vandesde lo peregrino (“US6199070 Uso debases de datos para registros de progra-

mas”) hasta lo ininteligible (“US5634006Sistema y método para asegurar QOS enuna red token ring utilizando un regu-lador de acceso en cada nodo para laasignación del tamaño de marco paraaplicaciones de transmisión virtualesbasadas en información negociada yprioridad en la red”)

¿Qué sería mucho mejor que IBMdonara TODOS sus patentes o que directa-mente abandonara su política de registromasivo de patentes? Hombre, eso sería loideal… en un mundo ideal, donde nadiemás intentara acaparar lo que IBM no re-gistra. Mientras tanto, 500 patentes dona-dos… pues es un comienzo. �

http://www-1.ibm.com/press/ Press

ServletForm.wss?TemplateName=ShowPre

ssReleaseTemplate&SelectString=t1.docu-

nid=7473”.

�El FUD No esNecesariamente Malo...Especialmente si no significa “Fear,Uncertainty and Doubt” (“Miedo,Incertidumbre y Duda”), sino “FedoraUsers and Developers” (“Usuarios yDesarrolladores de Fedora”), la aso-ciación de los cuales va acelebrar su primeraconferenciainternacionalel 18 defebrero del2005 en laMassachusettsInstitute ofTechnology, justodespués de laLinuxWorld Conference and Expo.

Una de las razones por las que RedHat, la empresa detrás de la iniciativa,desea promocionar este evento, es porque, sin ser un absoluto fracaso, lasaportaciones de la comunidad del códigoabierto a Fedora ha sido menor delesperado. Greg Dekoenigsberg, directorde relaciones con la comunidad de RedHat, dice que se debe a que“Simplemente no había mucho quepudieran hacer” ya que Red Hat nopodía hacer mucho más que aceptarinformes de errores. “(Esta vez) quere-mos asegurarnos de que tenemos los sis-temas y procesos que permita a la gentecontribuir”.

Aparte de la conferencia, Red Hat hatomado los pasos necesarios para hacerque la contribución por parte de losusuarios sea una realidad. Por un ladoha abierto el CVS para que los usuariospuedan acceder a software en fase dedesarrollo. En breve, los desarrolladoresexternos también podrán aprobar con-tribuciones al árbol de desarrollo.Asimismo, la empresa ha empezado unproyecto llamado “Fedora Extras”, quepermite a terceros mantener paquetesque se hallan fuera de la responsabilidaddirecta de Fedora. Y, por último, ofrecenservidores accesibles públicamente quepermiten automatizar el proceso deconstrucción de software Fedora y losextras mencionados. Estos servidorespermitirán evaluar posibles conflictosentre componentes. �

http://fedora.redhat.com/ http://

fedoraproject.org/wiki/FUDCon1.

Mandrake estuvo a punto de serfinancieramente guillotinado en el 2002cuando se declaró en bancarrota ante untribunal de cuentas. Pero hete quenuevos vientos soplan para la empresagala y ya se encuentra casi recuperada deun fatídica gestión por parte de “unaplantilla de directivos de categoríamundial con experiencia” (uno ya sepuede imaginar el daño que hace un

individuo con semejante título a unacompañía, no querremos ni pensar entoda una plantilla).

Afortunadamente “los directivos”fueron sumariamente despedidos cuan-do fue obvio que sus ambiciosos planeslo único que producían eran enormesgastos.

En la actualidad, Mandrake ha vueltoa sus orígenes y concentra sus esfuerzosen la producción de buenos productos decódigo abierto. A la línea de SOs de con-sumo, y sus ya reputadas distros parafines específicos (p.e.: Multi Network

Firewall), se suma ahora un tándem dedistros diseñado para asaltar la Bastillade los escritorios corporativos. El dúo deproductos se denominan CorporateDesktop y Corporate Server respectiva-mente.

El doblete está diseñado para queambas partes se integren perfectamentela una con la otra. Por un lado,Corporate Desktop viene con el softwarenecesario para disponer de un escritorioLinux y ser productivo en el área de laofimática en poco tiempo. CorporateServer, por otro lado, trae todos los servi-dores necesarios para soportar la cargade un red empresarial. Las dos distribu-ciones vienen con una serie de los yahabituales asistentes Mandrake para laconfiguración por separado de cada una,pero también vienen con otra serie deasistentes para integrar los clientes conlos servidores y viceversa.

El software de escritorio cuesta 99euros y el servidor 329 euros. Ambosvienen con soporte técnico y con asis-tentes (como no) para actualizaciones. �

http://www.mandrakesoft.com/

products.

�Mandrake para la Empresa

Page 9: Linux Magazine - Edición en Castellano, Nº 03

9www.linuxmagazine.com.es Número 03

Buzón del Lector CORREO

Correo del Lector

Acceso de Escritura�De Vuelta al Cole, PaulHace unos días que cayó en mis manosel número 1 de vuestra revista y tras leer-lo por completo decidí comprar elnúmero 2 y realizar la suscripción deprueba para los 3 siguientes números. Larevista me parece bien elaborada encuanto a contenidos, algo pobre en cuan-to a diseño gráfico aunque aceptable silo comparamos con el resto de revistasde similar temática pero sobre todo mepareció muy decepcionante en lo refe-rente a ortografía, gramática y expresión.

A lo largo de las páginas de ambosnúmeros hay tildes que no están puestas,errores gramaticales, frases que no lle-gan a término, confusiones entre “a ver”y “haber”, errores de guionado y lo queme ha impulsado a escribir este correo:el título del artículo de la página 83 delsegundo número que dice “Bienvenidosa la Aula Virtual”. El título es digno deser usado como comentario de texto enun aula presencial de un curso no supe-rior a quinto de primaria, pero su autorha necesitado largos años de estudio,una amplia experiencia laboral y, segura-mente, el paso por la universidad paracometer semejante tropelía lingüística.

Yo comprendo que los costes de pro-ducción de una revista y los escasosmárgenes comerciales (?) que deja, nopermiten mantener en plantilla a uncorector de estilo, pero incorreccionescomo la de ese título ni siquieratraspasan por la “ventana” de los correc-tores ortográficos de procesadores de

El mes pasado, compré en la calle elnúmero 1 de la revista Linux magazine.Me gustaría beneficiarme de la oferta detres primeros números de prueba al pre-cio de 5 euros pero solamente haciendoel pago contra reembolso. Me gustaríasaber lo antes posible si puedo hacerlode esta forma.

Gracias,

Un saludo.

Lucas Jiménez

�SubscripciónPara los que han expresado preocu-

pación sobre la seguridad del sistema,informaros que el formulario donde seconsignan los datos en la web está prote-gido contra abusos y los detalles que via-jan por correo hasta nuestro buzón desuscripciones se encriptan con una clavePGP de 1024 bits, por tanto, al menoshasta que se popularicen los orde-nadores cuánticos, podemos decir quevuestros datos están seguros. �

Por tanto, descartando al redactorcomo autor del fallo ¿a quien hay queculpar? Pues al director, a servidor, alque suscribe. ¡Sí, fui yo! ¡Paul C. Brown!¡Lo admito! En un arrebato de megalo-manía, decidí modificar el título originalde Juan Rafael (muy largo para migusto) por otro con más gancho y, a lapostre, un fallo gramatical horroroso.

Espero que tanto los lectores como elautor sepan disculparme y prometo pen-sármelo dos veces antes de meterlemano a otro titular sin consultarloprimero. �

Puedes enviar tuscomentarios y sugerencias a

[email protected]

texto, por lo que tampoco debieran pasarde largo a los ojos del maquetista, el edi-tor o incluso el director editorial (y nodigamos del autor). Pero eso sí, jamásdebiera ser el lector quien tenga quepadecer tales incorrecciones.

En definitiva, la técnica no está reñida,ni debe estarlo nunca, con la lingüisticay la mejor forma de expresar y transmitirel conocimiento técnico es hacerlo concorrección y rigor lingüístico.

Muchas gracias por leer mi correo yespero que la revista eleve el listón de lacalidad de las publicaciones técnicas.

Un saludo.

Fernando Bueno

LM Tienes toda la razón.Lamentablemente (y sirva de excusa) enestos momentos contamos con unequipo de esqueleto de correctores (unasola persona) que ha de corregir las cienpáginas de la revista en un tiemporécord, mientras compagina sus tareascon otros menesteres.

En cuanto al garrafal titular que men-cionas, he de decir en defensa del autor,Juan Rafael Fernández, que Juan Rafaelno comete errores. Es un profesor delargo historial y ahora coordina cursosde Guadalinex para profesores de centroseducativos para la Junta de Andalucía.Es escrupuloso tanto en lo que se refiereal contenido técnico de sus artículos,como en lo que se refiere a su ortografíay gramática.

LM Lamentamos informaros a todoslos que nos habéis preguntado lo mismoque de momento Linux Magazine nopuede servir suscripciones contrareembol-so, ni prevemos hacerlo en el futuro. Sinembargo, existe una solución: la transfe-rencia bancaria. Para todos aquellos quedesean realizar un pago controlado,podéis mandarnos un correo a [email protected] y os facilitaremoslos detalles para realizar la transacción.

Page 10: Linux Magazine - Edición en Castellano, Nº 03

10 Número 03 www.linuxmagazine.com.es

seguridad. El cortafuegos tradicionales una especie de router que resideen la Capa 3 del modelo de referen-cia OSI. La Capa 3 es la capa de lapila que escucha al Protocolo deInternet, lee direcciones IP y tomadecisiones sobre donde dirigir losdatagramas IP. Un cortafuegos ademásinspecciona las cabeceras de la Capa 4(TCP o UDP) para identificar servicios yevaluar flags.

Pero los productos de cortafuegosmodernos pueden operar en otros nivelesde la pila de protocolos (Figura 1). Estametodología multinivel puede extendersede modo descendente a la Capa 2, dondeencontrará el llamado bridgewall. Mien-tras que un bridge (o switch)simplemente evaluará la dirección MAC,el bridgewall inspeccionará los paquetesde la Capa 2 hasta la Capa 4. El bridge-wall es un filtrador de paquetes hecho yderecho, tan flexible como un switch.

Un gateway a nivel de aplicación pro-porciona una capa adicional deseguridad al más alto nivel. El gatewaycaptura la conexión TCP actuando comoun proxy entre el cliente y el servidor.Esto permite al cortafuegos antes definalizar mirar el protocolo de aplicacióny detectar los paquetes ilegales queincumplan las reglas del protocolobasadas en RFC.

Porsupuesto que la mayoría de las variantesde cortafuegos son productos caros paragrandes redes y configuraciones comple-jas. Nosotros estamos más interesados enlo que podemos hacer sólo con Linux ycon un software de cortafuegos fácil deencontrar.

Como veremos en el tema de portadade este mes, Linux tiene una buenacolección de cortafuegos, incluyendoalgunas utilidades poderosas que simpli-fican el proceso de configuración demodo que no hace falta ser un expertopara manejar uno.

En nuestro artículo sobre Guarddogvamos a mostrar como usar este programaKDE para realizar configuraciones decortafuegos IPTables o IPChains. En nues-tro siguiente artículo, sobre Bridgewall,hablamos de los instrumentos para confi-gurar un cortafuegos a nivel de la Capa 2.

Un problema en el manejo de cortafue-gos es la cantidad de datos que maneja yque se acumulan en los registros del soft-ware de protección. En nuestro tercerartículo se habla de herramientas para elmanejo y análisis de los registros de loscortafuegos. Y nuestra última historiadescribe Shorewall, otra utilidad que noes un cortafuegos propiamente hablando,sino un instrumento para simplificar laconfiguración de un cortafuegos. �

Su ordenador le permite ver elmundo, pero usted no quiere que elmundo le vea. Los intrusos son

cada vez más sofisticados y cabe esperara que alguno se de cuenta tarde o tem-prano de que su equipo está sinprotección. Si se conecta a Internet, nece-sita estar detrás de algún tipo decortafuegos.

Hay cortafuegos de muchos tamaños,formas, precios y diseños. Es Bastanteinteresante notar que, lo que se solía lla-mar cortafuegos, ahora tan solo es unomás de la gran gama de productos de

Los cortafuegos son cada vez más complejos. Por suerte, las herramientas para su

manejo son cada vez más simples y más accesibles para los usuarios normales.

POR JOE CASAD Y ACHIM LEITNER

IntroducciónPORTADA

Cortafuegos para el día a día

No Sólo para Expertos

Guarddog.........................................11

a utilidad de KDE Guarddog proporciona un

interfaz intuitivo para la configuración de

cortafuegos en Linux.

Brigdewall ......................................14

Un cortafuegos a nivel de bridge puede pro-

porcionar una solución simple con un

mínimo de reconfiguración.

Analizadores Registros ...........18

Herramientas para analizar los ficheros de

log y que nos ayudan a entender el estado

de la red.

Shorewall .......................................22

Shorewall es un conjunto de ficheros para la

configuración de cortafuegos basados en fil-

tros de red.

EN PORTADA

Figura 1: Los cortafuegos modernos puede actuar como bridges (izquierda), routers (centro) o gateways

a nivel de aplicación (derecha).

Page 11: Linux Magazine - Edición en Castellano, Nº 03

11www.linuxmagazine.com.es Número 03

Guarddog está diseñado para usuariosdomésticos o de redes privadas. Aunquedistribuciones como Red Hat, Mandrakey Suse tienen herramientas simplesbasadas en GUI para los cortafuegos,carecen de la posibilidad de manejar sis-temas distribuidos. Los usuarios másexigentes que requieran una configu-ración más detallada, probablementepreferirán usar Guarddog.

Agujeros de SeguridadLos usuarios inexpertos tienen que sermuy cuidadosos cuando configuren un

cortafuegos con Guarddog. La facilidadque supone escoger una opción y hacerclicen ella de la GUI a menudo lleva alos usuarios a abrir más puertos de losnecesarios. Por otro lado, es bastantefácil “reforzar” una máquina hasta talpunto que algunos servicios dejen defuncionar.

También hay que tener en cuenta queGuarddog es una aplicación KDE y nodebería ejecutarse en un servidor en elsentido tradicional de la palabra. Si tieneun servidor dedicado en su LAN, lo pro-pio es crear una configuración con

Las herramientas IPChains (Linux2.2) e IPTables (Linux 2.4) confi-guran el cortafuegos de Linux,

pero estas herramientas de línea decomandos pueden ser algo crípticaspara los recién llegados a Linux. SimonEdwards desarrolló Guarddog [1] parasimplificar la tarea de configurar elcortafuegos. Guarddog es una utilidadbasada en GUI para manejar los corta-fuegos. La utilidad Guarddog viene conlicencia GPL y funciona tanto en KDE 2como KDE 3.

Los usuarios se pueden descargar laversión estable 2.2.0 desde [2]. Ademásde los fuentes, el sitio tiene tambiéndisponible los binarios ya listos para serejecutados para Mandrake, Red Hat yDebian. Si desea probar las últimas ca-racterísticas, pruebe la versión 2.3.2desde [2]. Pero antes de hacerlo, com-pruebe los pros y los contras en elcuadro “Para los Valientes”.

El programa KDE Guarddog promete

una configuración fácil del cortafue-

gos de Linux con tan solo unos

cuantos clics. Guarddog ayuda a los

usuarios inexpertos a proteger sus

máquinas, e incluso redes completas,

contra los atacantes.

POR HOLGER JUNGE

PORTADAGuarddog

Configuraciones de cortafuegos con Guarddog

¡Cuidado con el Perro!

La versión de desarrollo actual de Guarddog es la 2.3.2. Hay varias reticencias para usar esta ver-

sión en entornos productivos. Por un lado,el usuario valiente puede encontrar algunas

características nuevas. La versión 2.3.2 soporta áreas de puertos para los protocolos definidos por

el usuario. Los desarrolladores han modificado también la versión para soportar Linux 2.6 y han

añadido algunos protocolos nuevos a la lista,como RSync,Distcc,GKRellm,Bittorrent,PGP Key

Server, Jabber sobre SSL y el protocolo Microsoft Media Server.

Para los Valientes

Page 12: Linux Magazine - Edición en Castellano, Nº 03

12 Número 03 www.linuxmagazine.com.es

GuarddogPORTADA

Guarddog en un ordenador distinto yluego copiar el script resultante al servi-dor.

Como Guarddog está basado enIPChains o en IPTables, los usuariosdeben asegurarse que los módulos nece-sarios del kernel estén disponibles en elservidor. La mayoría de las distribu-ciones se hacen cargo de estoautomáticamente. Si su distribución nolo hace, necesitará recompilar el kernelpara que incluya IPTables o IPChains.

Guarddog usa comandos filtros orien-tados al protocolo. Los usuarios nonecesitan especificar los números depuertos, lo que ayuda a evitar errores deconfiguración.

Asimismo Guarddog soporta gruposde máquinas o zonas y permite a losusuarios la opción de establecer zonasdesmilitarizadas (DMZ).

La GUISe debe ejecutar Guarddog con los privi-legios de root para permitir al programaaplicar las reglas del cortafuegos. LaFigura 1 muestra Guarddog justodespués de haber sido ejecutado.Desafortunadamente, la GUI de Guard-dog no es muy intuitiva. La GUI deGuarddog tiene cuatro solapas. Laprimera de estas solapas, la solapaZones, permite a los usuarios agruparlas máquinas en zonas.

Zone Properties acepta direcciones IPo rangos de direcciones para la zona.Hay dos zonas preconfiguradas lla-madas Internet y Local que el usuario nopuede borrar. La zona Internet automáti-camente incluye cualquier dirección IP

(Asegúrese que se aplican los cambiospulsando Apply). Si se pulsa de nuevo lacaja de verificación la marca se trans-forma en una X para indicar que elcortafuegos denegará de forma explícitalas conexiones que usen este protocolo.Una caja de verificación vacía indicaque el cortafuegos ignorará cualquierpetición al puerto.

Los protocolos HTTP, FTP (en la cate-goría File Transfer) y los protocolos decorreo SMTP y POP3 son otros protoco-los que se usan habitualmente.

Registro de ProtocolosLa solapa Logging (véase la Figura 3)proporciona opciones detalladas para el

que no esté incluida en cualquier otrazona. Local incluye las direcciones de latarjeta de red local. Una máquina indi-vidual estará bien con tan solo estas doszonas.

Se puede usar la solapa Protocol

(Figura 2) para permitir o denegar proto-colos específicos. La estructura en árboldel lado derecho de la ventana organizalos protocolos por categorías. Normal-mente el servicio DNS es el primero quese necesita habilitar. La entrada DNSestá ubicada en la categoría Network.Haciendo clic en la caja de verificaciónde DNS – Domain Name Server se colocauna marca de verificación que indicaque el servicio está permitido.

Figura 3: Los administradores pueden usar la solapa Logging para especificar que clase de registro debe

proporcionar el cortafuegos.

Figura 1: El GUI de Guarddog después de ser ejecutado con dos zonas de red

preconfiguradas: Internet y Local.

Figura 2: La solapa Protocol permite especificar el protocolo permitido o dene-

gado por el cortafuegos.No hay que preocuparse por los números de puerto.

Page 13: Linux Magazine - Edición en Castellano, Nº 03

13www.linuxmagazine.com.es Número 03

opciones del cortafuegos para reflejarsus necesidades. Si algo va mal, no sepreocupe: siempre se puede pulsar enRestore to factory defaults… para restau-rar las opciones por defecto deGuarddog. Las opciones por defectopara Local Dynamic Port Range estánbien en la mayoría de los casos. Especi-fica que rango de puertos puede usarLinux para las conexiones salientes.

Si echa en falta algún protocolo en lasolapa Protocol, puede pulsar New Proto-

col e introducir el nombre del protocolo,establecer si el protocolo es TCP o UDPy especificar los números de puertos queusa.

Guarddog tiene una opción útil paraimportar y exportar los scripts de corta-fuegos creados con la herramienta.Guarddog puede exportar la configu-ración actual a un script de la shell

sencillo y almacenarlo en/etc/rc.firewall. Como los servidores nor-malmente no ejecutan KDE, losadministradores pueden simplementepulsar el botón Export para exportar unscript, copiar este script al servidor yejecutarlo en él.

Puerta de Enlace al MundoDesde luego, los cortafuegos de Linuxno se usan típicamente para los sistemasaislados, sino que se usan como parte dela estructura de seguridad de una redcompleta. En este caso, la máquinaLinux actúa como una puerta de enlacey tiene dos tarjetas de red, una de cara aInternet y otra de cara a la red interna(véase la Figura 5). Es bastante simpleconfigurar Guarddog para este esce-nario, sin embargo se necesita unsistema con la versión 2.4 del kernel.Además de configurar IP masquerading

antes de instalar el cortafuegos. Guard-dog no puede ayudarle en este paso,pero sí la herramienta Guidedog en [4].

El primer paso es crear una zonaGuarddog nueva para la red local. Parahacerlo, pulse New Zone en la solapaZone. Se puede llamar a la zona “LAN”,por ejemplo. Después púlsese New

Address para establecer la dirección IP,tal como 192.168.1.0/24. Ahora púlseseen Internet y Local en Connection paraasegurar que la LAN está conectada aInternet y al ordenador local.

Seleccione Internet en la solapa Proto-

col y marque las cajas para losprotocolos requeridos en la columna dela LAN. Finalmente, pulse Apply paraalmacenar la configuración en/etc/rc.firewall y lance el cortafuegos. �

PORTADAGuarddog

registro de Guarddog en syslog. El re-gistro proporciona a los usuarios unaherramienta para detectar escaneos depuertos. Los usuarios de Guarddogpueden establecer la tasa de registropara restringir el número de entradas enlos registros del cortafuegos. Un límitepara el número máximo de entradasayudará a evitar un ataque potencial pordenegación de servicios, que a veces escausado por una tormenta de paquetesIP que llenan el syslog y sobrecarga eldisco duro.

Si necesita detalles de todos lospaquetes IP y TCP entrantes, puedeseleccionarse la opción para registrartodos los paquetes y los números desecuencia TCP en la base de la ventana.

La solapa Advanced (véase la Figura4) permite a los administradores experi-mentados ajustar con precisión las [1] Guarddog:http://www.simonzone.com/

software/guarddog

[2] Descarga:http://www.simonzone.com/

software/guarddog/#download

[3] Manual online:http://www.simonzone.

com/software/guarddog/#manual

[4] Guidedog:http://www.simonzone.com/

software/guidedog/

INFO

Holger Junge trabaja para Lifemedien,

donde se encarga de los servidores de

dominio,de los servidores Web,el servi-

dor de base de datos MySQL y el

servidor de base de datos Oracle.ELAUTOR

Figura 4:Guarddog soporta configuraciones del cortafuegos detalladas. Por ejemplo, los usuarios

pueden definir protocolos y exportar e importar scripts.

Figura 5: El ordenador cortafuegos de Linux actúa como puerta de enlace para la red interna.

Page 14: Linux Magazine - Edición en Castellano, Nº 03

14 Número 03 www.linuxmagazine.com.es

Normalmente los cortafuegos se implementan como routers,pero no tiene por qué ser así. Los filtros a nivel del bridge

tienen una serie de ventajas que puede añadirlas a su red en una etapa más tardía sin necesidad de cambiar la configu-

ración de los componentes de red.

POR RALF SPENNEBERG

Linux se ha ganado una buena repu-tación como plataforma paraimplementar un cortafuegos. El

kernel posee un poderoso filtro depaquetes basado en Netfilter/IPTables.En un escenario clásico de cortafuegos,Netfilter está en el router, donde dividela red en dos o más subredes. Pero elañadir un cortafuegos a una red yainstalada puede suponer cambiar lainfraestructura de la misma. Este

transparente como cortafuegos de la red.Por supuesto, el puente evalúa lospaquetes de los protocolos de las capassuperiores (direcciones IP, puertos TCP)en su rol de cortafuegos. Pero los hostsde la red no notarán nada, a menos queintenten enviar paquetes ilegales.

Configuración del KernelLennert Buytenhek y Bart deSchuymer desarrollaron un parche que

BridgewallPORTADA

esfuerzo supone cambiar las direccionesIP y modificar los controles de accesos alos servicios internos.

Es bastante sencillo añadir un bridge.Los bridges actúan en la capa 2 delModelo de Referencia OSI y normal-mente inspeccionan las direccionesMAC en vez de las direcciones IP (véaseel cuadro titulado “ConstruyendoPuentes”). Linux realiza esta tarea deforma inteligente efectuando un filtrado

Implementando un cortafuegos a nivel de bridge

Puente Levadizo

Page 15: Linux Magazine - Edición en Castellano, Nº 03

15www.linuxmagazine.com.es Número 03

PORTADABridgewall

este paquete por defecto. El paquete con-tiene el comando brctl, cuyo uso estáreservado al usuario root. El comandobrctl addbr br0 crea un bridge llamadobr0. El comando ip link show br0 con-firma la existencia del bridge. Como elbridge tiene un nombre, se pueden eje-cutar múltiples bridges virtuales en unamisma máquina Linux.

A continuación el bridge necesitasaber qué tarjetas Ethernet (NICs) tieneque controlar. El comando brctl permiteasignar las NICs al bridge:

brctl addif br0 eth0

brctl addif br0 eth1

Las tarjetas de red no deben estar con-figuradas en este punto; es decir, nodeben estar UP o tener una dirección IP.La idea es habilitar las tarjetas despuésde habérselas asignado al bridge:

ip link set eth0 up

ip link set eth1 up

ip link set br0 up

El bridge ya está listo para entrar enacción, como el comando ip link show

muestra (Figura 3). El bridge redirigelos paquetes y mantiene su propiacaché ARP; usa la caché para registrarlas entradas mostrando qué direcciónMAC tiene asignada cada interfaz

(véase el cuadro “ConstruyendoPuentes”).

Bloqueando el PuenteComo cualquier otro cortafuegos, elbridge tiene un conjunto de reglas quedescriben qué paquetes debe permitir ycuales debe denegar. Hay tres comandospara crear dichas reglas:• iptables

• ebtables

• arptables

Todos los paquetes que el puenteredirige pasan por el filtro de red FORD-

WARD. Hay algunas cosas a destacarcuando se usan las bien conocidas ipta-

bles en un bridge. Si una regla especificaque los paquetes pueden pasar por elbridge en una única dirección, es impor-tante usar -m physdev (véase la Tabla 1).Esto permite a la política identificar elpuerto del bridge por el cual el paquetellega o comprobar si incluso debe sermanipulado por el bridge.

El siguiente ejemplo está diseñadopara permitir conexiones SSH a la direc-ción IP 192.168.0.16 (puerto TCP 22) enuna única dirección. El servidor SSH estáaccesible por eth1. Las conexiones sólopueden establecerse por clientes conec-tados por eth0. Se necesitan doscomandos iptables para definir dichapolítica:

iptables -A FORWARD -m physdev

--physdev-in eth0 U

--physdev-out eth1

--dport 22 -d 192.168.0.16 U

-m state

--state NEW -j ACCEPT

iptables -A FORWARD -m physdev

--physdev-is-bridged -m state

--state ESTABLISHED,RELATED U

-j ACCEPT

añade la funcionalidad de cortafuegosa nivel de bridge al kernel 2.4 deLinux. El kernel 2.6 lleva el parcheinstalado por defecto y los admi-nistradores simplemente tienen queconfigurar el kernel correctamente(véanse las Figuras 1 y 2).

Todas las opciones del bridge en elgrupo netfilter son importantes, porejemplo, ARPtables soportaIP_NF_ARPTABLES, IP_NF_ARPFILTER yIP_NF_ARP_MANGLE. Estas funcionespueden implementarse como módulos obien ir incluidas dentro del kernel. Elsoporte de Physdev match también esimportante: IP_NF_MATCH_PHYSDEV.Esta opción es necesaria en el kernel 2.6o posteriores para comprobar el interfazfísico cuando filtre paquetes en elbridge.

Una vez que se haya compilado einstalado el nuevo kernel de formasatisfactoria, tan solo serán necesariasalgunas herramientas de usuario.Aunque la mayoría de las distribu-ciones traen el programa iptables,habrá que instalar arptables y ebtables.Si se está ejecutando el kernel 2.6 ouno anterior, también habrá que insta-lar una versión más reciente delcomando iptables.

El paquete bridge-utils [2] es necesariopara configurar el bridge. Las distribu-ciones modernas normalmente instalan

Opción Significado

--physdev-in Nombre Especifica el puerto por el que el paquete tiene que llegar al bridge para que se le aplique esta

regla.

--physdev-out Nombre Especifica el puerto por el que el paquete tiene que salir del bridge para que se le aplique esta regla.

--physdev-is-in El paquete viene desde un interfaz conectado al bridge.

--physdev-is-out El paquete saldrá del ordenador vía un interfaz conectado al bridge.

--physdev-is-bridged El paquete viaja a través del bridge.

Tabla 1: Physdev Match

Figura 1: Para permitir el modo bridge con el kernel 2.6, los administradores

necesitan seleccionar 802.1d Ethernet Bridging en Networking Support.

Figura 2: La opción Bridged IP/ARP packets filtering en la configuración de fil-

trado de red del kernel debe estar habilitada.

Page 16: Linux Magazine - Edición en Castellano, Nº 03

16 Número 03 www.linuxmagazine.com.es

perteneciente a esta conexiónpasar por el bridge.

Colección deDireccionesLos cortafuegos a nivel debridge se utilizan muy amenudo para añadir seguri-dad a las redes, eliminando lanecesidad de cambiar lainfraestructura de la red y lasdirecciones IP. Un punto posi-ble de inserción es justo

delante del router que el administradorno pueda cambiar o que no posea fun-cionalidades de cortafuegos. Pero lomejor que hacen los cortafuegos a nivel

de brigde es subdividir redes que ante-riormente estaban contiguas.

En este caso, las direcciones IP encada lado del bridge no pueden ser derangos específicos ya que han sido asig-nadas de forma arbitraria. El comandoipset proporciona a los administradoresun medio para subdividir la red: ipset

crea un conjunto de direcciones del quelos administradores pueden coleccionardirecciones IP arbitrarias. Las siguienteslíneas crean un conjunto de direccionesllamado left y añade tres direcciones IPal conjunto:

ipset -F; ipset -X; ipset -N U

left iphash

El primer comando se encarga delestablecimiento de las conexiones, queestá restringido en la dirección deseada.El segundo permite a cualquier paquete

BridgewallPORTADA

Figura 3: El bridge virtual está ejecutándose. La salida de ip

link show muestra los datos del bridge seguidos de la etiqueta

:4 bro:.

El término bridge se refiere a una categoría

de dispositivos que manejan directamente el

reenvío de paquetes de red en la capa 2 del

modelo OSI. (Los dispositivos conocidos

como switch son un tipo de bridge). Para

reenviar paquetes de la capa 2, el bridge

tiene que obtener las direcciones MAC de la

red local y recordar que interfaces y puertos

pertenecen a qué ordenador. Cuando el

bridge recibe un paquete con un destino

cuya dirección MAC es conocida, simple-

mente lo reenvía al interfaz correcto y de

este modo evita el tráfico innecesario. Si el

bridge no conoce la dirección MAC del des-

tino, tendrá que reenviarlo por todos los

interfaces.

El comando brctl showmacs bro lista todas

las direcciones MAC conocidas de un bridge.

El comando proporciona una tabla de

entradas. La primera columna contiene el

número de puerto para la entrega de paque-

tes del ordenador y la segunda columna

tiene la dirección MAC.Le siguen más colum-

nas con información de

configuración.

Olvido de Tablas

Para estar al corriente, el bridge

elimina las entradas de direc-

ciones MAC antiguas de su base

de datos de reenvios. Los admin-

istradores pueden especificar

cuánto tiempo debe manten-

erse una dirección MAC no

usada en la base de datos antes

de deshacerse de ella. El

comando para esto es brctl

setageingtime bro segundos.

El esfuerzo computacional

interno sería excesiva e innece-

sariamente alto, si el bridge

olvidara las direcciones MAC no usadas

inmediatamente. En vez de ello, el bridge eti-

queta primero las entradas no usadas como

inválidas y luego las elimina a intervalos

regulares (conocidos como intervalos de

recolección de basura). Se puede establecer

dicho intervalo introduciendo el comando:

brctl setgcint bro segundos. Por defecto es 0

segundos.

El protocolo Spanning Tree

Los switches modernos usan el protocolo

spanning tree para proporcionar una

configuración avanzada. Si dos o más

switches conectan dos subredes, descubren

todas las rutas posibles de una red a otra.

Después de elegir un switch como raíz , el

switch raíz define caminos activos e inac-

tivos a través de la red y propaga esta

información a todos los switches que haya

en la red.

Los switches bloquean los caminos y los

interfaces inactivos, impidiendo el duplicado

de paquetes (paquetes que vayan por dos

caminos) que puedan llegar a la red destino

(véase la Figura 4). Si un switch falla, el resto

de los switches descubren de nuevo qué

caminos están aún disponibles y evitan el

paso por el switch caído.

Linux soporta el protocolo spanning tree, sin

embargo, los administradores necesitan

introducir el comando brctl stp bro on para

activarlo. Los bridges pueden asignarse con

una prioridad de 0 a 65535: brctl set-

bridgeprio bro prioridad. El bridge con la

prioridad más baja asume la función de raíz.

Test de Función

Los bridges comprueban si los otros bridges

están funcionando enviando un mensaje

“hello” a intervalos regulares. Los adminis-

tradores pueden establecer el intervalo de

intercambios de mensajes “hello” intro-

duciendo brctl sethello bro segundos. El

comando brctl setmaxage bro segundos

especifica cuánto tiempo el otro bridge debe

esperar si no recibe un mensaje “hello”.

Pasado este intervalo,el bridge asume que el

otro está fuera de servicio.

Cuando un bridge está conec-

tado a una red,debe esperar un

período de tiempo antes de

empezar a reenviar paquetes.

Tiene que usar este período

para comprobar si la red usa el

protocolo STP. El siguiente

comando establece el retraso

inicial:brctl setfd bro segundos.

STP debe estar desactivado en

un bridge de filtrado: brctl stp

bro off. El cortafuegos tiene

que confiar en sus propias

reglas y debe evitar ser desha-

bilitado por un ataque STP.

Construyendo Puentes

Figura 4: Los bridges 1 y 2 conectan las redes A y B. El bridge con la prioridad más

baja usa STP para definir caminos válidos para los paquetes enviados desde A a B.

Page 17: Linux Magazine - Edición en Castellano, Nº 03

17www.linuxmagazine.com.es Número 03

PORTADABridgewall

--destination-mac U

fe:fd:0:0:0:1 -j DROP

Esta sintaxis elimina todas los paquetesrespuestas ARP enviados al ordenadorcon la dirección MAC fe:fd:0:0:0:1 queno son originados desde el ordenadorcon la IP 192.168.0.15. El paquete derespuesta ARP le dice a una entidadsolicitante la dirección MAC asociadacon la dirección IP especificada. Aquí elordenador con la dirección MACfe:fd:0:0:0:1, que está en la red al otrolado del bridge, sólo consigue ver ladirección MAC del ordenador con ladirección IP 192.168.0.15.

EBtablesEl comando ebtables es mucho máspotente que el ARPtables. El comandoebtables soporta NAT para las direc-ciones MAC del bridge. El bridge inclusopuede impedir a los atacantes averiguarla dirección MAC de un ordenadorconectado a otro puerto. El bridge envíasu propia dirección MAC en respuesta asolicitudes ARP y proporciona MAC-NAT para todos los paquetes IP. Elprimer comando en el Listado 1 le diceal bridge que responda con su propiadirección MAC (0:ff:90:2b:a6:16) acualquier solicitud ARP que quiera saberla dirección MAC para la IP192.168.0.16.

La dirección IP del ordenador que sedesea esconder detrás del bridge nece-sita seguir: --arp-ip-dst. --arpreply-mac esla dirección MAC del bridge. Para los

paquetes IP de MAC-NAT, adicional-mente se necesitan las líneas 2 y 3 delListado 1. En nuestro ejemplo192.168.0.16 es la dirección IP del orde-nador que se esconderá detrás delbridge, y su dirección MAC esfe:fd:0:0:0:1.

La excelente documentación en lapágina Web de EBtables en [3] propor-ciona más información sobre lascapacidades del comando ebtables.

En las Profundidades de laRedUn cortafuegos a nivel de bridge pro-porciona a los administradores unanueva clase de filtrado de paquetes quepermite mayor control sobre la capa 2.Lo realmente práctico de los cortafue-gos de tipo bridge es que puedenañadirse de forma transparente a unared existente. El bridge simplementereemplaza a un hub, switch o cablecruzado en una red. Si se necesita blo-quear unos cuantos ordenadores conapariencia sospechosa detrás de uncortafuegos, se puede hacer sin tenerque reconfigurar la red entera simple-mente añadiendo un cortafuegos a nivelde bridge. �

ipset -A left 192.168.0.5

ipset -A left 192.168.0.17

ipset -A left 192.168.0.18

El nuevo conjunto puede utilizarse porlas reglas IPtables. Con la opción -m set

se maneja esto. -set Nombre especifica elconjunto:

iptables -A FORWARD -m physdev

--physdev-in eth0 U

--physdev-out eth1

--dport 22 -m set U

--set left -m state

--state NEW -j ACCEPT

Además de los paquetes IP, los paquetesARP son también objetivo de las reglasdel cortafuegos. Muchos ataques através de redes internas están basadosen la manipulación de peticiones yrespuestas ARP.

ARPtablesEl comando arptables filtra paquetesARP. Fuera de las operaciones delbridge, el comando sólo tiene sentido enlas cadenas INPUT y OUTPUT, ya quelos routers no redirigen los paquetesARP. Pero en un bridge, ARPtablespuede filtrar paquetes en la cadena FOR-

WARD. La sintaxis del comando essimilar a iptables. ARPtables usa losobjetivos ACCEPT y DROP, la opciónREJECT no tiene sentido aquí.

arptables -A FORWARD -s ! U

192.168.0.15

[1] IPtables:http://www.iptables.org

[2] Linux bridge:http://bridge.sf.net

[3] EBtables:http://ebtables.sf.net

INFO

Figura 5: La página de Sourceforge para EBtables proporciona documentación y ejemplos del mundo real.

01 01 ebtables -t nat -A

PREROUTING -p ARP --arp-ip-dst

-j arpreply

02 --arpreply-mac

0:ff:90:2b:a6:16

03 02 ebtables -t nat -A

PREROUTING -p IPv4 -d

0:ff:90:2b:a6:16 --ip-dst

04 192.168.0.16 -j dnat

--to-dst fe:fd:0:0:0:1

--dnat-target ACCEPT

05 03 ebtables -t nat -A

POSTROUTING

06 -p IPv4 -s

fe:fd:0:0:0:1 -j snat --to-src

0:ff:90:2b:a6:16

07 --snat-target ACCEPT

Listado 1: MAC-NAT

Page 18: Linux Magazine - Edición en Castellano, Nº 03

18 Número 03 www.linuxmagazine.com.es

El cortafuegos Netfilter crea ficheros

de registros muy detallados que real-

mente nadie quiere inspeccionar a

mano. Las herramientas de análisis

de ficheros de registros como IPtables

Log Analyzer,Wallfire Wflogs y

FWlogwatch ayudan a los admi-

nistradores a seguir la pista de

acontecimientos y de filtros para

mensajes importantes.

POR RALF SPENNEBERG

En un entorno protegido por uncortafuegos, el administrador debeseguir la pista de los acontecimien-

tos mediante el registro de tantastransacciones como sean posibles. Almismo tiempo, los administradoresquieren evitar inspeccionar ficheros deregistros de cientos de megabytesporque sólo están interesados enalgunos en concreto.

Asistentes para los Ficherosde RegistrosLas herramientas de análisis de proto-colo proporcionan una solución a estedilema. Los usuarios de Linux tienenvarias opciones a la hora de elegir unprograma de análisis de cortafuegos. En

datos Ulog son raras. Ulogd-php [5] esuno de los primeros. Al contrario que losotros sistemas de registros, Ulogd puederegistrar los eventos que causaron unaalerta en el cortafuegos en su base dedatos.

IPtables Log AnalyzerIPtables Log Analyzer presta servicio alos registros de IPtables para Linux 2.4 o2.6 en formato de páginas HTML (VerFigura 1). La herramienta incluye trescomponentes. El sistema de entrada dela base de datos almacena los eventosen una base de datos MySQL; los admi-nistradores pueden usar el interfaz webpara acceder a la base de datos. El sis-tema de entrada de la base de datos, la

Analizadores de Registros de CortafuegosPORTADA

este artículo, veremos tres alternativas:IPtables Log Analyzer [1], WFlogs delproyecto Wallfire [2] y FWlogwatch [3].Los tres programas soportan una ampliagama de protocolos y muestran losresultados como páginas HTML muybien formateadas; WFlogs y FWlog-watch además tienen modos en tiemporeal. IPtables Log Analyzer es la únicaherramienta que utiliza bases de datospara el almacenamiento de mensajes.

IPtables Log Analyzer se basa en unsistema de entrada especial. Ulogd deHarald Weltes [4] maneja esto de formanativa, sustituyendo el sistema de syslogque trae por defecto. Desafortunada-mente, las herramientas de análisisgratuitas que soportan las bases de

Herramientas de Análisis para Ficheros de Registros de Cortafuegos

Análisis Final

Page 19: Linux Magazine - Edición en Castellano, Nº 03

19www.linuxmagazine.com.es Número 03

PORTADAAnalizadores de Registros de Cortafuegos

parámetros de la base de datos y la con-figuración del servidor web (usuario,password, URL). El último paso es insta-lar y activar el sistema de entrada de labase de datos. Será necesario de nuevomodificar las credenciales de los usua-rios de la base de datos.

IPtables Log Analyzer tiene tres va-riantes del sistema de entrada de la basede datos denominadas feed_db.pl,feed_db-shore-wall.pl y feed_db-

suse.php. Para lanzar el sistema deentrada automáticamente, el admi-nistrador necesita mover el script dearranque, scripts/iptablelog, a /etc/init.d

y crear los enlaces en rc.

WFlogsWFlogs es la herramienta de análisisque pertenece al proyecto Wallfire [2],aunque puede usarse independiente-mente. El módulo del programa analizay procesa Netfilter, Ipchains, IPfilter,Cisco PIX, Cisco IOS y ficheros de re-gistro Snort, mostrando los resultadoscomo texto, HTML, XML o en tiemporeal. WFlogs no tiene soporte de base dedatos, pero puede convertir formatos deficheros de registros entre Netfilter,IPchains e IPfilter.

Instalar WFlogs en Debian es muyfácil. Debian Sid incluye WFlogs y los

paquetes para Woody están disponiblesen [8]. Los usuarios de otras distribu-ciones pueden compilar WFlogs desde elcódigo fuente. Wflogs también necesitala biblioteca WFnetobjs, otro compo-nente de Wallfire [2]. La libreríaalternativa DNS, adns [9], también serecomienda para la resolución de nom-bres de forma asíncrona DNS.

Para compilar Wflogs, se siguen lospasos típicos ./configure; make; make

install; se necesitará especificar el direc-torio de WFnetobjs en los pasos deconfiguración.

De Netfilter a HTMLWFlogs puede procesar los registros delcortafuegos de forma online u offline.Los siguientes comandos crean unavista en formato HTML de un fichero deregistro de Netfilter (Figura 2):

wflogs -i netfilter -o htmlU

netfilter.log > logs.html

En el modo tiempo real, WFlogs analizalas nuevas entradas del fichero de re-gistros y muestra por pantalla estasentradas. Los administradores puedenusar la shell para modificar interactiva-mente el comportamiento de WFlogs.Los siguientes comandos le dicen a

base de datos y el interfaz web puedenejecutarse todos en la misma máquina oen máquinas distintas. Por otro lado, labase de datos puede almacenar ficherosde registros de varios cortafuegos.

Después de decidir la arquitectura,el administrador necesita crear unabase de datos MySQl denominada ipta-

bles, permitir a los usuarios el accesoa iptables_admin e iptables_user ygenerar tablas en la base de datos (Lis-tado 1). También es necesario definirlas reglas de IPtables. Dos cadenasdefinidas por el usuario es la mejorforma (Listado 2).

Creando CadenasEn vez de -j ACCEPT, IPtables ahorausará -j LOG_ACCEPT. Estas modifica-ciones no son necesarias para Shorewall[6] o Suse Firewall en CD [7]. Sinembargo Suse dice que no dará soportea su producto de cortafuegos en elfuturo, que es otra razón para que losadministradores escojan herramientas yactualizaciones del mundo de códigoabierto.

El siguiente paso es instalar el interfazweb. Para hacer esto, el administradornecesita mover el directorio web aldirectorio raíz del servidor web y modi-ficar config.php para reflejar los

Figura 1: IPtables Log Analyzer da al administrador una clara visión de los ficheros de registros del corta-

fuegos.

01 # mysql -u root -p

02 mysql> create database

03 iptables;

04 mysql> grant

05 create,select,insert

on

06 iptables.* to

07

iptables_admin@localhost

08 identified by

'g3h31m';

09 mysql> grant create,select on

10 iptables.* to

11

iptables_user@localhost

12 identified by

'auchgeheim';

13 mysql> quit

14 # cat sql/db.sql | mysql -u

15 iptables_admin -p

iptables

Listado 1: Base de DatosMySQL

Page 20: Linux Magazine - Edición en Castellano, Nº 03

20 Número 03 www.linuxmagazine.com.es

enviando mensajes de correo oautomáticamente modificando las reglasdel cortafuegos.

Los administradores pueden usar elservidor web integrado para supervisarel estado de FWlogwatch desde un nave-gador web.

FWlogwatch soporta IPchains(opción i), Netfilter (n), Ipfilter (f),IPFW (b), Cisco IOS (c), Cisco PIX (p),Netscreen (e), Windows XP (w), ElsaLancom (l) y formatos Snort (s). Lainstalación es tan fácil como lanzar los

procesos make && make

install && make install-con-

fig. Boris Wesslowski tienelos paquetes para Red Hat yDebian en la página princi-pal del sitio web deFwlogwatch.

Los administradorespueden configurar el com-portamiento de FWlogwatchusando el archivo de confi-guración, que vienesumamente comentado.También pueden configurarFWlogwatch mediante lalínea de comandos. En laspáginas de ayuda (comandoman) vienen explicadas lasopciones. Por ejemplo, elsiguiente comando ejecutaFWlogwatch en modoresumen:

fwlogwatch -b -Pn -U U

'Spenneberg.Com'-p -n -N -o U

output.html -t -w U

/var/log/messages

La opción -Pn habilita el analizador deNetfilter. -U permite al usuario especi-ficar una cabecera para el resumen. Laopción -o especifica el fichero de salida; -w estipula la salida HTML. -n y -N

permite la resolución de nombres dehosts y servicios. El resultado es unresumen en formato HTML del ficherode registros del cortafuegos.

Respuesta RápidaLa opción de ejecución de FWlogwatchen modo tiempo real permite a losadministradores reaccionar ante men-sajes del fichero de registros y a la vezmostrar el estado actual en la ventanadel navegador. FWlogwatch se ejecutaen segundo plano como un servicio ymonitoriza el fichero de registros, ana-lizando de nuevo el archivo deconfiguración si se recibe un SIGHUP.SIGUSR1 le indica al servicio que vuelvaa abrir el fichero de registros. Esta carac-terística es útil para ir rotando ficherosde registros, por ejemplo.

Los administradores pueden especi-ficar el valor umbral para queFWlogwatch reaccione a mensajes delfichero de registros disparando alarmas orespondiendo con scripts. Hay dos

WFlogs que monitorice inte-ractivamente un ficherodenominado /var/log/warn

en tiempo real:

wflogs -RI -o humanU

/var/log/warn

La opción -P le dice a WFlogsque procese los mensajesmás antiguos del fichero.WFlogs no se lanza por men-sajes que no sean delcortafuegos.

FiltradoLas opciones de filtradopueden restringir la salida amensajes específicos. El fil-tro siguiente es de ladocumentación de WFlogs;lista las conexiones Telnet ySSH denegadas para los últi-mos tres días de la red10.0.0.0/8:

wflogs -f '$start_time >= U

this 3 days ago] &&$start_timeU

< [this 2 days ago] && U

$chainlabel =~ /(DROP|REJECT)/U

&& $sipaddr == 10.0.0.0/8 && U

$protocol == tcp && ($dport ==U

ssh || $dport == telnet) && U

($tcpflags & SYN)' -i U

netfilter -o text U

--summary=no

FWlogwatchBoris Wesslowski desarrolló FWlogwatchpara RUS-CERT en la Universidad deStuttgart, Alemania. La versión 1.0 [3]de la herramienta de análisis ahora hasido lanzada bajo licencia GPL.

FWlogwatch tiene tres modos deoperación: Modo Log Summary, ModoInteractive Report y Modo RealtimeResponse. En el modo Log Summary, elprograma genera texto o páginas HTMLcon el resumen del análisis de losficheros de registros del cortafuegos(Figura 3). En el modo Interactive Report,FWlogwatch genera automáticamenteinformes de incidencias que los admi-nistradores pueden reenviar a quieneshayan sido afectados por el incidente.

En el modo Realtime, FWlogwatchresponde a ataques ejecutando scripts,

Analizadores de Registros de CortafuegosPORTADA

Figura 2: La página del Resumen de WFlogs muestra cuantos paquetes han

sido registrados para cada fuente.

01 iptables -N LOG_DROP

02 iptables -A LOG_DROP -j LOG

--

03 log-tcp-options

--log-ipoptions

04 --log-prefix

05 '[IPTABLES DROP] :'

06 iptables -A LOG_DROP -j DROP

07 iptables -N LOG_ACCEPT

08 iptables -A LOG_ACCEPT -j LOG

09 --log-tcp-options

--log-ipoptions

10 --log-prefix

11 '[IPTABLES ACCEPT] : '

12 iptables -A LOG_ACCEPT -j

13 ACCEPT

Listado 2: Analizador deRegistros de IPtables

Page 21: Linux Magazine - Edición en Castellano, Nº 03

21www.linuxmagazine.com.es Número 03

PORTADAAnalizadores de Registros de Cortafuegos

con el analizador Netfilter. El proceso seejecuta bajo la identificación de usuariofwloguser.

Si se excede el umbral de cinco cone-xiones en 600 segundos, Fwlogwatchrealiza una acción configurable. Fwlog-watch monta un servidor de web en127.0.0.1:8888, donde un usuario ralf

puede conectarse con la contraseña pass-

word. FWlogwatch utiliza contraseñasencriptadas con DES, que pueden gene-rarse tecleando htpasswd -nb usuario

contraseña. Cuando el usuario se registraen esta página, aparece lo mostrado en laFigura 4. Esta página conduce a otraspáginas con una amplia gama deopciones de configuración de Fwlog-watch (Figura 5).

OpcionesFWlogwatch tiene una enorme va-riedad de características, que vandesde un simple resumen hasta unmodo en tiempo real con respuestasconfigurables. Pero las otras herra-mientas que se comentan en esteartículo merecen también una buenaconsideración. Si necesita filtrospotentes, WFlogs puede ser unabuena opción para su red. El IPta-bles Log Analyzer es una opcióninteresante para algunas situacionespor su soporte de base de datos.

El IPtables Log Analyzer da a losadministradores de sistemas la opción deutilización de sentencias SQL para bus-car los mensajes del cortafuegos, en vezde tener que lanzar las búsquedas desdeuna interfaz web. �

opciones de configuración importantes:recent (-l) define el período de tiempo amonitorizar y alert_threshold (-a) defineel número de eventos que en este tiempotienen que suceder para lanzar unarespuesta. El Listado 3 muestra su con-figuración. Este ejemplo configuraFWlogwatch para el modo en tiempo real

Figura 4: El servidor web integrado en FWlog-

watch permite a los administradores monitorizar

el estado actual del cortafuegos.

Figura 5: Los administradores pueden utilizar un

navegador para configurar FWlogwatch.El Alert

Threshold especifica el número de mensajes nece-

sarios para lanzar la respuesta de FWlogwatch.E

[1] IPtables Log Analyzer:http://www.gege.

org/iptables/

[2] Proyecto Wallfire (WFlogs y WFnetobjs):

http://www.wallfire.org

[3] FWlogwatch:http://fwlogwatch.

inside-security.de

[4] Ulogd:http://gnumonks.org/projects/

ulogd

[5] Ulogd PHP:http://www.inl.fr/download/

ulog-php.html

[6] Cortafuegos Shorewall:http://shorewall.

sourceforge.net

[7] Cortafuegos Suse:http://www.suse.de/

en/ business/products/suse_business/

firewall/

[8] Paquetes WFlogs,Debian Woody:http://

people.debian.org/~kelbert/

[9] GNU adns:http://www.chiark.greenend.

org.uk/~ian/adns/

INFO

Ralf Spenneberg es un freelance deUnix/Linux, profesor y autor. El añopasado vió la luz su primer libro:“Sis-temas de Intrusión y Detección paraServidores Linux”. Ralf también hadesarrollado varios trabajos de edu-cación.

ELAUTOR

Figura 3: En Modo Resumen, FWlogwatch da a los administradores una vista de la actividad del fichero

de registro del cortafuegos.

01 realtime_response = yes

02 parser = n

03 run_as = fwloguser

04 recent = 600

05 alert_threshold = 5

06 notify = yes

07 notification_script = /usr/

08 sbin/fwlw_notify

09 server_status = yes

10 bind_to = 127.0.0.1

11 listen_port = 8888

12 status_user = ralf

13 status_password =

14 i0QlAmOg4PrAA

15 refresh = 10

Listado 3: Fwlogwatch enModo Tiempo Real

Page 22: Linux Magazine - Edición en Castellano, Nº 03

22 Número 03 www.linuxmagazine.com.es

Cuando los usuarios piensan en su estación de trabajo

en casa olvidan normalmente la seguridad. Pero el peli-

gro acecha, esperando golpear a los desprevenidos.

Shorewall ayuda a los usuarios habituales de Linux a

mantener a los intrusos fuera.

POR JAMES MOHR

La única forma de que nuestro sis-tema sea completamente segurofrente a ataques es no conectarlo

nunca a Internet. Cada vez que abrimosla puerta para salir también la abrimospara que hackers potenciales entren.

Algunos usuarios tienen la equivocadacreencia de que los intrusos solo atacansitios de alto renombre y no están intere-sados en estaciones de trabajopersonales. La verdad es que todas lasestaciones de trabajo conectadas a Inter-net están en peligro de ser atacadas,incluso las que se conectan medianteteléfono analógico normal. En muchoscasos estos ataques son aleatorios, defuerza bruta, donde el atacante utilizauna larga lista de conocidos agujeros deseguridad.

Para frustrar a los atacantes simple-mente podríamos deshabilitar todos lospuertos de entrada, haciendo en esencianuestro equipo invisible al mundo. Sinembargo, cuando necesitamos o simple-mente queremos proporcionar serviciosdesde nuestro ordenador debemos usarotro tipo de protección.

sita ser específicamente configurado enel modo “compatibles con ipchains”para que trabaje con éstas.

Podemos descargar la última versiónde Shorewall desde la página Web deShorewall Web [2] bien como código ocomo paquete RPM. Debemos saber quela versión RPM no ha sido comprobadacon cada una de las distribuciones, sibien sí ha sido comprobada con las prin-cipales como SuSE, Redhat y Mandrake.Si no estamos seguros debemos compro-barlo en la página de Shorewall.

Para que Shorewall funcione necesita-mos los paquetes de iptables e iproute/iproute2. Estos paquetes son propor-cionados habitualmente por defecto enla mayoría de las distribuciones por loque no debería ser un problema. Larazón por la que necesitamos las iptableses porque Shorewall no es realmente uncortafuegos en sí mismo. Shorewall noes responsable de comprobar, filtrar ygestionar paquetes. Shorewall simple-mente coge sus archivos deconfiguración y usa el comando iptables

para cargarlas en el núcleo.

ShorewallPORTADA

Incluso el más pequeño de los nego-cios necesita la protección queproporciona un cortafuegos. La mayoríade los usuarios no puede permitirse losmiles de dólares que cuesta un cortafue-gos comercial. Afortunadamente haysoluciones de código abierto que ofrecenla protección adecuada. Una de esassoluciones es Shorewall.

Entre BastidoresShorewall es el nombre común delcortafuegos Shoreline Firewall. Desdela perspectiva del usuario, Shorewall esun conjunto de archivos fáciles de con-figurar que se utilizan para configurarNetfilter [1]. Netfilter es una funcióndel núcleo de Linux 2.4.x y 2.6.x quepermite a los módulos del núcleoacceder al conjunto de protocolos dered en distintos lugares. El módulo delnúcleo puede hacer casi todos con elpaquete de red, incluyendo simple-mente dejarlos caer o manipularlo.Netfilter también soporta las antiguasipchains, la instalación empaquetadade filtro en núcleos 2.2. Netfilter nece-

Configuración de Netfilter y tablas ip con Shorewall

La Mesa Servida

Page 23: Linux Magazine - Edición en Castellano, Nº 03

23www.linuxmagazine.com.es Número 03

PORTADAShorewall

el paquete. Este concepto es básicamentecomún en todo software cortafuegos ypuede utilizarse en redes con decenas,incluso cientos de ordenadores, si bienes probable que, con muchos orde-nadores hablando entre ellos, prefiramossubdividir nuestra red en pequeños seg-mentos. Cada segmento también puedeser gestionado por su propio cortafuegosShorewall.

Algo que debemos saber es que nonecesitamos dedicar un equipo específi-camente como cortafuegos. Si bien estoes una práctica común y generalmenteuna buena idea, los usuarios domésticosno dispongan del espacio necesario parausar un equipo específico para cada fun-ción. Si nuestra estación de trabajo se

conecta directamente a Internetpodríamos añadir un cortafuegos direc-tamente a nuestro equipo.

Mi red consiste en un ordenador contarjeta DSL que se conecta a Internet,una máquina con Windows XP y otracon Linux. Cada una tiene una funciónespecífica y permito diferentes cone-xiones desde y hasta estas máquinas.

Tan simple como es la configuraciónde mi red, solo tengo que cambiar un parde archivos de configuración para usarShorewall. Debido a que esta es una con-figuración común y simple, es un buenpunto de partida.

Configuración BásicaEl archivo principal de configuración es/etc/shorewall/shorewall.conf. shore-

wall.conf nos permite configurar todo,desde el comportamiento al arranquehasta el comportamiento al apagarlo. Sibien podemos configurar muchos va-lores distintos en este archivo aún no heencontrado ninguna razón para cambiarninguno de ellos en mi sistema.

Puede que ya estemos familiarizadoscon el término “segmento” para denomi-narporciones específicas de una red.Shorewall usa el término “zona”. En miconfiguración tengo cuatro zonas: fw (elpropio cortafuegos y mi estación de tra-bajo), net (Internet) y loc (la red local).

Los nombres de las zonas deben sercortos (5 caracteres o menos) y puedencontener letras o números. Debemossaber que no podemos usar el nombre dezona especial all. Tampoco nos podemosreferir a una zona distinta a la del corta-fuegos mediante la variable FW delarchivo shorewall.conf. Este nombrecambia por defecto a fw.

Aunque no proporcionamos ningúnservicio a ordenadores fuera de nuestrared local necesitamos la zona Internet.Recordemos que las reglas iptable sedefinen mediante una conexión especí-fica, o lo que es lo mismo, definida pordos puntos finales. Uno de los puntospuede ser nuestra estación de trabajo,siendo el otro Internet. Por tanto necesi-tamos definir una zona específicamentecomo Internet.

Debemos saber que estos nombres sonsolo un acuerdo. Si bien son los queShorewall usa por defecto para estaszonas, las podemos llamar como que-ramos mientras que seamos consistentes

Debido a que iptables asume la tareade manipular tablas dentro del núcleo,Shorewall no se necesita más una vez lohemos ejecutado. Incluso podemos verque esta ocurriendo echando un vistazoal propio programa Shorewall. No esnecesario rebuscar a través de muchocódigo. El programa Shorewall (normal-mente /sbin/shorewall) es un archivo decomandos.

Para que iptables sepa lo que debehacer debemos indicarle al núcleo lasreglas. Las llamadas rulesets se definendentro de las iptables y están compues-tas de una conexión y una serie de“clasificadores”. Esto determina si unaconexión en particular se permite y si ycomo debe ser manipulado o redirigido

Figura 1: Una configuración Shorewall para entornos empresariales.Nótese las distintas zonas de

seguridad.

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

24 Número 03 www.linuxmagazine.com.es

net ppp0 routefilter,norfc1918

loc eth0 detect -

Como podemos observar, la zona Inter-net está conectada a la interfaz ppp0 yla zona local está conectada a la inter-faz eth0. Debido a que tengo treszonas, puede que nos preguntemos porqué no hay ninguna línea para la zonadel cortafuegos. Bueno, es sencillo, elcortafuegos se conecta a las otras zonasa través de una de las interfaces yaespecificadas. Por tanto quizás seamejor pensar en el archivo interface

como el lugar donde se define queinterfaz usa el firewall para hablar conlas otras zonas.

En el caso de la interfaz ppp0 lacolumna difusión tiene un guión (-).Debido a que la conexión PPP no tienedifusión, podríamos haberlo dejado enblanco. No obstante, como deseabaespecificar algunas opciones adicionales,necesitaba ocupar el espacio de algunamanera. Si no hubiera opciones simple-mente podríamos haber dejado los dosespacios en blanco. No obstante, a mísiempre me gusta incluir un guión envez de dejar el espacio libre con el fin derecordar que “falta algo”.

La opción routefilter que hemosespecificado le indica al núcleo que deberechazar cualquier paquete de la interfazindicado cuya dirección origen haya sidoencaminada fuera con un interfaz dis-tinta. En este caso, si el interfaz ppp0

recibe un paquete con una direcciónoriginal entrante que normalmente sehabría dirigido fuera desde la interfazeth0, esta sería abandonada. Esto es lla-mado anti-spoofing.

La segunda opción, norfc1918, indicaal núcleo que no debe enrutar direc-ciones especificadas como “privadas” enRFC 1918. RFC 1918 lista una serie derangos de direcciones que pueden serusadas por cualquiera y no deben seenrutadas. Esta opción asegura que no loserán. Los detalles respecto a RFC 1918pueden ser encontrados en [3].

Aquí hemos tenido un problema.Queremos que nuestros otros orde-nadores sean capaces de acceder aInternet, pero tienen direcciones en elrango marcado por RFC 1918. Entonces,¿cómo pueden acceder a Internet?Bueno, eso lo veremos en breve.

Podemos configurar Shorewall deforma que se comporte de determinadasmaneras en base a las zonas ajustandocondiciones específicas para cada zona.Los ajustes por defecto para cada zonason iguales (como nos podemos imagi-nar) y están en el archivo policy. Loscampos en este archivo son: cliente (lazona origen), servidor (la zona destino),política (lo que se debe hacer pordefecto) y nivel de registro (cuanta infor-mación debe ser almacenada).

El listado 3 muestra un archivo depolítica de ejemplo. Observemos las últi-mas dos líneas. La primera indica quecualquier tráfico que haya sido compro-bado y venga desde Internetsimplemente debe ser abandonado(ignorado). Tenemos cuatro opcionespara la política de conexión:

ACCEPT (Aceptar) - Acepta la solicitudde conexión. DROP (Dejar) - Ignora lasolicitud de conexión. REJECT (Re-chazar) - Devuelve un error determinadoal equipo solicitante. CONTINUE (Con-tinuar) - Nos permite tener anfitriones enmúltiples zonas y aplicar reglas deambas zonas.

El nivel de registro determina cuantainformación se envia al registro del sis-tema (syslog). Debemos recordar quetodo esto se realiza con los iptables queexisten en el núcleo. Esto significa quetoda la información es enviada por la

a los largo de los archivos de configu-ración.

Los permisos en el directorio/etc/shorewall está puesto en 700 pordefecto, lo que significa que solo elpropietario (raíz) tiene acceso. Incluso elpermiso de lectura puede ser peligrosopuesto que alguien puede ser capaz dever un agujero en la seguridad yexplotarlo.

Las zonas están definidas en el archivo/etc/shorewall/zones. Cada entrada tienetres valores: nombre de la zona (usadopara referirse a ésta en los otrosarchivos), nombre a mostrar (aparececuando shorewall esta cargando lasreglas) y un comentario. El listado 1 nosmuestra el archivo zones básico.

Definición de los Caminos deComunicaciónSi bien hemos definido las zonas, elcortafuegos aún no sabe como comuni-carse con cada zona. Esto es debido aque aún no hay asociación entre losnombres de las zonas y la propia red.Esto se hace usando el archivo/etc/shorewall/interfaces, compuesto decuatro columnas: zona, interfaz,difusión y opciones.

En mi sistema, el archivo interfaces esparecido al que aparece en el listado 2.

La zona es simplemente el nombre dela zona cogido del archivo zones. Elinterfaz es el nombre de la interfaz dela red. Por ejemplo, en mi conexiónDSL, que usa el protocolo punto apunto (PPP), el nombre de la interfazes ppp0. El nombre del interfaz para latarjeta de red es eth0. Para saber queinterfaces tenemos debemos usar elcomando /sbin/ifconfig. La columnadifusión es la dirección de difusión dela red anexa a esa interfaz. Comohabrás podido imaginar, la columnaopciones especifica cualquier opciónque deseemos usar.

En mi sistema aparecen dos entradascomo las siguientes:

ShorewallPORTADA

01 #ZONE DISPLAY COMMENT

02 net Net the Internet zone

03 loc Local the local network

04 fw FW the firewall

05 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Listado 1: Archivo de zones de ejemplo

01 #ZONE OPTIONS BROADCAST INTERFACE

02 net ppp0 - routefilter,norfc1918

03 loc eth0 detect -

04 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Listado 2: Archivo de interfaces de ejemplo

Page 25: Linux Magazine - Edición en Castellano, Nº 03

25www.linuxmagazine.com.es Número 03

PORTADAShorewall

solicitud saliente lo primero que hace elsistema es comprobar la solicitud con lasconexiones definidas en el archivo dereglas. Si no se encuentra ninguna usa elvalor por defecto del archivo de política.Las columnas del archivos de reglas son:acción a ejecutar, la fuente de la solici-tud, el destino, el protocolo usado, elpuerto de destino, el puerto origen y eldestino original.

Adicionalmente a las acciones delarchivo zona, tenemos un par deacciones adicionales en el archivo dereglas. DNAT nos permite hacer traduc-ciones de direcciones de destino de red(Destination Network Address Transla-tion). De esta forma las solicitudespueden ser redireccionadas a equiposdistintos e incluso a distintos puertos enesos equipos. La acción REDIRECT (redi-reccionar) redireccionará las solicitudesa puertos específicos en el mismoequipo. Esto se utiliza normalmente pararedireccionar solicitudes HTTP al proxylocal (por ejemplo, squid).

Para redes más pequeñas que no nece-sitan proporcionar acceso completo aInternet he averiguado que la acciónREDIRECT es extremadamente útil (posi-blemente sólo permitiendo accesoHTTP). Hay una entrada que es comosigue:

REDIRECT loc 3128 tcp www -U

!10.2.38.0/24

En un interfaz de comandos, estaentrada indica que todas la conexionesentrantes usando el protocolo TCP ysolicitando servicios www (por ejemploHTTP) serán redireccionados al puerto3128. Este es el puerto en el que el servi-dor proxy Squid está escuchando.

Mirando en el destino original especi-ficamos una completa red tipo Cusando la anotación CIDR: 10.2.38.0/24. Además esta entrada está precedidade una marca de exclamación. Como enotros contextos, la marca de excla-mación se utiliza para negar el acceso.Por tanto el significado de la líneaentera en inverso. Lo que significa quetodas las solicitudes excepto aquellasdestinadas a direcciones en la red10.2.38.0 son redireccionadas a Squid.Esto tiene sentido porque 10.2.38.0 esmi red local y cualquier servidor Weben la red local puede o debe ser accesi-

ble sin necesidad de tener que pasar através de un proxy.

La acción LOG (registro) primeroregistrará el paquete y luego continuarácon la siguiente regla de aplicación. Laacción QUEUE (cola) se utiliza para diri-gir paquetes a aplicaciones de espacio deusuario, las cuales se manipulan y sedevuelven a la pila IP.

Una norma a seguir cuando configure-mos el archivo rules es poner apagar todo(off>) en principio y luego ir encen-diendo cosas según las necesitemos.Muchas personas lo hacen al revésempezando con una red abierta y luegovan apagando servicios innecesarios. Enel primer caso, si olvidamos algo lo únicoque ocurre es que no tendremos accesosegún esperamos (lo que es un simpleinconveniente), pero si esto ocurre en elsegundo caso, olvidar apagar algo puedesignificar estar abierto a un ataque.

Cavando más profundoEl archivo /etc/shorewall/hosts nos per-mite definir anfitriones específicos.Habitualmente no hay razones paraañadir nada en el archivo hosts pararedes pequeñas. Cuanto más pequeña esla red es más posible que todas lamáquinas en una zona están configu-radas de la misma forma (o dicho de unaforma más correcta, que todas lasmáquinas de un interfaz concreto tienenla misma configuración).

Este puede que no sea el caso y puedeque necesitemos diferentes reglas deacceso para distintas máquinas de lamisma red. Hace un par de meses mihijo comenzó a jugar a un juego de rolen Internet. Esto implica que él necesitaalgo más de un simple acceso HTTP aInternet, por lo que no pude continuarsimplemente usando la redirección alproxy Squid como describimos antes.

Para proporcionar este acceso hedefinido un grupo específico de orde-nadores como una zona nueva. Primerohe creado una nueva entrada en miarchivo de zonas para esta nueva zona, lacual he llamado “juego” (game). Luegohe creado una entrada en el archivo hosts

que solo contiene el equipo de mi hijo:

game eth0:10.2.38.13.

Pero esto no es todo. Recordemos que mired local es 10.2.38.0/24. Éste es una de

utilidad de registro del núcleo. Todo loque nosotros hacemos es especificar laprioridad de los mensajes que a registrar.Debemos repasar la página principal delsyslogd para encontrar más detalles alrespecto.

Las dos últimas líneas de mi archivode política tienen este aspecto:

net all DROP info

all all REJECT info

La primera línea indica que cualquiertráfico que no haya comprobado yprovenga de Internet debe ser abando-nado (ignorado). No obstante, el restodel tráfico debe ser rechazado. Estopuede parecer un poco absurdo al princi-pio, pero tiene sentido cuandoconsideramos las diferencias entre aban-donar y rechazar. Cuando un paqueteviene de Internet con destino a unadirección específica o puerto no permi-tido deseamos ignorarlo. No deseamosque el remitente sepa lo ocurrido. Estopuede darle al usuario alguna pistarespecto de cómo evadir la seguridad.Por otro lado, los paquetes provenientesde cualquier otro lugar (mi estación detrabajo o el equipo local) son rechaza-dos, dando indicaciones a la aplicacióncliente de lo ocurrido.

Estamos configurando el compor-tamiento por defecto en el archivo de lazona. Esto significa que si no definimosninguna conexión adicional éste será elcomportamiento que aplicará en elarchivo de política.

En mi archivo de política solo tengouna entrada para la zona de red. Teórica-mente, esto significa que todos lospaquetes que provengan de Internetdeben ser abandonados. No obstante,tengo en mi máquina un servidor Webcon mucha información de referenciaque deseo acceder desde el trabajo.Debido a que esta conexión es vía Inter-net, el archivo de reglas no me permitiráacceder a mi servidor.

La respuesta a este problema es elarchivo reglas. El archivo de reglas es elcorazón de la configuración de Shore-wall. Aquí definimos una conexiónespecífica en términos de zonas, servi-cios de red (puertos), segmento de red,equipos individuales y básicamentecualquier combinación en la quepodamos pensar. Cuando llegue una

Page 26: Linux Magazine - Edición en Castellano, Nº 03

las redes “privadas” listadas en RFC1918. Incluso si yo quisiese dirigirla através de mi tarjeta DSL, podríamosapostar a que mi ISP no va ha aceptarla.Entonces, ¿qué podemos hacer?

La solución es algo llamado “enmas-carar IP” (IP masquerading). Como sunombre implica, una dirección IP es“enmascarada” por las otras. En mi caso,la dirección IP en la tarjeta DSL (la cualtiene una dirección de Internet válida) esenmascarada por la dirección IP en la redlocal. Por tanto necesito creer unaentrada en el archivo/etc/shorewall/masq como la siguiente:

ppp0 10.2.38.0/24

Esta entrada hace que todo el tráficosaliente de la interfaz ppp0 desde la redclase C 10.2.38.0 debe ser enmascarada.

En este punto ya hemos acabado laconfiguración básica del enmascarador.No obstante, lo siguiente es la parte máscomplicada. No fue muy sencillo encon-trar información acerca de cómo ejecutareste juego a través de cortafuegos. Dehecho encontré determinada informa-ción al respecto que sugeríandeshabilitar el cortafuegos si se deseajugar.

Bien, pues al final conseguí que fun-cionara. Para hacerlo necesité ajustar elnivel de acceso en el archivo policy paradepurar y vigilar en el archivo de regis-tros todos los intentos de conexión desdeel equipo de mi hijo con cualquier otramáquina para entonces comprobar elDNS para ver si fue una máquina de losdesarrolladores del juego. Entoncesañadí un puerto específico a mi archivorules.

Si lo hubiese deseado, también podríahaber añadido reglas para el servicioWWW (puerto 80). No obstante, debidoa que esto es lo único que mi hijo nece-

sitaba al margen de acceso a la Web, aúncontinuo usando REDIRECT para elacceso Web.

Resolución de problemas yaccesoEs posible (y probable) que tengamosproblemas la primera vez que configure-mos Shorewall. Por tanto, rastrear lascausas de un problema nos será útil.

Una técnica útil para depurar proble-mas es ajustar el nivel de registro en elarchivo policy. Ajustarlo para depurarnos proporciona mucha más informa-ción. Entrar en mucho detalle respecto alas entradas del registro está más allá delalcance de este artículo, pero es bastantefácil entender de que van incluso sincomprender del todo la terminología. Porejemplo, veamos estos datos:

Nov 1 11:19:32 saturn kernel:U

Shorewall:net2all:DROP:IN=ppp0U

OUT= MAC=

SRC=1.2.3.4 DST=10.2.38.11U

LEN=48 TOS=0x00 PREC=0x00U

TTL=116 ID=47048 DF

PROTO=TCP SPT=1 292 DPT=1080U

WINDOW=64240 RES=0x00 SYN URGP=0

Estos son datos estándar de/var/log/messages. Al principio tenemosla fecha, el nombre del equipo y el regis-tro del sistema (kernel en este caso). Acontinuación encontramos el mensajepropiamente dicha. Fácilmente podemosver que el paquete entraba en mi tarjetaDSL (ppp0) y que el paquete fue aban-donado. También podemos observar queestaba usando la conexión net2all deInternet a todas las otras zonas.

Si volvemos a repasar lo comentadorespecto al archivo policy veremos queteníamos una entrada que indicaba queel comportamiento por defecto debíaser el abandono de todos los paquetes

que vengan de Internet hacia el restode las interfaces. Había un paqueteintentando acceder el puerto 1080(DPT). No hay nada ejecutándose enese puerto y desde luego no me hecomunicado con nadie que deba usarese puerto. Puesto que no hay ningúnservicio “estándar” asociado a estepuerto no hay razón para que nadieintente acceder a el desde Internet, porlo que parece bastante obvio quealguien intentaba aprovecharse de unerror de Windows.

Si el equipo remoto (o incluso otroequipo en la misma red) continua inten-tando acceder a distintos puertos de miequipo puede que desee añadirlo a la“lista negra”. Esto se hace añadiendo ladirección del anfitrión o de red enformato CIDR al archivo /etc/shore-

wall/blacklist. Eso implica que, almargen de que cualquier otra entrada lespermita el acceso, estos equipos tienenel acceso específicamente prohibido.

Por defecto, Shorewall usa un sistemade acceso que normalmente envía unmensaje a /var/log/messages. Inclusocuando configuré syslogd para enviarmensajes a otro archivo encontrémolesto hacer que el registro de micortafuegos no se confundiera con otrosmensajes del kernel.

Para resolverlo podemos usar elsoporte ULOG del kernel. Este debe estardisponible para nuestro kernel, siendohabitual en la mayoría de las distribu-ciones. No obstante, el paquete ulogd noestá siempre disponible, por lo que esposible que lo tengamos que descargardesde [4].

Una vez ulogd esta configurado ennuestro sistema no usaremos más losniveles de acceso del syslogd. En su lugarusaremos el ULOG. �

26 Número 03 www.linuxmagazine.com.es

ShorewallPORTADA

[1] Netfilter Website:http://www.netfilter.

org

[2] Shorewall Website:http://www.

shorewall.net

[3] Asignación de Direcciones Privadas de

Internet RFC 1918:http://rfc.net/rfc1918.

html

[4] Ulog:http://www.ulog.ch/english/index.

html

[5] Squid Proxy:http://www.squid-cache.org/

INFO

01 #SOURCE DEST POLICY LOG LEVEL

02 fw net ACCEPT info

03 fw loc ACCEPT info

04 loc net REJECT info

05 loc fw ACCEPT info

06 net all DROP info

07 all all REJECT info

08 # LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Listado 3: Archivo policy de ejmplo

Page 27: Linux Magazine - Edición en Castellano, Nº 03

27www.linuxmagazine.com.es Número 03

DESARROLLOSDL

información sobre el controlador, seadel ratón, el teclado o una palanca dejuegos, para permitirnos la suficienteflexibilidad para crear un buen sistemade control.

La entrada del teclado es la forma deentrada más empleada en este juego, ¡yaque la mayoría de los PCs tiene tenden-cia a tenerlo! Pero como cada pulsacióndel teclado tiene 2 partes, un evento detecla pulsada y un evento de tecla libe-rada, es necesario escuchar ambos.

Manejar múltiples teclas es muy fácil yla velocidad de auto repetición delteclado no causa problemas adicionales,ya que solo importa si la tecla ha sidopulsada o no. Si aparece auto repetición,una característica importante es que sepuede almacenar siempre el tiempo en el

El mes pasado vimos cómo SDL pro-porciona toda la entrada a nuestrojuego a través de un bucle de even-

tos con SDL_PollEvent. Esta funcióncumplimenta nuestra variableSDL_Event con información útil sobre elevento siguiente. Ahora necesitamosinterpretar estos datos.

Mensaje en una botellaLo primero que hay que advertir es queSDL_Event no está implementado comoestructura, sino como una unión, porquecada elemento es mutuamente exclusivo,no tiene sentido obtener informaciónsobre el puntero del ratón para un eventoque reporta la pulsación de una tecla.Por consiguiente, la lectura de parte deuna estructura que no corresponda conel tipo de evento producirá invariable-mente datos inutilizables y no elcontenido del ultimo mensaje del ratón,por ejemplo.

Solamente necesitamos manejar loseventos en los que tenemos interés; todolo demás será ignorado, SDL no inten-tará ni supondrá qué hacer con elevento. En nuestro juego la pantallasiempre se actualiza 60 veces porsegundo, así que no necesitamos mane-jar el mensaje de SDL_VIDEOEXPOSE,por ejemplo.

Cada estructura del evento contieneuna miríada de información quepertenece al evento. Por ejemplo,SDL_MouseButtonEvent indica québotón de ratón fue pulsado, la posición xe y del puntero del ratón y qué disposi-tivo del ratón era (para sistemas con dos,o más, ratones). Los nombres asociadosa las variables dentro de cada estructurase pueden encontrar en las páginas de

Diseño de juegos bajo Linux

Todo bajo Control

manual, o en SDL_events.h, que general-mente habita en /usr/local/include/SDL.

Desde aquí podemos crear mane-jadores de evento para cada mensaje enel que estemos interesados. Esto se hacecreando funciones separadas que mane-jen una clase particular de evento (comola entrada).

Whisky en la JarraEl control es probablemente la partemás importante de un juego de orde-nador. Es la interfaz entre el jugador yel juego. Todos los diseñadores de jue-gos saben esto y pasarán muchassemanas (incluso meses) retocando elsistema de control hasta que esté “per-fecto”. SDL no hace este proceso másfácil, sino que proporciona la suficiente

Este mes todo está bajo control. Y Steven Goodwin con-

trola un montón.Veremos cómo el jugador controla el

juego y cómo el juego controla los personajes.

POR STEVEN GOODWIN

Page 28: Linux Magazine - Edición en Castellano, Nº 03

28 Número 03 www.linuxmagazine.com.es

SDLDESARROLLO

cual la tecla fue presionada utilizando lafunción SDL_GetTicks.

Con la asignación de un punteroSDL_Event (pEevnt), se encuentra latecla correcta con la linea:

SDLKey key = pEvent->keyU

.keysym.sym;

Esto puede parecer un poco agotadorpara una simple pulsación de tecla, perolos otros miembros de estas estructurastambién son redundantes (Por ejemplopEvent ->key.state incluye la mismainformación como tipo de evento; pul-sado o soltado) o intrascendente (elcódigo de exploración específico delteclado). Prefiero pensar que esto esminucioso y no prolijo.

El valor sym equivale a una de lasmuchas definiciones que indican unatecla específica: Por ejemplo SDLK_LEFTpara el cursor izquierdo y SDLK_RIGHTpara el cursor derecho. Las teclasalfanuméricas mapean muy bien elASCII, así que comprobar la tecla ‘0’ estan simple como debe ser:

if (key == '0') /* ...se podiaU

haber usado SDLK_0 aquí... */

No obstante, recomiendo usar las defini-ciones de SDL_keysyms.h ya que lasletras activan siempre eventos con sushomólogas minúsculas del ASCII (elvalor de tecla sería igual a ‘a’ no ‘A’) sintener en cuenta el bloqueo de mayúscu-las o la tecla ‘mayúsculas.

if (key == SDLK_a) /* ...Vaya!U

Efectivamente son minúsculas...

*/

Usaremos este conocimiento reciénencontrado para almacenar pulsacionesde tecla de una manera parecida a losjuegos, mediante la creación de unamatriz especial para indicar que teclas

están controlando elpersonaje. Esto esdiferente de que teclaha sido pulsadaporque, cuando dosteclas son pulsadas,queremos la pulsadamás recientementepara controlar ladirección. Nuestrocódigo será algo asícomo el Listado 1.

Escribir el sistemade control de estamanera hace que sea más fácil cambiarla asignación de teclas o añadir un con-trol de palanca de juegos. Adviértase, sinembargo, que el mensaje de ‘tecla libera-da’ se perderá si cambia del juego aldepurador. SDL no funciona y no estáhabilitado para escuchar mensajes detecla liberada (los cuales, ahora van aldepurador). Por tanto cuando retorne aljuego tomará un evento adicional detecla pulsada y tecla soltada pararestablecer el sistema ¡Esto es más noto-rio si el personaje continúa moviéndosea pesar de que no se pulsan teclas!

Sin embargo, comprobar todas lasteclas de este modo, puede ser leve-mente incomodo. La abstracción de lasteclas de control del juego es una ‘buenacosa’, pero tener que escribir el códigopara aceptar el nombre de los jugadorespara la tabla de puntuaciones máximascuando el cursor izquierdo ha sido rema-peado, digamos, a ‘Z’. en este caso,solamente queremos preguntarle a SDLque tecla concreta se ha pulsado.Podemos hacer esto con la función

Uint8 *keystate = SDL_U

GetKeyState(NULL);

El puntero devuelto es una matriz (queno está permitido modificar) que repre-senta cada tecla en el sistema y estáreferenciado con las macros SDLK_* que

Figura 1: Nuestro juego hasta ahora.

SDL ha hecho que capturar la pantalla sea un

asunto muy simple que apenas requiere una

función, SDL_SaveBMP. Esta es el espejo

exacto de la función SDL_LoadBMP que

hemos usado en la primera parte y toma el

puntero de la superficie (que en nuestro

caso es la superficie de pantalla) y un nom-

bre de fichero.

01 if (ev.type == SDL_KEYDOWN &&

02 ev.key.keysym.sym==SDLK_F12)

03 {

04 static int curr_grab = 0;

05 char GrabName[32];

06 sprintf(GrabName,

07 "DugPic%d.bmp", curr_grab);

08 ++curr_grab;

09 SDL_SaveBMP(TheGame.pScreen,

10 GrabName);

11 }

Cuadro 1: Di ‘Patata’

Este mes hemos hecho una adición a la fun-

ción de actualización. Es un parámetro para

controlar el tiempo. Generalmente, cada lla-

mada a los comportamientos que la función

de Update() realizaría un cuadro valido de la

actividad. Sin embargo, en casos extremos,

el juego podría haber tomado dos cuadros

para procesar la ultima imagen. Esto

requeriría que la función de Update() se lla-

mara dos veces dentro de un solo cuadro

para compensar. Sin embargo, llamar dos

veces a Update() no permite que el compor-

tamiento se optimice con eficacia.Así que en

vez de eso lo llamamos una vez y le pedimos

que actualice N cuadros. Los juegos con una

granularidad más fina pasarían un número

de coma flotante (indicando los segundos

transcurridos) a sus funciones de la actua-

lización.

Cuadro 2: Acerca deltiempo

Función Notas

Start game Llamada una vez al comienzo del nivel

Reset game Llamado siempre que el nivel consiga reiniciarse,después de que el jugador muera por ejemplo

Update Mover o animar al objeto

Draw Dibujar este objeto en la pantalla

Destroy Liberar cualquier memoria ocupada al inicio del juego

Tabla 1: Retrollamadas

Page 29: Linux Magazine - Edición en Castellano, Nº 03

29www.linuxmagazine.com.es Número 03

DESARROLLOSDL

Al contrario que el control de teclado,SDL no inicializa la palanca de juegosautomáticamente cuando se llama aSDL_Init. Hay tres pasos adicionales: Ini-cializar el subsistema de la palanca dejuegos (que no es distinto del subsistemade vídeo o el temporizador), poner enmarcha los eventos de la palanca de jue-gos (si no el bucle de eventos noinformará sobre los eventos de lapalanca de juegos) y abrir un puerto depalanca de juegos para la lectura. Véaseel Listado 3.

Si se tienen que manejar varias palan-cas de juegos, entonces la funciónSDL_NumJoysticks informará delnúmero de palancas de juegos conec-tadas al sistema. El parámetro para lafunción SDL_JoystickOpen, como sepuede esperar, indica cual de las palan-cas de juegos hay que abrir.

Una vez que se tiene un punteroSDL_Joystick se pueden consultar lascapacidades y los parámetros de lapalanca. Esto es importante porque cadapalanca de juegos es distinta: Algunostienen controles tipo HAT (conmutadordigital de 8 vías, otros tienen ‘track balls’y otros tienen más botones de lo que sepueda imaginar. Las palancas de juegospara simulación aérea suelen incluirtodos los anteriores.

Determinar las capacidades de lapalanca de juegos le permitirá saber,por ejemplo, si el jugador tendrá quereasignar los botones de la palanca dejuegos al teclado. Nosotros solo nece-sitamos control a izquierda, derecha ybotón de salto, así que cualquierpalanca de juegos disponible debe ser

suficientemente buena para Explorer

Dug.Refiriendonos de nuevo a la tabla

comentada anteriormente hay tres even-tos principales en los que estamosinteresados: SDL_JOYAXISMOTION,

SDL_JOYBUTTONDOWN y SDL_JOY-

BUTTONUP. Puesto que solamente hayuna palanca de mando en nuestro juego,podemos ignorar cualquier elemento dela estructura del evento y suponer quecualquier evento de la palanca de juegodebe haber venido de la palanca cero(porque es la única que hemos abierto).

Entonces podemos usarpEvent->jaxis.value (que oscila entre-32768 y 32767, indicado totalmente a laizquierda, totalmente a la derecha) paracontrolar el juego. Véase el Listado 4.

La banda muerta es un tema intere-sante. Todas las palancas de juego semueven, que yo sepa. Pero las palancasde juego también se mueven cuandonadie las está tocando. Tiemblan ligera-mente y por tanto generan eventos depalanca de juegos espúreos en cadacuadro. Puesto que esto es una carac-terística del hardware no podemos evitarque suceda, pero podemos limitar losefecto que esto tiene en nuestro juego.Para hacerlo, crearemos una bandamuerta alrededor de la parte central de lapalanca. Cualquier movimiento queocurra en esta área será ignorado ytratado como si la palanca de juegosenviara 0,0. Fuera de la banda muerta,se tratará a la palanca normalmente.Aquí he usado una banda muerta de8000, que es un número razonable paraeste tipo de juegos, aunque en un juego

veremos más tarde. Cualquier valor dis-tinto de cero en esta matriz significa quela tecla está actualmente pulsada.

if ( keystate[SDLK_F12] ) U

printf("The F12 key is down.");

Cualquier tecla que se ha mantenido pul-sada durante dos cuadros consecutivosserá considerada ‘VERDADERO’ paraambos cuadros, porque esta funcióninforma del estado de la tecla y no even-tos. Normalmente esto no es unproblema, pero si se está usando estacaracterística para realizar una capturade pantalla, obtendrá una imagen porcada cuadro mientras la tecla este pul-sada. Véase el Cuadro 1 “Di ‘Patata’”,para más detalles sobre como realizaruna captura de pantalla.

También se puede determinar quemodificador de teclas están pulsados(como ‘mayúsculas’ o ‘alt’); pero paraesto necesita una función diferente.Véase el Listado 2.

Mi Chica PiruletaLa entrada de la palanca de juegos es muyfácil de programar bajo SDL, que inclusopermite múltiples palancas de juego sinningún esfuerzo extra. En nuestro ejem-plo, se supondrá que hay una palanca dejuegos, pero en un juego más completo esdeseable dejar al jugador que seleccioneque palanca de juegos utilizará y que per-sonaje controlará.

01 SDL_Joystick *pJoyStick;

02 SDL_InitSubSystem(SDL_INIT_JOYSTICK);

03 SDL_JoystickEventState(SDL_ENABLE);

04 pJoyStick = SDL_JoystickOpen(0);

Listado 3: Inicialización de la palanca de juegos

01 if (SDL_GetModState() & KMOD_SHIFT) printf("Una de las teclas de

mayúsculas se ha presionado.");

02 if (SDL_GetModState() & KMOD_LSHIFT) printf("Se ha presionado la

tecla de mayúsculas izquierda.");

Listado 2: Modificadores de teclas

01 void exUpdateInterface(const

SDL_Event *pEvent)

02 {

03 if (pEvent->type ==

SDL_KEYDOWN)

04 {

05 SDLKey key = pEvent-

>key.keysym.sym;

06 if (key == SDLK_LEFT)

07 {

08 iMovement[EXI_MOVE_LEFT] =

TRUE;

09 iMovement[EXI_MOVE_RIGHT] =

FALSE;

10 }

11 /* ... etcétera ... */

Listado 1: Pulsaciones deteclas

Page 30: Linux Magazine - Edición en Castellano, Nº 03

30 Número 03 www.linuxmagazine.com.es

SDLDESARROLLO

profesional, este valor debe ser confi-gurable.

Jumpin’ Jack FlashComo los dispositivos del teclado y elratón, las palancas de juegos también sepueden leer sin el bucle de eventos. Parahacerlo hace falta llamar a la funciónSDL_JoystickUpdate que lee el hardware,antes de usar una de las funciones dellistado 5 para consultar los datos.

Ahora hemos recuperado la entrada,deseamos controlar algo en el juego ypor eso, necesitamos algún objeto deljuego …

Gente corrientecada objeto del juego, ya sea el jugador,un enemigo, o una puerta de salida,tiene un número de elementos comunes.Todos tienen una posición de comienzo,todos tienen gráficos y todos “hacencosas”. Sin embargo, cada objeto en eljuego tendrá una posición de comienzodistinta, gráficos distintos, y todos hacen“cosas” distintas. Para implementar unbuen armazón debemos poder identi-

ficar esos elementos y aislarlos con efica-cia del motor común del juego.

Datos comunes para todos los objetos:• Posición de comienzo• Una superficie conteniendo grá-

ficosCódigo único para cada tipo de objeto:• Como inicializar el objeto• Como actualizarlo, p. e. direc-

ción y velocidad de latrayectoria.

• Como dibujar el objeto• Como destruir el objetoNecesitamos estas distinciones porque,por ejemplo, aunque podemos describircada objeto en términos de una superfi-cie, cada objeto en el juego no utilizaráesta superficie de la misma manera.Algunos objetos consistirán en unladrillo (los enemigos), algunos usaránvarios (la puerta de salida) y otros sedesvanecerán en algún momento (eljugador).

Realmente esta lista no está completay no dudaremos en introducir nuevascaracterísticas durante el desarrollo deljuego, pero es un buen punto de partida.El método que he elegido para imple-mentar estas características utilizaretro-llamadas (callback) individuales alas funciones, donde cada una tiene unpropósito específico.

Sin embargo, la implementaciónexacta de cómo trabaja esa función secontrola por el código que es específicopara cada tipo de objeto. Cada uno deesos tipos se denomina comportamiento.Y cada función de retro-llamada mane-jará como se comporta ese objeto en unasituación en particular. Nuestro juegoinicial de retro-llamadas se muestran enla Tabla 1. Esta lista imita nuestro buclede juego general realmente bien: Comen-zamos el juego, procesamos un bucle deactualización del dibujo y entonces sali-mos. No tenemos ninguna distinciónentre el nivel y el juego, puesto que cadanivel es un mini-juego en sí mismo. La

lista también demuestra que tenemosuna jerarquía de dos niveles de datos:configuración y estado. Los datos de laconfiguración se crean en el comienzodel juego e incluyen cosas como lasuperficie SDL o su posición decomienzo. Por el contrario, los datos delestado incluyen las cosas que cambiandurante el juego, como la posición o ladirección actual.

Esto perfila la información que necesi-tamos para nuestra estructuraEX_OBJECT. Cada objeto del juego uti-lizará esta estructura genérica,almacenada como parte de una listaenlazada, con las funciones de retro-lla-mada púdicamente ocultas dentro deotra estructura (EX_OBJ_VTABLE),como se ve en el Listado 6.

Aquí hemos creado la configuraciónmás usada y las variables de estado den-tro de la estructura EX_OBJECT ymarcado las otras con punteros nulos.Será responsabilidad de cada compor-tamiento asignar la memoria para estos

01 if (pEvent->type ==

SDL_JOYAXISMOTION)

02 {

03 if (pEvent->jaxis.axis == 0)

/* X-axis; assume

04 stick 0 */

05 {

06 int DeadBand = 8000;

07

TheGame.iface.iMove[EXI_MOVE_L

EFT] = FALSE;

08

TheGame.iface.iMove[EXI_MOVE_R

IGHT] = FALSE;

09 if (pEvent->jaxis.value <

-DeadBand)

10

TheGame.iface.iMove[EXI_MOVE_L

EFT] = TRUE;

11 else if (pEvent->jaxis.value >

DeadBand)

12

TheGame.iface.iMove[EXI_MOVE_R

IGHT] = TRUE;

13 }

14 }

Listado 4: Movimiento dela palanca de juegos

01 SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis);

02 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat);

03 SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int

04 *dx, int *dy);

05 SDL_JoystickGetButton(SDL_Joystick *joystick, int

06 button);

Listado 5: Consultado la palanca de juegos

01 typedef struct sOBJECT {

02 /* Setup - los datos no

cambian */

03 int init_x, init_y; /*

Posición de inicio */

04 SDL_Surface *pGfx; /* apunta a

una superficie existente */

05 void *pBhvSetupData;

06 /* Estado - consigue el

reinicio */

07 int x, y; /* Posición actual

*/

08 void *pBhvStateData;

09 /* Admin */

10 EX_OBJ_VTABLE VTable;

11 /* Lista de componentes

enlazados */

12 struct sOBJECT *pNext;

13 } EX_OBJECT;

Listado 6: EX_OBJECT

Page 31: Linux Magazine - Edición en Castellano, Nº 03

31www.linuxmagazine.com.es Número 03

DESARROLLOSDL

(donde no debería cambia nada). Por lotanto tenemos que confiar en el sentidocomún y en los programadores compe-tentes. Pero hay una característica dellenguaje que podemos utilizar para cen-trar el desarrollo.

La Tabla La palabra VTable es la abre-viatura de ‘virtual table’ y se ha cogidoprestado de C++. Es una manera dellamar a funciones específicas en obje-tos específicos, sin tener queespecificarlos en tiempo de compi-lación. Esto permite un cierto nivel deabstracción. Cada objeto hace estoestableciendo los punteros a las fun-ciones privadas como en el listado 9.Declaramos cada una de las funciones(dheStart, dheUpdate y dheDraw) comoestáticas para hacer sus nombres invisi-bles a cualquiera fuera del ficheroactual. Esto asegurara que solopodemos llamar a estas funciones refe-renciando a VTable, de este modo:

pObject->VTable.Start(pObject);

Para prevenir referencias a NULL o aotros punteros de función inválidos,prepararemos un conjunto de retro-lla-

madas predeterminadas bajo demanda.Cada objeto podrá entonces reemplazar(o sobrecargar) esos punteros de fun-ciones con los suyos propios.

Este método puede parecer redun-dante, ya que requiere 2 instancias depObject, pero normalmente es más efi-ciente que añadir conmutadores deestado en torno a cada llamada a Start,Update o Draw. Esto también escala biensi añadimos nuevas funcionalidades a losobjetos a través de su VTable. Siemprepodremos usar una pequeña función deenvoltorio para prevenir el error casualcuando una VTable de un objeto se estausando, pero se pasa el puntero de otra.

void exDrawObject(EX_OBJECT U

*pObj)

{

pObj->VTable.U

Draw(pObj);

}

Tu me llevas¡Pero porque cada EEH utiliza el mismocódigo, no significa que utiliza los mis-mos datos! Tenemos ya una estructurapara la información de la configuración,así que si tenemos una manera de cam-biar estos datos iniciales entoncespodemos introducir mucha variedad ennuestro juego, basándolo en los datos.Bien, eso se hace antes los que se dice,ya que podemos ampliar nuestrasusodicha función Bhv_CreateDumbHori-

zontal para incluir un juego deparámetros, tales como velocidad ydirección.

A fin de hacer estos parámetro gene-rales para todos los comportamientos,los crearemos como cadenas de carac-teres y dejaremos que elcomportamiento los analice en busca dealgo significativo. De esta manerapodríamos también leerlos directamentede un archivo de texto para hacer losniveles de juego personalizables de unaforma muy simple.

Todas los objetos basados en compor-tamiento trabajan usando exactamentelos mismos métodos; aunque algunosrequerirán más código que otros. Eljugador, por ejemplo, requerirá manejarcolisiones con el mundo, manejar lasrecolecciones y el contacto con los ene-migos. Programaremos un manejador elpróximo mes. �

punteros y crear estructuras que el pro-pio comportamiento pueda comprender.Tomando el ejemplo de un enemigo quecamina a ciegas de izquierda a derecha(véase el listado 7). Este estúpido ene-migo horizontal (EEH) inicializará suestado en cada reset de los datos de con-figuración que hemos definido como talcomo se ve en el listado 8.

Como lenguaje, C no facilita ningúnmecanismo para parar su cambio deinformación de configuración durante elciclo de actualización (donde solamentedebería ser cambiado el estado), ni lepreviene de datos del estado que cam-bian durante el ciclo de la creación

01 typedef struct sDHE_SETUP {

02 int x1,y1,x2,y2; /* grados

para el enemigo */

03 int iInitialDir; /* -1 para

izquierda, +1 para derecha */

04 int iSpeed;

05 } EX_DHE_SETUP;

Listado 8: Enemigohorizontal mudo

01 BOOL Bhv_CreateDumbHorizontal(EX_OBJECT *pObj)

02 {

03 /* ... otras initializaciones de cosas ... */

04 pObject->VTable.Start = dheStart;

05 pObject->VTable.Update = dheUpdate;

06 pObject->VTable.Draw = dheDraw;

07 /* ... */

08 }

09 static void dheStart(EX_OBJECT *pObj) { /* ... hace cosas ... */ }

10 static void dheUpdate(EX_OBJECT *pObj) { /* ... hace cosas ... */ }

11 static void dheDraw(EX_OBJECT *pObj) { /* ... hace cosas ... */ }

Listado 9: Ajustando punteros

01 typedef struct sDHE_STATE {

02 int iDirection; /* La dirección en que camina, -1 para izquierda, +1

para derecha */

03 int iAnimFrame; /* Marco actual de la animación, mapeado directamente

a una región */

04 int iAnimDir; /* La animación ping-pong entre cuadros

0->1->2->3->2->1->0. será -1 or +1, dependiendo de la dirección */

05 } EX_DHE_STATE;

Listado 7: Enemigo caminando

Page 32: Linux Magazine - Edición en Castellano, Nº 03

El desarrollo web a menudo está ca-racterizado por los hackeos rápidosy sucios con una pintoresca mezcla

de código y HTML. Sin embargo, hay encamino un esfuerzo para llevar unaestructura más formal a la programaciónweb. Por ejemplo, Rails [1] usa Rubypara implementar una clásicainfraestructura Model View Controller

(MVC), algo que en el mundo desmalltalk se ha usado algunas veces. Lainfraestructura MVC abstrae el proce-samiento de datos del modelo de manejode código (controlador) basada en GUI yde la representación del código (la vista),véase la Figura 1.

Esta técnica de abstraer los datos delos métodos del procesamiento de datos

puede aplicarse a cualquier cosa, desdeuna tabla de una base de datos a unmodelo de flujo de trabajo para unaempresa de gran tamaño. El modelo esparcial o completamente visualizado enla vista. Los controladores reaccionan ala entrada del usuario (entre otras cosas)para comenzar los cambios de estadodentro del modelo.

32 Número 03 www.linuxmagazine.com.es

RubyDESARROLLO

Aplicaciones Web con Ruby y Rails

Bien Encaminados.

La mayoría de las bibliotecas web hacen que el 90 por ciento del trabajo sea fácil y el resto imposible. Rails, un

infraestructura de código abierto programado en Ruby, es lo bastante flexible como para tener éxito con ese 10 por

ciento restante.

POR ARMIN RÖHRL Y STEFAN SCHMIEDL

Page 33: Linux Magazine - Edición en Castellano, Nº 03

33www.linuxmagazine.com.es Número 03

DESARROLLORuby

Rails sea realmente útil para el desarrollode aplicaciones de bases de datosbasadas en web, como el software degestión de proyectos Basecamp [2], queha sido programado usando Rails (véaseel cuadro “entrevista con el desarrolladorde Rails”). Cuando se trabaja con Rails,se nota que el diseño del sistema vienede un entorno práctico. Rails evitamuchos de los fallos presentes en lamayoría de las estructuras teóricas detrabajo.

Rails está basado en el concepto DRY(Dont Repeat Yourself: No se repita; enotras palabras, “una vez y solamenteuna vez.”) Repetir código dentro de unprograma suena a programa mal dise-

ñado. Rails tiende a utilizar la reflexión ymódulos en tiempo de ejecución parasustituir los ficheros de configuración;esto elimina la necesidad del típicomaratón de configuración al estilo XML.También tiene el efecto de aplicar loscambios inmediatamente sin tener quepasar por un proceso de generación queconsuma mucho tiempo.

Rails también ha integrado la fun-cionalidad de comprobación general yunitarias. RubyDoc proporciona la docu-mentación. El gran avance es que los trescomponentes de la estructuras de trabajoMVC fueron escritas en Ruby.

Si los desarrolladores se adhieren a lasconvenciones de Rails (mapeado entrebase de datos y estructura de objetos), laestructura ayudará a lanzar un proyectorápidamente. Las funciones para añadir,modificar y borrar objetos estándisponibles con unas pocas pulsacionesde teclado.

Popularización de la Base deDatos de ObjetosNuestro ejemplo de aplicación estábasada en el tutorial de la página web deRuby. Crearemos una simple aplicación

Esta estructura hace a la lógica de laaplicación independiente de la repre-sentación externa y de la interfaz delusuario. Algunos productos de desarrolloafirman ofrecer MVC, aunque esta afir-mación resulta ser un poco pretenciosacuando se analiza de cerca.

Software en AplicacionesPrácticasPara mantener el modelo, Rails incluyeel Registro Activo (Active Record) queproporciona el mapeado relacional delobjeto. El modelo Paquete de Acción(Action Pack) subdivide la petición weben controladores y componentes especí-ficos de la vista. Este diseño hace que

Para los usuarios de Mac OS X (versión 10.3 o posterior), dos vídeos [5]

muestran el proceso de instalación.Desde luego que también hay cosas

interesantes para los usuarios de Linux.Rubygems [6] (versión 0.7 o pos-

terior) una herramienta de gestión de paquetes para Ruby, facilita una

aproximación sencilla a la instalación:

gem install rails

Cada vez que una nueva versión de Action Pack o Active Record se pu-

blica, puede actualizarse simplemente tecleando gem update.

Asegúrese de que la conexión de la base de datos al back-end está

disponible; puede usar tanto MySQL como PostgreSQL. Los usuarios de

Debian necesitaran cumplir algunos requisitos para la instalación, ya

que los componentes necesarios están dispersos a lo largo de un gran

número de paquetes (véase también [7]):

irb1.8,libbigdecimal-ruby1.8, libdbm-ruby1.8, libdl-ruby1.8, libdrb-

ruby1.8, liberb-ruby1.8, libgdbm-ruby1.8, libiconv-ruby1.8,

libopensslruby1.8, libpty-ruby1.8, libracc-runtime-ruby1.8, libreadline-

ruby1.8, librexml-ruby1.8, libruby1.8,libruby1.8-dbg, libsdbm-ruby1.8,

libsoap-ruby1.8, libstrscanruby1.8, libsyslog-ruby1.8, libtest-unit-

ruby1.8, libwebrick-ruby1.8, libxmlrpc-ruby1.8, libyaml-ruby1.8,

libzlibruby1.8, rdoc1.,ri1.8 ruby1.8,ruby1.8-dev, ruby1.8-elisp, y por

ultimo, ruby1.8-examples.

Configuración de Apache

Si aun no lo ha hecho, necesitará habilitar el modulo rewrite de

Apache:

# a2enmod

Which module would you like to enable?

Your choices are: ... rewrite ...

Module name? rewrite

Module rewrite installed;

run /etc/init.d/apache2 force-reload to enable.

Para ejecutar aplicaciones en /var/www/myapp necesitará añadir una

entrada al host virtual en su fichero de configuración de Apache. La

entrada puede ser algo como esto:

01 01 <VirtualHost *:80>

02 ServerName rails

03 DocumentRoot /var/www/railsdemo/public

04 ErrorLog /var/www/railsdemo/log/apache.log

05 <Directory/var/www/railsdemo/public/>

06 Options ExecCGI FollowSymLinks

07 AllowOverride all

08 Order allow,deny

09 Allow from all

10 </Directory>

11 </VirtualHost>

Compruebe el archivo htaccess para la aplicación web para más ajustes;

en nuestro ejemplo, éste está en /var/www/railsdemo/public/.htaccess.

Ahora trabajando como root, recargue su configuración de Apache

como sigue,para aplicar los cambios:

/etc/init.d/apache2 force-reload

Cuadro 1: Instalación

Aplicación Java Ruby

GUI Aplicación Swing TK,QT,Fox

GUI Web JSP,XSLT,XMLC… Iowa,Rails

Domino de objetos permanentes y gestión de transacciones Entity EJBs,JDO,generados manual-

mente Kansas

Mecanismo RPC (Llamadas a Procedimientos remotos) Para la comunicación entre front-end y back-end DAOs

& Session EJBs,Servlets Drb

Infraestructura para comunicación asíncrona EJBs manejado por mensaje DRb/Rinda/Tupleserver

Tabla 1: Java y Ruby

Page 34: Linux Magazine - Edición en Castellano, Nº 03

web en la carpeta /var/www/railsdemo.Rails comenzará por crear una estructuraconteniendo los archivos necesarios:

rails /var/www/railsdemo

Esta orden sobreescribirá la aplicaciónRails que exista en el directorio especi-ficado, así que procedamos concuidado. Necesitamos una base dedatos MySQL para la tabla de ejemplo;véase el listado 1.

El archivo Yaml config/database.yml

define el acceso a la base de datos; elarchivo serializa los datos en un lenguajeindependiente del formato:

production:

adapter: mysql

database: rails_production

host: localhost

username: root

password:

El acceso a la base de datos de pruebaserá parecida a ésta. En la vida real, no

querrá ejecutar esto con privilegios deroot que están sin contraseña.

El guión new_controller crea un nuevocontrolador; su nombre debe aparecercon letras mayúsculas. La vista sigue elnombre del controlador:

./script/new_controller ßß Friends listdisplay new edit

Evite usar process como nombre devista, ya que Rails usa este nombre inter-namente. El proceso para crear un nuevomodelo es similar:

./script/new_model U

Person

Normalmente Rails descubre automáti-camente la tabla subyacente de la basede datos. Si fuera necesario el guiónaceptara un nombre de tabla, despuésdel nombre de modelo:

@LI./script/new_model ßß Personpeople

Para comprobar la configuración deuna aplicación Rails, los desarrolladorespueden ejecutar rake (el make de Ruby)en el directorio de la aplicación. Podránocurrir toda una serie de cuestiones enfunción de la configuración de su sistema:• Si mysql.sock no está en la

ubicación habitual, podrá edi-tar cualquier mysql.rb (en undirectorio tal comousr/lib/ruby/gems/1.8/gems/act

ive-record-0.9.5/lib/active_recor

d/vendor ) o configurar la va-riable de entornoMYSQL_UNIX_PORT.

• Los permisos para la base dedatos no están bien configura-dos.

• El guión espera que/usr/local/bin/ruby sea la ruta aRuby. Si Ruby está ubicado enotro sitio, puede crear unenlace simbólico o cambiar elnombre de ruta en el archivodel guión.

Para completar la aplicación web, ahoranecesitaremos proporcionar algo decontenido para app/views/friends/dis-

play.rhtml:

01 <html>

02 <body>

03 <h1>Amigos</h1>

04 <p>Muestra un entrada de

alguien</p>

05 <p>

06 <%= @person.name %><br />

07 <%= @person.street1 %><br />

08 <%= @person.street2 %><br />

09 <%= @person.city %><br />

10 <%= @person.state %><br />

11 <%= @person.zip %><br />

12 </p>

13 </body>

14 </html>

34 Número 03 www.linuxmagazine.com.es

RubyDESARROLLO

Figura 2:El portal de planificación para empresas Basecamp (http://www.basecamphq.com) utiliza Ruby

Rails como aplicación web de fondo.

01 CREATE DATABASE

rails_production;

02 USE rails_production;

03

04 CREATE TABLE people (

05 id int(10) unsigned NOT NULL

auto_increment,

06 name varchar(50) NOT NULL

default '',

07 street1 varchar(70) NOT NULL

default '',

08 street2 varchar(70) NOT NULL

default '',

09 city varchar(70) NOT NULL

default '',

10 state char(2) NOT NULL default

'',

11 zip varchar(10) NOT NULL

default '',

12 PRIMARY KEY (id),

13 KEY name (name)

14 ) TYPE=MyISAM

AUTO_INCREMENT=2;

15

16 INSERT INTO people VALUES (1,

'Superman',

17 '123 Somewhere', '',

'Smallville', 'KS', '123456')

Listado 1: SQL para Person

Page 35: Linux Magazine - Edición en Castellano, Nº 03

35www.linuxmagazine.com.es Número 03

DESARROLLORuby

contiene los métodos de acceso. Laorden require añade el modelo.

require 'person'

Ahora la aplicación web puede usar laclase Active Record para acceder a labase de datos. Si ahora insertamos el

siguiente código para el método display,cogerá la primera entrada de la tabla y loescribirá en la variable de la instancia@person para la vista de clase.

def display

@person = Person.find(1)

end

La definición del modelo de clase enapp/models/person.rb también es dignode examinar.

require 'active_record'

class Person < U

ActiveRecord::Base

end

La clase de base ActiveRecord::Base hacela mayoría del trabajo, ya que definemétodos simples de acceso a la base de

Esto es parecido a Erb, la variante deHTML incrustado de Ruby. La páginaHTML muestra los datos que elmodelo proporciona. El control tieneque definir y crear el objeto referen-c i a d o @ p e r s o n a q u í . E s t oo c u r r e e n el archivo app/con-

trollers/friends_controller.rb, que

<LM>:¿Por qué desarrolló Rails?

<DH>:Yo había estado programando en

PHP durante unos años mientras vigilaba

de cerca todos los proyectos de desarrollo

web basados en Java. Yo amaba PHP por su

inmediatez y estaba muy inspirado por los

infraestructura en Java. Así que no quería

rendirme rápidamente y y abandonar PHP,

pero ni uno ni otro eran lo que yo buscaba

para lidiar con las dificultades de grandes

sistemas orientados a objeto.

En el momento álgido de mi enojo con PHP

y no mucho después de mi desilusionante

encuentro con Java (trabajé en con J2EE

durante 6 ó 7 meses), leí sobre como Martin

Fowler y los Programadores Pragmáticos

trabajando sobre un lenguaje que encajaba

a la perfección con mis exigencias. Por

supuesto que ese lenguaje era Ruby, y una

vez que supere los primeros escollos, fue

amor a primera vista.

Poner todas mis inspiraciones de Java en

una infraestructura impulsada por Ruby

resultó ser un camino muy natural para mi.

Tenía que hacerlo de todos modos, con el

propósito de construir Basecamp tan

rápido como lo hice (en dos meses).

<LM>:¿Cuál es la mayor fortaleza de Rails?

<DH>:Sobre todo la inmediatez. Puedes

crear aplicaciones increíblemente rápido

sin que por ello acabes con código

enmarañado. Se construye una aplicación

rápidam, pero te sirve para toda la vida.

Totalmente enfocado a patrones probados,

tales como pruebas y desarrollo dirigidos a

dominios, junto con una división MVC que

de verdad ayuda en este caso.

<LM>:¿Cuál es la mayor debilidad de Rails?

<DH>:Puede ser difícil de convencer a los

potenciales clientes (o sus gerentes) que

ellos podrían ser productivos en un

lenguaje relativamente desconocido

cuando todos ellos han leído sobre Java y

C#.

<LM>:¿Cuál es el futuro de Rails?

<DH>:Espero publicar la versión 1.0 en el

año 2004. Pienso que el 2005 será El Año de

Ruby y espero que la publicación de Rails

ayude a conseguirlo. Pero por otra parte,

tengo unas metas bastante humildes para

el ulterior desarrollo de la infraestructura.

Rails tiene en este momento alrededor de

2.500 líneas de código. Me gustaría que no

creciera mucho más allá de eso.

<LM>: Por favor díganos 2 párrafos sobreBasecamp. Quizá debería mencionar tam-bién el modelo de negocio.

<DH>:Basecamp es una aplicación de

gestión de proyectos basado en web,

construida en torno a weblogs, hitos y lis-

tas de quehaceres (TODO en inglés). Es

una aplicación engañosamente sencilla

que ha tenido un impacto enorme en

todas las personas que gestionan proyec-

tos. Es una aplicación alojada en un

servidor externo y las empresas pagan

entre 19 y 59 dolares al mes por usarla.

Para el que sólo desea probarla, incluso

hay un plan gratuito por el tiempo de

duración de un solo proyecto.

<LM>:¿Cuál es el futuro de Basecamp?

<DH>:Estamos mejorando la aplicación

constantemente. Justamente la semana

pasada lanzamos un montón de nuevas

características para gestionar mejor las

responsabilidades de un proyecto. Además,

pienso que acabamos de hacernos con un

porcentaje minúsculo de un mercado

enorme. La gestión de proyecto está por

todas partes. Además de las obvias aplica-

ciones en los negocios, estamos viendo que

la gente usa Basecamp para planificar

cualquier cosa, desde bricolaje casero hasta

bodas. Basecamp se ajusta muy bien a un

amplio rango de proyectos debido a su sen-

cillez. Gestionar un proyecto no es un

proyecto en sí mismo.

<LM>:¿Hacia donde piensa que va la pro-gramación basada en web?

<DM>:Espero que no hacia la intensa com-

plejidad que J2EE, .NET y otros entornos

torpes que de alguna manera han conven-

cido a la gente que los necesitan. Los

lenguajes dinámicos como Ruby y las

estructuras de trabajo construidas con él,

como Rails, los van a barrer de la escena en

los próximos años. Clientes y desarrolla-

dores comenzarán a darse cuenta de que la

mayoría de los aplicaciones web no necesi-

tan la potencia de fuego de un destructor

Imperial, sino más bien la flexibilidad de un

Caza rebelde (Sííí, acabo de ver Star Wars en

DVD).

Cuadro 2: Una entrevista con el desarrollador de Rails, David Heinemeier Hansson

01 01 USE rails_production;

02 CREATE TABLE phones (

03 id int(10) unsigned NOT NULL

auto_increment,

04 person_id int(10) unsigned NOT

NULL default '0',

05 phone varchar(15) NOT NULL

default '',

06 PRIMARY KEY (id),

07 KEY people_id (person_id),

08 KEY phone (phone)

09 ) TYPE=MyISAM

AUTO_INCREMENT=3;

10

11 INSERT INTO phones VALUES (1,

1, '1234567890');

12 INSERT INTO phones VALUES (2,

1, '1122334455');

Listado 2: SQL para Números de teléfonos

Page 36: Linux Magazine - Edición en Castellano, Nº 03

datos. El nombre de la tabla es el pluraldel nombre de la clase. Curiosamente, laforma plural es gramaticalmente correctapara los nombres irregulares, por ejem-plo, men para man o people para person.Véase la documentación de la clase paramás detalles sobre las reglas sobre losnombres y las convenciones [8].

El resultado de este trabajo ahora esvisible bajo http://localhost/rails/friends/

display. Esta URL apunta al controlador(friends) y a la acción (display).

Tablas AsociadasRails también tiene una solución para laasociación de tablas. Usaremos dostablas con números de teléfono (véase ellistado 2).

Rails utiliza un sufijo (_id) para identi-ficar claves externas, por ejemploperson_id. Como se menciono anterior-mente el nombre de la tabla es la formaplural del nombre del modelo:

./script/new_model Phone

El archivo generado anteriormente, per-

son.rb necesita dos modificaciones:

require 'active_record'

require 'phone'

class Person < U

ActiveRecord::Base

has_many :phones

end

La llamadahas_many :phones

especifica un vinculo1:n. En otras pala-bras, una personapuede tener más deun número de telé-fono. Necesitaremosañadir las siguienteslíneas a display.html

para cambiar el for-mato devisualización.

<% for phone in U

@person.phones %>

<%= phone.phone

%><br/>

<% end %>

Si un modelo yaexiste, en Rails es

bastante fácil usar técnicas de estruc-turación para definir visualizaciones ymétodos de manipulación para los datos.Los desarrolladores Web pueden ajustarlos métodos básicos tanto como lo nece-siten.

Estructuración AutomáticaEl siguiente ejemplo supone un directo-rio de aplicación Rails vacío. Primerocrearemos un controlador y un modelo(./script/new _controller Friend y./script_new _model Person, véase másarriba). Nos aseguraremos de que notenemos una acción llamada list. Railsutilizará la base de datos existente. Sim-plemente necesitamos modificar elcontrolador friends:

scaffold :person

Este añadido crea nuevos métodos con laconducta predefinida, como se especificaen la documentación en [9]: list, show,destroy, new, create, edit y update.

Esto facilita la estructuración con Per-

son, pero aún necesitamos los númerosde teléfono. Si se establecen los indi-cadores correctos, Rails añade unareferencia a la acción al nombre delmodelo para evitar colisiones de nom-bres con las acciones de nombresdefinidas:

scaffold :person, :suffixU

=> true

scaffold :phone, :suffixU

=> true

Esto nos da las siguientes URLs:http://rails/friends/list_person http://

rails/friends/list_phone

Como puede ver, hemos creado unaestructura para una aplicación Web conun esfuerzo mínimo. La aplicación alma-cenará y manipulará objetos en una basede datos relacional. Ruby implementa elmodelo MVC elegantemente e inclusogenera el código básico asociado con laestructura de MVC.

LogoutRails facilita el desarrollo de aplicacionesbásicas si se siguen las reglas. El sistemaproporciona una introducción suma-mente útil a la programación deaplicaciones web. Si necesita más ayudapara empezar con Ruby, revise el Manualde Ruby. �

36 Número 03 www.linuxmagazine.com.es

RubyDESARROLLO

[1] Ruby on Rails:http://www.rubyonrails.org

[2] Basecamp:http://www.basecamphq.com

[3] Apache Struts:http://struts.apache.org

[4] Struts Action Invocation Framework

(SAIF):http://struts.sourceforge.net/saif/

[5] Videos del tutorial:http://www.

rubyonrails.org/show/HomePage

[6] Rubygems:http://rubygems.rubyforge.

org/wiki/wiki.pl

[7] Rails para Debian:http://www.

rubyonrails.org/show/RailsOnDebian

[8] Rules para nombres plurales:http://api.

rubyonrails.org/classes/ActiveRecord/Base.

html

[9] Metodos de estructuración:http://api.

rubyonrails.org/classes/ActionController/

Scaffolding/ ClassMethods.html

[10]El weblog del autor de Rails:http://loudthinking.com

RECURSOS

Figura 1: Esquema Model View Controller (MVC). El flujo de datos no es

idéntico para todas las aplicaciones y podría diferir del flujo de datos

mostrado aquí.

Armin Röhrl y Stefan Schmiedl dirigen

una compañía llamada Agile Soft-

wareschmiede Approximity GmbH. Usan

Ruby desde hace cinco años y todavía se

divierten trabajando con Ruby y otras

soluciones de desarrollo y administración

de proyectos hiperproductivos. Para los

autores es más importante la productivi-

dad que estar a la última.

LOSAUTORES

Page 37: Linux Magazine - Edición en Castellano, Nº 03

37www.linuxmagazine.com.es Número 03

DESARROLLOCurses

¿Qué hacer? Acudir a la sección deinterfaces del tío Paul, porsupuesto. De hecho, para empezar

a comprender como funcionan losmenús, ni siquiera vamos a verlos conuna envoltura C++, sino que vamos aestudiar unos sencillos programas en Cpelado y mondado para evitar líos y con-fusiones.

Con tal motivo presento la pruebaA: el listado 1, que contiene un pro-grama, y sin que sirva de precedente,completo, compilable (se puede uti-lizar g++ o gcc, monta tanto, tantomonta) y ejecutable que presentará enpantalla nuestro primer menú (verFigura 1)… Sí, ya sé que no es muy

impresionante, pero paciencia. Anali-cemos lo que hace el código ypodremos mejorarlo.

Primer menúLo primero es declarar una matriz decadenas (options) que contiene lasopciones que vamos a mostrar en nuestromenú. Atención, que si bien se mostraráncuatro elementos en el menú, hay quedefinir 5 porque curses exige que el menútermine en una cadena nula, que es exac-tamente lo que es el elemento (char*)

NULL al final de la matriz.A continuación, nos metemos directa-

mente en la función main del programay inicializamos la ventana estándar de

curses (esto a estas alturas no deberíaentrañar ningún misterio).

De la línea 18 a la 21, declaramosvariables que nos servirán en la creacióndel menú. Tenemos, por un lado, unpuntero a una variable MENU, que es laque apunta al menú propiamente dicho.A continuación tenemos un puntero a lascadenas options, un entero i que serviráde iterador en un bucle y, finalmente,una matriz de punteros ITEM (barra)cada elemento del cual contendrá lasopciones disponibles en el menú.

El siguiente paso consiste en asignarespacio de memoria a barra. Esto lohacemos con la función C calloc() y leasignamos tanto espacio como elemen-

Menús con Curses

Menú del DíaEl tema de los menús con curses es com-

plejo. La información que se

puede consultar por ahí, es

contradictoria. Una fun-

ción puede aparecer

como menu_post(),

display_menu()

o, incluso,

menu_dis-

play() en

según que

versión del

manual mires, cuando

en realidad se llama

post_menu(). Los ejemplos que se

encuentran por Internet no están documentados y

muchos de ellos no compilan.POR PAUL C. BROWN

Page 38: Linux Magazine - Edición en Castellano, Nº 03

tos del menú disponemos (en este caso,5). A continuación, en la línea 26, tene-mos un bucle que asigna los elementosdel menú a barra y, después, creamos elmenú propiamente dicho pasando barra

como parámetro a la funciónnew_menu() de curses.

Y, por fin, podremos ver nuestromenú. Lo mandamos a la ventana conpost_menu(). Como no se especificaninguna otra ventana, el menú apare-cerá en la ventana estándar pordefecto, stdscr. Para que se puedavisualizar el menú, habremos derefrescar la pantalla, cosa que hacemoscon refresh().

El resto del listado debería ser obvio:se espera un entrada del teclado, si elusuario pulsa la tecla [Inicio], el bucletermina, se retira el menú, se liberan loselementos, se cierra curses y se acaba elprograma. ¿Alguien está viendo manerasde envolver todas estas feas tareasdomésticas en una hermética claseC++? Por que yo sí.

El ejemplo anterior es un poco aburri-dillo ¿verdad? Pero si de verdad queréisprobarlo, para compilar el listado 1, bas-tará con ejecutar…

gcc -o menu menu.c -lcursesU

-lmenu

… en el directorio donde tengamos elcódigo fuente. O, si preferís…

g++ -o menu menu.c -lcursesU

-lmenu

… que lo compilará igual.El aspecto de nuestro menú no es

exactamente como lo queremos. Esto esporque no hemos definido la geometría

del menú y la librería menu aplica lageometría por defecto, que, según ladocumentación, consiste en un menú deuna columna y dieciséis filas. Además,no podemos desplazarnos por lasopciones, lo cual hace que nuestro menúsea incluso menos interesante.

Vamos a ver como se solucionan losdos problemas anteriores y despuéspasaremos a abstraer el código a unaclase.

Un poco de MovimientoEn el listado 2 podemos ver una versiónmejorada del programa, o al menos laparte que nos atañe. Observemos, porejemplo, que hemos insertado unanueva función, set_menu_format(), a lacual, pasándole el puntero del menú elcual queremos modificar y las filas ylas columnas, modifica el formato pordefecto. Como nosotros queremos teneruna barra de menús, utilizamos unasola fila y varias columnas, tantas

38 Número 03 www.linuxmagazine.com.es

CursesDESARROLLO

01 #include <stdlib.h>

02 #include <menu.h>

03

04 char* opciones[5] =

05 {

06 "Fichero", "Editar",

"Ventana", "Ayuda",(char*)

NULL

07 };

08

09 int main(int argc, char

*argv[])

10 {

11 (void) initscr();

12 keypad(stdscr, TRUE);

13 (void) nonl();

14 (void) cbreak();

15 (void) noecho();

16 wclear(stdscr);

17

18 MENU * menu_principal;

19 char ** o=opciones;

20 int i;

21 ITEM ** barra;

22

23

barra=(ITEM**)calloc(5,sizeof(

ITEM*));

24

25 for(i=0;i<5;i++)

26

barra[i]=new_item(opciones[i],

"");

27

28

menu_principal=new_menu((ITEM*

*)barra);

29 post_menu(menu_principal);

30 refresh();

31

32 int ch;

33

34 while

((ch=getch())!=KEY_HOME)

35 {

36 /* procesar entrada del

teclado */

37 }

38

39 unpost_menu(menu_principal);

40 refresh();

41 free_menu(menu_principal);

42

43 while(*barra)

44 free_item(*barra++);

45

46 endwin();

47 exit(0);

48 }

Listado 1: menu.c - nuestro primer menú01 .

02 .

03 .

04

menu_principal=new_menu((ITEM*

*)barra);

05

set_menu_format(menu_principal

,1,5);

06 post_menu(menu_principal);

07 refresh();

08

09 int ch;

10

11 while ((ch=getch())!=KEY_HOME)

12 {

13 switch(ch)

14 {

15 case KEY_RIGHT:

16

menu_driver(menu_principal,

REQ_RIGHT_ITEM);

17 break;

18 case KEY_LEFT:

19

menu_driver(menu_principal,

REQ_LEFT_ITEM);

20 break;

21 default:

22

menu_driver(menu_principal,

ch);

23 break;

24 }

25 }

26 .

27 .

28 .

Listado 2: Menú mejorado.

Page 39: Linux Magazine - Edición en Castellano, Nº 03

39www.linuxmagazine.com.es Número 03

DESARROLLOCurses

como elementos del menú, para el for-mato.

Lo siguiente es conseguir mover elenfoque de elemento a elemento. Esto loconseguimos dentro del bucle principal,consultando a la variable ch. Si ch con-tiene el seudo-carácter KEY_RIGHT

(correspondiente a la tecla de flecha decursor derecha), llamaremos a la funciónmenu_driver() de la librería menu. Lafunción menu_driver() es el motor tras lainteracción del usuario con el menú unavez creado este. Acepta como entrada elpuntero al menú al cual afectarán los

cambios y un carácter o seudo-carácterque dicta el comportamiento del enfoquedel menú.

En el ejemplo que nos ocupa, al pul-sar el usuario en las flechas izquierda yderecha, el enfoque se desplaza hacia elelemento de la izquierda o derecha,respectivamente. La tercera opción, per-mite que menu_driver() busque unacoincidencia en la lista de opciones enel caso de que ch sea un carácterimprimible.

Por ejemplo, si tenemos el enfoque enel primer elemento del menú (“Fichero”

- ver figura 2) y pulsamos la letra “v”,menu_driver() desplazará el enfoque a laopción “Ventana” (ver figura 3) yempezará a examinar la segunda letra detodas las opciones que empiecen por “v”a la espera de otro carácter imprimibleque le puede permitir depurar la selec-ción. Aquí, en este caso, es unafuncionalidad un poco tonta, pero podéisimaginar su utilidad si tenemos unalarga lista de nombres sacada, por ejem-plo, de una base de datos y podemos irtecleando las letras del apellido buscadoy menu_driver() nos iría acercando alregistro buscado.

Ha llegado el momento de crear laclase menú.

Un Menú con ClaseAhora es cuando empieza lo interesantey quitamos de en medio todos esas feasfunciones. El listado 3 muestra un frag-mento de la implementación de la claseapplication (ver los dos capítulos anteri-ores de esta serie, aparecidas en LinuxMagazine 1 y Linux Magazine 2 - el

Figura 2: Eso está mejor: una barra de menús, y además…

Figura 3: ¡Podemos desplazarnos por ella!

01 .

02 .

03 .

04 void application::mainMenu()

05 {

06 window

main_Menu(COLS-2,3,1,1,TRUE,""

);

07 vector<string> mitems;

08

09 mitems.push_back("Fichero");

10 mitems.push_back("Editar");

11

mitems.push_back("Ventanas");

12 mitems.push_back("Ayuda");

13

14 menuClass

main_App_Menu(mitems,main_Menu

.getWHandle(),1,10);

15

app_Window.wWrite(2,10,main_Ap

p_Menu.hideMenu());

16

17 main_Menu.closeWindow();

18 }

19 .

20 .

21 .

Listado 3: application.cpp(fragmento)

Page 40: Linux Magazine - Edición en Castellano, Nº 03

código completo se puede descargar de[1]) que muestra el método que activa elmenú principal de la aplicación. Norequiere mucha explicación. Creamosuna ventana donde alojar el menú (estoes práctica habitual en curses) y a con-tinuación utilizamos un vector decadenas para almacenar las etiquetas decada opción. Después creamos un objetomenuClass al cual pasamos el vector, elhandle de la ventana y la posición delmenú dentro de esa ventana. He optadopor la fila 1 y columna 10 para no “pisar”el borde del cual he dotado la ventana

con el fin de que quede el área del menúclaramente delimitado (ver figura 4).

La inicialización de la clase implica lacreación y visualización del menú, a lavez que se traslada el enfoque a él. Elenfoque permanece con el objeto hastaque el usuario pulsa [Enter] habiendorealizado su selección (todo esto lovemos un poco más abajo).

Una vez que el menú libera el enfoque,recogemos la salida del método hide-

Menu(), que es la opción escogidacuando el usuario pulsó [Enter] y loimprimimos en pantalla para demostrar

que es correcto. Obviamente, en un casoreal, la clase application tendría quehacer algo más productivo con esta sali-da, como guardar el fichero en edición,abrir una ventana de ayuda, etc.

Por fin, cerramos la ventana del menúpara que desaparezca del entorno.

Cómo habréis imaginado, la clasemenuClass es el meollo de la cuestión. Ellistado 4 muestra su implementación.Esta clase es virtualmente hermética, esdecir casi ninguno de sus métodos nininguno de sus atributos son accesiblesdesde fuera de la clase. Ella se la guisa y

40 Número 03 www.linuxmagazine.com.es

CursesDESARROLLO

01 #include <menuclass.h>

02

03

menuClass::menuClass(vector<st

ring> items, WINDOW*

window=stdscr,int rows=16, int

columns=1)

04 {

05 item_List=items;

06 createItemList();

07 menu_Window=window;

08

menu_Thing=new_menu((ITEM**)me

nu_Items);

09

set_menu_format(menu_Thing,row

s,columns);

10

set_menu_win(menu_Thing,menu_W

indow);

11

set_menu_sub(menu_Thing,derwin

(menu_Window,1,COLS-4,1,2));

12 showMenu();

13 moveFocus();

14 }

15

16 menuClass::~menuClass()

17 {

18 }

19

20 string menuClass::hideMenu()

21 {

22 string

option=getSelectedItem();

23

24 unpost_menu(menu_Thing);

25 refresh();

26 free_menu(menu_Thing);

27 while (*menu_Items)

28 free_item(*menu_Items++);

29 return option;

30 }

31

32 void

menuClass::createItemList()

33 {

34 unsigned int i;

35

menu_Items=(ITEM**)calloc(item

_List.size(),sizeof(ITEM*));

36

37 for

(i=0;i<item_List.size();i++)

38

menu_Items[i]=new_item(item_Li

st.at(i).c_str(),"");

39

menu_Items[i]=new_item(NULL,""

);

40 }

41

42 void

menuClass::setMenuWindow(WINDO

W* window=stdscr)

43 {

44 menu_Window=window;

45 setMenuWindow(menu_Window);

46 }

47

48 void menuClass::showMenu()

49 {

50 post_menu(menu_Thing);

51 wrefresh(menu_Window);

52 }

53

54 void menuClass::moveFocus()

55 {

56 int ch;

57 while((ch=getch())!=13)

58 {

59 switch (ch)

60 {

61 case KEY_RIGHT:

62

menu_driver(menu_Thing,REQ_RIG

HT_ITEM);

63 break;

64 case KEY_LEFT:

65

menu_driver(menu_Thing,REQ_LEF

T_ITEM);

66 break;

67 case KEY_UP:

68

menu_driver(menu_Thing,REQ_UP_

ITEM);

69 break;

70 case KEY_DOWN:

71

menu_driver(menu_Thing,REQ_DOW

N_ITEM);

72 break;

73 default:

74

menu_driver(menu_Thing,ch);

75 break;

76 }

77 wrefresh(menu_Window);

78 }

79 }

80

81 string

menuClass::getSelectedItem()

82 {

83

selected_Item=item_name(curren

t_item(menu_Thing));

84 return(selected_Item);

85 }

Listado 4: Implementación de la clase menuClass

Page 41: Linux Magazine - Edición en Castellano, Nº 03

41www.linuxmagazine.com.es Número 03

DESARROLLOCurses

ella se la come. La excepción son el con-structor (a partir de la cual se llamantodos los otros métodos), el destructor(que está vacío), el método hideMenu()

(que se llama para cerrar el menú yrecoger el valor seleccionado) y getSe-lectedItem(), que devuelve la etiqueta dela opción actual escogida (ya que es útilpoder acceder a esta información encualquier momento).

El constructor menuClass() (de la línea3 a la 14) es la encargada de llamar atodos los otros métodos (a excepción dehideMenu()) en su debido orden. Primeroinicializa un vector string llamadoitem_List que, como su nombre indica,contendrá la lista de elementos quemostrará el menú. Seguidamente, lla-mamos al método createItemList() quehace exactamente eso: crear la lista deelementos en un formato que podrá inser-tarse en el menú. Si se ha seguido esteartículo hasta el momento, el métodocreateItemList() (de la línea 34 a la 42) noentrañará ningún misterio: Primero reser-vamos memoria para la lista (línea 37) y acontinuación volcamos las etiquetas en elespacio reservado (líneas 39 y 40), para,finalmente, marcar el final de la lista conun elemento nulo.

De vuelta al constructor, el siguientepaso consiste en inicializar el menúpropiamente dicho (línea 8), establecersu formato, la ventana y la subventanadonde se va a mostrar y exhibirlo. Elencargado de esto último es el método

showMenu() (ver de la línea 51 a la 55)que simplemente utiliza la funciónpost_menu() de la librería menu yrefresca la ventana con wrefresh().

El constructor, por último, llama almétodo moveFocus() que se puede veren el listado de la línea 57 a la 82. Estemétodo se limita a escuchar las entradasdel teclado y mueve el enfoque de unelemento a otro según convenga. Paraque se puedan apreciar los cambios,después de que el enfoque haya cambia-do, hay que refrescar la ventana (verlínea 80). Si el usuario pulsa [Enter](clave ASCII 13), el bucle termina.

Por último, hideMenu() recoge laúltima opción escogida y lo coloca en lavariable de cadena option, esconde elmenú y libera el espacio reservado por lalista de elementos. La variable option sedevuelve a la función que llamó almétodo para ser procesada.

Todos Juntos En el listado 5 podemosver una función main que hace uso de laclase explicada a través de la clase appli-

cation. Como se puede comprobar, no esnada complejo explotar esta clase. Paramostrar el menú, pulsaremos en F2 ypara mostrar una ventana de diálogocomo el que vimos el mes pasado, pul-samos en F1.

ConclusiónEn este artículo no hemos hecho másque rayar la superficie de las funcionali-

dades de la librería menu de curses. Exis-ten muchas otras cosas que se puedenhacer. Entre ellas, la posibilidad de aso-ciar una función con cada elemento demenú que se ejecute cuando se selec-ciona una opción.

En todo caso, si tanto escribir te dapereza, existe por ahí toda una serie declases (como, por ejemplo, las que sesuelen instalar en /usr/share/doc/libn-

curses5-devel-5.3/c++/ con el paqueteestándar de curses) con sus ejemplos queimplementan más funcionalidades, tantode menús, como formularios y otrosaspectos de curses. Pero, estate adver-tido, están mal documentadas y sonbastante más complejas que los mías. �

01 #include "application.h"

02

03 int main()

04 {

05 int ch, cDialogos=1;

06 application my_App(TRUE,"Mi

Aplicación número %i",1);

07

08

while((ch=my_App.wGetch())!=KE

Y_HOME)

09 {

10 switch (ch)

11 {

12 case KEY_F(1):

13

my_App.dialWin(50,10,"Esto se

supone un Diálogo.","Diálogo

%i",cDialogos++);

14 break;

15 case KEY_F(2):

16 my_App.mainMenu();

17 break;

18 }

19

20 }

21 my_App.~application();

22 exit(0);

23 }

Listado 5: El ficheroprincipal.cpp

[1] Listados completos en formato tar.gz con

Makefile para facilitar la compilación

http://www.linuxmagazine.com.es/

Magazine/Downloads/03

RECURSOS

Figura 4:Un menú delimitado en nuestra aplicación.

Page 42: Linux Magazine - Edición en Castellano, Nº 03

www.linuxmagazine.com.es

PerlDESARROLLO

/tmp/agent.log. La línea 33 de este guióncrea un nuevo objeto Net::Jabber::Client

que implementa el cliente de mensajeríainstantánea que actuará como agente.

Antes agent.pl entra en el bucle principalde eventos en la línea 83, se necesita definirunas cuantas retro-llamadas para varioseventos en la línea 35ff. El manejadoronauth en la línea 68 se llamará después deque el cliente haya ingresado en el servidorusando las credenciales especificadas en lalínea 23. El manejador entonces llamará aRosterGet() para que vaya a buscar la listade conocidos y la almacene en una variableglobal %ROSTER.

El método siguiente, Presence(),envíaun mensaje presence a todos los clientesen la lista para decirles que agent.pl estáen línea. A partir de este punto, uncliente gaim que haya ingresado como elusuario mikes-agent-sender mostrará amikes-agent-receiver como cliente activoen su propia lista de conocidos (Véase laFigura 2).

La retro-llamada message en la línea37 se invocará cuando alguien envíe unmensaje a agents.pl. Cualquier cliente enla red Jabber puede hacer esto y es poreso que la línea 45 comprueba si elemisor es un amigo. En este casomikes-agent-sender es el único al que sele permite enviar un mensaje, ya que esla única entrada en la lista de conocidosdel cliente (Véase la sección “Insta-lación”). La función simplementedescarta todas las demás peticiones,almacena un mensaje de información enarchivo de “log” y vuelve al bucle princi-pal en la línea 50.

El método getBody() en la línea 57 delguión extrae la orden de control enviada

con el mensaje de texto y la pasa a lafunción run_cmd definida en la la línea93.

En la línea 83, Execute() conecta conel servidor de Jabber en jabber.org eingresa como mikes-agent-receiver. Si sepierde temporalmente la conexión elbucle principal, que se ejecutaindefinidamente, la rescatará. Si tambiénse detiene porque se han producidomuchos errores, la línea 90 los eliminaráy parará el programa.

Para estar seguro de que el agenteempiece a funcionar cuando se inicialiceel sistema, se añade lo siguiente:

Control remoto con un bot Jabber

Contacto InteriorPara acceder a una LAN traspasando un cortafuegos, se necesita una puerta

trasera secreta o un agente colaborador dentro.Un cliente Jabber dentro de la

LAN conecta con un servidor Jabber público y esperará que aparezcan instruc-

ciones en forma de mensajes instantáneos enviados por su conocido de

Internet. POR MICHAEL SCHILLI

Por supuesto, que una manera derealizar tareas, desde Internet, enuna red local es abrir un agujero a

través del cortafuegos y conectar con unservidor web local. Servicios comohttp://www.dyn-dns.org/ (entre otros)permiten un acceso casi estático a travésde la dirección IP dinámica que asigna elproveedor de Internet.

Un agente o “bot” (palabra derivadade “robot”) hace la vida más fácil: Uncliente de mensajería detrás del cortafue-gos puede conectar con una red públicade mensajería Jabber y aceptar ordenesen formato de mensajes de texto. Elcliente descrito en este artículo soloaceptará ordenes desde clientes de sulista de conocidos y solo permitirá cuatroacciones: cargar la comprobación para elordenador bot, consultar la direcciónpública del enrutador (orden: ip) yencender y apagar las luces de miapartamento en San Francisco (lamp

on|lamp off).El guión agent.pl (Véase el Listado

1)necesita Log::Log4perl y transaccionesde “log” en un archivo

llamado Figura 1: El “bot”detrás del cortafuegos, ejecuta

las ordenes que se le envían mediante un cliente

Jabber basado en Internet.

Figura 2: El

“bot”aparece

ahora en la

lista de cono-

cidos del

emisor.

Número 0342

Page 43: Linux Magazine - Edición en Castellano, Nº 03

43www.linuxmagazine.com.es Número 03

DESARROLLOPerl

x:3:respawn:su U

username -cU

/usr/bin/agent

a /etc/inittab. Este código también secerciora de que el agente consiga reini-ciarse inmediatamente si deja defuncionar por cualquier razón.

Arriba y AbajoEl agente descubre la direcciónexterna del enrutador enviando unasolicitud web a la URL pública http://

perlmeister.com/cgi/whatsmyip. Elobjetivo es un simple guión quedevuelve la dirección del clientesolicitante:

print U

"Content-Type: text/html\n\n";

print $ENV{REMOTE_ADDR}, "\n";

Para hacer esto agent.pl usaLWP::Simple; si el mensaje detexto que el cliente Jabber recibees IP, la función get de la línea99 toma el contenido de lapágina web.

Determinar la carga actualdel sistema sigue un patrónsimilar: La línea 17 llama auptimes y el resultado pasa devuelta a la línea 55. La si-guiente llamada a chomp

elimina el contenido sobrante yla línea 62 amontona el resul-tado en el cuerpo del mensaje;

el método send envía este resultadohacia el compañero solicitante.

¿Pero como hace un agente que estáfuncionando en un ordenador Linux,para encender la luz del dormitorio?

La Figura 3 muestra la configuración.En EE.UU. se utiliza mucho una tec-nología conocida como X10 paratransmitir señales a través del cableadode la instalación eléctrica de los hoga-res (por supuesto que los equiposamericanos solo funcionan con elvoltaje de ese país, aunque en Europatambién se venden productos que uti-lizan esta tecnología adaptados a losvalores europeos [5]). Estos equipos secomunican con el ordenador a travésde interfaces serie o USB. Haydisponible una amplia gama de disposi-tivos X10 para diversas tareas deautomatización domestica. Además de

simples interruptores, se puedenencontrar sistemas con capacidadesX10 en cámaras de vigilancia, sensoresde movimiento, sistemas de alarma,reproductores mp3, televisiones ydetectores de metales.

Cada unidad de control X10 (Figura 4)tiene un código de casa (A-P) y uncódigo de unidad (1-16) que la unidadde control (por ejemplo la de la Figura5) ha de seleccionar para encender lalampara correcta (en vez de la delvecino). X10 no es caro (en EE.UU.): Unkit básico con cuatro componentes contoda clase de extras y un control remotocuesta en algunos sitios entre 50$ y100$ en [3].

El listado lamp.pl muestra un guióncorto que envía los códigos a través delpuerto serie al controlador de la lam-para. El guión solo usaDevice::ParallelPort y ControlX10::CM11

de CPAN, para direccionar la unidadusando el código de casa/unidad en lalínea 38. El subsiguiente send() con elcódigo y una “J” (para encender) o una“K” (para apagar) activa el dispositivoindicado. El puerto serie usado en esteejemplo en la línea 34 es /dev/ttyS0,donde la pequeña caja blanca que se veen la Figura 6 está conectada al primerpuerto serie del ordenador. Evidente-mente, este equipo no está a la ultima,pero eso es solo para demostrar queLinux es poco exigente con los recursos.La línea 35 configura el baudrate a 4800

Figura 4: La dispositivo X10 espera a la señal y

conecta y desconecta la lampara.

Figura 6: Encendiendo la lampara del dormitorio

vía Internet.

Figura 3:Visión general del interruptor de luz controlado por

un “bot”.

Figura 5: La unidad de control X10 con un conector

serie puede enviar señales desde el ordenador a los

dispositivos X10 a través de la instalación eléctrica.

Page 44: Linux Magazine - Edición en Castellano, Nº 03

44 Número 03 www.linuxmagazine.com.es

PerlDESARROLLO

un envoltorio C, que se puede com-pilar así de fácil:

gcc -o lamp lamp.c

Ajustando el bit de setuid vía chmod

4755 lamp de manera que un usuario‘normal’ pueda ejecutar el binario com-pilado lamp y por tanto el guión Perl/usr/bin/lamp.pl como root:

$ ls -l /usr/bin/lamp*

-rwsr-xr-x 1 root root 11548U

Oct 2 08:48 lamp

-rwxr-xr-x 1 root root 742 U

Oct 2 08:45 lamp.pl

En esta configuración, solamente root

puede modificar el guión lamp.pl, peroun usuario normal puede ejecutarlamp.pl con el ID efectivo de root.

Guardian BotY ahora volvamos al bot:

Para evitar que cualquier clienteantiguo de Jabber envíe ordenes,

para asegurar que el dispositivo X10conectado al puerto serie reciba el men-saje correctamente.

Potencia de root restringidalamp.pl accede al puerto serie delordenador y necesita ejecutarsecomo root para hacer esto. La línea29 comprueba que el user ID sea elcorrecto y detendrá la ejecución sino es 0 (root). Como el cliente Jab-ber se ejecuta con un user ID sinprivilegios, el listado lamp.c define

001 #!/usr/bin/perl

002 #############################

003 # agent -- Jabber bot

004 # Operando tras un

cortafuegos

005 # Mike Schilli, 2004

006 # ([email protected])

007 #############################

008 use warnings;

009 use strict;

010

011 use Net::Jabber qw(Client);

012 use Log::Log4perl qw(:easy);

013 use LWP::Simple;

014

015 Log::Log4perl->easy_init(

016 {

017 level => $DEBUG,

018 file =>

019 '>>/tmp/agent.log'

020 }

021 );

022

023 my $JABBER_USER =

024 'mikes-agent-receiver';

025 my $JABBER_PASSWD = "*****";

026 my $JABBER_SERVER =

027 "jabber.org";

028 my $JABBER_PORT = 5222;

029

030 our %ROSTER;

031

032 my $c =

033 Net::Jabber::Client->new();

034

035 $c->SetCallBacks(

036

037 message => sub {

038 my $msg = $_[1];

039

040 DEBUG "Mensaje '",

041 $msg->GetBody(),

042 "' from ",

043 $msg->GetFrom();

044

045 if ( !exists

046 $ROSTER{ $msg->GetFrom()

047 } ) {

048 INFO "Denegado (no está en "

049 .

050 "la lista)";

051 return;

052 }

053

054 DEBUG "Ejecutando ",

055 $msg->GetBody();

056 my $rep =

057 run_cmd(

058 $msg->GetBody() );

059 chomp $rep;

060 DEBUG "Resultado: ", $rep;

061

062 $c->Send(

063 $msg->Reply(

064 body => $rep

065 )

066 );

067 },

068

069 onauth => sub {

070 DEBUG "Auth";

071 %ROSTER =

072 $c->RosterGet();

073 $c->PresenceSend();

074 },

075

076 presence => sub {

077 # Ignorar todas las

078 # peticiones de subscripción

079 },

080 );

081

082 DEBUG "Conectando ...";

083

084 $c->Execute(

085 hostname => $JABBER_SERVER,

086 username => $JABBER_USER,

087 password => $JABBER_PASSWD,

088 resource => 'Script',

089 );

090

091 $c->Disconnect();

092

093 #############################

094 sub run_cmd {

095 #############################

096 my ($cmd) = @_;

097

098 # Encontrar IP Externo

099 if ( $cmd eq "ip" ) {

100 return LWP::Simple::get(

101 "http://perlmeister" .

102 ".com/cgi/whatsmyip"

103 );

104 }

105

106 # Imprimir Carga

107 if ( $cmd eq "load" ) {

108 return `/usr/bin/uptime`;

109 }

110

111 # Encender/Apagar luz

112 if ( $cmd =~

113 /^lamp\s+(on|off)$/ )

114 {

115 my $rc =

116 system(

117 "/usr/bin/lamp $1");

118 return $rc == 0

119 ? "ok"

120 : "not ok ($rc)";

121 }

122

123 return "Orden desconocida";

124 }

Listado 1: agent.pl

Page 45: Linux Magazine - Edición en Castellano, Nº 03

45www.linuxmagazine.com.es Número 03

DESARROLLOPerl

agent.pl solo acepta mensajes de las per-sonas de su lista de nombres. Cuandollega un mensaje, la línea 45 compruebaque el emisor está en la lista y lo recha-zará si no es así.

El manejador de petición de presenciadefinido en la línea 75 está vacío e ignoracualquier petición desde clientes quequieran añadir al agente en su propialista de conocidos. Net::Jabber::Client

trae un manejador predeterminado que

acepta mensajes presence desdecualquier cliente de la red. Esto no seríatan malo, pero sin más dificultades, pon-drá a estos clientes en su lista deconocidos. Un manejador de presence

vacío evitará que ocurra esto.

InstalaciónCuando se instale el bot, se debe confi-gurar su lista de conocidos. La mejor

manera de hacerlo es usandoun cliente gaim [4], creando 2nuevas cuentas en Jabber,mikes-agent-receiver ymikes-agent-sender y hacerque mikes-agent-receiver tengaa mikes-agent-sender en sulista de conocidos (Véase laFigura 7).

Si ambas cuentas están enlínea, en mikes-agent-sender

emergerá el cuadro de dialogo mostradoen la Figura 8 y será necesario pulsar enAuthorize para indicar al servidor quepermita que se realice la acción. Entoncesse preguntara a mikes-agent-sender siquiere poner a mikes-agent-receiver en sulista de conocidos (Figura 9); porsupuesto que sí, hacer esto tiene sentidopara permitir al remitente seleccionar elnombre en la lista de conocidos paraenviar una orden al bot.

Después de salir de la sesión, hay queasegurarse de que la cuentamikes-agent-receiver solo se utilice poragent.pl y no por otros clientes, para evi-tar que enreden en la lista de conocidos,que proporciona el mecanismo de laautorización.

Cuando se lance agent.pl,mikes-agent-receiver debe aparecer en lalista de conocidos de mikes-agent-sender

(Véase la Figura 2). El archivo de bitá-cora /tmp/agent.log, anotará lo sucedidoen el caso de que sea necesario depurarla configuración.

Hay que ser cuidadoso cuando seaplican modificaciones, un pequeñoerror en la implementación puede abrirun agujero en el cortafuegos ¡Hay quevigilarlo!

Desde luego que si se vive en unazona donde la infraestructura eléctricano da soporte a X10, se necesitará encon-trar otra manera de comunicar con elinterruptor de la lampara. Pero, apartede este proyecto, estas técnicas ayudarána comenzar con la construcción de unagente de mensajería instantánea. �

Michael Schilli trabaja como desarro-llador de software en Yahoo!, Sunnyvale,California. Es el autor de “Perl Power”dela editorial Addison-Wesley y se le puedecontactar en [email protected] página está en http://perlmeister.com.

ELAUTOR

01 #!/usr/bin/perl

02 #############################

03 # lamp -- x10 light switch

04 # Mike Schilli, 2004

05 # ([email protected])

06 #############################

07

08 use warnings;

09 use strict;

10

11 use Device::SerialPort;

12 use ControlX10::CM11;

13

14 my $UNIT_CODE = "F";

15 my $HOUSE_CODE = "1";

16

17 my %cmds = (

18 "on" => "J",

19 "off" => "K",

20 );

21

22 die "utilización: $0 [on|off]"

23 if @ARGV != 1

24 or $ARGV[0] !~

25 /^(on|off)$/;

26

27 my $onoff = $1;

28

29 die "Debe ser root"

30 if $> != 0;

31

32 my $serial =

33 Device::SerialPort->new(

34 '/dev/ttyS0', undef );

35 $serial->baudrate(4800);

36

37 # Unidad de Dirección

38 ControlX10::CM11::send(

39 $serial,

40 $UNIT_CODE . $HOUSE_CODE );

41

42 # Enviar Instrucción

43 ControlX10::CM11::send(

44 $serial,

45 $UNIT_CODE . $cmds{$onoff}

46 );

Listado 2: lamp.pl

01 main(int argc, char **argv) {

02 execv("/usr/bin/lamp.pl",

03 argv);

04 }

Listado 3: lamp.c

[1] Listados de este artículo:http://www.

linuxmagazine.com.es/Magazine/

Downloads/03

[2] “Jabber Developer’s Handbook”de Dana

Moore y William Wright,Colección Devel-

oper’s Library,de la editorial Sam’s

Publishing,2004.

[3] Dispositivos X10 de:http://x10.com

[4] Gaim,el cliente de mensajería instan-

tánea universal:http://gaim.sourceforge.

net

[5] Dispositivos Domóticos:http://www.

domotica.net/

RECURSOS

Figura 7:Usando el cliente gaimpara añadir el

agente de ordenes a la lista de emisores aceptados.

Figura 9: Añadiendo

el “bot”a la lista de

conocidos del

emisor.

Figura 8: Añadiendo

el emisor a la lista

de conocidos del

“bot”.

Page 46: Linux Magazine - Edición en Castellano, Nº 03

46 Número 03 www.linuxmagazine.com.es

PHPADMINISTRACIÓN

La mayoría de los administradores suelen usar la shell, Perl o

Python si necesitan programar un script de administración. Pero

para los programadores de la web no es necesario aprender

otros lenguajes para escribir una tarea de rutina. PHP propor-

ciona a los administradores la potencia para programar

herramientas de línea de comandos e incluso interfaces web

completos.POR CARSEN MÖHRKE

Uso de PHP en scripts de administración

Operación Comando

Los scripts escritos en PHP para laconsola tienen básicamente lamisma forma que scripts escritos

para la web: los programadores puedenusar todo el rango de características dePHP. Para permitir de forma sencilla, quelos programas se ejecuten en la línea decomandos, se necesita especificar elintérprete de PHP en la primera línea delfichero de scripts de la siguiente forma#!. Si no se conoce el path al intérprete,tecleando which php se averiguará.También, los ficheros de scripts necesi-tan tener activado el permiso de ejecu-ción. Echémosle un vistazo al típicoejemplo “Hello, World” en PHP:

#!/usr/bin/php -q

<?php

echo "Hello, World\n";

?>

Las herramientas de PHP es lo que se nece-sita para cualquier clase de manipulaciónde texto, como modificación de ficheros de

configuración, ficheros de registro,entradas de gestión de usuarios y cosasasí. Si se necesita acceder a las funcionesde sistema operativo, para tareas comoadministración de procesos, se necesitaráañadir algunos comandos Linux.

Línea de ComandosPHP tiene cuatro funciones diseñadaspara la ejecución de comandos del sis-tema: exec(), system(), passthru() yshell_exec():

*exec() ejecuta el comando que se lepasa como primer argumento y eliminacualquier salida del comando. La últimalínea del comando se devuelve comoresultado. Si el segundo parámetro es elnombre de un array, exec() rellena el arraylínea a línea con la salida que deberíaaparecer en la pantalla. Si se necesitaprocesar el código de salida del comandoexec() se puede usar un tercer parámetro.

*system() no suprime la salida al con-trario que exec(). Tiene un segundoparámetro opcional para el código de salida.

*passthru() funciona como system(),pero en modo binario compatible. Estopermite al comando pasar imágenes ge-neradas como salida convertidas para unnavegador web.

*shell_exec() funciona como una ver-sión simple de parámetros de exec(),pero en vez de extraer la última línea,devuelve una cadena con la salida com-pleta del comando. La cadena contienecaracteres de nueva línea en contraposi-ción a las entradas que devolvía elcomando exec() en el array de valores.

Tanto exec() como shell_exec() sonútiles en casos donde se necesite mani-pular el texto de salida de un comandoexterno. Los ejemplos que vienen a con-tinuación hacen uso de la función exec(),que es mucho más flexible que las otrasfunciones. Nos encontramos con unpequeño fallo técnico relacionado conesto en la actualidad: PHP no siempredevuelve el código de salida correcto delcomando externo (por ejemplo cuandoconcatenamos comandos).

Control de ProcesosEl siguiente script PHP usa exec() paramostrar el número de procesos que seejecutan en el sistema:

unset ($out);

$cmd="ps axu | wc -l";

$erg=exec($cmd,$out);

$erg-=1; //minus 1 line header

echo "Number of active U

processes is $erg\n";

Las versiones de PHP 4.3.0 o posteriores tienen un nuevo interfaz para la shell para programar

herramientas desde la línea de comandos: el CLI(Command Line Interface). Las versiones previas

de PHP (incluso algunas nuevas) tienen un interfaz de programación llamado Server Application

Programmers Interface (SAPI), pero SAPI fue diseñado para usarse en servidores web (CGI-SAPI) y

añade una cabecera HTTP a la salida. (Se puede suprimir la cabecera colocando la opción -q cuan-

do se lanza el intérprete de PHP, pero esto no eliminará las etiquetas HTML de los mensajes de

error).Se puede comprobar si se tiene la versión CGI,que no tiene el mismo alcance de característi-

cas que tiene la interfaz de línea de comandos, tecleando php -v. El ejemplo de este artículo fun-

cionará con cualquier versión.

Interfaces para la Shell Antiguos y Modernos

Page 47: Linux Magazine - Edición en Castellano, Nº 03

El fichero primero elimina el contenidode la variable $out, que representa elarray donde se almacenará la salida delcomando. exec() no sobrescribiría elarray sino que simplemente le añadiríaal final la nueva salida. El ejemplo impi-de que se mezclen los resultados demúltiples scripts vaciando primero elarray. El comando detecta el número delíneas en la lista de procesos y resta unalínea de las cabeceras de columna.

shell_exec() y exec() tan sólo puedenmanejar datos de stdout. Para capturar lasalida de error estándar desde stderr, senecesita redireccionar la salida de error astdout: 2 >&1.

Los programadores a menudo necesitanpasar argumentos de la línea de comandosal script. Para permitir que esto puedahacerse, PHP introduce los argumentosque siguen al nombre del fichero en lalínea de comandos dentro de un array lla-mado $argv, conservando el orden origi-nal. Además, el número de argumentos sealmacena en la variable $argc.

Buenos ArgumentosPHP no soporta comandos que leandatos directamente desde el teclado. Paraproporcionar soporte a las entradas deteclado, los programadores pueden abrirel flujo stdin como un fichero y leerdesde él. Esto permite el uso de los flujosstdout y stderr relacionados:

$in=fopen("php://stdin","r");

$err=fopen("php://stdin","w");

$input=trim(fgets($fp, 100));

while (""==$input)

{

fputs($err,"Please input a U

value\n");

}

Si se usa stdin para leer las entradas deteclado de esta forma, el script deberíausar la función trim() para eliminar losespacios en blanco al final de la cadena.No hay necesidad de usar stdout para lasalida de datos, ya que PHP cuenta conlas funciones echo y print para realizarestas tareas. La salida de ambos coman-dos pueden ser redireccionadas.

ColoreadoPara diseñar aplicaciones más cómodas,los programadores necesitan funcionesque borren la pantalla, que controlen el

cursor y que añadan color a la salida. Lassecuencias ANSI [1] proporcionan unasolución útil, ya que la shell es capaz deinterpretarlas. Estas secuencias empiezancon el carácter Escape y son conocidascomo secuencias de Escape. Por ejemplo,la secuencia echo "\033[2J" limpia la pan-talla. La Tabla 1 lista unas cuantas de lassecuencias más importantes.

El color seleccionado permanece váli-do hasta que se selecciona un colordiferente. Las funciones de PHP ncurses

proporcionan mayor portabilidad y unrango mucho más amplio de característi-cas. Véase los ejemplos de las páginasweb de PHP o Zend en [2], [3] para másdetalle.

Gestión de UsuariosEl siguiente ejemplo muestra las fun-ciones referidas a aquellas en el con-texto de un script para la gestión deusuarios de un servidor con el fin deque se vean ejemplos prácticos. ElListado 1 es una muestra y el scriptcompleto está disponible para descar-garse desde [4].

Nótese que el script abre la entradaestándar con fopen() pero no hace usode fclose() para cerrarla. Ya que PHPautomáticamente cierra todos los flujosabiertos cuando finaliza el programa, elscript evita cerrar el flujo por razones delegibilidad. El tiempo de ejecución paralos programas de la línea de comandosno está restringido.

PHP es ideal para crear interfaces web.Esta atractiva opción tiene algunas pegasocultas. Cuando se diseña una aplicaciónse necesita considerar los riesgos poten-ciales de seguridad. El más pequeño delos agujeros de seguridad podría tenerconsecuencias fatales. Un ejemplo:

01 <form method="POST">

02 Command: <input name=

"cmd" /><br />

03 <input type=

"submit" value=

"Execute" />

04 </form>

05 <?php

06 if (isset ($_POST['cmd']))

07 {

08 $outp=shell_exec

09 ($_POST[cmd]);

10 echo "<pre>$outp</pre>";

11 }

12 ?>

Las soluciones que ejecutan comandosarbitrarios (como esta) están fuera delugar. Los scripts de administración tansólo deberían ser ejecutables dentro deun entorno seguro y no deberían permi-tir ninguna posibilidad de que seanmanipulados.

Privilegios EspecialesLos scripts a menudo necesitan privile-gios de root. Un script PHP basado enweb normalmente se ejecuta con losprivilegios del identificador de usuariodel servidor web. Podría parecer obviodarle a este usuario (típicamente www,

wwwrun o nobody) muchos más privile-gios, pero esto es extremadamente peli-groso. Comandos como sudo o su pro-porcionan una alternativa. Sin embargo,su requiere la práctica insegura de añadirla clave de root como texto en claro den-tro del script.

La herramienta sudo también puedeasignar privilegios de root para accionesespecíficas a un usuario sin la necesi-dad de que este usuario conozca laclave de root. En vez de ello, los usua-rios se autentican con su propia clave yse les asignan los privilegios específicospor el root en el fichero /etc/sudoers. Siun administrador necesita asignar alusuario webadmin el derecho de termi-nar procesos con el comando kill, él oella podría añadir la siguiente línea a/etc/sudoers:

webadmin ALL = /bin/kill, U

/usr/bin/killall

Es una buena idea usar el editor visudo

para esto. El editor se asegura de quesólo un usuario puede editar el fichero

47www.linuxmagazine.com.es Número 03

ADMINISTRACIÓNPHP

Significado Secuencia

Borrar Pantalla \033[2J

Posicionar el cursor en x,y

\033[x;yH

Coloca el cursor n posiciones a la izquierda

\033[nC

Coloca el cursor n posiciones arriba

\033[nA

Color de Fuente rojo \033[0;31m

Color de Fuente negro \033[0;30m

Color de Fuente verde \033[0;32m

Color de Fuente gris \033[0;37m

Tabla 1: Secuencias deEscape importantes

Page 48: Linux Magazine - Edición en Castellano, Nº 03

Si el usuario webadmin no es elusuario root del servidor web desde elpunto de vista de los procesos de Unix(esto implicaría la herencia de los privi-legios del usuario que probablemente nosería deseada en la mayoría de loscasos), con toda seguridad se necesitaráuna combinación de su y sudo. Elusuario del servidor web primeroasumirá la identidad de webadmin tem-poralmente ejecutando su y entonces escuando se le asignan los privilegios deroot específicos por medio de sudo. Unscript que usa esta solución puede pare-cerse a este:

$user="webadmin"; //sudoer

$pwd="clave"; U

// Webadmin password

$befehl="kill -9U

".escapeshellarg($_GET

["pid"]);

$cmd_line="echo $pwd | U

su -l $user -c

\"echo $pwd | sudo -S U

$command 2>&1\"";

$ret=shell_exec($cmd_line);

El script primero usa escape-shellargs()

para manipular el pid, que lo procesadesde un formulario. Esto elimina losataques potenciales a la shell, que porotro lado se podrían insertar en el códigode forma maliciosa. �

de configuración al mismo tiempo.Además se asegura de que las entradasconcuerden con las reglas y no entren enconflicto.

La sintaxis genérica para asignar privi-legios con sudo es: QUIEN DONDE =QUE. QUIEN puede ser un nombre deusuario, como en nuestro ejemplo, o ungrupo de usuarios que deben serdefinidos usando un User_Alias. DONDEsignifica el host donde el usuario tendráestos privilegios.

Cambio de IdentidadGracias a las entradas en el fichero deconfiguración de sudo, el usuario webad-

min puede ahora “matar” procesos deforma arbitraria después de introducir suclave para la cuenta de usuario. Unscript automatizado podría pararse y pre-guntar por la clave antes de continuar.Suele colocarse el parámetro -S para indi-carle a sudo que lea la contraseña desdela entrada estándar. La línea de coman-dos sería como sigue: echo clave | sudo -S

kill 13221

48 Número 03 www.linuxmagazine.com.es

PHPADMINISTRACIÓN

01 #!/usr/bin/php -q

02 <?php

03 function cls()

04 {

05 echo "\033[2J"; // Borrar

Pantalla

06 echo "\033[0;0H"; // Cursor

07 to 0,0

08 }

09

10 function text_red()

11 {

12 echo "\033[0;31m";

13 }

14

15 function text_black()

16 {

17 echo "\033[0;30m";

18 }

19

20 // Funciones adicionales

21 // ¿Se ha insertado nombre de

usuario?

22 $in=fopen("php://stdin","r");

23

$err=fopen("php://stderr","w")

;

24 if (3==$argc &&

25 "-u"==$argv[1] &&

26 isset($argv[2]))

27 {

28 $user=$argv[2]; // leer

29 username

30 }

31 else

32 { // no hay nombre de usuario

33 fputs($err,"Por favor utilice

-u para insertar un nombre de

usuario\n");

34 exit(1);

35 }

36 // Comprobar existencia

usuario

37 // con etc/passwd

38 if (false

===user_exists($user))

39 {

40 fputs($err,"Nombre de usuario

no existe\n");

41 exit(2);

42 }

43

44 while (1) //Procesado infinito

45 loops

46 {

47 cls();

48 text_red();

49 echo "Administración para

usuario $user\n";

50 text_black();

51 echo "1) Comprobar

consistencia\n";

52 echo "2) Crear usuario MySQL

DB\n";

53 // Más elementos del menú

54 echo "q) Salir Programa\n\n";

55 echo "Escoja una opción: ";

56 // Eliminar blancos e entrada

57

58 $input=trim(fgets($in,255));

59

60 switch ($input)

61 {

62 case "1":

63 consistency_check($in);

64 break;

65 // Más casos

66 case "q": exit(0);

67 // beep en caso de entrada

incorrecta

68 default: echo chr(7);

69 }

70 }

71 ?>

Listado 1: Menú PHP

[1] Códigos ANSI:http://en.wikipedia.org/

wiki/ANSI_escape_code

[2] Manual de Funciones Ncurses:http://

www.php.net/ncurses

[3] Tutorial Ncurses:http://www.zend.com/

zend/tut/tut-degan.php

[4] Listado:http://www.linuxmagazine.com.

es/Magazine/Downloads/03

RECURSOS

Carsten Möhrke es un consultor free-

lance y profesor, es el autor de “Better

PHP Programming” y el CEO de

Netviser. Puede ponerse en contacto

con Carsten en [email protected]

Page 49: Linux Magazine - Edición en Castellano, Nº 03

49www.linuxmagazine.com.es Número 03

DESARROLLOPython

Tanto GNOME como KDE disponende sendas aplicaciones para con-sultar diccionarios. A nosotros nos

resultan muy útiles cuando, por ejemplo,aparece en alguna página o documentouna palabra de argot o difícil en inglés.Entonces recurrimos a ellas, realizanconsultas en prestigiosos diccionarios

como el Webster o en el famosísimo (a lapar que desternillante) Jargon file.

Pero no todo el mundo está dispuestoa usar GNOME o KDE (al menos uno denosotros no lo hace), así que parece unpoco desmedido instalar todo un escrito-rio gráfico solamente para tener acceso aun programa que podemos realizar sin

demasiada dificultad usando nuestroquerido Python y el maravilloso Tkinter.

Hablando con el servidor dela R.A.E.La R.A.E. (Real Academia de la lenguaEspañola) tiene una página web (http://

www.rae.es) donde podemos consultar el

Desde que llegó Internet todos escribimos más. Se supone que con los ordenadores y sus fabulosos correctores ortográ-

ficos y gramaticales no volveríamos a cometer errores garrafales al hescrivir. La realidad es que, a pesar de estas ayudas,

cuando escribimos a través de los sistemas de mensajería o en los correos solemos usar argot, lo que nos obliga a desac-

tivar los correctores. Es entonces, después de escribir mil veces ´k´ en lugar de ´que´, al enfrentarnos a escribir algo

normal comienzan a asaltarnos dudas ¿esto era con ´b´ o con ´v´? ¿Existe esta palabra?.

POR JOSÉ MARÍA RUÍZ Y JOSÉ PEDRO ORANTES

¿Problemas de ortografía? La R.A.E. y Python raudas al rescate.

Python y PalabraEmpiezan por “P”

Page 50: Linux Magazine - Edición en Castellano, Nº 03

50 Número 03 www.linuxmagazine.com.es

PythonDESARROLLO

parámetros seleccionemosnosotros, lo que nos per-mitirá hablar con el servi-dor directamente sinnecesidad de usar unnavegador. De esta man-era podemos crear progra-mas que salten el paso delnavegador y accedandirectamente al servidorHTTP.

Ese es nuestro objetivo.Tenemos que localizaresos parámetros en el

servidor HTTP de la R.A.E. en la páginade búsqueda de palabras.

Localizando los ParámetrosAhora comienza nuestra labor de detec-tives. Primero accedemos a la página dela R.A.E y pinchamos en Diccionario de

la lengua española, lo primero que nosdebería extrañar es que la URL no hacambiado, sigue siendo http://www.rae.

es. Eso significa que nuestro browserestá volviendo a pedir el mismo objeto alservidor HTTP, pero lo que vemos es unapágina distinta. Esto puede significarvarias cosas, pero una inspección delcódigo HTML de la página nos dice quese están usando FRAMES.

El W3C [1], entidad que gestiona

muchos de los estándares de la web,desaconseja el uso de FRAMESET, larazón es que engañan a las URLs y alusuario. Por ejemplo, estoy diciendo queestamos en la página de búsqueda deldiccionario de la R.A.E., pero la URLsigue siendo la de la página principal dela R.A.E. (http://www.rae.es), así que nopodemos deciros que vayáis a esa URLporque no se corresponde con la debúsqueda en el diccionario. Por ello losFRAMES destruyen la idea de que unaURL, una dirección, corresponde a unsolo objeto en la red.

La página de búsqueda la componen 2FRAMES ( o subpáginas): cabecera y por-tada. La cabecera no nos interesa. La por-

tada a su vez la componen los FRAMES:elección y presentación. Este último es elque presenta los resultados de la búsque-da… ¿pero como sabe a qué palabra nosestamos refiriendo?

Cada FRAME contiene varias páginas,y los FRAMES se diseñaron para mostrarvarias páginas la vez. A nosotros solonos importa una página: http://buscon.

rae.es/draeI/SrvltGUIBusUsual.Esta página es la que acepta un

parámetro, LEMA, y devuelve una webcon la definición (o un aviso de fallo) deLEMA. El método usado es POST, losabemos porque si vemos la informaciónde la página, los parámetros pasados sonLEMA de tipo POST. Pero muchas aplica-ciones web, en particular la que usarServlets de Java, suelen buscar losparámetros tanto en POST como en GET.Y éste es nuestro caso.

¿Cómo se pasan parámetros? Puesmuy sencillo, vamos a usar GET. Se ponela URL y se le añade ?<PARA-

METRO1>=<VALOR1>&<PARA-

METRO2>=<VALOR2>. Por ejemplo:http://buscon.rae.es/draeI/

SrvltGUIBusUsual?LEMA=hola. Ahoratenemos que ver como es posible obten-er el contenido de esa URL.

Lynx al RescatePodríamos haber diseñado algún com-plejísimo sistema, para traer la páginaHTML, eliminarle las etiquetas, for-matearla y demás; pero la vagancia, alia-da poderosa del buen programador, noshace buscar una manera más simple dehacer esto.

La manera más simple, consistiría enseguir el ejemplo de xdrae [2]. Esta apli-

diccionario o realizar preguntas sobredudas lingüísticas. Tener que acceder aesa página es un poco engorroso si lo vasa hacer más de una vez.

A pesar de todas esas buzzwords (quesi PHP, que si J2EE, que si .NET) al finaltodo acceso a un servidor web se realizaa través del protocolo HTTP. Este proto-colo no posee estados y, básicamente,sirve para pedir ficheros. En teoríaimplementa varios tipos de mensajes, delos cuales solo el GET y el POST se uti-lizan (existe otros más, como PUT quenos permitiría depositar archivos, perocasi nadie lo usa). GET sirve para pedirun fichero a través de una URL y POST

para enviar información al servidorHTTP.

Desde este punto de vista, un servi-dor HTTP solo ve dos cosas: archivosque le pedimos y datos que le damos.Tanto GET como POST se pueden uti-lizar para pasar información al servidor.Ambos tienen ventajas e inconve-nientes. Generalmente se usa GET,porque los parámetros que pasamos alservidor van incluidos en la URL. Deesta manera podemos pasarle una URLa alguien o ponerla en nuestra página ycualquiera podrá ver la página con losparámetros que nosotros selec-cionamos. Con POST esto no es posible,ya que los parámetros no están pre-sentes en la URL. Los estándares dicenque GET debe usarse para pasarparámetros (opciones por ejemplo)mientras que POST debe ser usado paramandar información al servidor queposteriormente sea almacenada.

Si entramos en una página web yprestamos atención a las URLs que sevan generando podemos encontrar lasopciones que acepta esa página. Si laslocalizamos podemos crear URLs cuyos

01 #!/usr/local/bin/python

02

03 from popen2 import popen2

04 from sys import argv

05

06 def busca_palabra(palabra):

07 salida, entrada =

popen2('lynx -dump --nolist

"http://buscon.rae.es/draeI/Sr

vltGUIBusUsual?TIPO_HTML=2&LEM

A=' + palabra + '"')

08 entrada.close()

09 cadena = salida.read()

10 print(cadena)

11

12 if __name__ == "__main__":

13 if ( len(argv) == 1 ):

14 print("ERROR: hace

falta un argumento")

15 else:

16 busca_palabra(argv[1])

Listado 1: Programabuscador.py

Figura 1: Nuestra utilidad busca-palabras en marcha.

Page 51: Linux Magazine - Edición en Castellano, Nº 03

cación, realizada en Tcl/Tk, descansa enotro programa, lynx, para obtener elresultado de las búsquedas parseado yen formato texto.

Esto nos enseña un lección muyimportante de la manera en que UNIXentiende la reutilización de código. Lamanera propuesta por UNIX es lacreación de utilidades compactas ypequeñas que puedan ser conectadasmediantes tuberías (por ejemplo ls -l | wc

-l). Para que esto sea posible, las salidasdeben ser en formato texto.

lynx acepta multitud de parámetrospero posee uno, -dump, que hace quevuelque en la salida estándar la página,pero ya formateada de manera que esASCII sin etiquetas HTML. Si lo hace-mos así, lynx nos volcará la página for-mateada más una lista de todos lasURLs de los hipervínculos de la misma.Para que no lo haga añadimos --nolist.Nos quedaría al final algo así: lynx

-dump --nolist URL.

popen2Para poder recoger lo que lynx generatenemos que crear una tubería entre él ynosotros. Para ello existe la funciónpopen2 de la librería del mismo nombre.Esta función ejecuta un programa y creados descriptores de fichero, uno paramandarle texto al programa y otro pararecibirlo. Se corresponden con la entraday la salida estándar del programa que seejecuta.

La idea es ejecutar lynx... conpopen2. Su entrada estándar no nosinteresa, así que la cerramos, pero lasalida estándar es lo que buscábamos.Una vez ejecutado popen2, el volcadode lynx... puede ser leído como sileyésemos un fichero.

>>> salida, entrada = popen2U

("wc -w")

>>> entrada.write("En un lugarU

de la mancha de cuyo nombre noU

quiero acordarme")

>>> entrada.close()

>>> print salida.read()

12

>>>

wc -w devuelve el número de palabraque son leídas de su entrada estándarhasta el fin de fichero (por eso tenemosque hacer un entrada.close()).

51www.linuxmagazine.com.es Número 03

DESARROLLOPython

01 #!/usr/local/bin/python

02

03 from popen2 import popen2

04 from Tkinter import *

05 from Tkconstants import *

06

07 class GUI:

08 def __init__(self):

09 self.root = Tk()

10

self.crea_panel_busca()

11

self.crea_panel_muestra()

12

13 def arranca(self):

14 mainloop()

15

16 def busca_palabra(self):

17

self.label_estado.config(text=

"Estado: buscando palabra...")

18 palabra =

self.entry_palabra.get();

19 salida, entrada =

popen2('lynx -dump --nolist

"http://buscon.rae.es/draeI/Sr

vltGUIBusUsual?LEMA=' +

palabra + '"')

20 entrada.close()

21 texto = salida.read()

22 # Borramos el texto

que hubiese antes

23

self.label_estado.config(text=

"Estado: mostrando texto")

24

self.text_muestra.delete(1.0,E

ND)

25

self.text_muestra.insert(1.0,t

exto)

26 salida.close()

27

28 def

crea_panel_muestra(self):

29 self.panel_muestra =

Frame(self.root)

30

self.panel_muestra.pack()

31

32 # Vinculamos una barra

de desplazamiento

33 self.scrollbar=

Scrollbar(self.panel_muestra)

34

self.scrollbar.pack(side=RIGHT

,fill=Y)

35

36 # Caja de texto para

mostrar la definición de la

37 # palabra

38 self.text_muestra =

Text(self.panel_muestra,

yscrollcommand =

self.scrollbar.set)

39

self.text_muestra.pack()

40

41 def

crea_panel_busca(self):

42 self.panel_busca =

Frame(self.root)

43

self.panel_busca.pack()

44

45 self.label_estado =

Label(self.panel_busca,

text="Estado: parado")

46

self.label_estado.pack(side=LE

FT)

47

48 self.entry_palabra =

Entry(self.panel_busca)

49

self.entry_palabra.pack(side=L

EFT)

50

51 # Botón de salida

52 self.btn_salir =

Button(self.panel_busca,text="

Salir", command=

self.root.destroy)

53

self.btn_salir.pack(side=RIGHT

)

54

55 self.btn_busca =

Button(self.panel_busca,

text='Buscar',

command=self.busca_palabra)

56

self.btn_busca.pack(side=RIGHT

)

57

58 if __name__ == "__main__":

59

60 app = GUI()

61 app.arranca()

Listado 2: Programa buscador2.py

Page 52: Linux Magazine - Edición en Castellano, Nº 03

52 Número 03 www.linuxmagazine.com.es

PythonDESARROLLO

de empotrar en aplicaciones realizadasen C. La idea era que el usuario pudieseextender la funcionalidad de la apli-cación sin tener que ponerse a progra-mar en C, sino creando scripts que laaplicación ejecutaría.

Al poco tiempo comenzó a trabajar enTk, una extensión de Tcl que permitiríala creación de interfaces gráficos demanera rápida y simple gracias a Tcl.

Aunque no hayamos escuchado hablarmucho de Tcl/Tk, su importancia en elsoftware es muy grande, muchos lengua-jes usan Tk como librerías gráficas. Tcl/Tk se ha usado mucho en el prototipadode aplicaciones.

El hola mundo GráficoDespués de esta pequeña lección dehistoria, pongámonos manos a la obra.Lo primero que necesitamos saber escomo estructura Tk los widgets (usare-mos esta palabra a partir de ahora,viene a significar elementos gráficos).Tk usa un árbol, como el árbol dedirectorios, pero en lugar de usar elsímbolo / y usa el punto, .. La apli-cación se crea desde la raíz, . haciaadelante. Los widgets pueden contenerotros widgets, o sea, los widgetspueden ser directorios de otros widgets.Así podemos tener un widget .panel

que tenga dos hijos .panel.campo_texto

y .panel.boton1. Visualmente veríamos

a campo_texto y a boton1 dentro depanel.

Veamoslo en práctica con un hola

mundo.

01 >>> import Tkinter

02 >>> from Tkconstants import *

03 >>> tk = Tkinter.Tk()

04 >>>

05 >>> panel = Tkinter.Frame(tk,

relief=RIDGE, borderwidth=2)

06 >>> panel.pack(fill=BOTH,

expand=1)

07 >>>

08 >>> etiqueta = Tkinter.Label

(panel, text="Hola Linux

Magazine")

09 >>> etiqueta.pack(fill=X,

expand=1)

10 >>>

11 >>> boton = Tkinter.Button

(panel,text="Salir",

command=tk.destroy)

12 >>> boton.pack(side=BOTTOM)

13 >>>

14 >>> tk.mainloop()

El método pack posiciona los widgetsdentro de su widget padre, si le especifi-camos side=BOTTOM los irá posicio-nando uno encima de otro; fill=X sirvepara que el widget ocupe todo el espaciohorizontal (con fill=Y ocuparía el verti-cal y con fill=XY todo el espaciodisponible); expand=1 hace que el wid-get crezca si su padre crece, en caso con-trario no modificará sus dimensiones.

Tk funciona de la siguiente manera.Primero se construye el interfaz gráfico.Cada elemento del interfaz responde auna serie de eventos (ser pulsado, que elratón pase por encima…) y cada uno deestos eventos puede estar vinculado conun procedimiento que se dispara al ocu-rrir el evento. Así que asignamos proce-dimientos a los eventos de los widgets.Por último entramos en el bucle principal

(main loop).Todas las invocaciones a las funciones

de creación de widgets tienen un primerargumento, en él se especifica de quiencuelga (o dentro de quien está) nuestrowidget. Aquí el widget tk representa laventana, dentro de la cual hay un panely dentro del cual hay dos widgets, unaetiqueta y un botón.

El botón tiene vinculado un comando,en este caso tk.destroy, pero podría

Ahora solo tenemos que ejecutar nues-tro comando lynx... y leer su salida,almacenando el valor en una variable.

Script de Consulta Sencilloxdrae hace uso de esta metodología detrabajo, invocando a lynx, que realiza lamayor parte del trabajo pesado, deján-dole a xdrae la gestión del GUI. Un scriptsencillo para que consigamos el mismoresultado sería el del Listado 1.

Cuando Python comenzó a tenerexpansión se hizo evidente la necesi-dad de un sistema para la creación deinterfaces gráficos. Pudieron hacer lomismo que en Java y crear su propiosistema (AWT y Swing), pero en lugarde eso reutilizaron uno ya existente:Tcl/Tk.

Tcl/TkTcl/Tk son unas siglas extrañas, puedenrecordarnos a TCP/IP y la verdad es quealgo comparten con ellas. Tanto Tcl/Tkcomo TCP/IP hacen referencia a 2 tec-nologías que trabajan juntas. En el casode Tcl/Tk estas tecnologías son ellenguaje script Tcl y el sistema de inter-faz gráfico de usuario Tk. Tk fue creadodespués que Tcl, y está realizado comouna extensión de Tcl.

Tcl fue creado por el profesor John K.Ousterhout con el objetivo de disponerde un lenguaje script que fuese sencillo

Figura 2: Página del diccionario de la RAE.

Page 53: Linux Magazine - Edición en Castellano, Nº 03

haber sido otro. Podríamos haber incor-porado otro botón antes de ejecutar eltk.mainloop():

>>> def escribe():

... print "Hola mundo"

...

>>>

>>> boton2 = Tkinter.ButtonU

(panel, text="Escribe",U

command= escribe )

>>> boton2.pack(side=BOTTOM)

Habría otro botón, debajo de el botónSalir, que al pulsarlo escribiría por la sa-lida estándar (normalmente la consola)el texto Hola mundo.

Diseño de la aplicaciónTk tiene todos los widgets que existen enel resto de GUIs. Tenemos etiquetas,botones, paneles, imágenes, combos ydemás. Nosotros lo que necesitamos es:• Un panel• Una etiqueta Estado, un campo

de entrada de texto, un botónBuscar y otro Salir.

• Un widget de texto con múlti-ples líneas para la respuesta,con una barra de desplaza-miento asociada.

• Deberíamos también darle untítulo a la ventana.

Barras de desplazamiento +Campos de texto = algo muyútilUn widget de texto es un widget que nospermite mostrar una gran cantidad detexto. Posee infinidad de opciones, sien-

do posible implementar con ellas hastaun intérprete de HTML o crear textoenriquecido.

Vamos a usar un widget de texto paracontener la respuesta del servidor de laR.A.E.. Tenemos que solucionar el pro-blema de que la respuesta de la R.A.E.

sea mayor que el contenido de nuestrocampo. Nuestro widget de texto no vaser redimensionable y puede que hayamás texto del que quepa en el área quevemos del widget de texto.

Para solucionar este problema, seinventaron las barras de desplazamiento,que damos por sentadas, pero quefueron toda una innovación en su día. Laidea es crear una barra de desplazamien-to y vincular su movimiento y tamaño altexto mostrado en el widget de texto quetendrá asociada.

En Tk el tamaño no es posible vincu-larlo, pero podemos vincular elmovimiento. Algunos widgets, aquellospropensos a usar una barra de desplaza-miento, poseen un evento llamadoyscrollcommand, que toma un valor deuna función y lo usa para posicionar eltexto dentro del widget. El widget tieneun elemento llamado viewport, que es laventana dentro de todo lo que tiene elwidget que puede ver el usuario. El wid-get puede tener, aprovechando la coyun-tura, “El Quijote” pero en el viewport

solo se ven unos cuantos párrafos de laobra de Cervantes. Cuando vinculamosuna barra de desplazamiento con unwidget de texto en realidad lo que hace-mos es que vinculamos el valor de iniciodel viewport con el de la barra dedesplazamiento.

Ensamblaje FinalY ahora llega el momento que estábamosesperando, cuando todas estas técnicas eideas se ponen juntas y aparece algo útil.Básicamente lo que hace nuestra apli-cación es crear un objeto GUI. Éste seencarga de crear y vincular la accionesque los widget requieren. Una vezcreadas, es necesario invocar el métodoarranca() que ejecuta el bucle principalde Tk. Este bucle se dedica a repintar laventana y gestionar los eventos.

El encargado de buscar en la R.A.E.

una palabra a través del botón “Buscar”es el método busca_palabra, ejecutalynx… con las opciones necesarias y conel contenido del campo de entrada. Lohace a traés de popen2. Cuando está listoel texto, borra el contenido del widget detexto e inserta en él el texto devuelto porel servidor HTTP de la R.A.E..

Cada vez que se hace esto, la apli-cación queda bloqueada como resultadode la invocación a popen2, que bloqueaa nuestra aplicación hasta que terminede ejecutarse lynx…. Para evitar esteproblema se deben emplear hebras,pero eso está fuera del alcance de ésteartículo.

Cuando se pulsa el botón “Salir” laaplicación acaba. �

53www.linuxmagazine.com.es Número 03

DESARROLLOPython

[1] W3C http://www.w3c.org

[2] Página de xdrae http://xinfo.sourceforge.net/xdrae.html

RECURSOS

José María Ruiz actualmente está

realizando el Proyecto Fin de Carrera

de Ingeniería Técnica en Informática

de Sistemas. Lleva 7 años usando y

desarrollando software libre y,desde

hace dos, se está especializando en

FreeBSD.Pedro Orantes está cursando

3º de Ingeniería Técnica en Infor-

mática de Sistemas.

LOS AUTORES

Figura 3: Buscador desde la línea de comandos.

Figura 4:

“Hola

Mundo”de

Tcl/Tk.

Page 54: Linux Magazine - Edición en Castellano, Nº 03

54 Número 03 www.linuxmagazine.com.es

CharlyADMINISTRACIÓN

ésta difiere de la anterior con un númerode pixeles configurable. El siguientecomando es el único que necesité usarpara utilizar esta función:

motion -t /home/charly/motionEl parámetro -t indica a Motion donde

debe almacenar las imágenes. Ahora,cuando paso delante de la cámara Web,los altavoces del PC emiten un sonido dealerta. Motion ha detectado el cambio enla imagen. Si preferimos omitir el sonidode alerta debemos añadir -Q al comando.Si queremos que Motion se ejecute enmodo demonio añadiendo el parámetro-D, el sonido esta deshabilitado pordefecto.

Cuando las PelículasAprenden a ContarSi necesitamos ajustar a medida Motiondebemos tocar el archivo opcional deconfiguración. El archivo puede residirbajo /usr/local/etc/ o en nuestro directo-rio raíz. El archivo de configuración nospermite ajustar la sensibilidad de la fun-ción de detección de la imagen. Laentrada

threshold 1500

Estipula que al menos 1500 pixeles debencambiar de una imagen a otra antes deque Motion detecte el cambio. Mis pecesde pelea Siameses son muy valientespero muy pequeños, por lo que dejé elvalor en la mitad. Esperando y contem-plando, Motion reacciona cada vez queun pequeño pez de 3 centímetros o másnada delante de la cámara Web. Si nues-tra distribución Linux dispone decodificador MPEG podemos inclusohacer que Motion nos genere unapelícula a partir de una serie de imágenesfijas (por ejemplo, ffmpeg proporcionasoporte directo para esta aplicación).Motion.cgi [2] hace que el uso de Motion

sea incluso más sencillo. El paqueteopcional incluye un interfaz para comen-zar, detener y grabar con Motion. Inclusonos permite picotear en el flujo de datosen cualquier momento para ver una ima-gen real en vivo como la que aparece enla figura 1, que muestra los habitantes demi pecera.

Debemos saber que la cámara que use-mos puede ser determinante en losresultados que Motion nos dé. Mi viejacámara Web fue útil mientras lahabitación tuvo luz suficiente, pero inútilen la oscuridad. Como no creo que losladrones entren en la tienda de Olli yMelanie para encender la luz y sonreír ala cámara, parece lógico que mis amigasinviertan en una nueva cámara Web. �

Los sistemas comerciales del vigilancia son caros y normalmente involucran

acuerdos de mantenimiento. Yo creo que debe haber una alternativa de bajo

coste.POR CHARLY KÜHNAST

Vigilancia con movimiento

Gente Pez

Autopsy............................................55En esta segunda parte dedicada a las audi-

torías de seguridad,vemos como

diseccionar un equipo cuya seguridad ha

sido comprometida con el paquete Autopsy.

Suspend ..........................................59Vemos como poner un equipo en modo

hibernación,volcando el contenido de la

memoria al swap con el paquete Software

Suspend.

SYSADMIN

Charly Kühnast es ungestor de sistemas Unixen el centro de datosMoers cerca del Rhin,elfamoso río alemán.Sustareas incluyen laseguridad y disponibili-dad del cortafuegos yocuparse del DMZ (zona desmilita-rizada).

EL AUTOR

[1] Motion:http://www.lavrsen.dk/twiki/

bin/view/Motion/WebHome

[2] Motion.cgi:http://www.lavrsen.dk/twiki/

bin/view/Motion/MotionCGI

[3] A fish:http://www.fishbase.org/Country/

CountrySpeciesSummary.

cfm?Country=Malaysia&Genus=Betta&S

pecies=splendens

INFO

Figura 1: una pez de pelea Siamés [3] nadando

felizmente en la imagen de la cámara Web de

Charly. Recogido por Motion.cgi.

Olli y Melanie, que son dos buenasamigas mías, tienen tres tiendas.Una de las tiendas ha sido

robada muchas veces. Por supuesto quehay seguros para cubrir los robos. sinembargo ellos estaban preocupadosporque nadie había sido capaz de detenera los culpables. Se preguntaban si un sis-tema de vigilancia podía ayudar.

Por supuesto que los sistemas de vigi-lancia llave en mano son caros, por loque me han preguntado si un viejo PC yuna cámara Web pueden ser una alterna-tiva. Actualmente yo tengo una cámaraWeb, pero sólo la he usado para grabar elacuario que tengo en mi salón. No tengoninguna experiencia con aplicaciones devigilancia. Pero menos mal que existenlos motores de búsqueda, ¿verdad? Trasuna breve investigación encontré rápida-mente una aplicación muy útil llamadaMotion [1].

Motion es fácil de instalar. En mimáquina de ensayos Debian, elegida sim-plemente porque tenía una cámara Webinstalada, solo fue necesario escribir

apt-get install motionLos usuarios con otras distribuciones

pueden usar RPM o archivos tar. Motionaccede a dispositivos V4l o V4L2, en estecaso mi cámara Web, comparando laimagen actual con la imagen previa. Elprograma almacena la imagen actual si

Page 55: Linux Magazine - Edición en Castellano, Nº 03

Sleuthkit busca en los sistemas deficheros de Microsoft y Unixficheros borrados y reconstruye los

hechos para localizar una intrusión.Autopsy Forensic Browser [1] no es sólofácil de usar, sino que también propor-ciona funciones avanzadas: este interfazbasado en web de Sleuthkit facilita y doc-umenta el proceso de análisis forense.

Nuevos CasosBasaremos nuestros ejemplos en el sis-tema de ficheros Forensic Challenge [3].El tarball contiene la partición individualcomo aparece descrita en la Tabla 1.

Antes de empezar la investigación conAutopsy y Sleuthkit, los investigadoresforenses tienen que abrir un nuevo caso.Para hacerlo, simplemente hay que hacer

clic en el botón New

Case al pie dela página

de bien-veni-

da de Autopsy. Haciéndolo, se abre lapágina de entrada para el nuevo caso(véase la Figura 2).

Una vez que se hayan rellenado todoslos campos y pulsado New Case, Autopsycreará el directorio del caso(/var/morgue/forensic_challenge/)y el fichero de configuración(/var/morgue/forensic_challenge/case.au

t), además de añadir al investigador. Laherramienta muestra los resultados enotra página Web y le pide que lo con-firme pulsando OK.

En la siguiente ventana (Case Gallery,Figura 3), Autopsy presenta una lista decasos seleccionables; incluso se puedeacceder a esta página desde la página debienvenida pulsando el enlace Open

Case. El caso forensic_challenge estáseleccionado por defecto; después dehacer clic en OK para confirmar laselección, es el momento de añadir lasmáquinas que se desean investigar eneste caso.

Bajo la lupaPara añadir un nuevo host hay queespecificar el nombre de la máquina yopcionalmente se puede añadir unadescripción, adicionalmente se puedeindicar el huso horario y ladesviación del reloj del ordenadorcon respecto al tiempo real, si fueranecesario. También se puedeespecificar, si se tiene, una base dedatos hash de ficheros benignos omalignos. A continuación hay quepulsar Add Host y Autopsymostrará de nuevo una página deconfirmación. Púlsese OK paraaceptar.

A continuación se muestra la Host

Gallery, permitiendo seleccionar loshosts que van a ser procesados; otra vezhacemos click en OK para confirmarantes de continuar añadiendo las imá-genes de disco. Para ello, hay que selec-cionar Add Image y teclear el nombre delfichero (véase la Figura 4).

Este formulario se utiliza también paraespecificar si Autopsy debe añadir unenlace simbólico para el fichero originalen el directorio morgue o si la imagendebe ser copiada o movida. También hayque especificar el punto de montajeoriginal, el tipo de sistema de ficheros ylas opciones MD5. Autopsy calcula lasuma de verificación MD5 en cada caso;si ya conoce cual debería ser dicho valor,se puede introducir aquí, para queAutopsy lo verifique con el valor de real.

Registro del 7 de Noviembrede 2000Ahora se puede continuar con la investi-gación de la escala temporal de las modifi-caciones del sistema de ficheros seleccio-nando el elemento del menú File Activity

Time Lines. Haciéndolo se cambia laapariencia de la aplicación Web, dividien-do la ventana en dos marcos. El marco

55www.linuxmagazine.com.es Número 03

ADMINISTRACIÓNAutopsy / Sleuthkit

Para determinar si un sistema está expuesto, el administrador tiene que buscar

señales reveladoras y pruebas seguras, el administrador se convierte en un

científico forense. Sleuthkit y Autopsy pueden ayudar con esta complicada

tarea haciendo uso de una práctica interfaz Web para buscar archivos borrados

y descubrir la pista de los intrusos. POR RALF SPENNEBERG

Autopsy y Sleuthkit, Kit de Herramientas para el Forense Digital

Tras la Pista del Zorro

Partition Filesystem

/dev/hda8 /

/dev/hda1 /boot

/dev/hda6 /home

/dev/hda5 /usr

/dev/hda7 /var

/dev/hda9 swap

Tabla 1: Particiones deChallenge

Page 56: Linux Magazine - Edición en Castellano, Nº 03

Autopsy no sólo realiza análisis, sino que

también ayuda al investigador a realizar las

tareas de papeleo que el análisis

forense conlleva,organizando las tareas

en casos y asignándole un directorio a

cada uno. Es una buena idea crear un

directorio padre para los directorios de

los casos antes de empezar con el pro-

ceso de instalación: /var/morgue es un

buen nombre para el almacén de prue-

bas.

La instalación de Autopsy es algo

extraña.Después de ejecutar make,hay

que contestar una o dos preguntas. El

script de instalación comprueba si una

versión de Sleuthkit está instalada

antes de crear los ficheros de insta-

lación.

Cuando se lanza la herramienta, te-

cleando ./autopsy en el directorio

fuente, el Autopsy Forensic Browser se activa

mostrando su número de versión, una URL y

un mensaje indicando que se debe dejar este

proceso ejecutándose durante la fase de

análisis y que hay que pararlo cuando

termine dicha fase pulsando [Crtl]+[C].

A continuación, con cualquier navega-

dor Web, se puede acceder a Autopsy.

Tan sólo hay que introducir la URL

mostrada anteriormente en el cuadro

de texto de la barra de direcciones del

navegador Web. También se pueden

usar opciones de la línea de comandos

para indicarle a Autopsy que se ejecute

en otro puerto y dirección IP: ./autopsy

<número de puerto> <dirección IP>.

Si se prefiere usar los paquetes RPM

del autor [2] para instalar Autopsy, en

vez de usar los fuentes, se dará cuenta

que autopsy se incluye en el path por

defecto. Este paquete usa /var/morgue

como almacén de pruebas.

A continuaciónAutopsy crea lalínea temporalbasada en elfichero “body”. Elelemento del

menú Create Timeline indica con pru-dencia que se restrinja la ventana detiempo que se va a investigar.

La descripción de Forensic Challenges

indica que el 7 de Noviembre del 2000 es lafecha más probable de la intrusión. Paraeste ejemplo, el investigador querrárestringir la ventana del tiempo para deta-llar de forma más precisa las investiga-ciones en el período entre el 7 y el 9 deNoviembre de 2000. Para permitir aAutopsy reemplazar el UID y el GID con losnombres correspondientes cuando se creela línea temporal, hay que establecer la

imagen del sistema de ficheros que con-tenga los ficheros /etc/passwd y /etc/group.

La línea temporal muestra que elfichero /etc/hosts.deny ha sido modifica-do, reduciendo su tamaño a 0 bytes.Unos pocos minutos después, un ficherotarball fue instalado en el directorio/usr/man/.Ci/ (véase la Figura 6). Estees el directorio en el que el investigadorforense querrá concentrarse después.Unos pocos segundos antes de que estainstalación tuviera lugar, el inodo 8 133en hda8 fue borrado. El tamaño delfichero era de 2.129.920 bytes, ypertenecía a un usuario llamado drosen.Un fichero en el rootkit fue borradodespués, el fichero en el inodo 109.801con un tamaño de 1.153 bytes.

La línea temporal también muestra losaccesos de lectura a las bibliotecas de

superior muestra los pasos típicos comolos elementos del menú y el marco inferiorse usa para las entradas y las salidas.

La Figura 5 muestra como crear el lla-mado fichero de “body” usando el ele-mento del menú Create Data File. Esteproceso puede tardar un poco, ya queAutopsy tiene que invocar los coman-dos fls e ils de Sleuthkit. Después decompletarse estos pasos, Autopsyautomáticamente calcula las sumas decomprobación MD5 que se utilizanpara comprobar la integridad de losficheros.

56 Número 03 www.linuxmagazine.com.es

Autopsy / SleuthkitADMINISTRACIÓN

Figura 2:Hay que especificar el nombre del nuevo caso (forensic_challenge en

nuestro ejemplo) y añadirle un login para el investigador responsable para

este caso (ralf).

Figura 3: Autopsy organiza las investigaciones forenses en casos. Esto per-

mite cambiar de caso sin tener que reiniciar la GUI.

Instalación y ejecución de Autopsy

Figura 1:Tecleando make se compila e instala Autopsy, pero hay

que estar preparado para contestar algunas preguntas.Tiene

sentido crear el directorio morgue antes de empezar la insta-

lación.

Page 57: Linux Magazine - Edición en Castellano, Nº 03

funciones. Este hecho indica que elintruso compiló una o varias aplica-ciones.

Ningún Punto para EncubrirPistasDespués de completar la instalación elintruso borró una enorme cantidad deficheros. Parece que estos ficherosfueron creados como parte del procesode compilación. Tras borrar los ficherossuperfluos, el intrusoparece que instaló unadistribución SSH (véaseel Listado 1).

La línea temporal tam-bién indica que el intrusousó scripts de instalaciónpara tomar el control einstalar software. Dichalínea contiene un númerode entradas que indicanel borrado de ficherosque nos hace man-tener esta hipótesis:install-sshd1 y parecidos(véase el Listado 2).

Los ficheros mostra-dos aquí no son las úni-cas entradas sospe-chosas de la línea tem-

poral. A lo largodel curso delataque, pareceque el intrusodejó una copia

del cliente “Bitch X IRC” y “eggdrop” enel disco.

Ahora la tarea del administrador-detective consiste en descubrir la natu-raleza y el propósito de los ficherosinstalados. Los scripts de instalación sonsiempre un buen punto de partida. Elintruso los ha borrado, pero Autopsy notiene ningún problema en recuperarlos.

Para recuperarlos, primero hay quecerrar la línea temporal (arriba a la

derecha Close) y seleccionar la partición/usr. Tras confirmar pulsando OK semuestra una nueva vista, donde hay queseleccionar File Analysis. Este es el sitiodonde se pueden mostrar los ficherosindividuales, como el llamado/usr/man/.Ci/install (véase la Figura 7).

Procesos OcultosAfortunadamente, Autopsy tambiénpermite el visionado de otros tiposde ficheros. Por ejemplo,/usr/man/.Ci/addps contiene un scriptque obviamente ha sido usado para ocul-tar procesos que normalmente se mues-tran con los comandos ps o top para de

57www.linuxmagazine.com.es Número 03

ADMINISTRACIÓNAutopsy / Sleuthkit

Figura 4: Antes de investigar una imagen del sistema de ficheros, el investi-

gador ha de añadir la imagen al caso, especificando la suma de control MD5

para asegurarse que la imagen no esté dañada.

Figura 5: Autopsy crea un fichero “body”para almacenar la línea temporal

para las operaciones sobre el sistema de ficheros de la imagen. El “body”se

puede aplicar tanto a los ficheros borrados como a los existentes.

01 537 m.c -/-rw------- root root 26570 /etc/ssh_host_key

02 880 .a. -/-rw-r--r-- root root 26579 /etc/ssh_config

03 512 m.c -/-rw------- root root 2048 /root/.ssh/random_seed

04 341 mac -/-rw-r--r-- root root 26578 /etc/ssh_host_key.pub

05 ...

06 604938 mac -/-rws--x--x root root 109999 /usr/local/bin/ssh1

Listado 1: Instalación de SSH

01 1153 ..c -/-rwxr-xr-x 1010 users 109801 /usr/man/.Ci/install-sshd1 (deleted)

02 1076 ..c -/-rwxr-xr-x 1010 users 109802 /usr/man/.Ci/install-sshd (deleted)

03 80 .a. -/-rwxr-xr-x 1010 users 109803 /usr/man/.Ci/install-named (deleted)

04 71 ..c -/-rwxr-xr-x 1010 users 109867 /usr/man/.Ci/install-wu (deleted)

05 106 ..c -/-rwxr-xr-x 1010 users 109864 /usr/man/.Ci/install-statd (deleted)

06 ...

Listado 2: Scripts de Instalación

Page 58: Linux Magazine - Edición en Castellano, Nº 03

tarios. Un investigador tiene que serextremadamente disciplinado para con-seguir esta funcionalidad solamentehaciendo uso de la línea de comandos.

Los desarrolladores de Autopsy estánactualmente trabajando en rutinas debúsqueda indexadas para la caracterís-tica de búsqueda de palabras claves.Tan sólo hay que crear una vez unarchivo índice, para acelerar cualquierbúsqueda. Una búsqueda que tarda 168segundos actualmente, tardaría tan sólo2 segundos con el uso de la nueva téc-nica.

ConclusiónLa combinación de Sleuthkit conAutopsy Forensic Browser proporciona

un conjunto de herramientas bastantepotentes para la realización de análisisforenses. Sus características y serviciosson comparables con las herramientascomerciales. El hecho de que sea decódigo abierto permite a los investi-gadores seguir el rastro de los progresosde la herramienta en detalle. �

este modo evitar ser detectados. El ata-cante parece que ha reemplazado loscomandos estándar del rootkit por vari-antes. El contenido del fichero es el si-guiente:

#!/bin/sh

HIDE=$1

echo "hiding $HIDE from ps/top"

/bin/echo "2 $HIDE" >>/dev/ptyp

Los comandos ps y top modificados leen/dev/ptyp con el objetivo de ocultar estosprocesos. El fichero contiene las si-guientes entradas:

2 slice2

2 snif

2 pscan

2 imp

3 qd

...

El análisis del comando ps con strings ocon la interfaz Autopsy, muestra que estecomando contiene la cadena /dev/ptyp.Esto demuestra nuestra hipótesis previa,ya que la versión original del comandops no lee este archivo.

TroyanosEl servidor SSH instalado por el ata-cante es otro fichero interesante./usr/local/sbin/sshd contiene una refe-rencia a /usr/tmp/nap. La referencia esfácil de localizar. Tan sólo hay que miraral carácter separador /. /usr/tmp es unenlace simbólico a /var/tmp. El fichero/var/tmp/nap contiene la siguiente infor-mación:

username: root password: U

tw1Lightz0ne hostname: U

c871553-b.jffsn1.mo.home.com

En otras palabras, el servidor SSH insta-lado por el intruso almacena cualquiercontraseña que recibe en formato texto.

Funciones AvanzadasAutopsy proporciona un número adi-cional de funciones, tales comobúsquedas de palabras claves, clasifi-cación de ficheros por tipo y accesodirecto al contenido de los ficheros. Unade las mayores ventajas de usar Autopsyes la posibilidad de calcular las sumas decontrol MD5 al vuelo y de añadir comen-

58 Número 03 www.linuxmagazine.com.es

Autopsy / SleuthkitADMINISTRACIÓN

[1] Autopsy Forensic Browser:http://autopsy.

sf.net

[2] Paquetes RPM Autopsy y Sleuthkit:http://

www.spenneberg.org/Forensics/

[3] Ficheros del Desafío Forense:http://

project.honeynet.org/challenge/images.

html

RECURSOS

Figura 7: El módulo de análisis de ficheros de Autopsy permite mostrar cualquier fichero del sistema de

ficheros, incluso los borrados (resaltados en rojo). El panel inferior de la derecha muestra el contenido

del fichero borrado install-named

Figura 6: Reconstrucción de Autopsy de un rootkit. Las columnas contienen las fechas y horas, tamaños,

acciones (a para access,m para modify), privilegios,UID,GID, número de inodos y nombres de los

ficheros en cuestión.

Page 59: Linux Magazine - Edición en Castellano, Nº 03

La teoría sobre Software Suspend essencilla: Linux escribe el contenidode la memoria y otros buffers, como

la memoria gráfica, a la partición deswap y luego apaga la máquina. La pró-xima vez que se encienda el ordenador,Linux comprueba la partición de swap,detecta que el sistema operativo fue apa-gado, pero de forma diferente a como seapaga normalmente, que se detuvo porSoftware Suspend y restaura la memoriadesde los archivos existentes. Esta formade actuar ignora la BIOS y su sistema decontrol de energía, así que no hay porqué preocuparse por los errores de laBIOS. Esto es una buena noticia para losusuarios cuyos ordenadores no soportanla suspensión interna APM o ACPI.

En un mundo perfecto, SoftwareSuspend funcionaría perfectamente ¿nosería maravilloso que la vida fuera así desimple? El gran obstáculo para el sistemaoperativo es la captura de los datos de lamemoria. Para hacerlo, Linux tiene quelanzar un nuevo proceso que cambia elcontenido actual de la memoria. En otraspalabras, el sistema tiene que estar en unestado tan estable como sea posibleantes de ponerlo a dormir. Y hay algunosdrivers que se niegan a cooperar (porejemplo, los adaptadores gráficos deNVidia y ATI).

Tres sistemas diferentesEn el momento de escribir este artículo,hay disponible tres soluciones diferentesde Software Suspend. Todas ellas origi-nadas por el mismo proyecto y basadaslas tres en el mismo principio.

Software Suspend (Swsusp), la origi-nal, está implementada en el kernel 2.6,

que elimina la necesidad de instalarlo.Como inconveniente, necesita de unaBIOS ACPI compatible.

El proyecto PMDisk fue una de lasramas en las que se dividió swsusp paraañadirle unas pocas mejoras. PMDiskestá también en el kernel 2.6. La ventajaque PMDisk ofrece es que no necesitaACPI. El equipo del kernel mezcló losavances realizados por los dos proyectosbajo el nombre original Swsusp [1].

Software Suspend 2 (Swsusp2) [2] esotra mejora a la versión Swsusp. ComoPMDisk, no necesita una BIOS con el sis-tema de control de energía y tiene algu-nas características extra. Por ejemplo,ahorra espacio comprimiendo el archivode memoria. En vez de usar la particiónde swap, puede usar un archivo de swapen la partición de datos. Además,Swsusp2 funciona con sistemas multi-procesadores. El reverso de la moneda esque Swsusp2 no está incluido en el ker-nel y por lo tanto hay que parchearlo yrecompilarlo manualmente.

La pregunta es: ¿Cuál de estos tres sis-temas de Software Suspend es la eleccióncorrecta para usted? Las integradas en elkernel son sin duda las opciones más sen-cillas, ya que eliminan las tareas de par-chear y recompilar. Sin embargo, comoninguno de los tres sistemas está real-mente maduro, podría darse el caso que elque más le guste de los tres no soporte suhardware; así que el proceso entero impli-ca seguir el proceso de la prueba y error.

Los tres sistemas de Software Suspendsuponen que su partición de swap es lobastante grande. Dos veces la cantidadde memoria RAM proporcionará un mar-gen suficiente de seguridad.

Afortunadamente, el ordenador no secolgará si se queda sin espacio, sino quesimplemente debería salir del proceso desuspensión.

Sofware Suspend, el originalEl kernel 2.6 incluye swsusp por defecto,pero no todas las distribuciones tienenhabilitada la opción en el kernel que sumi-nistran. Suse y Mandrake habilitanswsusp, mientras que los usuarios deDebian y Fedora tendrán que empezar apreparar sus compiladores. Hay que habi-litar la opción CONFIG_SOFTWARE_SUS-

PEND bajo Power management options

(ACPI, APM) y recompilar el kernel.Nótese que swsusp necesita ACPI.

También es necesario añadir unparámetro al cargador del sistema.Suponiendo que se tenga instalado grub,que es el cargador estándar actual paraSuse y la mayoría de las distribuciones,se necesita editar el archivo/boot/grub/menu.lst. Localizar la líneadel kernel que esté utilizando y añadirresume=/dev/hdaX sustituyendo/dev/hdaX por la partición de swap, porejemplo /dev/hda6. Puede teclear fdisk -l

/dev/hda | grep swap para identificar lapartición swap de su sistema.

Para no cometer errores y curarse ensalud, copie la entrada completa y creeuna entrada nueva en la lista del menúde arranque. Asígnele un nombre dife-rente a esta entrada, por ejemplo,poniéndole noresume en la línea título.Ahora borre el parámetro resume en lalínea kernel de la nueva entrada y añadapmdisk=off noresume noresume2. Estaentrada le permitirá reiniciar la máquinasi falla el arranque tras haber entrado en

59www.linuxmagazine.com.es Número 03

ADMINISTRACIÓNSoftware Suspend

Casi todas las placas bases tienen la característica de control de energía, dise-

ñada para apagar el ordenador y ponerlo en modo suspendido. En la vida real,

esta característica no siempre funciona. Linux tiene varias alternativas para

tratar de solucionar el problema.

POR SIMON RUTISHAUSER

Trabajando con Software Suspend

Sueño Profundo

Page 60: Linux Magazine - Edición en Castellano, Nº 03

usuarios de Debian tendrán que usar init

2; hay que parar manualmente el servi-cio de login gráfico tecleando/etc/init.d/kdm stop, suponiendo que seesté usando KDM.

Si este test también funciona, teclee init

5 y repita el proceso con el GUI; los usua-rios de Debian pueden lanzar el serviciode login tecleando /etc/init.d/kdm start.

Si está usando el GUI sin aplicacionesque consuman mucha memoria, el orde-nador debería tardar entre 10 o 20 segun-dos en suspenderse y entre 30 y 40segundos en volver a activarse. Estostiempos pueden variar dependiendo dela velocidad del ordenador y de cuantamemoria esté usando en el momento deentrar en el modo de suspensión.

PMDiskComo swsusp, PMDisk fue presentadoen la versión 2.6 del kernel. La diferenciamás importante entre el proyectoPMDisk y swsusp es que PMDisk nonecesita ACPI, lo que es una buena noti-cia para los ordenadores que usen APM.PMDisk tabién funciona a veces enmáquinas que tienen ACPI pero noentran en modo de suspensión usandoswsusp.

Como PMDisk es un pariente cercanode swsusp, apenas hay diferencias en laforma de usar los programas. La mayoríade las distribuciones del kernel tienen laopción requerida activada por defecto.En Debian, hay que habilitarCONFIG_PM_DISK y recompilar el ker-nel.

Luego, hay que editar el archivo delgestor de arranque, /boot/grub/menu.lst,igual que se hizo para swsusp, perousando pmdisk=/dev/hdaX en vez de laopción resume:

title SuSE Linux

kernel (hd0,1)/boot/U

vmlinuz root=U

/dev/hda2 vga=U

791 pmdisk=U

/dev/hda6

initrd (hd0,1) U

/boot/initrd

Añadésele por seguridad pmdisk=off taly como se describió en la sección deswsusp.

Ahora se puede teclear sync && echo

-n "disk2 > /sys/power/state para habili-

tar PMDisk. El comando sync se incluyepor razones de seguridad; almacena losdatos en un archivo temporal del sis-tema, por si el ordenador se cuelga cuan-do se habilite PMDisk.

Software Suspend 2Software Suspend 2 [2] está tambiénbasado en el Software Suspend original,aunque tiene nuevas características. Envez de escribir en la partición de laswap, Software Suspend 2 puede alma-cenar los datos de memoria en el sistemade ficheros; comprime los datos antes dealmacenarlos y soporta sistemas conmúltiples CPU y con más de 1 Gigabytede RAM. Swsusp2 puede manejar inclu-so particiones swap encriptadas.

Software Suspend 2 incluye algunascaracterísticas avanzadas bajo el ala. Porejemplo, swsusp2 usa los llamados“freezers”, que soportan una ejecuciónmejorada del proceso de hibernación.Además, el programa elimina los datossuperfluos de la memoria caché paraahorrar espacio en la partición swap.

Desafortunadamente, SoftwareSuspend 2 no ha sido incluido en el ker-nel oficial 2.6. Para usar swsusp2, senecesita aplicar un parche al códigofuente del kernel y recompilarlo.

Parcheando el kernelLos parches del kernel para SoftwareSuspend 2 están disponibles en el sitioweb [2]. Allí se encontrarán las últimasversiones, además de las antiguas.

Las distribuciones que usan kernelsmodificados pueden presentar algunosproblemas, ya que las distribucionesespecíficas a menudo entran en conflictocon el parche swsusp2, así que serámejor que se pruebe en un kernel sinalterar. La siguiente descripción se basaen la versión 2.6.8.1 del kernel.

Conectados como root, hay que entraren el directorio /usr/src y descomprimirel kernel tecleando tar xjf

linux-2.6.8.1.tar.bz2. Luego hay queintroducir tar xjf sotware-sus-

pend-2.0.0.105.tar.bz2 para descompri-mir el parche swsusp2.

Ahora es el momento de aplicarle elparche al kernel. Para ello, hay queentrar en el directorio/usr/src/linux-2.6.8.1/ y teclear ../soft-

ware-suspend-2.0.0.105-for-2.6.8.1/apply

. El script da la opción de añadir algunos

modo suspendido. Después de completarlos cambios, el contenido de/boot/grub/menú.lst debe ser como elmostrado en el Listado 1.

La primera entrada es la que necesita-mos cuando rearrancamos (esta es laentrada del Linux SuSE de nuestro labo-ratorio). La entrada arranca el ordenadorde forma normal y lo reanuda despuésde haber sido suspendido. La segundaentrada, SuSE Linux noresume, es nues-tro salvavidas en caso de que algo vayamal. Swsusp no necesita en realidad lasopciones pmdisk=off y noresume2;hacen lo mismo que noresume para losotros dos sistemas de Software Suspend.

En Suse, el programa powersave mane-jará el ahorro de energía por defecto, yno swsusp. Para cambiarlo, hay quelocalizar el archivo /etc/powersave.conf ycambiar la entrada POWERSAVED_DIS-

ABLE_USER_SUSPEND de yes a no.Sólo en el caso de que las cosas vayan

mal, tiene sentido entrar en el modomonousuario; así que habrá que intro-ducir init 1. Ahora tan sólo hay queteclear la clave del root para poner lamáquina en modo suspendido. En Susehay que teclear /etc/init.d/powersaved

start para lanzar el servicio powersave yluego escribir powersave --suspend. Enotras distribuciones sólo con teclear elcomando: sync && echo 4 >

/proc/acpi/sleep es suficiente.Si esta prueba funciona, habrá que

probar los runlevels, empezando con elmodo multiusuario sin GUI (init 3). Los

60 Número 03 www.linuxmagazine.com.es

Software SuspendADMINISTRACIÓN

01 title SuSE Linux

02 kernel (hd0,1)/boot/

03 vmlinuz root=/dev/hda2

vga=791

04 resume=/dev/hda6

05 initrd

06 (hd0,1)/boot/initrd

07

08 title SuSE Linux

09 noresume

10 kernel

11 (hd0,1)/boot/vmlinuz

12 root=/dev/hda2 vga=791

13 pmdisk=off noresume

noresume2

14 initrd

15 (hd0,1)/boot/initrd

Listado 1: Grub Menu List

Page 61: Linux Magazine - Edición en Castellano, Nº 03

extras. La mayoría de estos extras soninnecesarios, por lo que típicamente seacepta la configuración por defecto pre-sionando [Enter]. Si todo ha ido bien lasalida mostrada debería ser similar a laque aparece en el listado 2.

El siguiente paso es configurar elnuevo kernel. Para usar las opcionesactuales, hay que copiar el fichero deconfiguración del kernel actual al direc-torio del nuevo kernel escribiendo cp

/boot/config-X

/usr/src/linux-2.6.8.1/.config. Hay queasegurarse de reemplazar la X por elnombre de la versión actual del kernel.

Después hay que continuar modifican-do la configuración de manera que seajuste a sus necesidades. Si se tieneninstalados los paquetes ncurses-devel oncurses-dev, tecleando make menuconfig

se mostrará un sistema de configuraciónbasados en menú en modo texto. Hayque usar las flechas del teclado y la tecla[Enter] para navegar por los elementos.Se selecciona la entrada de menú Power

management options (ACPI, APM) y se

desabilita Software Suspend (EXPERI-MENTAL) y las entradas Suspend-to-Disk Support presionando la tecla [n];

estas entradas son para el otro sistema de

suspensión software.

Bajo estas entradas, debería verse elmenú Software Suspend 2. Hay que pre-sionar [y] en las entradas Software

Suspend 2, Swap Writer, LZF image com-

presion, Text mode console support yCompile in debugging output para habili-tarlas. La última de estas opciones pro-porciona mensajes de depuración másdetallados (Cuadro 1) y puede ser útil ensituaciones en las que se presenten pro-blemas. Suponiendo que no se deseemodificar nada más, hay que presionartres veces [Alt+e] para salir del configu-rador del kernel.

Para recompilar el kernel recién con-figurado hay que introducir make

bzImage && make modules modules

_install. Dependiendo de la velocidaddel microprocesador y la configuración,esto puede tardar unas cuantas horas.Cuando haya concluido, hay que copiarel nuevo kernel al directorio de arranque/boot/: cp arch/i386/boot/bzImage

/boot/vmlinuz-suspend2.A continuación teclee mkinitrd para

crear un disco ram inicial para el nuevokernel; es decir, a menos que hayarecompilado todos los drivers que senecesitan para leer el sistema de ficherosraíz en el nuevo kernel.

Se necesita introducir una nueva entra-da en el gestor de arranque para quearranque el nuevo kernel; si se está usan-do grub, añádase las siguientes líneas a/boot/grub/menu.lst, asegurándose quese modifica la partición de modo querefleje la configuración de su sistema:

title SuSE Linux - U

SoftwareSuspendU

2.0.0.105

kernel (hd0,1)/boot/ U

vmlinuz- U

suspend2 root= U

/dev/hda2

vga=791 U

resume2=swap: U

/dev/hda6

initrd (hd0,1)/boot/ U

initrd-suspend2

Nuestro ejemplo usa la partición/dev/hda2 como el sistema de ficherosraíz. En la jerga de grub, está partición sereferencia como hd0,1, donde hd0 es elprimer disco duro, es decir, hda, y el 1que le sigue a la coma se refiere a lasegunda partición, es decir, hda2. La par-tición swap está ubicada en /dev/hda6.Se está usando la convención de Susepara los nombres de las entradas delmenú, aunque se puede escribir lo quese quiera en la línea del título (title). Sise sigue el ejemplo, se debería tener unaentrada denominada Suse Linux -

Software Suspend 2.0.0.105 en el menúde arranque cuando se inicie el nuevokernel.

Configuración del ScriptHibernateEl sitio web de Software Suspend [2]también proporciona el paqueteHibernate. Hibernate contiene losficheros de configuración y el scripthibernate, que inicia el modo de suspen-sión. Entrando como root, tecléese rpm

-Uvh hibernate-0.98-1.i386.rpm parainstalarlo; en Debian hay que tecleardpkg -i hibernate-0.98-1_all.deb.

Se necesita echar un vistazo al scriptde configuración de Hibernate en/etc/hibernate/hibernate.conf para ase-gurarse que Software Suspend 2 fun-cionará tal y como se espera que fun-cione. En la mayoría de los casos sepuede dejar la configuración por defecto.Pero podría ser necesario añadir las si-guientes líneas:

RestartServices hotplug

StopServices alsasound

StartServices aumix

LeaveXBeforeSuspend yes

La línea RestartServices hotplug le dice alscript que pare el servicio hotplug antesde suspenderse y que lo reinicie despuésde que se despierte; esto asegura que los

61www.linuxmagazine.com.es Número 03

ADMINISTRACIÓNSoftware Suspend

Figura 2: Configuración del kernel para Software

Suspend 2.

01 /usr/src/linux-2.6.8.1 #

../software-suspend-2.0.0.105-

for-2.6.8.1/apply

02 Apply KDB patches (for serious

debugging capabilities) [yN]?

03 Apply Bootsplash patches

(includes bootsplash.org

patch) [yN]?

04 Apply Win4Lin support patches

[yN]?

05 Applying

20-software-suspend-linux-2.6.

8.1-rev1-whole ...

06 Applying

21-software-suspend-linux-2.6.

8.1-rev2-incremental ...

07 Applying

21-software-suspend-linux-2.6.

8.1-rev3-incremental ...

08 Applying

30-software-suspend-core-2.0.0

.104-whole ...

09 Applying

31-software-suspend-core-2.0.0

.105-incremental ...

10 All happy!

Listado 2: Salida del scriptSoftware Suspend 2

Page 62: Linux Magazine - Edición en Castellano, Nº 03

bar que funciona, hay que seguir los pasosindicados anteriormente para lanzar hiber-

nate en modo multiusuario sin la GUI yfinalmente con la GUI.

Habilitando Hibernate paralos usuarios sin privilegiosSe necesitan los privilegios de rootpara pasar a modo suspendido,aunque los usuarios sin estos privile-gios podrían beneficiarse también deesta característica. Para permitir quelos usuarios sin privilegios puedanusar las capacidades de suspensión,hay que instalar primero el paquetesudo, si lo necesita (la mayoría de lasdistribuciones incluyen sudo pordefecto). Como root, modifíquese elfichero de configuración /etc/sudoers

como sigue:

User_Alias USERS = U

simon, whoever

Cmnd_Alias HIBERNATE = U

/usr/sbin/hibernate

USERS ALL=NOPASSWD: U

HIBERNATE

Este cambio permite a los usuariossimon y whoever lanzar/usr/sbin/hibernate invocando sudo

/usr/sbin/hibernate sin tener que intro-ducir la contraseña. �

dispositivos tales como ratones USB yteclados funcionarán bien una vez des-pertados. Las siguientes dos líneasdetienen el sistema de sonido antes desuspenderse y restaura el nivel de volu-men después de despertarse. Por último,LeaveXBeforeSuspend le indica al sis-tema que se pase a una consola en modotexto antes de suspenderse y que entrede nuevo en la GUI después de desper-tarse. Sin estas opciones, se experimen-tarán una serie de anomalías en el sis-tema de ventanas y el teclado.

Una vez realizados estos pasos, es elmomento de lanzar el test. Hay que teclearinit 1 para entrar en el modo monousuario.Entonces introduciendo hibernate se pasaa modo suspendido. Si todo ha salido bien,el sistema volverá al mismo estado unavez que se haya despertado. Tras compro-

62 Número 03 www.linuxmagazine.com.es

Software SuspendADMINISTRACIÓN

Diversas razones pueden impedir que

Software Suspend funcione y la mayoría de

ellas no son específicas del sistema.

Si el proceso suspend se sale sin terminar o la

máquina se cuelga, teclee free para compro-

bar si se tiene espacio suficiente en la parti-

ción de swap; será necesario reiniciar para

realizarlo. Si el espacio en swap no es el pro-

blema, habrá que comprobar los parámetros

de arranque para ver si se entra en la parti-

ción correcta cuando se despierte.

Si la máquina falla a la hora de despertarse el

resultado puede ser una partición de swap

incorrecta, en este caso la partición no

mostrará como free. Para formatearla y acti-

varla de nuevo hay que introducir mkswap

/dev/hdaX, seguido de swapon /dev/hdaX.

Otra posible fuente potencial de errores son

los módulos de bajo nivel del kernel. Para

comprobar si éste es el caso, tecléese init 1

para entrar en modo monousuario. Luego

habrá que introducir lsmode para mostrar la

lista de módulos activos y eliminar tantos

como sea posible con el comando modprobe

-r. Los sospechosos habituales son los módu-

los del sonido,USB y AGP.

La salida de dmesg después de una suspen-

sión fallida a menudo indica la causa del

fallo.

Si Software Suspend 2 provoca el cuelgue

después de mostrar la barra de progreso en

la pantalla, pulsando [Esc] normalmente

cancelará el proceso y devolverá al sistema

al estado actual. En caso de que dmesg no

proporcionara la información necesaria

para determinar la causa del fallo, habrá

que habilitar la función de información de

depuración integrada como sigue:

thinkpad:~# cd

/proc/software_suspend

thinkpad:/proc/software_suspend#

echo 3 > default_console_level

thinkpad:/proc/software_suspend#

echo 1 > log_everything

thinkpad:/proc/software_suspend#

echo 7 > debug_sections

thinkpad:/proc/software_suspend#e

echo 1 > pause_between_steps

Luego habrá que introducir el siguiente coman-

do para lanzar el proceso de suspensión:

sync && echo 1 >

/proc/software_suspend/do_suspend

Esto proporciona una pantalla repleta de

información, donde habrá que pulsar la

tecla de espacio para confirmar cada paso.

Armado con estos mensajes individuales,

habrá que navegar por la página web de

swsusp2 [2] y comprobar el FAQ, el Wiki, la

lista de correo y la documentación restante

en busca de respuestas.

Si Software Suspend funciona en modo

monousuario, pero no en el runlevel nor-

mal, habrá que intentar averiguar qué ser-

vicio es el causante del fallo. Para localizar

al culpable, habrá que parar cualquier servi-

cio sospechoso, por ejemplo, tecleando

/etc/init.d/alsa stop si se sospecha de alsa.

Si este primer intento no funciona, siga

parando individualmente los servicios y

relance el modo suspendido hasta que se

encuentre al culpable.

Desde luego, puede darse la circunstancia de

que no se identifique el servicio que esté cau-

sando el fallo; en este caso, algún módulo del

kernel puede ser el culpable. Con lsmode lis-

tando los módulos activos, y como root,

empiece a eliminarlos uno a uno con rmmod

<nombredelmódulo>.

Si algún elemento hardware, como la tarjeta

de sonido o algún dispositivo USB, es el cau-

sante del fallo, se puede parar dicho elemen-

to antes de entrar en el modo de suspensión.

Como root, deténgase el servicio y elimínese

el módulo correspondiente del kernel.

Después de despertar al sistema habrá que

lanzar el servicio y cargar el módulo usando

modprobe. Si resultara imposible cargar el

módulo una vez que se haya despertado el

sistema, se puede probar a recompilar el

módulo dentro del kernel.

En el caso de Software Suspend 2, bajar a una

versión anterior podría ayudar, ya que el

proyecto está aún en desarrollo. La versión

2.0.0.93, en particular, presentó cambios

importantes en comparación con las ver-

siones anteriores. Algunos equipos portátiles

funcionan mejor después del cambio,pero su

hardware podría funcionar mejor con ver-

siones anteriores.

Si los problemas persisten a pesar de todas

estas pruebas, puede ser que tenga mejor

suerte con algunas de las otras implementa-

ciones de Software Suspend: en caso con-

trario,pruebe a escribir en alguna de las listas

de correo.

Cuadro 1:Problemas con Software Suspend

[1] El futuro de Swsusp y PMDisk:http://

kerneltrap.org/node/view/3485

[2] Software Suspend 2:http://

softwaresuspend.berlios.de

RECURSOS

Page 63: Linux Magazine - Edición en Castellano, Nº 03

Bienvenidos a Linux UserÉsta 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 apasionantes nuevas aplicaciones.

Herramientas: KHotKeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64Los gestos con el ratón y los atajos con el teclado añaden velocidad y simplicidad a las

operaciones con el PC. Los gestos de ratón solían ser coto privado de los usuarios de

Opera y de Mozilla,pero KHotKeys nos los ofrece ahora para Konqueror para usuarios

de KDE 3.2 o superior.

Desktopia: KRecipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67No es necesario hacer malabarismos con libros de cocina simplemente para hacer

felices a esos amigos que hemos invitado a comer.Krecipes permite a los chefs afi-

cionados a gestionar sus recetas e incluso crear la lista de la compra.Además nos

puede ayudar con una dieta si lo necesitamos.

Aplicaciones: KDM/GDM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73Tanto KDE como GNOME disponen de gestores de pantallas.Veremos las característi-

cas ofrecidas por KDM y GDM y examinaremos como configurar un gestor de pantalla

en nuestro sistema Linux.

Programación Básica: XUL (III) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76En los primeros capítulos de nuestra serie de XUL hemos estado principalmente

mirando los conceptos básicos del lenguaje.A medida que nuestro viaje ha continu-

ado hemos explorado botones,etiquetas y gestión de geometrías,comenzando el mes

pasado a conectar funcionalidad a nuestro interfaz.

Educación:WIMS (III) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81Con este artículo cerramos la serie que hemos dedicado al servidor de recursos educa-

tivos WIMS,recapitulamos su uso en una clase y hacemos lo que creemos que es un

interesante y necesario balance pedagógico de la aplicación.

Linea de Comandos: su y sudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84Para más seguridad,aunque tenga privilegios de rootpara un sistema, tiene sentido

utilizarlos solo temporalmente para prevenir daños accidentales. su y sudo le per-

miten cambiar la identidad rápidamente desde la línea de ordenes.

Iniciación a LaTeX (III) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87En esta nueva entrega sobre el procesador de textos LaTeX,vemos como crear tablas y

fórmulas matemáticas con LaTeX,siendo esta última funcionalidad una de las más

espectaculares del compilador tipográfico y uno de los motivos por el cual es tan popu-

lar en círculos académicos.

Page 64: Linux Magazine - Edición en Castellano, Nº 03

64 Número 03 www.linuxmagazine.com.es

KToolsLINUX USER

vez nos acostumbremos a Khotkeysaparecerán nuestras propias ideas deteclas rápidas y gestos que incremen-tarán la efectividad de nuestro escritorio.

Gestos de RatónLa ventana del programa está dividida endos paneles. El panel izquierdo tieneunos ejemplos y un gesto de ratón deKonqueror. El panel derecho contiene losajustes de acciones individuales queestán distribuidas en una serie de pes-tañas. Por defecto KDE habilita los atajosde KHotKeys y Konqueror entiende losgestos del ratón.

Si los gestos de ratón no funcionancon nuestra distribución, debemos com-probar la pantalla de bienvenida del cen-tro de control de KDE para ver si real-mente tenemos la versión 3.2 o superior.Luego abrimos Global shortcuts (AtajosGenerales) en la parte derecha del panelde Khotkeys y quitamos la marca de lacasilla Disable KHotKeys daemon

(Deshabilitar el demonio KhotKeys. VerFigura 1) si es necesario. Confirmamospulsando Apply (Aplicar) y luegocambiamos a la pestaña Gestures Set-

tings. Quitamos la marca de la casillaDisable mouse gestures globally (Desha-bilitar los Gestos de Ratón en General) yconfirmamos pulsando Apply.

Los gestos pueden ser habilitados odeshabilitados individualmente. Pulsan-do en el signo de suma a la izquierda deKonqueror Gestures (Gestos de Kon-queror) en el panel de la izquierda revelauna lista de gestos comunes quepodemos habilitar o deshabilitar segúndeseemos. Para deshabilitar un gesto dela lista pulsamos sobre el y marcamos lacasilla Disable en el panel de la derecha.

El panel de la derecha contienecomentarios sobre los gestos existentes.Un comentario describe el movimientoasociado con el gesto. No obstantepodemos editar el comentario si no esta-mos contentos con ellos. Guardamosnuestros cambios pulsando Apply y con-tinuamos probando los gestos del ratóncon Konqueror.

Creando nuestros propiosgestosKHotKeys nos permite reemplazar gestosexistentes o añadir nuestros propios

KDE es un sistema extremada-mente flexible. Los menús contex-tuales que se despliegan cuando

los usuarios presionan en el botón dere-cho del ratón son tan aplicables como elmenú K o los iconos de inicio rápido. Yescondido en las profundidades del cen-tro de control de KDE hay otro intere-sante programa que permite un uso másflexible de KDE: KHotKeys. ConKhotKeys, el usuario puede asignar com-binaciones de teclado a aplicaciones.Incluso podemos usar gestos de ratónpara controlar Konqueror (ver cuadro 1).

Para lanzar KhotKeys debemos pre-sionar [Alt-F2] e introducir khotkeys oabrir el centro de control y abrir la sec-ción Regional & Accessibility (Regiones yAccesibilidad). Cuando lanzamosKhotKeys aparece un mensaje de adver-tencia informando de que los cambiosrealizados pueden ser peligrosos. Esteartículo nos proporciona una introduc-ción a algunos simples pero efectivosajustes con la aplicación KhotKeys.Siempre ayuda ser precavido, pero ten-dremos pocos temores acerca de estoscambios incluso si somos nuevos. Una

Gestos de ratón y atajos de teclado con KHotKeys

CharadaLos gestos con el ratón y los atajos

con el teclado añaden velocidad y

simplicidad a las operaciones con el

PC. Los gestos de ratón solían ser coto

privado de los usuarios de Opera y de

Mozilla, pero KHotKeys las ofrece

ahora a Konqueror para usuarios de

KDE 3.2 o superior. Incluso podemos

lanzar programas no-KDE con

KHotKeys.

POR KALLE GERWIEN

Page 65: Linux Magazine - Edición en Castellano, Nº 03

65www.linuxmagazine.com.es Número 03

LINUX USERKTools

acción: en nuestro ejemplo de Gesture

-> Keyboard input (simple). Esto indicaa KHotKeys que debe convertir el gestorealizado en un atajo de teclado. Porejemplo podemos especificar que nues-tro gesto sea interpretado como[Ctrl]+[U] para mostrar el código fuenteen un documento HTML Tiene sentidodecir que aspecto tiene el gesto comoparte del comentario.

Ahora cambiamos a la pestaña Ges-

tures, pulsamos Edit y dibujamos elnuevo gesto. Tras completar y este pro-cedimiento pulsamos en la pestaña Key-

board input settings. En la caja Keyboard

input especificamos las teclas quedeseamos emular. Comprobaremos losatajos del teclado de Konqueror. El ele-mento View Document Source (ver docu-mento fuente) está localizado en elmenú View. Tenemos que escribir elatajo de teclado mostrado para este ele-mento en la caja Keyboard input. En estecaso la entrada correcta es Ctrl+U.

Acabamos la programación del nuevogesto pulsando Apply. El gesto estáahora habilitado y puede ser usado enKonqueror. Podemos seguir el mismoprocedimiento para añadir gestos deratón para todas las funciones que nece-

sitemos. Debemos evitar gestosextremadamente extravagantes, puestoque cuanto más difícil sea el gesto deejecutar más tiempo necesitamos paraejecutar la función.

Atajos de TecladoComo sugiere su nombre, KHotKeys nosolo soporta la programación de gestosde ratón, si no que también puede usaratajos de teclado para lanzar programaso escribir líneas de texto en un editor.Tiene sentido ajustar un grupo deacciones separado para esto. Para haceresto seleccionamos General Settings yluego pulsamos sobre New Group.Escribimos un nombre para el grupo enla pestaña General. Ahora seleccionamosel recién creado grupo y pulsamos New

Action. Queremos que la nueva acciónuse una tecla rápida para lanzar el pro-grama Kmail.

Launch Kmail (lanzar Kmail) es unbuen nombre y muy descriptivo. Siusamos un programa de correo dife-rente elegiremos otro nombre distintoacorde con el mismo. Como tipo deacción, seleccionaremos Keyboard short-

cut -> Command/URL simple. Ahorapulsaremos en la pestaña Keyboard

gestos. KHotKeys tiene tres gestos posi-bles para cada acción. Seleccionamos elgestos requerido en el panel Actions ypulsamos en la pestaña Gestures en elpanel de la derecha. El panel nos mues-tra tres campos para tres posibles gestos,si bien normalmente solo el primercampo esta completo.

Si pulsamos el botón Edit para los tresprimeros campos, KHotKeys abre unanueva ventana. Entonces podemosinsertar un nuevo gesto. Debemos ase-gurarnos de mantener pulsado el botónde la izquierda al arrastrar el gesto,puesto que el botón central está reser-vado para ejecutar los gestos. Para ase-gurarnos de que nuestro gesto es únicotenemos que realizarlo dos veces. Si losdos gestos son muy poco similares elprograma no acepta el gesto y nossolicita repetir el procedimiento. Trasinsertar los tres gestos al nivel exigidopor KhotKey podemos pulsar OK paraalmacenar los gestos. El nuevo gestoentonces aparecerá en la segunda ven-tana con un ID único.

Nuevas funcionesSi necesitamos programar una funciónKonqueror pero no podemos encontrarun ejemplo en el que basarnos, selec-cionamos Konqueror Gestures y luegopulsamos New Action (Nueva acción).Esto crea una nueva entrada con esenombre. En el panel de la derechaescribimos un nombre descriptivo parala acción en Action name (Nombre de laacción). Ahora seleccionamos el tipo de

Figura 2:Gestos de ratón comunes.

Opera Software introdujo los gestos de ratón en el buscador de Internet Opera. Opera simple-

mente buscaba una solución que permitiera a los usuarios realizar las acciones más comunes en

un buscador, como Atrás,Adelante o Actualizar sin tener que navegar a través de los menús con el

ratón. El resultado fue la introducción de gestos de ratón que no habían sido introducidos por los

desarrolladores de Mozilla y Konqueror.Debido a que Konqueror es también un gestor de archivos,

los gestos de ratón también pueden ser utilizados para navegar por directorios locales.

Los gestos de ratón son tremendamente simples y pasan a ser movimientos naturales tras un

breve periodo de tiempo de aprendizaje. Presionamos el botón central del ratón, ejecutamos el

gesto con el ratón y soltamos el botón del ratón. Por ejemplo, para volver atrás una página en un

buscador (Browser back), gesticulamos una línea desde la derecha a la izquierda (ver figura 2). El

gesto es interpretado por Konqueror y el resultado es la acción deseada.

Cuadro 1: Gestos de ratón

Figura 1: KHotKeys no

interpretará los

gestos del ratón si el

demonio Disable

KhotKeys está mar-

cado.

Figura 3: Repetire-

mos el gesto de

ratón tres veces en

esta ventana.

Page 66: Linux Magazine - Edición en Castellano, Nº 03

66 Número 03 www.linuxmagazine.com.es

KToolsLINUX USER

short-cut. Deberemos ver un botón lla-mado None (Ninguno). Pulsamos elbotón con nuestro ratón e introducimosel atajo de teclado de nuestra elección,por ejemplo [Ctrl]+[K]. Si nuestra elec-ción de tecla rápida ya está siendousada nos lo indicará KhotKeys. Si no esasí el programa simplemente acepta ymuestra la entrada en una lista. Ahoranos movemos a la pestañaCommand/URL Settings y escribimos elprograma que deseamos que se lancecon KhotKeys. Para Kmail escribimoskmail. Para lanzar Kmail podíamoshaber seleccionado K-Menu Entry (sim-

ple) en su lugar. Esto escribe entradasde acceso en el menú K.

Saludos CordialesKeyboard Shortcut -> Keyboard Input

(simple) es un tipo de acción interesante.Nos permite simular pulsaciones deteclas. Usaremos la frase With kind

regards, Joe Public (Saludos cordiales,Joe Public) como ejemplo. Es una despe-dida típica para una carta en un proce-sador de texto, programa de correo, lec-tor de noticias o editor de texto.KHotKeys nos proporciona la posibilidadde introducir esta frase automáticamenteindependientemente de la aplicación queestemos usando.

Primero creamos una nueva entradaen el grupo de atajos del teclado pulsan-do en New Action. Podemos llamar a laentrada wkr. Seleccionamos Keyboard

Shortcut -> Keyboard Input (simple)

como el tipo de acción. Escribimos

Writes "With kind

regards" plus

name como elcomentario. Ahoracambiamos a lapestaña Keyboard

shortcut y elegi-mos una tecla rá-pida, por ejemplo[Ctrl]+[Y].Entonces nosmovemos a Key-

board input set-

tings y escribimostodas las teclasque necesitemospresionar como sifuéramos aescribir la frasecompleta. Debe-

mos asegurarnos de separar las pulsa-ciones individuales de teclas con dospuntos (:). La frase que deseamos intro-ducir, With kind regards, Joe Public, ten-drá la siguiente apariencia en la caja dedatos:

Shift+W:i:t:h:space:k:i:n:dU

::space:r:e:g:a:r:d:s:,:spaceU

::return:Shift+J:o:e:U

:space:Shift+P:u:b:l:i:c:

Tenemos que añadir la palabra claveShift+ para las mayúsculas. La tabla 1muestra más información respecto ateclas de control.

Control de MenúsEn este ejemplo hemos aprendido comosimular pulsaciones de teclas y comousarlas para escribir simples bloques detexto. Es igual de simple simular el acce-so a menús en programas. Algunoscaracterísticas de programas están ocul-tas en submenús, lo que puede sermolesto si las necesitamos habitual-mente. Por ejemplo, para acceder a View

/ View mode / Multicolumn view pul-saríamos [Alt+A] / [Cursor right] /[Cursor down] / [Cursor down] /[Enter]. Podemos dejar que KHotKeyssimule estas teclas para acceder a la vistamulticolumna con un gesto del ratón outilizando un simple atajo de teclado.

Para hacer esto primero creamos otraentrada Keyboard shortcut -> Keyboard

input (simple), le asignamos un atajo deteclado y escribimos un nombre descrip-

tivo. Como input del teclado escribimosalt+a:right:down:down:return. Esto nospermite navegar por menús incluso si lasfunciones no están disponibles vía sim-ples presiones de teclas.

Más tipos de accionesEl tipo de acción General nos permitecombinar gestos y atajos de teclado. Porejemplo podemos usar un gesto de ratón

para lanzar un programa o una tecla deacceso rápido para apuntar a una teclade acceso rápido definida por nosotrosmismos. Para hacerlo primero creamosuna nueva entrada y pulsamos New en lapestaña Trigger para especificar el tipo deactivación que deseamos: un atajo, ungesto o una ventana. Entonces especifi-camos que queremos que ocurra en lapestaña Actions. Podemos elegir entreCommand/URL, K-Menu Entry, DCOP

Call, Keyboard input y Activate Window.La pestaña Conditions nos permiteespecificar cuando debe ocurrir estaacción.

Restringiendo FuncionesSi hemos añadido muchas funcionespropias puede que notemos algunosefectos desagradables. Por ejemplopuede que otro programa use una denuestras teclas rápidas para otro menúcompletamente distinto. En este casodebemos habilitar la opción Send to spe-

cific window (Enviar a una ventanaespecífica) en la pestaña Keyboard input

settings. Añadimos un comentariodescriptivo y seleccionamos New | Sim-

ple Window. En el siguiente dialogodebemos especificar la ventana del pro-grama. Típicamente esto simplementeimplica añadir el nombre del programacomo título de la ventana (Konqueror ennuestro ejemplo). �

Función Comando

Cursor Arriba up

Cursor Abajo down

Cursor Izquierda left

Cursor Derecha right

Espacio space

Mayúsculas shift

Alt Alt

Intro return

Punto Shift+;

Tabla 1: Teclas de control

Figura 4: Separamos cada pulsación del teclado con dos puntos.

Page 67: Linux Magazine - Edición en Castellano, Nº 03

67www.linuxmagazine.com.es Número 03

LINUX USERKrecipes

madores para ofrecer su ayuda, estosestarán encantados de contar con ella.

La DespensaKrecipes almacena las recetas en unabase de datos, pudiendo elegirse actual-mente entre MySQL [2] y SQLite [3].PostgreSQL se añadirá más adelante,probablemente conjuntamente con laversión 1.0. El soporte para MySQL ySQLite es correcto, ¿pero qué base dedatos es mejor?

MySQL es extremadamente complejoy tiene su propio servidor de bases dedatos, el cual debe estar ejecutándosepara arrancar Krecipes. Si yadisponemos de un servidor de MySQLen nuestro ordenador podemos asignarel gestor de recetas a éste. Si no es así,probablemente prefiramos usarSQLite.

Para usar MySQL necesitamos insta-lar el paquete mysql, el Qt dev(el) y

qt3-mysql de los discos de nuestra dis-tribución. Si el paquete qt3-mysql noestá disponible, nuestra única opciónes compilar Qt, que creará un plug-inde MySQL para la librería (ver Cuadro1). No seremos capaces de ejecutarKrecipes con MySQL sin completarestos pasos.

Las cosas son más simples si optamospor SQLite, debido a que Krecipes imple-menta las funcionalidades requeridaspor sí mismo. Descargamos el paqueteSQLite de Internet [3]. Luego descom-primimos el paquete SQLite, cambiamosel directorio fuente y arrancamos la ruti-na de configuración:

tar xvzf sqlite-2.8.12.tar.gz

cd sqlite

./configure

Si esto funciona correctamente,podemos continuar con los pasos de

Solo tiene un año pero dispone deun gran número de ingredientes: elprograma de gestión de recetas

Krecipes [1] convierte nuestro ordenadorLinux en una útil herramienta para lacocina. El último paquete del programafue pre-arrancado justo antes de la Navi-dades del 2003 en la versión 0.4.1. Lostres desarrolladores que trabajan en elproyecto han estado cocinando de ver-dad desde entonces, esperando arrancarpróximamente la versión 0.5.

El módulo kdenonbeta CVS, almace-nado en los servidores KDE, dispone deun snapshot descragable. Krecipes espoco usual para ser un programa kde-

nonbeta en el sentido en que ha sidocapaz de entenderse con seis idiomasdesde la versión 0.4.1. Algunas de lastraducciones a estos idiomas no estáncompletas puesto que en algunos casosfalta la ayuda en línea, por lo que si ellector desear contactar a los progra-

Gestión de recetas con Krecipes

La Cocina de Cada DíaNo es necesario hacer malabarismos con

libros de cocina simplemente para hacer

felices a esos amigos que hemos invitado a

comer. Krecipes permite a los chefs aficiona-

dos a gestionar sus recetas e incluso crear la

lista de la compra. Además nos puede ayudar

con una dieta si lo necesitamos.

POR FRAUKE OSTER

Page 68: Linux Magazine - Edición en Castellano, Nº 03

68 Número 03 www.linuxmagazine.com.es

KrecipesLINUX USER

cd krecipes

./configure -with-qt-dir=

/directory

Para instalar escribimos los comandosmake y make install.

Si optamos por usar MySQL, nece-sitaremos arrancar el servidor de bases

de datos. Deberíamos ser capaces dearrancar el servidor MySQL o de ajustarel servidor de forma que se ejecuteautomáticamente cuando encedamosnuestra máquina.

La primera vez que ejecutemos nues-tra herramienta de gestión de recetasescribiendo krecipes & en la consola o

compilación e instalación. Podemosinstalar el sistema SQLite introduciendomake install. Esto requiere privilegiosde administrador:

make

su -c "make install"

Gestor de RecetasTras configurar la base de datos, losusuarios menos aventureros puedendescargar el código fuente del Krecipesde la página Web del proyecto. Cualquierotra persona puede arriesgarse a acudir ala versión de desarrollo KDE a través deCVS.

Sin importar la versión de Krecipeselegida, debemos asegurarnos de que elpaquete dev(el) kdelibs esté instalado ennuestro sistema. Si no es así, debemosinstalar el paquete apropiado(kdelibs3-devel-version.rpm o similar) denuestro distribución. Ésta es la únicaforma de construir programas KDE a par-tir de sus fuentes.

Si estamos usando las fuentes deKrecipes debemos primero descomprimirel archivo tar:

tar xvjf krecipes.tar.bz2

Ahora debemos cambiar al directoriokrecipes creado y arrancar la herramientade configuración. La herramienta necesi-ta la ruta al directorio raíz Qt:

Para compilar Qt necesitamos las fuentes de Qt que están disponibles bien en los discos de nues-

tra distribución o desde el fabricante de Qt,Trolltech [4].

Tras descomprimir el archivo debemos cambiar al directorio con el código fuente de Qt.Usaremos

la opción - plugin-sql-mysql para configurar las opciones de las librerías para añadir soporte

MySQL a Qt:

cd qt-directory

./configure -system-zlib -qt-gif

-system-libpng -system-libjpeg -

plugin-imgfmt-mng -thread -noexceptions

-plugin-sql-mysql

La opción de la configuración -system-zlib habilita el uso de la librería de compresión zlib en nues-

tra máquina y las librerías para los formatos de imágenes PNG y jpeg.En lugar de usar una librería

para el formato de imagen GIF deberíamos usar la función de Qt -qt -gif, necesitando Qt un com-

plemento para el formato de imagen MNG (“Multiple-Image Network Graphics”).

La opción -thread habilita el hilado múltiple de ejecución en programas basados en Qt. La opción

de configuración final que necesitamos habilitar por defecto es -no-exceptions, que significa que

no debemos esperar control de las excepciones según están definidas por los autores del progra-

ma.Como nos muestra el ejemplo,podemos añadir más opciones cuando llamemos el comando.

Tras finalizar con los pasos de la configuración debemos continuar con la construcción de la libre-

ría Qt y algunas herramientas necesarias para Qt y KDE:

make sub-src sub-tools

Puede que esto tarde un poco,pero no obstante no hay necesidad de instalar QT tras finalizar.

Cuadro 1: Compilanción de Qt para Añadir Soporte MySQL

Figura 1:MySQL insiste en configurar un usuario de base de datos. Figura 2:Una configuración de MySQL necesita credenciales de usuario.

Page 69: Linux Magazine - Edición en Castellano, Nº 03

69www.linuxmagazine.com.es Número 03

LINUX USERKrecipes

usuario tiene losprivilegiosrequeridos parala base de datoso si hemos dis-puesto unadministradorde sistema parala base de datos(ver figura 1). Sino selec-cionamos ningu-na de estasopciones y en sulugar pulsamosNext >, elsiguiente diálo-go mostraránuestro actualnombre deusuario en

Linux sin la contraseña. Debemosintroducir la contraseña. Si no,Krecipes no se ejecutará por falta decredenciales del usuario, incluso sihemos completado el resto de los pasosdel asistente. El cuadro 2 nos indicacomo crear un usuario para la bases dedatos MySQL. En el última cuadro dediálogo, que aparece inmediatamente,si hemos seleccionado SQLite, el asis-tente nos pregunta si queremos ponerlas recetas de ejemplo en la base dedatos. No hay que esperar mucho,

puesto que actualmente solo hay cuatrorecetas. Debemos cerrar este diálogopara arrancar Krecipes en la típica vista"Find/Edit Recipes" (ver figura 3).

La Receta AdecuadaCada vista del programa tiene una barrade navegación a la izquierda. El resto delárea de la ventana es una lista de recetasdonde buscarlas. Si estamos buscandoun plato específico, puede que prefi-ramos usar la función de búsqueda,especialmente a medida que la base dedatos crezca.

Para hacer esto debemos introducir elnombre de la receta en el campo Search:

y presionar [Intro] para confirmar. Estoindica a Krecipes que debe mostrar lareceta o una lista de todas las recetasposibles. La lista muestra la categoría, eltítulo de la receta y el número de indexa-do asignado a ésta cuando se creó.Podemos pulsar en los encabezados delas columnas para ordenar la lista porcada uno de los criterios.

El menú desplegable a la derecha delcampo Search: nos permite restringir labúsqueda a categorías específicas. Lascategorías se asignan al introducir lasrecetas. Un solo plato puede ser asigna-do a múltiples categorías.

Tras encontrar y seleccionar la recetadeseada en la lista podemos usarcualquiera de los dos largos botones

bajo la lista para abrir o editarla receta. El botón Delete borralas recetas motivo de desen-gaños culinarios de la base dedatos.

Por supuesto que necesita-mos crear unas pocas recetasantes de poder empezar aborrarlas. El botón New de labarra de herramientas se ocupade esto. Un fallo provoca unerror en la forma de mostrar lacaja de diálogo si tenemos Qt3.3 (ver figura 4). Para quitareste error debemos cambiar eltamaño de la ventana arrastran-do la esquina inferior derechade la ventana.

Nouvelle CuisineHay tres pestañas disponiblespara introducir los datos denuestras recetas. La primerapestaña, Recipe, es para el

vía el menú K, aparecerá un asistenteque nos guiará con los ajustes iniciales.Los usuarios de MySQL tienen dos pasosadicionales respecto a los usuarios deSQLite debido a que MySQL necesita unusuario de base de datos.

Comienzo rápidoInmediatamente después de queaparezca la pantalla de bienvenida elasistente nos preguntará por la base dedatos que deseamos usar. Si optamospor MySQL, podremos especificar si el

Figura 3:Uso de la vista “Find/Edit Recipe” (Encontrar/Editar Recetas).

Figura 4:Necesitamos introducir las recetas.

Page 70: Linux Magazine - Edición en Castellano, Nº 03

título de la receta, el nombre delautor y el número de comensalesindicado para la misma. El botón +cerca de los campos Authors y Cate-

gories abren una caja de diálogodonde podemos seleccionar un autoro categoría.

La segunda pestaña es para introducirlos ingredientes y las cantidades. Unalista de conocidos ingredientes hace lascosas más fáciles.

Si disponemos de todos los detallesnecesarios para los ingredientes pul-samos Add ingredient para almacenarlo.

Podemos usar las teclas de flechapara mover los ingredientes por la

lista. Esto nos permite intro-ducir los ingredientes en elorden en el que los necesita-mos para nuestra receta. Debe-mos pulsar el botón con lacruz para eliminar ingre-dientes incorrectos.

La tercera pestaña tiene unalarga caja de texto para lasinstrucciones de cocina.Podemos pulsar en el botónbajo la caja de texto para com-probar la ortografía del textointroducido.

Hay numerosos botones bajolas pestañas que nos permitensalvar la receta (símbolo deldisquete), cerrar el diálogo(círculo con una x), muestra lareceta (lupa) o añadirla a nues-tra lista de la compra (icono decarro de la compra como el lafigura 4). Adicionalmente, lafunción Scale recipe (es el

botón con la flecha azul) nos permitecambiar el número de comensales parauna receta y calcula automáticamentelas cantidades adicionales de ingre-dientes.

70 Número 03 www.linuxmagazine.com.es

KrecipesLINUX USER

Para asignar los privilegios de lectura y escritura requeridos al usuario de la base de datos MySQL,

debemos convertirnos en el administrador de la base de datos root en la línea de comandos Linux

y abrir el interfaz MySQL.Debemos prestar atención y no confundir el administrador de la base de

datos root con el administrador de sistemas de Linux root.

Si es la primera vez que usamos la cuenta del administrador de la base de datos root, no ten-

dremos asignada contraseña. Esto no significa que el usuario no exista, sino que la cuenta esta

desprotegida.En este caso no necesitamos introducir una contraseña para acceder a MySQL:

mysql -user=root mysql

Para asignar privilegios de lectura y escritura a nuestra base de datos de recetas a nuestra propia

cuenta “no privilegiada”debemos escribir el siguiente comando en el cursor. Esto asigna los privi-

legios de selección, inserción,actualización y borrado de la base de datos:

GRANT SELECT, INSERT, UPDATE,

DELETE ON Krecipes.* TO

'username'@'hostname' IDENTIFIED

BY 'password' ;

La base de datos que Krecipes crea automáticamente se llama Krecipes. Reemplazaremos user-

name,hostname y password (nombre de usuario, nombre de host y contraseña) con los creden-

ciales del usuario de la base de datos, la contraseña y el nombre del host. Si estamos ejecutando el

servidor MySQL en nuestra máquina local debemos usar localhost como nombre para el host.

Alternativamente debemos reemplazar Hostname con el nombre del servidor remoto de bases de

datos (por ejemplo un servidor dedicado en nuestra red local).

Ahora le podemos decir al asistente de Krecipes que tenemos los privilegios adecuados (ver figura

1). En la siguiente caja de diálogo (ver figura 2) introducimos los credenciales de usuario y con-

traseña que acabamos de asignar.

Cuadro 2: Configuración de un usuario de bases de datos MySQL

Figura 5: Cambiando de vista.

Figura 6: Creación de la lista de la compra

automáticamente.

Page 71: Linux Magazine - Edición en Castellano, Nº 03

71www.linuxmagazine.com.es Número 03

LINUX USERKrecipes

crear planes de dieta con gran detalle(ver figura 7).

Lucha Contra los MichelinesAntes de todo debemos especificar cuan-to tiempo pretendemos estar a dieta,cuantas comidas haremos al día y elnúmero de platos que compondrán cadacomida. Si hay más de un plato porcomida podemos usar los botones Pre-

vious Dish (Plato Previo) y Next Dish

(Siguiente Plato) para cambiar entreplatos.

Si marcamos Enable Category Filte-

ring (Filtro por Categoría Habilitado),Krecipes solo mostrará las recetas delas categorías seleccionadas. Esto, porejemplo, nos permite evitar platos

para el desayuno como la pizza o unfilete.

En la parte inferior derecha podemosseleccionar los niveles de hidratos decarbono, vitaminas, proteínas o grasa.Krecipes nos ofrecerá una selección limi-tada de recetas que corresponden anuestras preferencias. Cuando pulsamosCreate the diet (Crear una Dieta),Krecipes no solo compila un plan dedieta para nosotros para el periodoespecificado, si no que también nos lomuestra.

¿Alguna vez has abierto el frigorífico yno has sabido que hacer de comer conlos ingredientes de dentro? La opción deIngredient check (Comprobador de ingre-dientes) en la barra del navegador nos

Si la vista receta (ver figura5) no es de nuestro agrado ypreferimos tener los ingre-dientes en un lugar diferente,¿por qué no cambiar las pre-ferencias en Settings | Page

preferences...? Podemos arras-trar los elementos individual-mente, por ejemplo la lista decategorías o de ingredientes,con nuestro ratón para reor-denarlas (ver figura 5). Ahoradebemos pulsar Save and

Close para guardar los cam-bios.

El Carro de la CompraTras decidir nuestro menú, lafunción de Krecipes Shopping

List, localizada en la barra denavegación de la izquierda de laventana nos puede ayudar conla tortura de la compra.

Como se muestra en la figu-ra 6, podemos seleccionar una o másrecetas de la lista de recetas existentesy usar el botón con la flecha hacia laderecha para añadirlas a la lista de lacompra (Shopping list). Pulsando laflecha hacia la izquierda elimina lasrecetas de la lista y pulsando Clear

eliminamos toda la lista.El botón OK muestra nuestra lista de la

compra (ver figura 6). Podemos pulsarPrint para crear una copia para nuestropróximo viaje al supermercado. Pulsare-mos OK para cerrar la ventana.

En la parte inferior izquierda de laventana de la lista de la compra hay otrobotón que llama a la función Diet Wiz-

ard en la barra del navegador. Esta herra-mienta realmente nos puede ayudar a

Figura 7: El asistente de recetas de Krecipes para comensales sanos.

CVS: El sistema de versionado concurrente proporciona un sistema de gestión de versiones para archivos. El código fuente se almacena en un servidor

donde los desarrolladores pueden añadir parches o nuevas funciones. Podemos usar este sistema para descargar el código a nuestro equipo, lo que al

final nos permite construir una versión ejecutable.

kdenonbeta: Los programas de kdenonbeta esta normalmente en fases de desarrollo muy iniciales y no son parte oficial de la versión KDE comercial.

Esto significa que no se ven afectadas por planes de arrancamiento o de paralización.Como contrapartida, los programas de esta rama no suelen estar

disponibles como RPMs o paquetes Debian.El soporte también esta restringido.

MySQL: Base de datos que soporta la formulación de consultas en el lenguaje de bases de datos SQL (Lenguaje de consultas estructuradas). Los datos

son almacenados en tablas. Podemos usar el cliente de la línea de comandos comentado más adelante en este artículo para gestionar bases de datos

MySQL. La aplicación PhpMyAdmin, escrita en el lenguaje PHP, es un cliente alternativo popular. PhpMyAdmin dispone de GUI y soporta el acceso vía

Web.No obstante,para usar PhpMyAdmin necesitamos un servidor Apache funcionando, lo que implica algo de trabajo de instalación adicional.

SQLite: Librería C con software de servidor de base de datos integrada. Si enlazamos Krecipes con SQLite permitimos que el programa aceda a bases de

datos SQL sin necesidad de ejecutar un servidor de bases de datos adicional.La librería SQlite lee y escribe la base de datos directamente desde o hacia el

disco.

GLOSARIO

Page 72: Linux Magazine - Edición en Castellano, Nº 03

puede ayudar. Simplemente debemosseleccionar los ingredientes que tenemosen casa de la lista y pulsamos sobre elicono Find matching recipe (Buscar rece-ta coincidente). Esperemos que encon-tremos una buena receta en la lista ypodamos marcharnos a la cocina conuna misión que cumplir.

IngredientesSi estamos en la sección "Fighting the

Flab" y nos preguntamos si realmenteKrecipes realmente sabe el valor nutri-cional de algunas comidas poco usualescomo panceta o espinacas de agua,debemos comprobar el elemento Data

(Datos) en la barra de navegación paraaveriguarlo. Estos nos lleva a másentradas de navegación usadas para edi-tar nuestra colección de datos.

Por ejemplo, el elemento Ingredients enla figura 8 nos lleva a una lista de elemen-

tos de todos los ingredientes en la base dedatos. Podemos añadir elementos que fal-ten aquí, como algo que no haya sidousado hasta ahora en una receta, por siacaso. Para añadir un ingrediente debe-mos pulsar el botón con el símbolo +.Para eliminar un ingrediente pulsaremosel botón con el símbolo -. Ambos botonesfuncionan de forma similar en otras listas.

Podemos asignar la unidad apropiaday por supuesto definir la proteína, grasau otros valores nutricionales de cadaingrediente. Cargar los datos USDA(Load USDA data) hace esto más sen-cillo, pero esta funcionalidad no estáacabada del todo.

Ahora mismo lo que hace es cargar losdatos de una lista de ingredientes y susvalores nutricionales de una base dedatos del departamento de agricultura delos Estados Unidos [5], pero no es capazde añadir los datos a la base de datos deKrecipes. Los desarrolladores están traba-jando duro para resolver este problema.

Properties nos lleva a una muestra ge-neral de los valores nutricionales intro-ducidos hasta ahora. Podemos introducirelementos usando los símbolos más ymenos como describimos antes.

Units nos muestra una lista de todas launidades que conoce la base de datosincluyendo una tabla de conversión dejulios a calorías. Podemos añadir mástablas de conversión. Seguiremos los

pasos indicados más abajo paraañadir nuevas conversiones.

Categories gestiona las cate-gorías de la recetas y Authors esel lugar donde añadir y editarlos nombres de los proveedoresde recetas.

ImportarPuede que tengamos muchosdatos que añadir y no deseemosreescribir todas las recetas queya habíamos introducido ennuestro PC. ¿Verdad que seríabonito poder añadir todas esasrecetas que hemos descubiertoen Internet a nuestra base dedatos sin tener que escribirlas?

Para facilitar esto, al menos enla mayoría de los casos, Krecipessoporta Recipeml (“Lenguaje demarcas de recetas”) [6], unlenguaje basado en XML espe-cialmente diseñado para mostrar

datos de recetas. Krecipes no tiene ningúnproblema para abrir las recetas en esteformato. Puede importar formatos de re-cetas desde programas como Master Cooko Meal Master a la base de datos me-diante el menú File usando el comandoImport.

El diálogo de configuración del progra-ma bajo Settings | Krecipes preferences

(ver figura 9) es el lugar donde jugar conlas facilidades de importación de las re-cetas. También podemos cambiar elnombre de usuario y contraseña de labase de datos MySQL. Numbers modificael modo en que los números se muestranpara las cantidades.

Todas estas funciones funcionan bienal margen de que el desarrollo está enfase de desarrollo. Esto hace a Krecipesadecuado para un uso diario y le auguraun buen futuro. �

72 Número 03 www.linuxmagazine.com.es

KrecipesLINUX USER

Figura 8: Podemos acceder al elemento “Data”para añadir entradas en la base de datos.

Figura 9: El diálogo “Krecipes preferences”nos

permite configurar Krecipes.

[1] Krecipes:http://krecipes.sf.net/

[2] MySQL:http://www.mysql.com/

[3] SQLite:http://www.sqlite.org/

[4] Descraga de Qt:http://www.trolltech.

com/download/qt/x11.html

[5] Departamento de Agricultura de los

Estados Unidos:http://www.usda.gov/

[6] Más información en Recipeml:http://

www.formatdata.com/recipeml/

INFO

Page 73: Linux Magazine - Edición en Castellano, Nº 03

73www.linuxmagazine.com.es Número 03

LINUX USERKDM / GDM

En muchos sistemas, el gestor deventanas o de acceso es el primerprograma del GUI que ve el

usuario. La mayoría de las más impor-tantes distribuciones arrancan automáti-camente el sistema X Windows. Losusuarios escriben sus nombres y con-traseñas para acceder y seleccionar elentorno. Habitualmente pueden selec-cionar otras opciones, como apagar elequipo o reiniciarlo.

KDM, del proyecto KDM y su homólo-go Gnome, GDM, son los más popularesgestores de pantallas, si bien hay unaserie de alternativas, como los gestoresdel legado de XDM o el compacto WDM.El gestor de acceso no influye en la man-era en la que se ejecuta el escritorio.Incluso los mayores fans de KDE podríanseguir usando GDM para acceder al sis-tema y arrancar su entorno favorito. Laúnica desventaja es que instalar GDMincluye muchas librerías de Gnome ennuestro disco duro ocupando un valiosoespacio de almacenaje. Este artículoexplica como cambiar el gestor de pan-talla en Fedora Core 2, SuseLinux 9.1 y Mandrake Linux10.0 y como podemos añadirgestores de ventanas a la listadesplegable.

Lo BásicoLa mayoría de las distribucionesinstalan un gestor de ventanascuando instalan Linux. Suse yMandrake usan KDM por defec-to (figura 1) y Fedora usa GDM(figura 2). Si deseamos probarun gestor alternativo lo primeroque debemos hacer es añadirloa nuestra lista de instalación.GDM se encuentra en el paquete

gdm bajo Fedora Core 2, Suse y Man-drake Linux, mientras KDM puedeencontrarse en varios paquetes RPM. EnSuse el paquete se llama kdebase3-kdm,Mandrake Linux lo llama kdebase-kdm yFedora lo llama kde-base.

En Mandrake y en Suse Linux puedeque incluso no obtengamos un gestor deventanas si elegimos el acceso automáti-co al instalar el sistema. Esto puede serválido para usuarios individuales porqueel usuario solo necesita un escritorio,pero hay una serie de desventajas. Paraempezar es muy complicado cambiar aun escritorio alternativo y luegocualquiera puede acceder a nuestrosdatos simplemente encendiendo elequipo.

Para deshabilitar el acceso automáticoen Suse Linux debemos arrancar YaST yseleccionar etc/sysconfig/Editor en Sys-

tem. Debemos editar la entrada Desktop

| Display manager | DISPLAYMANAG-

ER_AUTOLOGIN eliminando el nombredel usuario del campo a la derecha de laventana.

Mandrake Linux usa drakconf comoherramienta de configuración. Selec-cionamos Autologin en Boot y cam-biamos la selección a No, I don't want

autologin. Debemos asegurarnos de queno deshabilitamos la casilla Launch the

graphical environment when

your system starts por error.Este ajuste evita arrancar el GUIal inicializar el sistema forzán-donos a acceder en una consolabasada en texto primero y luegodebiendo escribir startx paraacceder al escritorio KDE.

Cambio entre GDM yKDMPara cambiar el gestor de ven-tanas por defecto debemosrealizar algunos cambios ma-nuales a Mandrake Linux y aFedora Core 2. Ambas distribu-ciones usan el archivo

Configurando KDM y GDM

La primera pantallaTanto KDE como GNOME disponen de gestores de pantallas.Veremos las carac-

terísticas ofrecidas por KDM y GDM y examinaremos como configurar un

gestor de pantalla en nuestro sistema Linux. POR HAGEN HÖPFNER

Figura 1: La pantalla de inicio de sesión KDM en Suse Linux.

Page 74: Linux Magazine - Edición en Castellano, Nº 03

74 Número 03 www.linuxmagazine.com.es

KDM / GDMLINUX USER

ranque del servidor X y apagar el sis-tema (Shutdown).

Mandrake Linux espera que el usuarioprimero seleccione un nombre deusuario y luego muestra un dialogo decontraseña (figura 3) donde el usuariopuede especificar el escritorio que deseaarrancar. EL KDM de Fedora es muy sim-ple en comparación, pero se comportaexactamente como KDM bajo SuseLinux.

Las tres variantes permiten al usuarioacceder, pero al menos hay una buenarazón para cambiar la opción por defec-to. La selección del tipo de sesión estábasada en gestores de ventanas preins-taladas y escritorios de entornos. Siinstalamos un gestor de ventanas adi-cional, el gestor de acceso no mostraráuna entrada para el nuevo gestor deventanas al menos que la distribucióntenga una macro de seión a juego.Tanto KDM como GDM ignoran losgestores de ventanas sin una macro ajuego. El gestor qlwm es un ejemplo deesto.

Para indicar a KDM que añada qlwm

necesitamos crear un nuevo tipo desesión. KDE solía tener un Centro deControl para gestionar esto, pero estaopción ha desaparecido en KDE 3.2. Ensu lugar necesitamos acceder como raízy crear un archivo de comandos desesión para la nueva entrada. Un archivode comandos de sesión es un archivo detexto que contiene parámetros para elgestor de ventanas. Suse Linux almacenalos archivos de comandos de sesión en/opt/kde3/share/apps/kdm/sessions/.

Mandrake Linux y Fedora Core 2buscan estas entradas bajo/usr/share/apps/kdm/sessions/. Escribi-mos el nombre del archivo - qlwm.desk-

top en nuestro ejemplo (podemos elegircualquier nombre, pero la extensión esobligatoria) y luego añadimos lo sigu-iente:

[Desktop Entry]

Encoding=UTF-8

Type=XSession

Exec=/usr/local/bin/qlwm

TryExec=/usr/local/bin/qlwm

Name=QLWM

¡Hemos acabado! La próxima vez queaccedamos KDM tendrá un inicio desesión del tipo QLWM entre susopciones. El nombre del tipo de inicio desesión se define en la línea Name=,QLWM en nuestro caso. Esto supone quehay un archivo llamado/usr/local/bin/qlwm y que el archivo esejecutable (TryExec). Si ahora selec-cionamos QLWM como el tipo de iniciode sesión para acceder, KDM debe ejecu-tar el programa especificado en la líneaque comienza con Exec. KDM ordena eltipo de sesión en el menú desplegablealfabéticamente por el nombre del códi-go de la sesión. Si deseamos que QLWM

sea el primero de la lista podemos cam-biar el nombre qlwm.desktop creado enel paso previo por 00qlwm.desktop.

Más BonitoSi estamos descontentos con la aparien-cia y aspecto de KDM, debemos repasar

/etc/X11/prefdm para arrancar el progra-ma de acceso. prefdm lee los ajustes delgestor de acceso de una variable llamadaDISPLAYMANAGER, que viene descritaen /etc/sysconfig/desktop. La línea quedescribe el gestor contendrá o DISPLAY-

MANAGER="kdm" o DISPLAYMANAG-

ER="gdm". Al arrancar el GUI, se inicia-rá el gestor de acceso seleccionado.

Mandrake ofrece dos variantes a KDM:una versión específica de Mandrakeusada por defecto (figura 3) y la versiónsimple de KDM. Si ajustamos la variableDISPLAYMANAGER a kdm se muestra elKDM original al arrancar el GUI. La ver-sión Mandrake del gestor de acceso semuestra si cambiamos la variable a DIS-

PLAYMANAGER="KDE" en /etc/syscon-

fig/desktop.Los usuarios de Suse Linux necesitan

/etc/sysconfig/Editor en YaST. Esta herra-mienta es una portal que proporciona alos usuarios un acceso conveniente aldirectorio /etc/sysconfig/. Si preferimosun editor de texto a YaST, simplementedebemos editar la variable DISPLAY-

MANAGER en /etc/sysconfig/display-

manager para Suse Linux.

Control de KDMCada distribución tiene una configu-ración por defecto que definen la apa-riencia de KDM. Bajo Suse, KDE incitaal usuario a introducir su Username

(nombre de usuario) y Password (con-traseña), disponiendo adicionalmentede una Menu (figura 4) que permite alusuario seleccionar el tipo de sesión(Session type) y funciones para el rear-

Figura 2:GDM da la bienvenida a los usuarios en Fedora Core 2. Figura 3: KDM en Mandrake Linux – paso a paso.

Page 75: Linux Magazine - Edición en Castellano, Nº 03

75www.linuxmagazine.com.es Número 03

LINUX USERKDM / GDM

usuario una lista de gestores de ven-tanas y entornos de escritorio selec-cionables y System (Sistema) disponede opciones para apagar y reiniciar elequipo junto a una opción para confi-gurar XDMCP. También hay una entra-da para arrancar el programa de confi-guración de GDM. GDM en MandrakeLinux es exactamente igual con laexcepción del menú System, que sellama Actions (Acciones). Fedora, queusa GDM por defecto, no dispone de unmenú para apagar o reiniciar el equipo.Fedora tampoco tiene ninguna opciónpara arrancar la herramienta de confi-guración de KDE. No obstante elusuario root puede ejecutar el comandogdmsetup tras iniciar la sesión paraacceder a estas características.

En la pestaña Security (Seguridad)podemos especificar si deseamos per-mitir el acceso al diálogo de configu-ración desde la ventana de acceso. Noobstante, aunque marquemos la casillaAllow configuration from the login

screen (Permitir configuración desde lapantalla de inicio de sesión) en FedoraCore 2, no veremos el botón de gdmset-

up al acceder. Los theme (Temas) de l

GDM de Fedora Core 2 tienen la culpa.Si elegimos un tema diferente en la pes-taña Graphical greeter (Saludo gráfico),Fedora GDM nos mostrará sin ningúnproblema la herramienta de configu-ración. Debido a que la selección detemas preinstalada es limitada, puedeque queramos echar un vistazo a [3]para elegir un nuevo tema. De nuevotendremos que ejecutar gdmsetup parainstalar cualquier tema descargado deInternet.

Es muy simple indicar a GDM quemuestre una selección de tipos desesión en cualquier gestor de ventanasque instalemos, de hecho tan simplecomo hacerlo en KDM. La única dife-rencia entre las dos configuraciones esla ruta al código de la sesión. GDM enSuse Linux espera encontrar el códigoen /opt/gnome/share/xsessions. La rutaen Mandrake Linux y Fedora Core 2 es/usr/share/xsessions/. Si buscamos másinformación respecto a como configu-rar GDM debemos ver el manual de re-ferencia en [4]. �

su herramienta de configuración. Laherramienta está localizada en el Cen-tro de Control de KDE bajo System

administration | Login manager (figura5). Aparte de pestañas para una config-uración refinada de la apariencia delgestor de acceso (Appearance, Font,

Background- Apariencia, Fuente,Fondo), hay tres pestañas de opcionesgenerales. La pestaña Shutdown (Apa-gar) permite especificar los usuariosque tienen permiso para apagar y reini-ciar el equipo. La pestaña Users (Usuar-ios) nos permite seleccionar las cuentasde usuario que muestra KDM.

Debemos repasar el manual de usuariode KDE en [1] para obtener más informa-ción sobre la configuración. Desafortu-nadamente el manual no está actualiza-do en todos los aspectos, si bien sesupone que cubre hasta KDE 3.3.

Inicio de Sesión con GnomeAl igual que ocurre con KDM, laapariencia de GDM es específica paracada distribución. Suse Linux disponede una característica para ajustar ellenguaje del procedimiento de acceso(Language). Session (Sesiones) ofrece al

[1] Manual KDM:http://docs.kde.org/en/

HEAD/kdebase/kdm/

[2] Linux XDMCP HOWTO:http://www.tldp.

org/HOWTO/XDMCP-HOWTO/

[3] Temas GDM:http://art.gnome.org/

themes/gdm_greeter/

[4] Manual de referencia de GDM:http://

www.jirka.org/gdm-documentation/t1.

ht

INFO

Theme(Tema):Un tema es una colección de elementos que proporcionan a aplicaciones de base

GUI una apariencia predeterminada.Alparte de la mayoría de los gestores de ventanas,aplica-

ciones como Mozilla o XMMS soportan temas.

XDMCP: Protocolo de Control de Gestor de Pantalla X [2] fue desarrollado para permitir el acceso a

sesiones X a través de la red. Los usuarios remotos pueden trabajar como si tuvieran acceso direc-

to al equipo desde remotamente y se les permite hasta ejecutar aplicaciones basadas en GUI en el

servidor X.Por motivos de seguridad y para reducir la carga de la red,SHH es preferible a XDMCP.

GLOSARIO

Figura 4: Suse Linux ofrece a los usuarios un amplio rengo de opciones de

KDM a la vez. Figura 5:Modificando el aspecto y apariencia de KDM.

Page 76: Linux Magazine - Edición en Castellano, Nº 03

76 Número 03 www.linuxmagazine.com.es

XULLINUX USER

Este mes vamos a repasar conmucha atención qué menús se uti-lizan y para qué y como crearlos.

Una vez hecho esto juntaremos toda lainformación de los últimos números paracrear un interfaz XUL completo. Si bieneste interfaz no incluirá toda la fun-cionalidad de una aplicación completa,sí nos permitirá asentar nuestrosconocimientos de XUL mediante lacreación de un interfaz completo y prác-tico.

Los menús proporcionan una formade ocultar funcionalidad mantenién-dola accesible de forma sencilla para elusuario. El modo de funcionar de losmenús es muy ingeniosa. Si necesitáse-mos mostrar un botón para cada fun-

ción de una aplicación acabaríamoscon un interfaz completamente abarro-tado.

Los menús disponen de una serie departes distintas. La primera es la barra deherramientas. Éste es el espacio en laparte superior de la ventana de la apli-cación que agrupa los distintos menús.Dentro de este espacio tenemos distintosobjetos que se refieren a distintas cate-gorías de opciones. Finalmente,podemos pulsar dentro de esas cate-gorías y podemos mostrar el menú emer-gente completo con una serie deopciones que están relacionadas con esemenú.

Si pulsamos en el menú Archivo de unprograma normalmente nos encon-

tramos con opciones como Nuevo, Abrir,Cerrar, Guardar o Guardar como entreotros. Mientras que los usuarios sepan eltipo de función que necesitan deben deser capaces de seleccionar el menú ade-cuado y acceder a la opción deseada.

Siempre debemos tener una idea clararespecto al tipo de funcionalidad quedebe ir en cada categoría del menú y ase-gurarnos de que nuestros menús son losuficientemente intuitivos como parapersuadir al usuario de pulsar en elmenú correcto para acceder a la opcióndeseada.

La organización de menús cada veztiene manos en cuenta su uso y la conse-cuencia directa de esto es la convivenciade opciones no relacionadas en el mismo

Programando con Mozilla Xul

Clics BonitosEn los primeros capítulos de nuestra

serie de XUL hemos estado principal-

mente mirando los conceptos básicos

del lenguaje. A medida que nuestro

viaje ha continuado hemos explo-

rado botones, etiquetas y gestión de

geometrías, comenzando el mes

pasada conectar funcionalidad a

nuestro interfaz.

POR JONO BACON

Page 77: Linux Magazine - Edición en Castellano, Nº 03

77www.linuxmagazine.com.es Número 03

LINUX USERXUL

ahora (se usa normalmente en barras deherramientas).

Lo siguiente que debemos hacer escrear una barra de menú en las queponer las entradas de nuestro menú. Nosreferimos a la típica zona gris sobre laque se superponen los componentes delos menús. Podemos añadir esta zonausando la etiqueta “menubar” (barra demenú):

<menubar id="menubar">

Hemos especificado una identidad a estabarra de menú, práctica común cuandomanejamos menús y botones en XUL.

Ahora estamos listos para agregarcomponentes a nuestro menú. Con estefin utilizamos la etiqueta “menu”(menú) con su correspondiente identi-dad para el atributo y nombre con la eti-queta del atributo:

<menu id="filemenu"U

label="Archivo">

Ahora necesitamos llenar el menú concomponentes. Para hacer esto necesita-mos añadir el primer menú especialemergente usando la etiqueta<menupopup>:

<menupopup id="filepopup">

con nuestro menú emergente añadidoprocedemos a insertar objetos usando laetiqueta <menuitem> (elemento demenú) para cada uno de los distintosobjetos:

<menuitem label="Nuevo"/>

<menuitem label="Abrir"/>

<menuitem label="Guardar"/>

Puede que hayas notado que no hay unatributo de identificación para cadamenú. Esto es debido a que vamos ausar un método diferente para gestionarque elemento del menú se pulsa queveremos más adelante.

Cuando estemos creando nuestrosmenús puede que deseemos separarlosen diferentes secciones. Podemos hacer-lo usando separadores de menús con laetiqueta <menuseparator> (Separadorde menús):

<menuseparator/>

El elemento final puede ser la típicaopción de cerrar tras el separador:

<menuitem label="Salir"/>

Para finalizar añadiremos todas la eti-quetas de cierre que completan la estruc-tura de nuestro menú:

</menupopup>

</menu>

</menubar>

</toolbox>

</window>

Nuestro archivo completo hasta ahora semuestra en el listado 2 y en la figura 1vemos la estructura completada.

Más Funcionalidades demenúUna de las funcionalidades más habi-tuales en un menú es un sub-menú. Estetipo de menús especiales aparece cuandomovemos el cursos sobre un compo-nente del menú principal.

Para crear un sub-menú debemos edi-tar parte del código existente y añadirotra estructura para el mismo. Añadire-mos un sub-menú al elemento Nuevo denuestro menú, necesitando cambiar lasiguiente línea:

<menuitem label="Nuevo"/>

Cuando añadimos un sub-menú emer-gente debemos cambiar el elementopadre del sub-menú, modificando la eti-queta original <menuitem>, por la eti-queta <menu>:

<menu id="newmenu"U

label="Nuevo">

menú. Un ejemplo puede ser la opciónWork Offline (Trabajar desconectado) enel menú Archivo del programa MozillaFirefox.

Otro ejemplo en Microsoft Windows esla aparición de la opción de apagado enel menú de Inicio. Alguno de vosotros noestaréis de acuerdo con estos ejemplo,pero todos debemos prestar atención aluso por parte del usuario de los menús alcrearlos.

Creación de Nuestro PrimerMenúPara comenzar con nuestro primer menúnecesitaremos crear el código base nor-mal que aparece en casi todos losarchivos XUL. Usaremos el código queaparece en el listado 1.

Ahora podemos crear la estructura denuestro menú. El primer elemento quenecesitamos crear es el que posicionanuestro menú en la parte superior de lapantalla. Esto es llamado caja de herra-mientas y lo añadimos con la etiqueta<toolbox> (caja de herramientas):

<toolbox>

Como otros contenedores de gestión degeometría, la etiqueta “toolbox” posi-ciona el código en una parte específicade la pantalla. Otra opción es la depoder añadir el control especial “agarra-dera” de la barra de herramientas deforma que pueda ser separada de laventana y ser movida en una ventanaseparada sobrepuesta. No usaremosesta opción para nuestros menús por

Una de las mayores preguntas que se realiza

al mirar a XUL es si hay otros lenguajes

disponibles para escribir código XUL. Actual-

mente el único lenguaje soportado es

Javascript, si bien se está pensando en la

inclusión de otros lenguajes en versiones

futuras de Mozilla. Entre estos lenguajes

puede que estén incluidos Python o C#.

Muchas de de las discusiones entre los

desarrolladores se giran alrededor de la

creación de un nuevo nivel de funcionalidad

de la aplicación Mozilla: la máquina virtual

de Mozilla. Podemos encontrar más infor-

mación al respecto del progreso del proyecto

Mozilla en las Webs Mozillazine (http://

www.mozillazine.org/) y en Planet Mozilla

(http://planet.mozilla.org/).

Otros lenguajes y XUL

01 <?xml version="1.0"?>

02 <xml-stylesheet

href="chrome://global/skin/"

type="text/css"?>

03 <window

04 id="test-window"

05 title="Test Program"

06

xmlns="http://www.mozilla.org/

keymaster/gatekeeper/there.is.

only.xul">

Listado 1: first.xul

Page 78: Linux Magazine - Edición en Castellano, Nº 03

78 Número 03 www.linuxmagazine.com.es

XULLINUX USER

deberíamos asegurarnos de que la eti-queta con la que especificamos el códi-go JavaScript es la primera etiquetadentro de la etiqueta bloque <win-dow>.

La primera parte de nuestro interfaz acrear es la estructura del menú. Especi-ficaremos la etiqueta <toolbox> (cajade herramientas) para indicar que nues-tro menú está posicionado en la partesuperior de nuestra ventana. Esto nosasegura que nuestros menús y barras deherramientas (las veremos más ade-lante) se agrupan de forma conjunta enla caja de herramientas:

<toolbox>

Ahora podemos crear nuestra barra demenú principal y poner un menú y unsub-menú. Debemos recordar que cadamenú se especifica con una etiqueta<menu> (esta etiqueta realmenteañade el nombre del menú a la barra demenús), pero también debemos crear elmenú emergente propiamente dicho (elmenú que aparece cuando pulsamossobre un elemento). Éste es el código:

<menubar id="samplemenubar">

<menu id="filemenu"U

label="File">

<menupopup id="filepopup">

En este punto no tenemos ningún ele-mento en el menú emergente. El primerelemento, Nuevo, es un poco diferenteporque es en sí un menú emergente.Para añadir este sub-menú creamosnuestras etiquetas <menu> y <sub-menu> y luego añadimos las etiquetas<menuitem> (elementos del menú). Esimportante saber que si bien las otras

entradas del menú Archivo seañaden con la etiqueta <menu-item>, el objeto Nuevo es añadidocon la etiqueta <menu> al ser unsub-menu:

<menu id="newmenu"U

label="Nuevo">

<menupopup

id="secondpopup">

<menuitem

label="Plantilla"/>

<menuitem

label="Fichero"/>

</menupopup>

</menu>

Tras completar el menú Nuevo y su sub-menú podemos proceder a añadir elresto de nuestro componentes al menúArchivo. Hacemos esto con una serie deetiquetas <menuitem>, usando la eti-queta <menuseparator> para crearuna línea entre las entradas de los ele-mentos:

<menuitem label="Abrir"/>

<menuitem label="Guardar"/>

Ya hemos creado una estructuranueva. Ahora estamos listos paraañadir el sub-menú emergente:

<menupopup id="secondpopup">

<menuitem

label="Plantilla"/>

<menuitem label="Fichero"/>

</menupopup>

Debemos recordar añadir las etique-tas de cierre:

</menu>

Ahora debemos ver algo similar a lo quese muestra en la figura 2.

Construcción de un InterfazCompletoXUL nos muestra su potencial real cuan-do comenzamos a unir diferentes com-ponentes hasta completar un interfaz.

Vamos a crear un interfaz completocon XUL que puede utilizarse como basede futuras interfaces. Construiremos esteinterfaz desde el principio como si deuna herramienta de gestión de informa-ción se tratase. Esto involucrará la dedi-cación de determinadas partes de la pan-talla a diferentes funciones y usos. Sibien no escribiremos la funcionalidaddel interfaz, sí lo usaremos como basepara escribir una aplicación completa enXUL.

Para hacer que sea más fácil de enten-der repasaremos cada línea del códigoindividualmente y luego presentaremosel listado del código completo al final delartículo.

Comenzaremos añadiendo el códigobase XUL del listado 1.

Este código simplemente especifica aMozilla que se trata de XUL y luego usala etiqueta <window> (ventana) paracrear la ventana padre. Una vez comple-tado este código debemos especificar elarchivo que contiene el Javascript queproporciona funcionalidad a nuestrainterfaz:

<script src="code.js"/>

En nuestra interfaz ejemplo no estamosrealmente escribiendo ningún código enJavaScript y solo nos concentraremosen XUL. Si estuviésemos escribiendouna aplicación XUL funcional

01 <?xml version="1.0"?>

02 <?xml-stylesheet

href="chrome://global/skin/"

type="text/css"?>

03 <window

04 id="test-window"

05 title="Test Program"

06

xmlns="http://www.mozilla.org/

keymaster/gatekeeper/there.is.

only.xul">

07 <toolbox>

08 <menubar id="menubar">

09 <menu id="filemenu"

label="Fichero">

10 <menupopup id="filepopup">

11 <menuitem label="Nuevo"/>

12 <menuitem label="Abrir"/>

13 <menuitem label="Guardar"/>

14 <menuseparator/>

15 <menuitem label="Salir"/>

16 </menupopup>

17 </menu>

18 </menubar>

19 </toolbox>

20 </window>

Listado 2: second.xul

Figura 1: Un simple menú

Archivo con una línea de

separación incluida.

Figura 2: Añadir un sub-menú

al menú principal en XUL es

simple.

Page 79: Linux Magazine - Edición en Castellano, Nº 03

79www.linuxmagazine.com.es Número 03

LINUX USERXUL

<menuseparator/>

<menuitem label="Salir"/>

</menupopup>

</menu>

Ahora procedemos a añadir el segundomenú a la barra de herramientas. Ésteserá el menú de edición(Edit), usando denuevo las etiquetas <menu>,<menupopup>, y <menuitem>:

<menu id="editmenu"U

label="Edit">

<menupopup id="editpopup">

<menuitem label="Deshacer"/>

<menuitem label="Rehacer"/>

</menupopup>

</menu>

Para finalizar nuestra estructura, necesi-tamos añadir las etiquetas de cierre<menubar> y <toolbox>:

</menubar>

</toolbox>

La parte principal de nuestra interfaz vaha estar compuesta, a la izquierda, poruna combinación de una caja combo,una caja de listado y una barra dedivisión reajustable, y a la derecha elárea principal de texto y algunos otrosbotones. Con esto en mente debemostener algunos componentes encima deotros (la caja combo está encima de lacaja de listado, por ejemplo) y algunosotros componentes al lado de otros (porejemplo botones). Esto implica la combi-nación de la etiquetas <hbox> y<vbox> con el fin de agrupar compo-nentes de determinadas formas.

Comenzaremos usando la etiqueta<box> (caja) para indicar que esta-mos usando un diseño tipo caja paratodos nuestros componentes, y luegocreamos la etiqueta <vbox> paradisponer la caja combo y la caja de lis-tado una encima de la otra. Cada unode los componentes usa <flex=1>para extender el propio componente yocupar todo el espacio disponible. Esta

coletilla se utiliza a lo largo de todo elcódigo.

<box flex="1">

<vbox flex="1">

Nuestro primeros componentes van haser una etiqueta y una caja combo, loscuales van ha estar agrupados por la eti-queta <hbox> para que se coloquenuno al lado del otro. Primero creamos laetiqueta <label> con el modo texto yluego creamos la caja combo (es como sedenomina en XUL una lista de menú)con la etiqueta <menulist>. Dentro deesta etiqueta creamos una serie deentradas <menuitem> para cada objetoen la caja. También hemos dispuesto elatributo editable como falso para la listade nuestro menú con la intención de quelos usuarios no puedan cambiar los con-tenidos de la caja:

@LI<hbox> <label value=“Mode”/> <menulist editable=“false”flex=“1”> <menupopup> <menu-

01 <?xml version="1.0"?>

02 <?xml-stylesheet

href="chrome://global/skin/"

type="text/css"?>

03 <window

04 id="testwindow"

05 title="XUL Interface"

06

xmlns="http://www.mozilla.org/

keymaster/gatekeeper/there.is.

only.xul">

07 <script src="code.js"/>

08 <toolbox>

09 <menubar id="samplemenubar">

10 <menu id="filemenu"

label="Fichero">

11 <menupopup id="filepopup">

12 <menu id="newmenu"

label="Nuevo">

13 <menupopup id="secondpopup">

14 <menuitem

label="Plantilla"/>

15 <menuitem label="Fichero"/>

16 </menupopup>

17

18 </menu>

19 <menuitem label="Abrir"/>

20 <menuitem label="Guardar"/>

21 <menuseparator/>

22 <menuitem label="Salir"/>

23 </menupopup>

24 </menu>

25 <menu id="editmenu"

label="Editar">

26 <menupopup id="editpopup">

27 <menuitem label="Deshacer"/>

28 <menuitem label="Rehacer"/>

29 </menupopup>

30 </menu>

31 </menubar>

32 </toolbox>

33 <box flex="1">

34 <vbox flex="1">

35 <hbox>

36 <label value="Mode"/>

37 <menulist editable="false"

flex="1">

38 <menupopup>

39 <menuitem label="Simple"/>

40 <menuitem label="Avanzado"/>

41 <menuitem label="Experto"/>

42 </menupopup>

43 </menulist>

44 </hbox>

45 <listbox>

46 <listitem label="Facturas"/>

47 <listitem label="Gastos"/>

48 <listitem label="Pequeños

Gastos"/>

49 <listitem label="Otro"/>

50 </listbox>

51 </vbox>

52 <splitter collapse="before">

53 <grippy/>

54 </splitter>

55 <vbox flex="1">

56 <hbox>

57

58 <button id="addbutton"

label="Añadir"/>

59 <button id="deletebutton"

label="Eliminar"/>

60 <button id="editbutton"

label="Editar"/>

61 </hbox>

62 <textbox id="posttext"

multiline="true" flex="1"/>

63 <hbox>

64 <button id="findbutton"

label="Previsualizar"

default="true"/>

65 <button id="cancelbutton"

label="Publicar"/>

66 </hbox>

67 </vbox>

68 </box>

69 </window>

Listado 3: third.xul Completo

Page 80: Linux Magazine - Edición en Castellano, Nº 03

80 Número 03 www.linuxmagazine.com.es

XULLINUX USER

item label= “Simple”/> <menuitemlabel= “Avanzado”/> <menuitemlabel= “Experto”/> </menupopup></menulist> </hbox>

El componente que falta por añadir esla caja de listado. Para crearlo usamos laetiqueta <listbox> y añadimos cadaobjeto a la etiqueta <listitem>:

<listbox>

<listitem label= "Factura"/>

<listitem label= "Gastos"/>

<listitem label= "PequeñosU

Gastos"/>

<listitem label= "Otros"/>

</listbox>

Con anterioridad abrimos la etiqueta<vbox> en el código para disponer lascajas combo y de listado una encima dela otra. Ahora debemos cerrar esta eti-queta usando la etiqueta de cierre<vbox>:

</vbox>

Hasta ahora hemos credo componentesque aparecen en la parte izquierda denuestro interfaz. En casos en los queclaramente separemos un lado del inter-faz del otro debemos usar la etiqueta<splitter> para tener un separadorajustable entre las dos zonas. Una de lasposibilidades de esta etiqueta es quepodemos colapsar un lado y especifi-

camos el atributo <collapse> (colap-sar) para especificar los componentesantes de la etiqueta en el código (nuestracaja combo y listado). También hemosañadido la etiqueta <grippy> (agarra-dera) para proporcionar una manera demover el separador:

<splitter collapse="before">

<grippy/>

</splitter>

Para componentes situados a la derechadel separador vamos a agrupar grupos decomponentes unos encima de otros.Primero creamos la etiqueta <vbox>:

<vbox flex="1">

Nuestro primer grupo de componentesesta formado por los tres botones queaparecen cerca del marco superior de laventana. Creamos la etiqueta “hbox”para disponerlos unos al lado de losotros y luego añadimos la etiqueta “but-ton”:

<hbox>

<button id="addbutton"U

label="Añadir"/>

<button id="deletebutton"U

label="Eliminar"/>

<button id="editbutton"U

label="Editar"/>

</hbox>

El siguiente componente es un compo-nente de entrada de datos de muchotexto. Éste es el tipo de componente quese utilizaría para introducir texto en uneditor de textos, por lo que nos debemosasegurar de que el componente es capazde soportar más de una línea de texto.Podemos hacer esto con el atributo mul-

tilínea:

<textbox id="posttext"U

multiline="true" flex="1"/>

Nuestro conjunto final de componenteses una colección de botones que funcio-nan de la misma forma que los botonesAñadir, Eliminar y Editar que hemoscreado con anterioridad:

<hbox>

<button id="findbutton" label=U

"Previsualización"U

default="true"/>

<button id="cancelbutton" U

label="Publicar"/>

</hbox>

Para completar nuestro código ahoradebemos añadir la etiquetas de cierre<vbox>, <box> y <window>:

</vbox>

</box>

</window>

El listado 3 es el código completo. Cuan-do ejecutemos este código debemos veralgo parecido a lo que se muestra en lafigura 3.

El Siguiente PasoEn este número hemos agrupadotodos nuestro conocimientos actualesde construcción de interfaces enXUL. A medida que continuemosexplorando XUL veremos las fun-cionalidades de aplicaciones XUL enmás detalle, incluyendo el uso dePHP para conseguir archivos XULmás dinámicos.

Hasta que continuemos el próximomes debemos seguir jugando con lasdiferentes etiquetas de interfaz de XULy experimentando con distintas combi-naciones de componentes. Cuantasmás experiencia tengamos mejorvamos a ser capaces de resolver pro-blemas. �

Figura 3: Un interfaz XUL completo.

Page 81: Linux Magazine - Edición en Castellano, Nº 03

81www.linuxmagazine.com.es Número 03

LINUX USEREducación

dremos de paquetes wims con la mayo-ría de los módulos y de las ayudas tra-ducidas al castellano. En ese momentoserá muy fácil instalar el servidor en unamáquina de nuestro centro, y aprovecharla agilidad que proporciona una red localy por otro lado el control sobre accesos,incorporación de actividades, etc. quepermite ser nuestros propios adminis-tradores. Sólo será necesario instalarWIMS en un ordenador: los demásusuarios se conectarán a través del nave-gador web desde cualquier sistema ope-rativo. Por otro lado el tema de los per-misos también queda resuelto: dejandoaparte la administración pura y dura delservidor, las cuentas son las del profesor-supervisor de las hojas de ejercicios, ylas de los alumnos, a los que los profe-sores proporcionan la contraseña paraparticipar en las clases virtuales (otras

cuentas mencionables son las de losadministradores propiamente dichos delservidor WIMS y las de los desarrolla-dores de módulos).

Planteémonos el caso de un centroeducativo de varios niveles donde sedispone de un servidor WIMS. Varios pro-fesores crean clases virtuales, comovimos en la segunda parte de esta serie, yse encargan de que los alumnos seinscriban en la clase; hasta que no se par-ticipa de una clase virtual no se habilita elsistema de registro y seguimiento de laevolución de los alumnos. Seguidamenteel profesor crea varias hojas de ejercicios,de distintos niveles de dificultad en laselección de los ejercicios y en el grado dedificultad que los módulos individualespermiten configurar. Para crear las hojasdispone de todos los módulos y activi-dades instalados en el servidor, y a su vezpuede crear o adaptar de forma interacti-va actividades mediante dos lenguajesintegrados en el sistema: uno más senci-llo, el OEF de Createxo, que fue el quemostramos en su momento, y otro, Mod-tool, que utiliza la verdadera potencia deWIMS pero que escapa de las posibili-dades expositivas de una introducciónque se está haciendo demasiado larga yque por supuesto está documentado en el

El servidor WIMS también calcula lacalidad de los puntos y la muestracuando acaba el ejercicio. El profe-

sor puede servirse de estas dos cate-gorías de datos (el número de puntosobtenidos y la calidad de los mismos)para controlar el progreso de los alum-nos. Los alumnos pueden también com-parar su puntuación con la puntuaciónmedia de la clase.

Releo el párrafo anterior. Lo encuentroabstracto, quizás necesario, pero no con-vincente. La forma de captar la utilidadde la aplicación es con ejemplos prácti-cos en una situación real, a esto dedi-caremos el resto del artículo.

WIMS en la prácticaAunque en este tiempo de plurilingüis-mo no hay mucha excusa para no uti-lizarlo ya, dentro de poco tiempo dispon-

En los artículos anteriores hemos aprendido a generar y a

configurar los ejercicios interactivos y las hojas de trabajo

asignando a cada actividad un peso en puntos. La expli-

cación era que la realización de una tarea va acompañada del

registro de los puntos correspondientes hasta que el número

de puntos que se obtiene llegue al número requerido para

dar el ejercicio por superado con éxito.

POR JUAN RAFAEL FERNÁNDEZ

El servidor interactivo multipropósito de actividades WIMS

Ejemplo Práctico conWIMS

Lo que anunciábamos como una primicia se va poco a poco convirtiendo en una realidad:a inicia-

tiva de la Junta de Extremadura y dirigidos por Antonio Ullán,un equipo de traductores formado

por Pepe Grimaldos, Javier Sánchez, José Rafael Rodríguez,Carlos Entrena,Antonio Saorín y en el

que tengo el honor de colaborar estamos procediendo a la traducción de los módulos y de la inter-

faz de usuario de WIMS.Esperemos que para cuando este artículo llegue a los kioskos el proceso

esté terminado o próximo a su conclusión;algunas de las capturas de pantalla que acompañan a

este artículo son verdaderos estrenos.

Cuadro 1: Traducción de WIMS

Page 82: Linux Magazine - Edición en Castellano, Nº 03

82 Número 03 www.linuxmagazine.com.es

EducaciónLINUX USER

propio servidor (enlace módulos a

toda potencia). El resultado seríaalgo similar a la figura 1.

¿Como sería una sesión? Losalumnos se conectan al servidor, ytrabajan individualmente o porequipos en la hoja asignada.Recordemos que las hojas puedenincluir lecciones y apuntes, que elprofesor puede configurar en quémomento comienzan a registrarselos resultados de los ejercicios ypuede habilitar un tiempo deensayo previo, y que puededecidirse el tiempo que va a dedi-carse a la realización de cada ejer-cicio o grupo de ejercicios. Undetalle importante es que los pro-cesos de consulta, razonamiento,borradores y desarrollos de cálcu-los, discusión entre alumnos sobrela solución o la forma de alcan-zarla son provocados por el sis-tema pero no se realizan necesaria-mente en él. Los alumnos trabajancon los medios habituales, papel,libretas, pizarra, calculadoras, supropio cerebro. Nuestro alumnoPepe Pruebas vería la clase virtualcomo en la figura 2. Cuando larepetición (recordemos, no reitera-tiva) lleva a un grado de confianzasuficiente el alumno realiza unexamen (figura 3), nunca igual queel alumno de al lado.

Balance pedagógico endiez puntosParto en esta sección del balanceque del uso para la enseñanza dematemáticas del servidor WIMS seha efectuado en el sitio http://

www.poitou-charentes.iufm.fr/

wims/cd/bilan/bilan.htm.1. Un servidor WIMS permite

individualizar la enseñanza. Comoel resto de las herramientas infor-máticas, WIMS colabora a la aten-ción a la diversidad. Además lagran riqueza de actividades y lageneración aleatoria de parámetrosconllevan que cada alumno realiceun recorrido propio o un ritmoindividualizado por el entornoWIMS. Por otro lado esta variación per-mite que la repetición de los ejercicioshasta la comprensión de las nociones enjuego no se haga frustrante.

2. Un servidor WIMS es una herra-

mienta para trabajar sobre determinados

tipos de ejercicios. A pesar de su granpotencia, no es la panacea, ni puede

esperarse que ésta exista. WIMSnecesita una determinada codifi-cación de las tareas; por otro ladosu modularidad hace que puedandesarrollarse nuevas herramientas(«programas satélite» les llamaGeorges Khaznadar) que permitansu aplicación a nuevos campos.Un campo en especial donde debeprogresar es en el lingüístico, en elque los módulos dedicados y lasherramientas aplicadas son insufi-cientes.

Independientemente de lo ante-rior la usabilidad por los usuariosfinales es alta, y la creación derecursos con Createxo es relativa-mente fácil, aunque la herramien-ta es mejorable en su intuitividad.También sería deseable un módulode importación de actividades degeneración externa (pienso espe-cialmente en código html yjavascript) más sofisticado que elmero cortar y pegar.

3. Un servidor WIMS constituye

una interfaz muy potente y unifi-

cada para el uso de numerosos pro-

gramas, en especial matemáticos y

científicos, que de otro modo sondifíciles de utilizar. Además elhecho de que pueda utilizarsedesde cualquier navegador implicaque las actualizaciones no conlle-van ninguna modificación en losclientes y benefician automática-mente a todos los usuarios.

4. WIMS es un programa seguro y

ligero para los usuarios. A diferenciade los programas realizados en java,flash o javascript, que exigen lapresencia de plugins y de potenciade cálculo en los ordenadores de losusuarios, las actividades WIMS seejecutan en el servidor. Sólo esnecesario un navegador conjavascript habilitado para conec-tarse a un servidor WIMS, que seráel que realice los cálculos o generelos gráficos. Por supuesto lamáquina que haga de servidor sídebe ser potente y tener instaladoslos programas que van a utilizarse.

5. Una sesión de trabajo con un

servidor WIMS no elimina el trabajo de

cálculo, razonamiento, etc. del alumno.Esto contradice uno de los temores máscomunes de los detractores del uso de

Figura 1: Una clase virtual vista por el profesor.

Figura 2: La clase vista por el alumno.

Figura 3: El examen.

Page 83: Linux Magazine - Edición en Castellano, Nº 03

83www.linuxmagazine.com.es Número 03

LINUX USEREducación

(http://adullact.net/projects/

epistemon/), mediante la creación deuna interfaz entre la plataforma y elservidor WIMS, puesta en práctica en laUniversidad del Litoral francés (ver lafigura 4). Los alumnos pueden trabajaren un ejercicio WIMS dentro de unasesión de epistemon (figura 5); cuandocierran la ventana de WIMS todos losdatos del ejercicio son enviados al LMSpara que los procese.

10. WIMS es esencialmente obra deuna sola persona; este carácter personaltiene consecuencias positivas y negati-vas. En este sentido es una aplicaciónmuy creativa y original, diseñada expre-

samente para integrar múltiplesaportaciones (interfaz a otros eje-cutables, creación interactiva deactividades…); pretende darrespuesta a casi todas las exigen-cias de la enseñanza realizada conayuda del ordenador: generaractividades, clasificarlas y presen-tarlas al alumno, controlar accesoa clases, evaluar y seguir la evolu-ción de los estudiantes. Tareas tandistintas admitirían, en la tradi-ción Unix (pequeños programasque hacen una sola cosa pero lahacen bien y que son compatiblesy complementarios), una soluciónmás modular y fiel a estándares.Por poner unos ejemplos la tra-ducción de los módulos es innece-sariamente complicada porque losmensajes no están separados delcódigo de ninguna manera identi-ficable: es necesario comparar lasversiones inglesa y francesa paraaveriguar qué fragmentos hay quetraducir y cuáles no. Las activi-dades están escritas en un lengua-je de alto nivel de creación propiay sintaxis similar a la de LaTeXpero totalmente independiente detodo lo conocido. Por otro lado esdifícil plantearse una comparacióno un acercamiento a los están-dares educativos IMS o SCORM.

Esperamos que esta no tan breve intro-ducción a WIMS haya sido interesante yútil. En el próximo número vamos atratar un tema cada vez más urgente ennuestras escuelas: ¿cómo escribir otraslenguas y alfabetos? Antes era una pre-gunta que sólo hacían los profesores degriego y los traductores, ahora es unaexigencia de la integración de nuestrosnuevos alumnos chinos, árabes,eslavos… �

los ordenadores en clase: se haobservado que en una sesiónWIMS los alumnos dedican mástiempo a pensar y al papel que alordenador propiamente dicho.

6. Me voy a inventar la termi-nología: WIMS es agnóstico a lapresencia. Dicho en un idioma terrá-queo algo pedago-retórico, el sistema

de clases virtuales facilita el trabajo

tanto a distancia como presencial y

permite un uso flexible de los recur-

sos, los espacios y los tiempos.7. El enseñante que utiliza un

servidor WIMS puede trabajar con

el gran número de ejercicios y

módulos libres disponibles (varioscientos), modificarlos, o escribir élmismo o solicitar la creación decódigo que se adapte a sus obje-tivos pedagógicos. Hay una comu-nidad internacional creciente deusuarios y desarrolladores demódulos WIMS.

8. El seguimiento completo de los

alumnos de una clase virtual per-mite al profesor conocer fácilmentelos progresos y dificultades de unalumno. WIMS proporciona estadís-ticas sobre el nivel de dificultad, elgrado de éxito y el tiempo dedicadoa la resolución de los ejercicios.

9. El servidor WIMS puede hacer

funciones de un pequeño gestor de

contenidos educativos, permitir la comu-nicación entre alumnos en un foro, subirdocumentos, etc. También es posibleintegrarlo en una plataforma educativa(lo que en inglés se llama un Learning

Management System, LMS); mediante unmodo que permite la colaboración conuna de estas plataformas: lo que Xiaollama «el protocolo para la conexióndirecta de WIMS con otros servidoresweb» (http://localhost/wims/wims.

cgi?lang=es&+module=adm/

raw&job=help).Nos informa Khaznadar (en correo

personal) de que se está trabajando enla compatibilidad con epistemon

Figura 4: La plataforma educativa epistemon.

Figura 5:WIMS integrado con epistemon.

Aquellos profesores de mentalidad práctica y que se atrevan directamente con el francés disponen

en http://wims.auto.u-psud.fr/wims/faq/fr/program.html de programaciones de Secundaria y

Bachillerato (recordatorio:Sixième corresponde a nuestro Sexto de Primaria,y es el primer curso de

Secundaria en el sistema francés; la cuenta de cursos es descendente,sixième,cinquième…).

Cuadro 2: Programaciones en WIMS

Juan Rafael Fernández García es pro-

fesor de educación secundaria y

tiene una larga experiencia en la tra-

ducción y documentación del soft-

ware libre. De hecho está colaboran-

do en la traducción de los módulos y

la interfaz de WIMS. Ha sido coordi-

nador de uno de los Centros que par-

ticipan en la experiencia andaluza de

integrar las TIC en la educación y

actualmente trabaja como asesor de

formación del profesorado.

EL AUTOR

Page 84: Linux Magazine - Edición en Castellano, Nº 03

84 Número 03 www.linuxmagazine.com.es

su, sudoLINUX USER

Los privilegios de root son necesariospara tareas administrativas, pero notiene sentido ser el superusuario

todo el tiempo. Es preferible convertirseen root para una tarea administrativa yluego volver a ser un usuario “normal”.Dos ordenes , su y sudo, le permitencambiar de identidad.

suLa orden su (“substitute user”) le per-mite cambiar su ID en la línea deordenes. La orden lanza un nuevo intér-prete de ordenes en segundo plano usan-do nuevos IDs de usuario (UID) y degrupo (GID). Cuando teclee su para con-vertirse en superusuario, u otro usuariocon privilegios, deberá conocer la con-traseña para la cuenta de ese usuario.

La sintaxis básica del comando es su[-] [nombredeusuario]; pero hay unasutil diferencia, dependiendo de siteclea el signo menos o no . El signomenos (o alternativamente el parámetro

-l o su forma larga --login) se asegura deque realmente entra en el sistema, fijan-do así las variables de entorno apropia-das y el intérprete de ordenes y cam-biando al directorio de trabajo de eseusuario (su directorio ‘home’). Lasvariables de entorno no cambiaran siomite el signo menos y esto podría sig-nificar que el nuevo usuario no tieneningún privilegio para el directorioactual (Véase la Figura 1).

Si no suministra un nombre, se supon-drá root, la cuenta del superusuario. Estotambién es lo qué conduce a la falsa ideaque su es realmente una abreviatura de“superuser”. Por omisión la orden su nopermite al nuevo usuario lanzar aplica-ciones X. Los usuarios externos primerodeben tener permiso para utilizar elservidor de X para salida y esto significaeditar el archivo .Xauthority en el direc-torio de trabajo adecuado (véase tam-bién man xauth). Para permitir alusuario root lanzar un programa X en un

su, sudo

IdentidadPara más seguridad, aunque tenga privilegios de

root para un sistema, tiene sentido utilizarlos solo

temporalmente para prevenir daños accidentales.

su y sudo le permiten cambiar la identidad rápida-

mente desde la línea de ordenes.

POR HEIKE JURZIK

Page 85: Linux Magazine - Edición en Castellano, Nº 03

85www.linuxmagazine.com.es Número 03

LINUX USERsu, sudo

que el nombre sugiere: “sudo” es laabreviatura de “substitute user, do”(sustituye el usuario, haz) y facilita ausuarios individuales o grupos los privi-legios administrativos por un períodolimitado y limitándose a una tareaespecifica. Un usuario puede entoncessimplemente teclear su propia con-traseña para lanzar una orden privilegia-da.

El usuario admin necesita crear unalista de usuario autorizados a ejecutarordenes especificas privilegiadas en elarchivo /etc/sudoers. Mientras trabajacomo root, edite el archivo con la ordenvisudo. este programa ofrece las carac-terísticas habituales del editor vi conalgunas funciones adicionales. visudo

“bloquea” el fichero /etc/sudoers paraevitar que sea editado por multiplesusuarios a la vez. Además visudo com-prueba la sintaxis del fichero al terminary le informa de cualquier error si loencuentra:

>>> sudoers file: syntaxU

error, line 20 <<<

What now?

Dispone de tres alternativas: pulsar e

para editar el fichero de nuevo, x paracancelar los cambios y salir del editor oQ para salvar los cambios a pesar delerror.

Hay una entrada predeterminada pararoot ALL=(ALL) ALL en /etc/sudoers.Esto permite hacer todo al usuario root,

pero por supuesto root tambiénpuede hacerlo sin sudo. Si necesitaconceder a otro usuario privilegios deroot sin restricciones en unamáquina, simplemente copie estalínea y sustituya root por el nombrede ese usuario. Después de salvar elarchivo, este usuario podrá ejecutarórdenes de administración mediantesudo, por ejemplo:

huhn@asteroid:~$ sudoU

/sbin/shutdown

Password:

Si no se permite al usuario usar sudo,aparecerá un mensaje como este: “sudo:

huhn is not in the sudoers file. This inci-

dent will be reported.” (sudo: huhn no

está en el archivo sudoers. Se informará

de este suceso). La medida predetermina-da, que puede ser cambiada en/etc/sudoers, es enviar un correo alertan-do al administrador con los detalles delusuario que ha intentado lanzar sudo

(véase la Figura 2). Para estar seguros,los usuarios sin privilegios puedenteclear sudo -l para mostrar una lista delas ordenes permitidas.

Control MinuciosoLa sección Host alias specification de/etc/sudoers le permite especificar lasmáquinas donde las ordenes específi-cas de sudo deben aplicarse. Podemosutilizar el Host_Alias para crear ungrupo de ordenadores mediante laespecificación de sus nombre odefiniendo un rango de direcciones IP.Esta característica solamente tienesentido si aplicamos una configu-ración centralizada de sudo en múlti-ples ordenadores.

La sección User_Alias le permite creargrupos que necesiten los mismos privile-gios. Primero definimos el tipo de alias(p. e. User_Alias), después un nombrede alias (que puede contener mayúscu-las, subrayados y números), un mapeoindicado por el signo “=” y finalmentelos nombres de usuario separados porcomas. Vamos agregar los usuarios huhn

y petronella a un grupo que se le permiteparar la máquina:

# User alias specification

User_Alias SHUTTERSDOWN=U

petronella,huhn

Xterm que pertenezca al usuariopetronella, necesita extraer una clavedesde .Xauthority, añadirla al .Xau-

thority del administrador y entoncesredefinir la variable DISPLAY (véaseel Listado 1).

su también le permite usar otracuenta para lanzar una sola orden.Para hacer esto, indique la opción -c(--command):

huhn@asteroid:~$ su -c"lessU

/var/log/messages"

Password:

El uso de la orden su se anota en la bitá-cora (log). En función de la distribuciónque use, esas entradas de bitácora selocalizaran en /var/log/auth.log (p. e. enDebian) o en /var/log/messages (p. e. enSuse Linux). Los intentos inválidos sonfácilmente localizados, permitiendo alusuario admin ver rápidamente quien haintentado apropiarse indebidamente delos privilegios de root

Dec 22 14:50:50 asteroidU

PAM_unix[2108]: authenticationU

failure;

(uid=500) -> root for su service

Dec 22 14:50:52 asteroidU

su[2108]: pam_authenticate:U

Authentication failure

Dec 22 14:50:52 asteroidU

su[2108]: - pts/8 huhn-root

Si es el usuario admin, no necesita intro-ducir una contraseña después de teclearla orden su. Usted puede asumircualquier identidad para probar rápida-mente una modificación desde la pers-pectiva de otro usuario.

sudoLa orden sudo le permite evitar dar aconocer la contraseña de root de unamáquina, lo cual es comprensible pormotivos de seguridad. La orden realiza lo

Figura 1: Sin el apropiado ingreso en el sistema,no tiene

ningún privilegio.

UID:Cada usuario se identifica mediante un UID (“User IDentification number”),que lo mapea de

manera única a la cuenta del usuario. Puede encontrar fácilmente su propio ID tecleando “echo

$UID”

GID: Además del UID, los usuarios tienen un GID (“Group IDentification number”) que indica su

pertenencia a un grupo. Los miembros de un grupo pueden compartir privilegios. La orden “id”

indica su UID y su GID actual.

GLOSARIO

Page 86: Linux Magazine - Edición en Castellano, Nº 03

que el archivo se analiza desde arribahacia abajo. Esto le permitirá mantenerel grupo SHUTTERSDOWN, al cuál se lepuede permitir ejecutar otras ordenes,mientras que al mismo tiempo serestringe a petronella el permiso paraapagar la máquina. Si petronella intentaejecutar la orden, simplemente lemostrará un mensaje como el siguiente:“Sorry, user petronella is not allowed to

execute ‘/usr/sbin/visudo’ as root on

asteroid.linux-magazine.com.” (Lo sien-

to, el usuario petronella no tiene per-

miso para ejecutar ‘/usr/sbin/visudo’

como root en asteroid.linux-

magazine.com).Si quiere eliminar el indicador

(prompt) de contraseña para una ovarias ordenes, simplemente active elindicador NOPASSWD:

SHUTTERSDOWN ALL=NOPASSWD:DOWN

En vez de reducir el nivel de la seguri-dad que sudo proporciona, puede incre-mentarlo, obligando al usuario que

introduzca la contraseña cada vez queejecute sudo. Por omisión sudo ejecutauna especie de sistema de boletos conun intervalo que asegura, por ejemplo,que no pueda abrirse en la máquina unaconsola del intérprete de ordenes conprivilegios de root que pueda compro-meter todo el sistema sin excepción. Lavalidez predeterminada para el boletopara la mayoría de las distros es de 15minutos. Pero se puede configurar a 0minutos añadiendo la siguiente línea a/etc/sudoers:

Defaults timestamp_timeout = 0

Opcionalsudotambién tiene algunos parámetrosde línea de ordenes. Probablemente elmás importante de ellos sea -s, que lepermite lanzar un intérprete de ordenescomo root. No es necesario configuraraccesos al servidor X, solamente teclearsudo -s será suficiente para que eladministrador lance programas sobre elservidor gráfico.

El conmutador -L lista todas lasopciones en el archivo /etc/sudoers. Siquiere extender su boleto sin ejecutaruna orden, solo tiene que introducir sudo

-v. Si el intervalo se ha agotado, se leindicara que teclee la contraseña. Tam-bién puede dar de baja un boletotecleando sudo -k. El indicador -b le per-mite ejecutar una orden en segundoplano; sin embargo, no podrá moverlode nuevo al primer plano con la ordennormal de control de trabajos del intér-prete de ordenes, fg. �

El próximo paso es definir un alias para laorden shutdown en la sección Cmnd alias

specification. Para hacer esto, introduzcala ruta absoluta al programa requerido:

# Cmnd alias specification

Cmnd_Alias DOWN = /sbin/shutdown

Para decirle a sudo que los SHUTTERS-

DOWN estan autorizados a ejecutar estaorden, necesitamos otra entrada debajode User privilege specification:

SHUTTERSDOWN ALL = DOWN

Los usuarios del grupo SHUTTERS-

DOWN ahora pueden apagar la máquinatecleando sudo /sbin/shutdown. Perohay una forma más fácil de otorgar a unsolo usuario permiso para ejecutar unasola orden. Por ejemplo, la entrada:

huhn ALL = /usr/sbin/visudo

otorga al usuario huhns permiso paraeditar el archivo /etc/sudoers usando laorden sudo /usr/sbin/visudo.

¿Libre o Restringido?Una simple entrada en /etc/sudoers lepermite restar privilegios a un usuarioindividual. La sintaxis para hacer esto escomo sigue:

SHUTTERSDOWN ALL = DOWN

petronella ALL = !DOWN

Es importante especificar la excepcióninmediatamente después de la regla, ya

86 Número 03 www.linuxmagazine.com.es

su sudoLINUX USER

Figura 3: Se recomienda editar el fichero /etc/sudoers solamente con el

programa /usr/sbin/visudo.Figura 2: La seguridad es muy valiosa; sudo informa de los accesos ilegítimos.

01 petronella@asteroid:~$ xauth

02 extract key $DISPLAY

03 huhn@asteroid:~$ su -

04 Password:

05 asteroid:~# xauth merge

06 home/huhn/key

07 asteroid:~# export

DISPLAY=:0.0

Listado 1: Display

Page 87: Linux Magazine - Edición en Castellano, Nº 03

En esta penúltima entrega vamos aabordar en primer lugar la creaciónde tablas con LaTeX. Después

trataremos la escritura matemática,donde podremos comprobar que LaTeXes infinitamente mejor y más potenteque cualquier editor científico del tipoWYSIWYG. Posteriormente, en el próxi-mo número, terminaremos nuestra seriesobre LaTeX viendo cómo incluir labibliografía en nuestro documento (biendirectamente o creándonos nuestrapropia base de datos) y terminaremoscon un ejemplo de un proyecto donde seusan todos los conceptos que hemostratado en esta serie de artículos.

¿Cómo construir tablas conLaTeX?Las tablas son construcciones alineadasque aunque no son demasiado fáciles deconstruir con LaTeX, sin embargo éstepermite una enorme flexibilidad en suconstrucción y manipulación. Comosiempre lo mejor será que vayamosaprendiendo viendo un ejemplo:

%Sintaxis de una tabla básica

\begin{tabular}[<I>Posición<I>]U

{<I>FormatoColumnas<I>}

Fila1_Columna1 & Fila1_Columna2U

& \dots & Fila1_ColumnaN \\

Fila2_Columna1 & Fila2_Columna2U

& \dots & Fila2_ColumnaN \\

\dots & \dots & \dots & \dots \\

FilaM_Columna1 & FilaM_Columna2U

& \dots & FilaM_ColumnaN

\end{tabular}

Como se puede comprobar, el entornoque LaTeX usa para construir tablas esel entorno tabular con determinadosargumentos obligatorios y opcionalesque vamos a ir viendo. La Posición esun argumento opcional e indica la posi-ción vertical de la tabla respecto de lalínea en la que se ha incluido. Puedetomar uno de los tres valores si-guientes:• t: la línea inferior de la tabla sealinea con la línea base de la línea actu-al. • b: la línea superior de la tablase alinea con la línea base de la líneaactual. • c: es la opción que se toma pordefecto y alinea la tabla de manera cen-trada respecto de la línea base.

El argumento FormatoColumnas serefiere a la alineación de las columnas.Siempre debe aparecer una entrada porcada columna de la tabla. Se puedenincluir ciertos elementos opcionales(separadores para delimitar los bordesentre cada columna -los veremos en elsiguiente ejemplo-). Las posibilidadesson:• l: alineación a la izquierda. • r: alineación a la derecha. • c: alineación centrada de lacolumna. • p{ancho}: crea una columna deanchura ancho. El texto que se coloquedentro se trata como un párrafo (sin san-gría inicial) con la línea superior alinea-da con las otras columnas.Los Separadores son elementosopcionales. Pueden tomarse entre lossiguientes:• |: introduce una línea vertical.• ||: introduce dos líneas verti-cales. • @{texto}: elimina el espacioentre columnas e inserta el texto señala-do entre las columnas especificadas.Una vez vistos todos los argumentos delentorno tabular es el momento de pasar

Con este artículo continuamos nuestro paseo por el mundo de la

escritura con LaTeX. En las dos entregas anteriores hemos apren-

dido que LaTeX es un sistema de escritura profesional en el que, a

pesar de no ser de tipo WYSIWYG, se obtienen resultados de cali-

dad brillante con poco esfuerzo y donde fundamentalmente el

escritor se dedica a contar en su documento lo que le interesa sin

preocuparse del formato, que para eso LaTeX se ocupa de “todo”.

POR JOSE MANUEL GONZÁLEZ VIDA

LaTeX en Linux (3ª Parte)

La Tabla de Multiplicar(y otras)

87www.linuxmagazine.com.es Número 03

LINUX USERLaTeX

Page 88: Linux Magazine - Edición en Castellano, Nº 03

hemos construido. Con el símbolo &

separamos las distintas columnas en unafila. Podemos dejar una casilla vacíacolocando dos && o bien dejando unespacio en blanco entre ellos. Con lasdos barras \\ indicamos a LaTeX quecomienza una nueva fila.

Para separadores horizontales tenemosel comando \hline que dibuja una líneahorizontal entre fila y fila. Debe aparecerjusto antes de la primera fila o justodespués de \\ si está entre dos filas. Doscomandos \hline seguidos dibujan doslíneas horizontales con un pequeñoespacio entre ellas. \cline{n - m} dibujauna línea horizontal entre las columnasn y m. Si retocamos el ejemplo anteriorcambiando la tabla usando el siguientecódigo:

\begin{tabular}{|l|c|c|r|}

\hline

{\bf Nombre} & {\bf Apellidos}U

& {\bf DNI} & {\bfU

Calificación} \\

\hline \hline

Juan & López & 43434322L &U

5.3 \\ Emilio & Pérez &U

45989845K & 7.2 \\

Gema & Gutiérrez &U

21388383A & 8.1 \\

\hline

\end{tabular}

a la práctica escribiendo en nuestro edi-tor de texto el siguiente ejemplo:

01 \documentclass[a4paper,12pt]

{article}

02 \usepackage[latin1]{inputenc}

03 \usepackage[T1]{fontenc}

04 \usepackage[spanish]{babel}

05 \begin{document}

06 \begin{tabular}{|l|c|c|r|}

07 {\bf Nombre} & {\bf

Apellidos}

& {\bf DNI} & {\bf

Calificación} \\

08 Juan & López & 43434322L &

5.3 \\

09 Emilio & Pérez & 45989845K &

7.2 \\

10 Gema & Gutiérrez & 21388383A

& 8.1

11 \end{tabular}

12 \end{document}

El resultado de compilar el ejemplo ante-rior lo tenemos en la Figura 1. Podemosobservar en el listado de nuestro ejemploque no hemos usado los argumentosopcionales y que en el formato de lascolumnas hemos escogido separadoressimples para las columnas verticales.Otro detalle importante que convieneobservar es la utilización de los símbolos& y \\ en las distintas filas de la tabla que

88 Número 03 www.linuxmagazine.com.es

LaTeXLINUX USER

Figura 1: Un primer ejemplo de una tabla. Figura 2:Una tabla con una “multicolumna”.

Instrucción Uso

_{subíndice} Texto en subíndice

^{superíndice} Texto en superíndice

\sqrt[n]{radicando} Raíz enésima del radicando

\frac{numerador}{denominador} Cociente entre el numerador y el denominador

Tabla 1. Algunas fórmulas matemáticas sencillas

Obtenemos una tabla. Ahora me gustaríaque probaseis a sustituir la tabla denuestro ejemplo por la siguiente

\begin{tabular}{|l|c|c|r|}

\hline

{\bf Nombre} & {\bfU

Apellidos} & {\bf DNI}U

& {\bf Calificación} \\

\hline

Juan & López & 43434322LU

& 5.3 \\

Emilio & Pérez & 45989845KU

& 7.2 \\

Gema & Gutiérez &U

\multicolumn{2}U

{c|}{Dos celdas unidas} \\

\hline

\end{tabular}

El resultado, como podemos observar enla Figura 2, difiere del anterior en quehemos empleado el comando \multico-

lumn que se usa para unir varias colum-nas de una misma fila. \multicolumn usacomo argumentos el número de colum-nas a unir, la alineación del texto aincluir en la “multicolumna” y, por últi-mo, el texto que deseamos incluir. Porúltimo probad a sustituir la tabla anteriorpor la siguiente:

\begin{tabular}{|@{\bfU

Capítulo: } r@{\qquadU

Temas: }c@{ - }c|}

\hline

1 & 1 & 5 \\

2 & 6 & 9 \\

3 & 10 & 14 \\

\hline

\end{tabular}

Page 89: Linux Magazine - Edición en Castellano, Nº 03

Fijaros en que en este ejemplo los sepa-radores de las columnas son las palabrasque hemos incluido en los argumentosdel entorno tabular.

Tablas como objetosflotantesRecordareis que en el artículo delnúmero anterior explicábamos el con-cepto de objeto flotante basándonos en laidea de que las figuras son objetos indi-visibles y por tanto pueden “flotar” y serreubicadas en nuestro documento (den-tro de unas determinadas pautas) con elfin de que el aspecto global del docu-mento cumpla nuestras expectativas. Eneste sentido las tablas no deberían(aunque hay excepciones) ser separadasen más de una página, por tanto su ubi-cación debe ser determinada por el com-pilador. Para tratar las tablas como obje-tos flotantes disponemos del entornotable. Su sintaxis es:

%Sintaxis del entorno table

\begin{table}

Entorno tabular

\caption{Pie de la tabla}

\label{Etiqueta}

\end{table}

Las tablas, al igual que las figuras,pueden llevar su etiqueta con el fin dereferenciarlas en nuestro documento ytambién su pie, que nos servirá tambiénpara crear el índice de tablas.

Modo Texto y ModoMatemáticoBásicamente LaTeX distingue el textomatemático según se introduzca a lo

largo del párrafo que se estáescribiendo o en párrafos separados.El texto de tipo matemático intro-ducido en la misma línea de escritura(modo texto) ha de ser introducidoentre los símbolos $ y $. Para intro-ducir el texto matemático en líneasseparadas se suele hacer encerrándo-lo entre los símbolos $$ y $$ o bienentre los símbolos \[ y \].Introducimos el siguiente ejemplodentro de un documento LaTeX conlas cabeceras estándares que estamosusando y lo compilamos.

Sean $x$, $y$ y $z$U

funciones de $u$ y $v$,

continuas en un dominioU

$D$ del plano $u,v$.

El conjunto de puntosU

dados por:

$$

\vec{r}(u,v)=(x(u,v),yU

(u,v),z(u)),

$$

se llama superficieU

paramétrica.

El resultado debe ser parecido al quemostramos en la Figura 2. Observemosque los caracteres que usa LaTeX parala escritura en modo matemático sondistintos a los hemos visto hastaahora. Se trata de letras ligeramentecursivas y se emplea una fuente másredondeada.

El Entorno EquationEs frecuente, cuando se escriben textoscientíficos, hacer referencias a determi-nadas fórmulas que aparecen en el texto.

Para ello en LaTeX emplearemos elentorno equation. La sintaxis que tieneeste entorno es:

%Sintaxis del entorno equation

\begin{equation}

\label{Etiqueta}

Fórmula

\end{equation}

Este entorno numera automáticamentelas ecuaciones utilizando el contadordenominado equation. De este modopodemos hacer referencia a las distintasfórmulas con los comandos\ref{Etiqueta} y \pageref{Etiqueta}.Además también disponemos delcomando \eqref{Etiqueta} que, adiferencia de los anteriores, encierra elnúmero asignado a la ecuación entreparéntesis.

A diferencia del modo texto, en modomatemático LaTeX presenta un compor-tamiento distinto, es decir, además deusar una fuente distinta y con letras detipo itálico, no respeta los espacios entrepalabras, sólo deja espacios cuando loconsidera necesario. No se permiteescribir vocales acentuadas ni la “ñ” enel modo matemático. LaTeX se ocupa demodo automático de elegir los tamañosadecuados de letra adecuados a diversascircunstancias (fracciones, superíndiceso subíndices, etc.).

Algunas Fórmulas SencillasEn la Tabla 1 mostramos la forma deescribir super y subíndices, raíces desdecuadradas a cualquier orden, fracciones,etc. Una vez que veamos la sintaxis ausar en esta tabla, podemos escribir el

89www.linuxmagazine.com.es Número 03

Figura 3:Un ejemplo de escritura en modo texto y en modo matemático. Figura 4:Un ejemplo de escritura matemática con fórmulas sencillas.

Page 90: Linux Magazine - Edición en Castellano, Nº 03

matemático. Los podemos encontrar enla Tabla 2.

Construcciones Especiales enModo MatemáticoComo estaréis comprobando el modomatemático da mucho de sí en LaTeX. Eneste apartado vamos a aprender a cons-truir matrices y lo que se denominan fun-ciones definidas a trozos. Si imaginamosuna matriz en matemáticas podemos pen-sar que para escribirla con LaTeX hay queusar el entorno tabular que vimos antespero este entorno es válido sólo en modotexto. El entorno equivalente en modomatemático es array. Su sintaxis es pareci-da a la del entorno tabular. Lo vemos en elsiguiente ejemplo:

01 \documentclass[a4paper,

12pt]{article}

02 \usepackage[latin1]{inputenc}

03 \usepackage[T1]{fontenc}

04 \usepackage[spanish]{babel}

05 \usepackage{amsmath}

06 \begin{document}

07 $$

08 \left(

09 \begin{array}{ccc}

10 1 & 2 & 3 \\

11 4 & 5 & 6 \\

12 7 & 8 & 9

13 \end{array}

14 \right)

15 $$

16 \end{document}

El resultado obtenido al compilar, hablan-do sólo en términos de formato, es unatabla (como las del entorno tabular) pre-cedida y terminada por unos paréntesis

que se adaptan al tamaño de la misma.Pues bien, el entorno array permite ir pre-cedido por el comando comandos \left yterminado por \right. Observemos que ennuestro ejemplo hemos escrito el símbolo( justo después del comando \left y ) justodespués del comando \right. Son estoscomandos los que hacen que el símboloque colocamos justo después adapte eltamaño del array. Además permitenestructuran un poco más especiales.Escribid el siguiente código en el cuerpodel ejemplo anterior:

$$

f(x)=

\left\{

\begin{array}{ll}

1 & \mbox{ si $x>1$} \\

0 & \mbox{ en el resto deU

los casos}

\end{array}

\right.

$$

El resultado de compilar el ejemplo ante-rior lo tenemos en la Figura 5. Se trata deuna función definida a trozos, que dehecho, no es más que un array de doscolumnas que va precedido de un símbo-lo de llave ({) y que no se cierra con otrallave (fijaros que para no cerrar el array

con un símbolo usamos \right.). Ademáshemos usado otro nuevo comando\mbox que nos sirve al igual que el \text

para poder escribir texto dentro delmodo matemático.

Simbología MatemáticaLa simbología matemática en LaTeX esincreíblemente extensa y abarca varios

siguiente ejemplo en el cuerpo de nues-tro documento:

Sea $p(x)=a_0+a_1x+a_2x^2+U

\cdots +a_nx^n$.

Sea $p(x)=\sqrt{a_0}+\sqrt[3]U

{a_1}x+\sqrt{a_2}x^2+ \cdotsU

+a_nx^n$.

Sea $p(x)=\frac{a_0}{a_n}+\sqrtU

[3]{a_1}x+\sqrt{a_2}x^2+ \cdotsU

+a_nx^n$.

Lo compilamos y visualizamos el resul-tado, que debe ser parecido al quemostramos en la Figura 4.

El paquete amsmathEl paquete amsmath es una extensiónpara LaTeX que proporciona nuevascaracterísticas para facilitar la escriturade fórmulas matemáticas y mejorar lacalidad tipográfica del documento final.Como regla general incluiremos siempreeste paquete en nuestros documentoscuando éstos contengan fórmulas y nodistinguiremos en esta sección loscomandos propios de LaTeX de los quenos proporciona el paquete amsmath.

Hemos visto antes que cuando escribi-mos texto en modo matemático LaTeXno respeta los espacios, y entonces¿cómo incluir texto en nuestras fórmu-las? La respuesta se halla en el comando\text{texto a incluir}. El texto queincluyamos dentro de este comando serátratado exactamente como los textos quehemos visto hasta ahora.

También tenemos en LaTeX otra seriede comandos que nos proporcionan laposibilidad de dejar espacios de distintotamaño en nuestras fórmulas en modo

90 Número 03 www.linuxmagazine.com.es

LaTeXLINUX USER

Figura 5:Una función definida a trozos. Figura 6:Uso de estructuras de tipo teorema.

Page 91: Linux Magazine - Edición en Castellano, Nº 03

miles de símbolos que van desde lasclásicas letras griegas, todo tipo de fle-chas, operadores binarios, funcionesmatemáticas y un largo etcétera quepor razones de espacio no podemosincluir aquí pero que podemos encon-trar en el libro “Una Descripción deLaTeX2e” realizado por Tomás Bautista,sobre el trabajo inicial de Hubert Partl,Irene Hyna, Elisabeth Schlegl y TobiasOetiker y del que hemos puesto unenlace a una versión en PDF en elpunto [3] de la bibliografía de esteartículo. Además, a modo de ejemplo,os he incluido en la Figura 7cómo seescriben todas las letras clásicas griegascon LaTeX.

Teoremas y DemostracionesOtros elementos comunes dentro deartículos de investigación y libros decontenido matemático son los teoremasy demostraciones. Atendiendo al sis-tema de numeración llamaremosentornos de tipo teorema a estructurasde tipo teorema, proposición, lema,corolario, definición, conjetura, etc. EnLaTeX tenemos el comando \newtheo-

rem que nos permitirá definir en nues-tro documento tantos entornos de tipoteorema como necesitemos. Como siem-pre, lo mejor es comprender su manejocon un ejemplo:

01 \documentclass[a4paper,12pt]

{article}

02 \usepackage[latin1]{inputenc}

03 \usepackage[T1]{fontenc}

04 \usepackage[spanish]{babel}

05 \begin{document}

06 \newtheorem{teorema}{Teorema}

07

\newtheorem{lema}{Lema}[section]

08 \begin{teorema}

09 Aquí tenemos un teorema\dots

10 \end{teorema}

11 \begin{teorema}

12 Y aquí otro.

13 \end{teorema}

14 \begin{lema}[Lema de

fulanito]

15 Esto es una lema

16 \end{lema}

17 \end{document}

El resultado de compilar el texto anteriorlo mostramos en la Figura 6. ¿Qué hemosconseguido? Pues mediante el comando\newthorem hemos creado nuestros pro-pios entornos y les hemos asignado unnombre de entorno y un contador pro-pio. Me explico, mediante la línea\newtheorem{teorema}{Teorema} esta-

mos creando un nuevo entorno que sellama teorema de tal manera que cadavez que usamos un entorno de este tipoactualizamos un contador que va desdeel 1,2,… y creamos un texto que comien-za con Teorema x seguido del enunciadoque queremos escribir dentro de esteentorno (fijaros en el ejemplo anterior).Pero a veces nos puede gustar más queel contador de un entorno de este tipovaya ligado a la sección donde seencuentra, con el fin de que, al referen-ciarlo, el lector sepa en qué sección tieneque buscarlo. ¿Cómo se hace? Pues muyfácil, en el ejemplo anterior hemos crea-do un entorno con nombre lema y cuyocontador está referenciado a las sec-ciones (mirad en el ejemplo cómo haresultado). El contador resultante llevaen primer lugar el número de la secciónactual y separado con un punto el conta-

dor propio del entorno que hemos crea-do.

Para las demostraciones podemos usarel paquete amsmath que contiene elentorno proof. Este entorno produce unencabezamiento con la palabra Proof. yproduce un símbolo en forma de cuadra-dito al final. Para redefinir el encabeza-miento ejecutaremos el siguiente códigodentro de nuestro documento (da igual sise hace en el preámbulo o en el cuerpodel mismo):

\renewcommand*{\proofname}U

{Demostración}

En el siguiente ejemplo os muestro cómose usa.

01 \documentclass[a4paper,

12pt]{article}

02 \usepackage[latin1]{inputenc}

03 \usepackage[T1]{fontenc}

04 \usepackage[spanish]{babel}

05 \begin{document}

06 \renewcommand*{\proofname}

{Demostración}

07 \begin{proof}

08 Prueba del resultado\dots

09 \end{proof}

10 \end{document}

ConclusiónCon lo visto hasta ahora sois ya unoscasi LaTeXpertos, pero remataremosnuestros conocimientos en la próximaentrega donde podremos ver a LaTeX entodo su esplendor, creando un proyectocon capítulos, índices, figuras, tablas,bibliografía y ¡todo de manera automáti-ca! Además os pondremos en nuestrapágina http://www.linux-magazine.com.

es los listados de este proyecto para quelos tengáis de referencia para vuestrospropios trabajos. �

91www.linuxmagazine.com.es Número 03

LINUX USERLaTeX

Comando Abreviatura Espacio proporcionado

\thinspace \, pequeño

\medspace \: mediano

\thickspace \; grande

\negthinspace \! espacio negativo pequeño

\negmedspace espacio negativo mediano

\negthickspace espacio negativo grande

Tabla 2. Espaciados en Modo Matemático

[1] El libro de LaTeX.B.Cascales y otros.Ed.

Prentice Hall. 2003.

[2] LaTeX,a document preparation system.L.

Lamport.2ª Ed.Ed.Addison-Wesley. 1994.

[3] “Una Descripción de LaTeX2e”.Tomás

Bautista.http://www.iuma.ulpgc.es/

users/bautista/other/tex/ldesc2e/misc/

ldesc2e.pdf

RECURSOS

Figura 7: Las letras griegas con LaTeX.

Page 92: Linux Magazine - Edición en Castellano, Nº 03

HumorLINUX MAGAZINE

Según la CCCP (Cooperativa deCorporaciones de Comunicación yProducción), debida a la laguna

legal abierta por licencias tipo CreativeCommons y creciente número de denun-cias infundadas de algunos autores porlos abusos practicados por parte de cier-tas empresas del sector de las comunica-ciones con sus obras, existe la necesidadde un tipo de licencia intermedia, quetanto proteja los derechos de las corpora-ciones como defina los deberes de losautores para con las corporaciones de lacomunicación y que exima a éstas últi-mas de responsabilidades legalesderivadas de la mala fe y ambiguas inter-pretaciones que hacen los autores de lascondiciones descritas en las licenciasactuales.

Para los autores, la CCCP propone elGULAG (Granted User’s License AndGuarantee - Licencia y Garantía deCesión a Usuarios), un texto que servirácomo alternativa a las licencias CC habi-tuales y que prevalecerá sobre éstas encaso de conflicto. José Estallín, presi-dente de la CCCP, nos comenta: “No haydiferencias sustanciales entre los térmi-nos de una licencia CC actual y unGULAG. La única diferencia es la seguri-dad jurídica que otorga nuestra licencia”.

Como muestra, un botón:Reproducimos a continuación la lista derestricciones del texto del GULAG, paraque los autores y autoras se convenzande de la buena fe para llegar a unentendimiento que posee la CCCP:

. . . Restricciones

a.- Usted puede reproducir, distribuir o

comunicar públicamente la obra sola-

mente bajo términos de esta licencia y

debe incluir una copia de la misma, o su

Identificador Uniforme de Recurso (URI),

con cada copia o grabación de la obra

que usted reproduzca, distribuya o comu-

nique públicamente. Usted no puede ofre-

cer o imponer ningún término sobre la

obra que altere o restrinja los términos de

esta licencia o el ejercicio de sus derechos

por parte de los cesionarios de la misma.

Usted no puede sublicenciar la obra.

Usted debe mantener intactos todos los

avisos que se refieran a esta licencia y a

la ausencia de garantías. Usted no puede

reproducir, distribuir o comunicar públi-

camente la obra con medidas tecnológi-

cas que controlen el acceso o uso de la

obra de una manera contraria a los tér-

minos de esta licencia.

b.- Bueno, je, en lo que se refiere a lo

anterior, vaaaale, yo a usted sí le dejo

reproducir, distribuir o comunicar públi-

camente la obra bajo términos de esta

licencia o cualquier otra que se le ocurra.

Después de todo ¿quien va a saber más de

esto? Yo no quiero ir de nada.

c.- Y en cuanto a lo de que “debe”

incluir una copia de la licencia, pues

mire, siempre y cuando le parezca a usted

bien, porque no veas el precio al que se

han puesto las fotocopias con la subida

de los hidrocarburos. Y si la obra le llega

en formato electrónico, mucho peor: Yo

tampoco consigo acordarme nunca de

como se copia y pega.

d.- Tampoco quisiera abusar con lo de

que no puede ofrecer o imponer ningún

término sobre la obra que altere o restrin-

ja los términos de esta licencia. Vamos,

que si cree que algo se puede mejorar,

pues usted sabrá. Adelante. ¿Podría usted

avisarme cuando…? Bueno, mejor me

callo que ya han hablado con mi jefe y de

momento me puedo ir despidiendo de la

cesta de Navidad con el chopped y el

Delapierre Glasé.

f.- En lo que se refiere a lo de “no poder

sublicenciar la obra”, bueno, eso es una

errata. Se me fue el dedo y lo que debería

decir es “no quiero que presionen a mi

banco para que me embarguen el piso

por ponerme demasiado pesado con lo de

mis derechos”.

g.- ¿Qué si lo de la reproducción…? Sí,

claro hombre: tache, tache. Ya se sabe,

eso se pone por poner. Venía escrito de

serie y yo ni me había fijado. Oiga, si yo

firmo esto ¿conseguirán que vuelvan a

admitir a mi padre en la lista de can-

didatos para un trasplante de corazón?

h.- Muy bien, muy bien, hagan lo que

quieran con mi obra: modifíquenla,

manipúlenla, distribúyanla, tergivérsen-

la, saquen mis palabras de contexto o

hagan que diga justo lo contrario de lo

que dije en el original, con mi consen-

timiento expreso o sin él, citándome como

el autor o a su sobrino el de Cuenca, me

da igual. Pero por favor, por favor, por

favor, devuélvanme a mi familia. . . .

No hay nada que temer.(Dedicado a Mercè Molist y a Bill

Gates. A la primera deseándole lo mejor

en su lucha para que prevalezcan sus

derechos - ver http://barrapunto.com/

article.pl?sid=04/11/12/1522255 -. Al

segundo por mira con qué nos

sale ahora: http://news.com.com/

Gates+taking+a+seat+in+your+de

n/2008-1041_3-5514121.

html?tag=nefd.ac.) �

92 Número 03 www.linuxmagazine.com.es

Nuevas licencia, nuevos retos

Autores al Gulag

Page 93: Linux Magazine - Edición en Castellano, Nº 03
Page 94: Linux Magazine - Edición en Castellano, Nº 03
Page 95: Linux Magazine - Edición en Castellano, Nº 03

95www.linuxmagazine.com.es Número 03

COMUNIDADProyectos

FlightGear rápidamente se convirtió enun proyecto con ambiciones globales.Innumerables programadores de todo elmundo trabajan ahora en este simuladorde vuelo.

Descarga GigantescaEl paquete FlightGear básico, con variosmodelos de aviones y un pequeño mapade San Francisco (Figura 1), pesa más de90 Mbytes. Y se necesitan mas mapasdigitales FlightGear para el resto delmundo. Si la descarga es demasiado paratu conexión a Internet, puedes pedir elpaquete completo de FlightGear en lapágina de inicio de FlightGear [1]. Elpaquete viene con tres DVDs u onceCDs, conteniendo un total de 12 Gbytesde datos. A pesar de ello, los diferentessectores del mundo pueden descargarsepor separado.

Después de completar la instalación,los usuarios simplemente pueden teclearfgfs para arrancar Flightgear. Arrancar elprograma sin ninguna opción nos colocaen un Cessna en la mencionada zona devuelo de San Francisco. Un joystick es

Volar… un sueño para loshumanos desde la antigüedad.Grandes genios han dedicado su

tiempo e inteligencia a intentar construiraparatos voladores. Curiosamente, hoyen día, cuando el coste de volar concompañías comerciales está al alcancede todo el mundo, existe un crecientenúmero de programas, que permiten sur-car los aires desde el salón de tu casa.

Despegue con FlightGearMicrosoft introdujo un simulador devuelo ya hace tiempo, pero este productono corre en Linux. Sin embargo, comobien sabemos, la comunidad del códigoabierto es autosuficente: FlightGear traela experiencia de sentarse a los mandosde un avión a tu escritorio favorito. Yaterriza con licencia GPL.

Los desarrolladores de FlightGeardicen que el programa es el resultado desu disconformidad con simuladores devuelo comerciales; el hecho de que elcódigo de MS fuera cerrado impedía quese añadieran extensiones y mejoras deterceros.

El software libre incluyes un abanico

tan amplio de aplicaciones que

puede ser difícil encontrar la herra-

mienta perfecta. En esta sección,

escogemos lo mejor de la cosecha.

Este mes probamos FlightGear, un

fabuloso simulador de vuelo, y

Amarok, un reproductor musical de

nueva generación.

POR MARTIN LOSCHWITZ

Software Libre y sus Creadores

Proyectos en Marcha

perfecto para el control de un avión,pero también se puede utilizar un ratón.En el modo estándar, el ratón se utilizapara operar la instrumentación de la car-linga y acceder a los programas de losmenús. Al hacer clic con el botón dere-cho, se cambia a modo joystick. Otro clicderecho y se cambia la perspectiva. Sepuede ver el avión desde fuera (a amboslados, vista frontal o vista de pájaro),pero los jugadores preferirán la vistadesde el asiento del pilot.

Si el Cessna nos sabe a poco, simple-mente hemos de seleccionar un nuevoavión. Disponemos de una gran variedadde aviones, desde un Boeing 747 hastaun Antonov (ver Figura 2), así como doscazas: el F16 y el prototipo de unNorthrop/McDonell Douglas. Para losapasionados de la historia de la aviación,existe hasta un modelo del primer avióncreado por los hermanos Wright, elWright Flyer. Existen muchos otros mo-delos en Internet, desarrollados por losaficionados a FlightGear.

A diferencia de simuladores de vuelocomerciales, FlightGear es bastante fru-

Ronald Raefle

,visip

ix.co

m

Page 96: Linux Magazine - Edición en Castellano, Nº 03

de reproducción sencillas,almacenando los caminosa los ficheros de audioconsecutivamente en un ficherode texto.

Ya hace algún tiempo que Amarok [3]entró en escena como nuevo reproductorde audio con la intención de resolverambos problemas. Amarok está pensadoprincipalmente para usuarios de KDE yesto se hace patente al no disponer de unplugin para el acceso directo al móduloAlsa del kernel, sino que hace uso de sis-tema de sonido Arts de KDE, aunqueexisten extensiones para los motoresGStreamer y Xine.

El GUI de Amarok muestra un lista dereproducción completa con abundanteinformación sobre la pista actual, elartista y otras listas de reproducción. Sise requiere, el reproductor puedemostrar una ventana separada de repro-ducción al estilo de Xmms paravisualizar la salida músical. Existe uncreciente número de plugins para exten-der las características estándar.

Al igual que otros programas, Amarokcuenta con una lista de reproducción quepermite ver cual es la siguiente pista, sinembargo, el programa permite al usuariocompilar listas de reproducción flexible-mente a partir de varias colecciones.Para hacer esto, los usuarios definen unoo más directorios fuentes de ficheros desonido donde Amarok buscará. A conti-nuación, la aplicación muestra un lista

desplegable de artistas, la que permite alusuario seleccionar pistas o artistas indi-viduales y añadir pistas a la lista dereproducción.

La vista contextual muestra a losusuarios detalles sobre la pista en repro-ducción. Aparte del título y el nombredel artista, incluye estadísticas sobre lafrecuencia con el que se ha reproducidola canción, cuando se reprodujo por

primera vez, y cuando fue laúltima vez

que seescuchó. Debajo de estainformación, el programa muestra otraspistas del mismo álbum y las pistasmejor puntuadas del mismo artista, pun-tuación ésta basada en el rankingAmarok.

Por que Amarok clasifica cada canciónsegún tus gustos personales, sí, subiendouna pista en el ranking basándose en lasveces que se reproduce y bajándolo si nose escucha tan menudo o se reproducemal. Este sistema permite a Amarokcrear gradualmente una lista con las pis-tas favoritas de cada usuario.

En lo que se refiere a skins, Amarok notiene mucho que ofrecer: los usuariospueden cambiar los colores de fondo ydel panel a su gusto y el aspecto seadapta los temas por defecto de Qt.

A pesar de lo anterior, la potencia deAmarok en lo que se refiere a laadministración de listas de reproduc-ción, lo convierten en un seriocompetidor para el resto de los repro-ductores de música. �

gal en lo que se refiere a sus exigenciasde hardware. Necesitaremos un adapta-dor de gráficos bastante reciente consoporte para aceleración 3D OpenGL. Sinembargo, es bastante difícil dominar elmundo del pilotaje virtual y el manualen la página de inicio de FlightGear nosda un rápido repaso de los instrumentosy teclas más importantes.

Amar a AmarokA medida que Linux ha invadido losescritorios, el número de aplicaciones deentretenimiento ha ido en aumento,entre ellas, los reproductores de músicaMP3 y Ogg. A pesar de que los puristaspuedan preferir la herramienta de lalínea de comandos mpg123 [2], losusuarios de GUIs están bastante con-tentos con el clon Winamp, Xmms, o laherramienta estándar de KDE, Noatun.

Ambos programas tienen sus desven-tajas. Por un lado, ambos tieneninterfaces bastante estáticos. Xmmspuede utilizar skins de Winamp, siemprey cuando sean para la versión 2 del pro-grama de Windows, ya que losdesarrolladores de Winamp diseñaronun nuevo sistema de skins por quecreían que la anterior versión era muyaburrida. Noatun cambia según el temaque se aplique a KDE, sin ningún extra.

La segunda desventaja es que ningunode los dos ayuda al usuario a administraruna gran colección de música. TantoXmms como Noatun trabajan con listas

96 Número 03 www.linuxmagazine.com.es

ProyectosCOMUNIDAD

[1] FlightGear:http://www.flightgear.org

[2] Mpg123:http://www.mpg123.de

[3] Amarok:http://amarok.kde.org/

RECURSOS

Page 97: Linux Magazine - Edición en Castellano, Nº 03

97www.linuxmagazine.com.es Número 03

LINUX MAGAZINEEventos

LinuxPark CeBIT 2005Fecha: 10-16 Marzo

Ciudad:Hannover,Alemania

Sitio Web:

www.cebit.de/

homepage_e

LinuxWorld ExpoFecha: 14–17 Febrero

Ciudad:Boston,MA,EE.UU.

Sitio Web:

www.linuxworld

expo.com

FOSDEM 2005Fecha: 26–27 Febrero

Ciudad:Bruselas,Bélgica

Sitio Web:

www.fosdem.org

Eventos Seleccionados

Información de Contacto

DirectorPaul C. Brown

CoolaboradoresPaul C. Brown, Jose Manuel González Vida, JuanRafael Fernández, Pedro Orantes, José María Ruíz

TraductoresPaqui Martín Vergara, Paul C. Brown, Jesús ReyesDelgado, Antonio Rueda.

MaquetaciónSergio Hardasmal

Diseño de PortadaPaul C. Brown, Pinball([email protected])

Publicidadwww.linuxmagazine.com.es/pub/

Para EspañaPaul C. [email protected]@linuxnewmedia.esTel.: (+ 34) 951 010 556Móvil.: (+ 34) 655 036 836Fax.: (+ 34) 951 010 516

Sergio Hardasmal [email protected].: (+ 34) 951 010 556

Para Alemania, Austria y SuizaOsmund [email protected].: (+49) 6335 9110 Fax.: (+49) 6335 7779

Para el Resto del MundoBrian Osborn [email protected] Tel.: (+49) 6509 910 495Fax.: (+49) 6509 910 497

Director EditorialPaul C. Brown

Director de ProducciónSergio Hardasmal [email protected]

Subscripciones: www.linuxmagazine.com.es/magazine/subs

Precios Subscripción (12 números + 1 DVD cada 3 números) España: 49,50 €Europa: 59,90 €Resto del Mundo - Euros: 79,90 €Resto del Mundo - Dólares U.S.A.: $94,90 €

Tel.: (+34) 951 010 556Fax.: (+34) 951 010 516 [email protected]

Linux MagazineLinux New Media Spain, S.L.Avda. Juan López Peñalver, 2129590 - Campanillas Málaga ESPAÑA [email protected].: (+34) 951 010 556Fax.: (+34) 951 010 516

www.linuxmagazine.com.es - Españawww.linux-magazine.com - Mundowww.linux-magazine.de - Alemania

Si bien se toman todas las medidas posibles paragarantizar la precisión del contenido de los artículospublicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en larevista. Asimismo, Linux Magazine no compartenecesariamente las opiniones vertidas por suscolaboradores 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 escrupu-losamente para confirmar que está libre de virus yerrores.

Copyright y Marcas Registradas © 2004 Linux NewMedia Spain, S.L. Linux New Media Spain S.L. prohíbela reproducción total o parcial de los contenidos deLinux 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

Calendario de Eventos

Evento Fecha Ciudad Sitio Web

CodeCon 4.0 11-13 Febrero San Francisco,CA,EE.UU. www.codecon.org/2005

Southern California Linux Expo 12 Febrero Los Angeles,CA,EE.UU. www.socallinuxexpo.org

LinuxWorld Conference & Expo 14-17 Febrero Boston,MA,EE.UU. www.linuxworldexpo.com

UKUUG LISA/Winter Conference 24-25 Febrero Birmingham,R.U. www.ukuug.org/events/winter2005

FOSDEM 2005 26-27 Febrero Bruselas,Bélgica www.fosdem.org

Solutions Linux 01-03 Marzo París,Francia www.solutionslinux.fr

Linux Park CeBIT 2005 10-16 Marzo Hannover,Alemania www.cebit.de/homepage_e

O’Reilly Emerging Technology Conference 14-17 Marzo San Diego,CA,EE.UU. conferences.oreillynet.com/etech

Novell BrainShare 2005 20-25 Marzo Salt Lake City,UT,EE.UU. www.novell.com/brainshare

YAPC::Taipei 2005 26-27 Marzo Taipei,Taiwan taipei.pm.org

Festival Latinoamericano de Instalación de 2 de Abril Venezuela,Argentina http://ingenieria.ean.edu.co/~azul/

Software Libre y Colombia svnwiki.cgi/colibri/fisl

LinuxWorld Conference & Expo,Canada 18-20 Abril Toronto,Canadá www.linuxworldcanada.com

MySQL Users Conference & Expo 2005 18-21 Abril Santa Clara,CA,EE.UU. www.mysql.com/news-and-events/users-conference

linux.conf.au 18-23 Abril Canberra,Australia conf.linux.org.au/

3rd International Linux Audio Conference 21-24 Abril Karlsruhe,Alemania www.zkm.de:81/lac

GUADEC 2005 29-31 Mayo Stuttgart,Alemania http://2005.guadec.org

I Congreso de Tecnologías del Software Libre 7-8 Julio A Coruña http://congreso.gpul.org

Page 98: Linux Magazine - Edición en Castellano, Nº 03

98 Número 03 www.linuxmagazine.com.es

A LA VENTA MARZO 2005

Número 3PRÓXIMO NÚMERO

Boletín Linux MagazineEl Boletín de Linux Magazine te da la oportunidad de ver lo que se avecina en elsiguiente número de Linux Magazine e incluye enlaces a artículos que aparecenen nuestro sitio web antes de que la versión impresa llegue a los quioscos.Suscríbete en www.linuxmagazine.com.es/boletin.

Las redes inalámbricas son geniales… siconsigues configurarlas. Sinembargo, la gran variedad de dispo-sitivos (no siempre compatibles) y elproblema de integrar el hardwarecon el sistema de software, amenudo intimidan hasta el admi-nistrador más experimentado. El

mes que viene

Especial Wirelessmostramos como configurar Linux enuna red wireless.

Nuestros especialistas en LANsinalámbricas abordarán una amplioespectro de temas relacionados:Primero veremos los fundamentos deredes wireless, para después estudiardispositivos enrutadores DSL WLAN.Asimismo, veremos como configuraruna red privada utilizando OpenVPN

en una red inalámbrica.Finalmente, veremos como

mejorar la seguridad con laayuda de la detección de redesdesprotegidas utilizando unaparato ideal para estos me-

nesteres: un Sharp Zaurus cargadocon Linux.

PrácticoInauguramos sección: Linux Práctico, dedicada al uso de Linux en ámbitosprofesionales. En el número del mes que viene empezaremos a ver como utilizar unamáquina Linux como estación de trabajo para la autoedición con uno de los paquetesde maquetación más interesantes existentes: Scribus. Asimismo veremos comomontar fotos panorámicos utilizando Hugin y aprenderemos a actualizar nuestrainstalación Fedora de manera automática y regular con Yum.

DesarrolloEn nuestra sección dedicada a laprogramación, veremos como crear unlector de flujos RSS con Perl, crearemosuna araña buscadora web con Ruby ydaremos buenos consejos sobre comomontar un portal de contenidosutilizando PHPNuke

SysAdminsEn la sección dedicada a losadministradores de sistemas tendremosmás útiles consejos de Charly,hablaremos de metodologías deseguridad para aplicaciones web ydesentrañaremos los misterios de losservidores de correo IMAP.

Linux UserEn nuestra sección de educación,veremos como representar grafías nooccidentales para la enseñanza deidiomas. Finalizamos nuestro curso deLaTeX con un caso práctico que nosservirá de plantilla para futurosdocumentos. Seguiremos conociendo lalínea de comandos para que todospuedan aprovechar la potencia de lasinstrucciones del shell.

Abril 2005:Número 4

Próximo Número

... Y Además

El DVD de Linux Mandrake 10.1Official al completo.

Page 99: Linux Magazine - Edición en Castellano, Nº 03
Page 100: Linux Magazine - Edición en Castellano, Nº 03