Para el administrador de sistemas es esencial el uso de un "password ring", tal como ZSafe, MyPassWordSafe o KeyPass, entre otros. Pero desde que la LOPD es ley, mantener a salvo datos sensibles de clientes, buzones de contactos o documentos bancarios es una tarea prioritaria.
Una solución muy elegante para estos casos, en lugar de encriptar el sistema de ficheros al completo, es crear un sistema del tipo loopback, mantenerlo cifrado y montarlo/desmontarlo según sea necesario.
Veamos los pasos a seguir para conseguirlo:
1) Cargar los módulos de cifrado
modprobe cryptoloop
modprobe aes
(si no se dispone de ellos, se bajan precompilados para kernels de stock usando apt-get)
2) Crear la imagen. En este ejemplo le indicamos que tendrá un tamaño inicial de 100Mb (bs=1MB count=100)
dd if=/dev/urandom of=cryto_fs.img bs=1M count=100
3) Asociar la imagen creada al sistema loopback e indicarle que va a estar cifrada con AES 128bit
losetup -e aes /dev/loop0 crypto_fs.img
Password:
4) Formatear en el sistema de ficheros preferido
mkfs -t ext3 /dev/loop0
5) Montar en el directorio de trabajo seleccionado
mount /dev/loop0
mount -o loop,encryption=aes crypto_fs.img /home/jose/datos_sensibles/
En este punto, nos pedirá la contraseña de cifrado y podremos comenzar a trabajar con nuestro sistema de ficheros seguro.
La única pega es que para este tipo de ficheros, no nos funcionará el montado en arranque mediante fstab (tendremos que facilitar la contraseña igual), lo cual, aunque incordie, es una medida de seguridad de lo más obvio.
9.12.07
Python: Leer los titulares de un rss de noticias
Pongamos por caso que necesitamos extraer los titulares de un xml (rss) de un periódico. Lo más fácil será crear un parseador xml con sax o minidom que extraiga los datos contenidos entre los tags "title". En mi caso, esta función simple que hace uso de minidom, me ha aliviado el proceso más de una vez:
def buscaXMLTag(xmlFile,xmlTag):
resultList = []
try:
dom = minidom.parse(xmlFile)
elements = dom.getElementsByTagName(xmlTag)
if len(elements) != 0:
for i in range(0,len(elements)):
resultList.extend([elements[i].childNodes[0].nodeValue])
else:
# O ficheiro non ten tags sobre os que buscamos
pass
except:
# O ficheiro non existe ou non se pode abrir
pass
return resultList
def buscaXMLTag(xmlFile,xmlTag):
resultList = []
try:
dom = minidom.parse(xmlFile)
elements = dom.getElementsByTagName(xmlTag)
if len(elements) != 0:
for i in range(0,len(elements)):
resultList.extend([elements[i].childNodes[0].nodeValue])
else:
# O ficheiro non ten tags sobre os que buscamos
pass
except:
# O ficheiro non existe ou non se pode abrir
pass
return resultList
19.11.07
Python: Calculando la fecha de ayer y la de mañana
Esta es una pregunta que suelen realizarme muchas veces, así que queda por escrito para futuras consultas.
Como es lógico, la fecha de ayer y mañana se calculan restando uno o sumando uno a la fecha de hoy. Pero claro, hay que indicar que lo que se suman son días, no un número entero. Esto se realiza con el módulo datetime:
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import datetime
# La fecha de hoy es:
hoy = datetime.datetime.today()
# Para calcular la de ayer, restamos un día
ayer = hoy + datetime.timedelta(days=-1)
# Y para mañana, sumamos un día
mañana = hoy + datetime.timedelta(days=1)
Como es lógico, la fecha de ayer y mañana se calculan restando uno o sumando uno a la fecha de hoy. Pero claro, hay que indicar que lo que se suman son días, no un número entero. Esto se realiza con el módulo datetime:
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import datetime
# La fecha de hoy es:
hoy = datetime.datetime.today()
# Para calcular la de ayer, restamos un día
ayer = hoy + datetime.timedelta(days=-1)
# Y para mañana, sumamos un día
mañana = hoy + datetime.timedelta(days=1)
5.11.07
Python: ¿En qué día nos encontramos?
En ocasiones puede que necesitemos saber el día de la semana de una fecha en concreto, que podemos realizar con el siguiente código:
import datetime
dicDays = {'MONDAY':'Lunes','TUESDAY':'Martes','WEDNESDAY':'Miercoles','THURSDAY':'Jueves', \
'FRIDAY':'Viernes','SATURNDAY':'Sabado','SUNDAY':'Domingo'}
anho = 2007
mes = 11
dia = 05
fecha = datetime.date(anho, mes, dia)
print dicDays[fecha.strftime('%A').upper()]
import datetime
dicDays = {'MONDAY':'Lunes','TUESDAY':'Martes','WEDNESDAY':'Miercoles','THURSDAY':'Jueves', \
'FRIDAY':'Viernes','SATURNDAY':'Sabado','SUNDAY':'Domingo'}
anho = 2007
mes = 11
dia = 05
fecha = datetime.date(anho, mes, dia)
print dicDays[fecha.strftime('%A').upper()]
23.10.07
Tratando HTML con Python
Cada vez que toca lidiar con html pasa lo mismo: ¿nos hacemos un parseador "a palo seco" que nos sirva únicamente para esa web o nos peleamos con los módulos de pyxml?
El proceso más manual, suele ser útil para nimiedades pero cuando queremos hacer algo más o menos universal es bueno echar mano de PyXml o libxml2dom (véase más sobre libxml2dom y PyXML en el siguiente enlace: http://www.boddie.org.uk/python/HTML.html).
En esta receta vamos a ver como descargar un documento y asegurarnos de que no hay código mal formado.
1.- Para descargar un documento, el módulo urllib nos facilita mucho el trabajo. La siguiente función descarga un documento pasándole el nombre de dominio, la ruta del fichero a descargar y un fichero temporal donde almacenar los datos:
def getWebPage(nomeDominio,arquivo,fichTemporal):
'''
Descarga un documento de un site remoto. El nombre de cominio
debe de ser pasado sin http://
'''
import urllib
servidor = httplib.HTTP(nomeDominio)
servidor.putrequest('GET',arquivo)
servidor.putheader('Accept','text/html')
servidor.endheaders()
errcode, errmsh, replyheader = servidor.getreply()
if (errcode != 200):
# Significa que no se puede acceder al servicio
print errcode
descargado = 1
else:
codigoHtml = servidor.getfile()
datos = codigoHtml.readlines()
codigoHtml.close()
wTmp = open(fichTemporal,'w') # en binario wb si es un zip, jpg, etc
for line in datos:
wTmp.write(line)
wTmp.close()
descargado = 0
return descargado
2.- Recorremos el código para ordenarlo, limpiarlo y asegurarnos de que se quede sin "malformaciones". Podemos hacerlo a mano, pero existe un módulo llamado Beautiful Soup que lo hace por nosotros. (Beautiful Soup se puede descargar del siguiente enlace http://www.crummy.com/software/BeautifulSoup/#Download)
Una vez instalado podemos hacer uso de sus bondades para limpiar el código:
from BeautifulSoup import BeautifulSoup
limpiador = BeautifulSoup(variable_con_codigo_sucio)
codigo_limpio = limpiador.prettify()
Con esto ya nos queda el código perfecto para pasárselo a PyXML
El proceso más manual, suele ser útil para nimiedades pero cuando queremos hacer algo más o menos universal es bueno echar mano de PyXml o libxml2dom (véase más sobre libxml2dom y PyXML en el siguiente enlace: http://www.boddie.org.uk/python/HTML.html).
En esta receta vamos a ver como descargar un documento y asegurarnos de que no hay código mal formado.
1.- Para descargar un documento, el módulo urllib nos facilita mucho el trabajo. La siguiente función descarga un documento pasándole el nombre de dominio, la ruta del fichero a descargar y un fichero temporal donde almacenar los datos:
def getWebPage(nomeDominio,arquivo,fichTemporal):
'''
Descarga un documento de un site remoto. El nombre de cominio
debe de ser pasado sin http://
'''
import urllib
servidor = httplib.HTTP(nomeDominio)
servidor.putrequest('GET',arquivo)
servidor.putheader('Accept','text/html')
servidor.endheaders()
errcode, errmsh, replyheader = servidor.getreply()
if (errcode != 200):
# Significa que no se puede acceder al servicio
print errcode
descargado = 1
else:
codigoHtml = servidor.getfile()
datos = codigoHtml.readlines()
codigoHtml.close()
wTmp = open(fichTemporal,'w') # en binario wb si es un zip, jpg, etc
for line in datos:
wTmp.write(line)
wTmp.close()
descargado = 0
return descargado
2.- Recorremos el código para ordenarlo, limpiarlo y asegurarnos de que se quede sin "malformaciones". Podemos hacerlo a mano, pero existe un módulo llamado Beautiful Soup que lo hace por nosotros. (Beautiful Soup se puede descargar del siguiente enlace http://www.crummy.com/software/BeautifulSoup/#Download)
Una vez instalado podemos hacer uso de sus bondades para limpiar el código:
from BeautifulSoup import BeautifulSoup
limpiador = BeautifulSoup(variable_con_codigo_sucio)
codigo_limpio = limpiador.prettify()
Con esto ya nos queda el código perfecto para pasárselo a PyXML
13.9.07
Broadcom Corporation Dell Wireless 1390 WLAN Mini-PCI fácil con Debian Etch/Lenny
Esta tarjeta inalámbrica siempre ha sido muy puñetera de instalar (en algunos equipos funciona a la primera, en otros te desespera) y cuando se da instalado, luego resulta que el network-manager no la ve o que se valida nada bien con redes encriptadas. Aunque existen multitud de how-to(s) colgados, he aquí los dos métodos de instalación posible:
- Instalación para Debian Etch
1. Deshabilitar el módulo que trae el kernel de stock para esta tarjeta
echo "blacklist bcm43xx" >> /etc/modprobe.d/blacklist
rmmod bcm43xx
2. Instalar los paquetes necesarios y compilar ndiswrapper
apt-get install build-essential module-assistant ndiswrapper-common cabextract
m-a update
m-a prepare
m-a a-i ndiswrapper
3. Obtener y cargar los controladores de Windows para ndiswrapper
mkdir /usr/src/drivers-wifi
cd /usr/src/drivers-wifi/
wget ftp://ftp.hp.com/pub/softpaq/sp33001-33500/sp33008.exe
cabextract sp33008.exe
ndiswrapper -i bcmwl5.inf
4. Configurar y cargar ndiswrapper
cp /etc/ndiswrapper/bcmwl5/14E4:4324.5.conf /etc/ndiswrapper/bcmwl5/.conf
Editar el archivo /etc/ndiswrapper/bcmwl5/.conf y cambiar el valor Afterburner|1 a Afterburner|0
echo "ndiswrapper" >> /etc/modules
depmod -a
modprobe ndiswrapper
Con esto la tarjeta estará reconocida y se podrá configurar desde network-manager, consola u otra aplicación
- Instalación para Debian Lenny/Sid
En Sid todo es más fácil, basta simplemente con instalar
apt-get install bcm43xx-fwcutter
y listo, tarjeta funcionando, ya que el kernel 2.6.21 que trae esta distro utiliza este módulo no propietario.
- Instalación para Debian Etch
1. Deshabilitar el módulo que trae el kernel de stock para esta tarjeta
echo "blacklist bcm43xx" >> /etc/modprobe.d/blacklist
rmmod bcm43xx
2. Instalar los paquetes necesarios y compilar ndiswrapper
apt-get install build-essential module-assistant ndiswrapper-common cabextract
m-a update
m-a prepare
m-a a-i ndiswrapper
3. Obtener y cargar los controladores de Windows para ndiswrapper
mkdir /usr/src/drivers-wifi
cd /usr/src/drivers-wifi/
wget ftp://ftp.hp.com/pub/softpaq/sp33001-33500/sp33008.exe
cabextract sp33008.exe
ndiswrapper -i bcmwl5.inf
4. Configurar y cargar ndiswrapper
cp /etc/ndiswrapper/bcmwl5/14E4:4324.5.conf /etc/ndiswrapper/bcmwl5/.conf
Editar el archivo /etc/ndiswrapper/bcmwl5/.conf y cambiar el valor Afterburner|1 a Afterburner|0
echo "ndiswrapper" >> /etc/modules
depmod -a
modprobe ndiswrapper
Con esto la tarjeta estará reconocida y se podrá configurar desde network-manager, consola u otra aplicación
- Instalación para Debian Lenny/Sid
En Sid todo es más fácil, basta simplemente con instalar
apt-get install bcm43xx-fwcutter
y listo, tarjeta funcionando, ya que el kernel 2.6.21 que trae esta distro utiliza este módulo no propietario.
18.7.07
How To: Filtar el tráfico P2P mediante un firewall Linux con iptables
Puede que no sea una cuestión que nos quite el sueño el filtrar tráfico P2P, pero cuando en una red empresarial, el personal se anima a descargarse la película del momento, el último disco de Shakira y algún que otro vídeo para añadir a la pornoteca, te dices que si, que ha llegado el momento.
Ya hemos visto en anteriores posts que filtrar las conexiones a sistemas de chat como el IRC o el MSN es realmente fácil utilizando sencillas reglas de iptables, pero con el P2P no pinta tan fácil, por la forma en que P2P funciona:
Para evitar que un equipo de la red interna pueda ser accesible desde el exterior utilizamos un firewall que nos cierre los puertos y que, al mismo tiempo, permita a los equipos de la LAN acceder libremente a Internet.
Pero el P2P es realmente puñetero ya ha sido programado para saltarse esta limitación. Al abrir un cliente P2P en la LAN se establece una conexión con el exterior que el firewall considera confiable y a partir de este momento los paquetes que vengan de vuelta están marcados como ESTABLISHED,RELATED, con lo que pasan directamente al cliente LAN, saltándose todo tipo de filtro. Otros clientes más avanzados envían los datos directamente en UDP, cuyos datagramas no almacenan tanta información como TCP y marcan los paquetes como RELATED en origen, con lo que el firewall tampoco se entera y deja pasar los datos como perico por su casa.
Se me ocurren varias soluciones:
1) Marcar los paquetes que considero P2P y eliminarlos, pero esto tendrá un coste de CPU que no se si estoy dispuesto a asumir.
2) Instalar un proxy y hacer pasar las peticiones web,ftp y correo a través del mismo pero... ¿y si alguien utiliza VoIP por ejemplo?
3) Utilizar la librería ipp2p para iptables que provee de métodos de detección de paquetes según protocolos P2P, con lo que podemos hacer filtros más exactos.
Así que, optamos por utilizar ipp2p. Los pasos para instalarlo son los siguientes:
1) Instalar los paquetes necesarios (obviamos la instalación de los compiladores):
coruscant:~# apt-get install iptables-dev kernel-headers-`uname-r`
2) Descargarse los fuentes de la versión de iptables que tenemos y descomprimirlos:
coruscant:~# iptables --version
iptables v1.3.6
coruscant:/usr/src# wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.6.tar.bz2
coruscant:/usr/src# bunzip iptables-1.3.6.tar.bz2; tar xf iptables-1.3.6.tar
3) Descargarse la última versión de ipp2p de la web http://www.ipp2p.org/downloads_en.html a día de hoy y descomprimirlos:
coruscant:/usr/src# wget http://www.ipp2p.org/downloads/ipp2p-0.8.1_rc1.tar.gz ; tar zxvf ipp2p-0.8.1_rc1.tar.gz
4) Entrar en el directorio del ipp2p y editar el Makefile para que apunte a los fuentes del iptables que nos hemos descargado:
coruscant:/usr/src/ipp2p-0.8.1_rc1# vi Makefile
y cambiamos la variable a nuestro valor:
IPTABLES_SRC = /usr/src/iptables-1.3.6
5) Compilamos la librería
coruscant:/usr/src/ipp2p-0.8.1_rc1# make
6) Copiamos los módulos compilados y los cargamos
coruscant:/usr/src/ipp2p-0.8.1_rc1# cp ibipt_ipp2p.so /lib/modules/iptables
coruscant:/usr/src/ipp2p-0.8.1_rc1# cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4
coruscant:/usr/src/ipp2p-0.8.1_rc1# depmod -ae
coruscant:/usr/src/ipp2p-0.8.1_rc1# modprobe ipt_ipp2p
7) Añadir a nuestro script iptables las líneas necesarias para que comience a filtrar, por ejemplo:
# Adiós edonkey, emule y demás amigos
iptables -I FORWARD -p tcp -m ipp2p --edk -j DROP
# Adiós bittorrent y amigos
iptables -I FORWARD -p tcp -m ipp2p --bit -j DROP
# Adiños kazza & CO
iptables -I FORWARD -p tcp -m ipp2p --kazaa -j DROP
...
...
Por último recomiendaría hacerse con un buen palo para cuando los usuarios se pongan tontines por haberles cortado las descargas.
Ya hemos visto en anteriores posts que filtrar las conexiones a sistemas de chat como el IRC o el MSN es realmente fácil utilizando sencillas reglas de iptables, pero con el P2P no pinta tan fácil, por la forma en que P2P funciona:
Para evitar que un equipo de la red interna pueda ser accesible desde el exterior utilizamos un firewall que nos cierre los puertos y que, al mismo tiempo, permita a los equipos de la LAN acceder libremente a Internet.
Pero el P2P es realmente puñetero ya ha sido programado para saltarse esta limitación. Al abrir un cliente P2P en la LAN se establece una conexión con el exterior que el firewall considera confiable y a partir de este momento los paquetes que vengan de vuelta están marcados como ESTABLISHED,RELATED, con lo que pasan directamente al cliente LAN, saltándose todo tipo de filtro. Otros clientes más avanzados envían los datos directamente en UDP, cuyos datagramas no almacenan tanta información como TCP y marcan los paquetes como RELATED en origen, con lo que el firewall tampoco se entera y deja pasar los datos como perico por su casa.
Se me ocurren varias soluciones:
1) Marcar los paquetes que considero P2P y eliminarlos, pero esto tendrá un coste de CPU que no se si estoy dispuesto a asumir.
2) Instalar un proxy y hacer pasar las peticiones web,ftp y correo a través del mismo pero... ¿y si alguien utiliza VoIP por ejemplo?
3) Utilizar la librería ipp2p para iptables que provee de métodos de detección de paquetes según protocolos P2P, con lo que podemos hacer filtros más exactos.
Así que, optamos por utilizar ipp2p. Los pasos para instalarlo son los siguientes:
1) Instalar los paquetes necesarios (obviamos la instalación de los compiladores):
coruscant:~# apt-get install iptables-dev kernel-headers-`uname-r`
2) Descargarse los fuentes de la versión de iptables que tenemos y descomprimirlos:
coruscant:~# iptables --version
iptables v1.3.6
coruscant:/usr/src# wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.6.tar.bz2
coruscant:/usr/src# bunzip iptables-1.3.6.tar.bz2; tar xf iptables-1.3.6.tar
3) Descargarse la última versión de ipp2p de la web http://www.ipp2p.org/downloads_en.html a día de hoy y descomprimirlos:
coruscant:/usr/src# wget http://www.ipp2p.org/downloads/ipp2p-0.8.1_rc1.tar.gz ; tar zxvf ipp2p-0.8.1_rc1.tar.gz
4) Entrar en el directorio del ipp2p y editar el Makefile para que apunte a los fuentes del iptables que nos hemos descargado:
coruscant:/usr/src/ipp2p-0.8.1_rc1# vi Makefile
y cambiamos la variable a nuestro valor:
IPTABLES_SRC = /usr/src/iptables-1.3.6
5) Compilamos la librería
coruscant:/usr/src/ipp2p-0.8.1_rc1# make
6) Copiamos los módulos compilados y los cargamos
coruscant:/usr/src/ipp2p-0.8.1_rc1# cp ibipt_ipp2p.so /lib/modules/iptables
coruscant:/usr/src/ipp2p-0.8.1_rc1# cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4
coruscant:/usr/src/ipp2p-0.8.1_rc1# depmod -ae
coruscant:/usr/src/ipp2p-0.8.1_rc1# modprobe ipt_ipp2p
7) Añadir a nuestro script iptables las líneas necesarias para que comience a filtrar, por ejemplo:
# Adiós edonkey, emule y demás amigos
iptables -I FORWARD -p tcp -m ipp2p --edk -j DROP
# Adiós bittorrent y amigos
iptables -I FORWARD -p tcp -m ipp2p --bit -j DROP
# Adiños kazza & CO
iptables -I FORWARD -p tcp -m ipp2p --kazaa -j DROP
...
...
Por último recomiendaría hacerse con un buen palo para cuando los usuarios se pongan tontines por haberles cortado las descargas.
16.7.07
Espabilando un pelín a Apache2
Nadie discute que Apache2 es ideal para instalar en grandes servidores que atienden miles de peticiones al día, ya que está perfectamente preparado para ello gracias a "elementos" como los threads. Pero puede ser que necesitemos instalar Apache como pequeño servidor de pruebas o corparativo e incluso como servidor público en una máquina con el rendimiento justito. En este caso es recomendable ajustar al detalle los valores del servidor para hacerlo rendir sin que tengamos que pagar un alto precio en cuando a consumo de recursos se refiere. Algunos de los apartados de la configuración que podemos tocar para mejorar la eficiencia son los siguientes:
MaxClients y Max/MinSpareServers
En este apartado podremos ajustar el número de procesos padres/hijos a unos valores más adecuados al uso que deseamos darle al servidor. Es muy común la tendencia a reducir los "MaxClients" hasta valores ínfimos, pensando en la regla de tres de que menos procesos, menor consumo de memoria. Y si, hasta aquí, esta afirmación es cierta, pero en cuando realizamos peticiones al servidor web, si este valor es bajo el servidor puede hasta bloquearse por momentos, denegar conexiones e incluso permanecer totalmente inoperante. Por la contra, un alto número de "MaxClients" se traduce en un rendimiento positivo del servidor pero en una carga de memoria dependiendo del número de conexiones establecidas. Un número importante de "MaxClients" se va a traducir por tanto en un rendimiento positivo pero debemos ser cuidadosos con este valor cuando el servidor es de acceso externo.
En cuanto a los procesos hijos "Max/MinSpareServers" la situación es similar. No por poner un valor bajo en estas etiquetas vamos a tener un rendimiento mejor, ya que la situación es igual que en el caso anterior. Un valor bajo de estos valores obligará al servidor a abrir más procesos padres para satisfacer la demanda de peticiones. Al igual que en el caso anterior, es una pescadilla que se muerde la cola, ya que reduciendo el número de hijos el consumo de memoria bajará pero la carga del sistema será mayor hemos calculado mal estos números, volviendo al servidor inoperante.
Hay desmitificar por tanto, que el reducir el número de padres/hijos a valores ínfimos no es sinónimo de rendimiento y, al contrario, podemos pagar un alto precio en consumo de recursos.
HostnameLookup
Con esta directiva Apache intenta resolver los nombres de host en lugar de utilizar las direcciones IP. Esto puede ser útil para log o para aplicaciones CGI pero requiere un esfuerzo que nos podemos ahorrar ya que, por lo general, nos dará igual tratar con la IP que con el nombre. Desactivando esta directiva optimizaremos, por tanto, nuestro servicio.
AllowOverride
Esta función es muy útil y muy conocida. Mediante ficheros .htaccess guardados en cada directorio, podemos controlar el acceso a misma mediante juegos de usuario/pwd. Esto es muy útil pero, ¿vamos a usarlo en nuestro servidor? Porque si no es así, podemos desactivarlo y ahorrarle al servicio que por cada directorio que lea, está buscando el fichero.
FastCGI
Si vamos a hacer un uso intensivo de CGI, FastCGI es una interesante alternativa al módulo que viene por defecto en Apache2. El rendimiento de este módulo alternativo es sensiblemente mejor que los mod_X que vienen en las distribuciones de Apache2 (mod_cgi,mod_php...). Más información sobre FastCGI puede encontrarse en la web del proyecto http://www.fastcgi.com/, así como el API para diferentes lenguajes.
MaxClients y Max/MinSpareServers
En este apartado podremos ajustar el número de procesos padres/hijos a unos valores más adecuados al uso que deseamos darle al servidor. Es muy común la tendencia a reducir los "MaxClients" hasta valores ínfimos, pensando en la regla de tres de que menos procesos, menor consumo de memoria. Y si, hasta aquí, esta afirmación es cierta, pero en cuando realizamos peticiones al servidor web, si este valor es bajo el servidor puede hasta bloquearse por momentos, denegar conexiones e incluso permanecer totalmente inoperante. Por la contra, un alto número de "MaxClients" se traduce en un rendimiento positivo del servidor pero en una carga de memoria dependiendo del número de conexiones establecidas. Un número importante de "MaxClients" se va a traducir por tanto en un rendimiento positivo pero debemos ser cuidadosos con este valor cuando el servidor es de acceso externo.
En cuanto a los procesos hijos "Max/MinSpareServers" la situación es similar. No por poner un valor bajo en estas etiquetas vamos a tener un rendimiento mejor, ya que la situación es igual que en el caso anterior. Un valor bajo de estos valores obligará al servidor a abrir más procesos padres para satisfacer la demanda de peticiones. Al igual que en el caso anterior, es una pescadilla que se muerde la cola, ya que reduciendo el número de hijos el consumo de memoria bajará pero la carga del sistema será mayor hemos calculado mal estos números, volviendo al servidor inoperante.
Hay desmitificar por tanto, que el reducir el número de padres/hijos a valores ínfimos no es sinónimo de rendimiento y, al contrario, podemos pagar un alto precio en consumo de recursos.
HostnameLookup
Con esta directiva Apache intenta resolver los nombres de host en lugar de utilizar las direcciones IP. Esto puede ser útil para log o para aplicaciones CGI pero requiere un esfuerzo que nos podemos ahorrar ya que, por lo general, nos dará igual tratar con la IP que con el nombre. Desactivando esta directiva optimizaremos, por tanto, nuestro servicio.
AllowOverride
Esta función es muy útil y muy conocida. Mediante ficheros .htaccess guardados en cada directorio, podemos controlar el acceso a misma mediante juegos de usuario/pwd. Esto es muy útil pero, ¿vamos a usarlo en nuestro servidor? Porque si no es así, podemos desactivarlo y ahorrarle al servicio que por cada directorio que lea, está buscando el fichero.
FastCGI
Si vamos a hacer un uso intensivo de CGI, FastCGI es una interesante alternativa al módulo que viene por defecto en Apache2. El rendimiento de este módulo alternativo es sensiblemente mejor que los mod_X que vienen en las distribuciones de Apache2 (mod_cgi,mod_php...). Más información sobre FastCGI puede encontrarse en la web del proyecto http://www.fastcgi.com/, así como el API para diferentes lenguajes.
6.7.07
Python: Información meteorológica fácil con pymetar
Necesitaba escribir un script que me capturase la información meteorológica para mostrar en pantalla los resultados. Dándole unas vueltas a Google, he visto que con pymetar es una tontería, ya que nos da todo hecho para que podamos atacar a una estación meteorológica de las que hay instaladas en los aereopuertos. Para conseguir el código correspondiente a la estación que nos interesa, debemos mirar en http://www.nws.noaa.gov/tg/siteloc.shtml y cambiar el valor de la variable stationId.
En este ejemplo simple, utilizo dos diccionarios, uno para traducir a español el resultado y otro para cargar un gráfico según el estado del cielo. El módulo pymetar nos prevee de más métodos, que pueden consultarse en la documentación del módulo.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pymetar
import sys
# Global vars
stationId = 'LEPA' # Codigo de la estacion meteorologica
equivalencias = {'N':'Norte','S':'Sur','E':'Este', \
'W':'Oeste','NW':'Noroeste','NE':'Noreste','SSW':'Sur/Suroeste',
'SSE':'Sur/Sureste','NNE':'Norte/Noreste','NNW':'Norte/Noroeste','SE':'Sureste', \
'SW':'Suroeste','ENE':'Este/Noreste','WNW':'Oeste/Noroeste', \
'ESE':'Este/Sureste','WSW':'Oeste/Suroeste'}
iconos = {'sun':'sol.png','suncloud':'solnube.png','cloud':'nubes.png','rain':'lluvia.png', \
'snow':'nieve.png','storm':'tormenta.png','fog':'niebla.png'}
rf=pymetar.ReportFetcher(stationId)
rep=rf.FetchReport()
rp=pymetar.ReportParser()
wData=rp.ParseReport(rep)
if wData == None:
print 'Icono: --'
else:
print 'Icono: ' + iconos[wData.getPixmap()]
#print wData.getPixmap()
print 'Temperatura: ' + str(int(wData.getTemperatureCelsius())) + 'ºC'
print 'Humedad: ' + str(int(wData.getHumidity())) + '%'
print 'Visibilidad: ' + str(int(wData.getVisibilityKilometers())) + ' Km'
print 'Punto de condensacion: ' + str(int(wData.getDewPointCelsius())) + 'ºC'
print 'Viento: ' + equivalencias[str(wData.getWindCompass())] + ' a ' + str(int(wData.getWindSpeed())) + ' Km/h'
print 'Presion: ' + str(int(wData.getPressure())) + ' ba'
En este ejemplo simple, utilizo dos diccionarios, uno para traducir a español el resultado y otro para cargar un gráfico según el estado del cielo. El módulo pymetar nos prevee de más métodos, que pueden consultarse en la documentación del módulo.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pymetar
import sys
# Global vars
stationId = 'LEPA' # Codigo de la estacion meteorologica
equivalencias = {'N':'Norte','S':'Sur','E':'Este', \
'W':'Oeste','NW':'Noroeste','NE':'Noreste','SSW':'Sur/Suroeste',
'SSE':'Sur/Sureste','NNE':'Norte/Noreste','NNW':'Norte/Noroeste','SE':'Sureste', \
'SW':'Suroeste','ENE':'Este/Noreste','WNW':'Oeste/Noroeste', \
'ESE':'Este/Sureste','WSW':'Oeste/Suroeste'}
iconos = {'sun':'sol.png','suncloud':'solnube.png','cloud':'nubes.png','rain':'lluvia.png', \
'snow':'nieve.png','storm':'tormenta.png','fog':'niebla.png'}
rf=pymetar.ReportFetcher(stationId)
rep=rf.FetchReport()
rp=pymetar.ReportParser()
wData=rp.ParseReport(rep)
if wData == None:
print 'Icono: --'
else:
print 'Icono: ' + iconos[wData.getPixmap()]
#print wData.getPixmap()
print 'Temperatura: ' + str(int(wData.getTemperatureCelsius())) + 'ºC'
print 'Humedad: ' + str(int(wData.getHumidity())) + '%'
print 'Visibilidad: ' + str(int(wData.getVisibilityKilometers())) + ' Km'
print 'Punto de condensacion: ' + str(int(wData.getDewPointCelsius())) + 'ºC'
print 'Viento: ' + equivalencias[str(wData.getWindCompass())] + ' a ' + str(int(wData.getWindSpeed())) + ' Km/h'
print 'Presion: ' + str(int(wData.getPressure())) + ' ba'
19.6.07
Herramientas de gestión de energía para portátiles bajo Debian
Puesto que ya hemos tratado en hilos anteriores el escalado de frecuencia de las CPU, vamos a ir un poco más lejos y configuraremos el "laptop mode" tan famoso que viene con los kernels 2.6 para aprovechar un poco más la gestión de energía en portátiles modernos (ACPI no APM, aunque podría valer para APM con los cambios pertinentes).
Utilizando el kernel de stock de Debian Etch podemos optimizar el consumo de batería gracias a las laptop-mode-tools (si hemos compilado un kernel propio, debemos asegurarnos que hemos activado el Linux Laptop Mode en la configuración). Lo que vamos a hacer es definir los estados hibernación del portátil según los porcentajes de batería restantes y evitar el acceso al disco duro de forma continua cuando estamos utilizando las baterías. El efecto a conseguir es cargar en memoria (en la medida de lo posible) los datos que estamos utilizando en lugar de leerlos bajo demanda (video, mp3, pdf...). Esto, combinado con el escalado de frecuencia, dará más minutos a nuestro equipo.
Los pasos a seguir son los siguientes:
1.- Instalar las aplicaciones necesarias:
apt-get install sdparm laptop-mode-tools hibernate
2.- Editar el fichero de configuración de las laptop mode tools y ajustar según nuestras necesidades:
vi /etc/laptop-mode/laptop-mode.conf
En mi caso he realizado la siguiente configuración:
# Activamos la herramienta cuando no estamos conectados a la corriente eléctrica
ENABLE_LAPTOP_MODE_ON_BATTERY=1
# Herramienta desactivada si estamos usando el adaptador de corriente
ENABLE_LAPTOP_MODE_ON_AC=0
# Herramienta activada cuando cerramos la tapa del portátil
ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED=1
# Desabilitamos todas las herramientas sensibles a la pérdida de datos cuando estamos en el 20% de batería restante, para evitarnos sorpresas
MINIMUM_BATTERY_CHARGE_PERCENT=20
# Deshabilito la herramienta ante un nivel crítico que he definido como 10% de batería restante, para evitar perder datos
DISABLE_LAPTOP_MODE_ON_CRITICAL_BATTERY_LEVEL=10
# Activar el escalado de frecuencia cuando usamos baterías
CONTROL_CPU_FREQUENCY=1
# Permito el apagado del entorno gráfico
CONTROL_DPMS_STANDBY=1
# Permito que la herramienta hiberne el equipo
ENABLE_AUTO_HIBERNATION=1
# Defino los porcentajes de batería para hibernación automática
AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=9
AUTO_HIBERNATION_ON_CRITICAL_BATTERY_LEVEL=5
# Permito que la herramienta inicie las aplicaciones que necesite y monte/desmonte las unidades de datos que necesite
CONTROL_START_STOP=1
CONTROL_MOUNT_OPTIONS=1
Utilizando el kernel de stock de Debian Etch podemos optimizar el consumo de batería gracias a las laptop-mode-tools (si hemos compilado un kernel propio, debemos asegurarnos que hemos activado el Linux Laptop Mode en la configuración). Lo que vamos a hacer es definir los estados hibernación del portátil según los porcentajes de batería restantes y evitar el acceso al disco duro de forma continua cuando estamos utilizando las baterías. El efecto a conseguir es cargar en memoria (en la medida de lo posible) los datos que estamos utilizando en lugar de leerlos bajo demanda (video, mp3, pdf...). Esto, combinado con el escalado de frecuencia, dará más minutos a nuestro equipo.
Los pasos a seguir son los siguientes:
1.- Instalar las aplicaciones necesarias:
apt-get install sdparm laptop-mode-tools hibernate
2.- Editar el fichero de configuración de las laptop mode tools y ajustar según nuestras necesidades:
vi /etc/laptop-mode/laptop-mode.conf
En mi caso he realizado la siguiente configuración:
# Activamos la herramienta cuando no estamos conectados a la corriente eléctrica
ENABLE_LAPTOP_MODE_ON_BATTERY=1
# Herramienta desactivada si estamos usando el adaptador de corriente
ENABLE_LAPTOP_MODE_ON_AC=0
# Herramienta activada cuando cerramos la tapa del portátil
ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED=1
# Desabilitamos todas las herramientas sensibles a la pérdida de datos cuando estamos en el 20% de batería restante, para evitarnos sorpresas
MINIMUM_BATTERY_CHARGE_PERCENT=20
# Deshabilito la herramienta ante un nivel crítico que he definido como 10% de batería restante, para evitar perder datos
DISABLE_LAPTOP_MODE_ON_CRITICAL_BATTERY_LEVEL=10
# Activar el escalado de frecuencia cuando usamos baterías
CONTROL_CPU_FREQUENCY=1
# Permito el apagado del entorno gráfico
CONTROL_DPMS_STANDBY=1
# Permito que la herramienta hiberne el equipo
ENABLE_AUTO_HIBERNATION=1
# Defino los porcentajes de batería para hibernación automática
AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=9
AUTO_HIBERNATION_ON_CRITICAL_BATTERY_LEVEL=5
# Permito que la herramienta inicie las aplicaciones que necesite y monte/desmonte las unidades de datos que necesite
CONTROL_START_STOP=1
CONTROL_MOUNT_OPTIONS=1
12.6.07
Actualizado el bot que rastrea urls en el IRC
Por fin he podido actualizar el bot (pyHardware) para hacerlo un poco más listo que antes. Entre las nuevas funciones destacan:
- Lista negra de urls a no capturar
- Solucionado el problema de captura doble de urls
- Extracción del tag "title" de la url obtenida
- Extracción de una imagen de tamaño definido de la url obtenida
- Uploading automático del RSS
- Comando !quit para poder matarlo
- Implementado un auto-connect por si se cae
El código fuente del bot está disponible en la dirección:
http://www.cajondesastre.net/pyHardware.txt
- Lista negra de urls a no capturar
- Solucionado el problema de captura doble de urls
- Extracción del tag "title" de la url obtenida
- Extracción de una imagen de tamaño definido de la url obtenida
- Uploading automático del RSS
- Comando !quit para poder matarlo
- Implementado un auto-connect por si se cae
El código fuente del bot está disponible en la dirección:
http://www.cajondesastre.net/pyHardware.txt
8.6.07
Reciclando un equipo viejo: una gramola (jukebox) para la oficina
Para darle vida a un trasto que teníamos por aquí tirado, se nos ha ocurrido darle vida a una gramola en la que podamos subir nuestra música favorita y que nos permita seleccionar tema desde cualquier equipo sin cortar la reproducción. No confundamos este tipo de servicio con un streamer, ya que lo que no queremos hacer es reproducir en el equipo local, sinó conectar el viejo equipo al hilo musical.
La primera propuesta fue Python (como no) con un módulo con glob que busque ficheros y se los pase a pymedia pero, si ya existe, ¿para qué hacerlo?
Lo primero es instalar el sistema base sin X, junto con el alsa y alsa-oss por si las moscas. Aquí os dejo una captura del alsamixer que nos permite controlar el volumen en consola:
Luego instalaremos las librerías de audio (libmad, vorbis y similares) y un estupendo programa llamado moc que lanza un demonio de reproducción de audio y provee de un interface multiusuario que nos permitirá seleccionar tema desde diferentes ubicaciones.
apt-get install moc moc-ffmpeg-plugin
Ahora solo queda lanzarlo y darle a play más rápido que el compañero.
La primera propuesta fue Python (como no) con un módulo con glob que busque ficheros y se los pase a pymedia pero, si ya existe, ¿para qué hacerlo?
Lo primero es instalar el sistema base sin X, junto con el alsa y alsa-oss por si las moscas. Aquí os dejo una captura del alsamixer que nos permite controlar el volumen en consola:
Luego instalaremos las librerías de audio (libmad, vorbis y similares) y un estupendo programa llamado moc que lanza un demonio de reproducción de audio y provee de un interface multiusuario que nos permitirá seleccionar tema desde diferentes ubicaciones.
apt-get install moc moc-ffmpeg-plugin
Ahora solo queda lanzarlo y darle a play más rápido que el compañero.
7.6.07
Imprimiendo en Debian en una Epson Aculaser C1100
La Aculaser 1100 es una impresora de gran formato de Epson, Láser Color con soporte para impresión por red. Está soportada por Bindous y Mac y en la página de Epson de pueden bajar rpms con los ppd para Suse/Mandrake/RedHat/Centos y similares. También se dispone de un tgz con el código fuente del driver, supuestamente para Debian compatibles.
Tras buscar en Google diferentes soluciones he visto que lo que hace la gente es descargarse el .rpm, convertirlo a .deb e instalarlo pero... a mi no me funciona. He probado también a descargarme el ppd, incrustárselo a cups y... tampoco va. Así que vamos a instalarlo desde los fuentes:
1) Descargarse los fuentes de la web de Epson:
http://www.avasys.jp/english/linux_e/dl_laser.html
2) Descomprimir el fichero descargado (Epson-ALC1100-filter-1.2.tar.gz) y compilar:
tar zxf Epson-ALC1100-1.2.tar.gz
cd Epson-ALC1100-1.2
./configure
make
make install
Es probable que al ejecutar el script ./configure rompa con algo similar a esto:
./configure: line 2830: test: =: unary operator expected
configure: error: *** 'cups-config' missing, please install CUPS or fix your $PATH ***
atreides:/usr/src/Epson-ALC1100-filter-1.2#
Para solucionarlo, vamos a la línea en cuestión (2830) del script y nos cargamos todo el if:
vi configure (y nos vamos a la línea :2830 y borramos las siguientes líneas)
if test $have_cups_config = yes; then
CUPS_CFLAGS=`cups-config --cflags`
CUPS_LDFLAGS=`cups-config --ldflags`
CUPS_LIBS=`cups-config --libs`
CUPS_IMAGE_LIBS=`cups-config --image --libs`
CUPS_SERVER_DIR=`cups-config --serverbin`
CUPS_DATA_DIR=`cups-config --datadir`
else
{ { echo "$as_me:$LINENO: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&5
echo "$as_me: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&2;}
{ (exit 1); exit 1; }; }
fi
Ahora ya podemos compilar
3) Añadir la impresora a CUPS utilizando el ppd disponible en la carpeta ppd del tgz que hemos descomprimido:
atreides:/usr/src/Epson-ALC1100-filter-1.2/ppd# l
total 36
-rw-r--r-- 1 root root 34561 2006-10-12 14:54 Epson-AL-C1100-fm3.ppd
Los parámetros de configuración de la impresora para imprimir por red son los siguientes:
URI de la conexión: lpd://direccion_ip:515/PASSTHRU
4) Reiniciar cups y comenzar a disfrutar de la máquina
Tras buscar en Google diferentes soluciones he visto que lo que hace la gente es descargarse el .rpm, convertirlo a .deb e instalarlo pero... a mi no me funciona. He probado también a descargarme el ppd, incrustárselo a cups y... tampoco va. Así que vamos a instalarlo desde los fuentes:
1) Descargarse los fuentes de la web de Epson:
http://www.avasys.jp/english/linux_e/dl_laser.html
2) Descomprimir el fichero descargado (Epson-ALC1100-filter-1.2.tar.gz) y compilar:
tar zxf Epson-ALC1100-1.2.tar.gz
cd Epson-ALC1100-1.2
./configure
make
make install
Es probable que al ejecutar el script ./configure rompa con algo similar a esto:
./configure: line 2830: test: =: unary operator expected
configure: error: *** 'cups-config' missing, please install CUPS or fix your $PATH ***
atreides:/usr/src/Epson-ALC1100-filter-1.2#
Para solucionarlo, vamos a la línea en cuestión (2830) del script y nos cargamos todo el if:
vi configure (y nos vamos a la línea :2830 y borramos las siguientes líneas)
if test $have_cups_config = yes; then
CUPS_CFLAGS=`cups-config --cflags`
CUPS_LDFLAGS=`cups-config --ldflags`
CUPS_LIBS=`cups-config --libs`
CUPS_IMAGE_LIBS=`cups-config --image --libs`
CUPS_SERVER_DIR=`cups-config --serverbin`
CUPS_DATA_DIR=`cups-config --datadir`
else
{ { echo "$as_me:$LINENO: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&5
echo "$as_me: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&2;}
{ (exit 1); exit 1; }; }
fi
Ahora ya podemos compilar
3) Añadir la impresora a CUPS utilizando el ppd disponible en la carpeta ppd del tgz que hemos descomprimido:
atreides:/usr/src/Epson-ALC1100-filter-1.2/ppd# l
total 36
-rw-r--r-- 1 root root 34561 2006-10-12 14:54 Epson-AL-C1100-fm3.ppd
Los parámetros de configuración de la impresora para imprimir por red son los siguientes:
URI de la conexión: lpd://direccion_ip:515/PASSTHRU
4) Reiniciar cups y comenzar a disfrutar de la máquina
5.6.07
Yakuake, consola rápida en KDE
Tras haber echado tantas pestes durante tanto tiempo KDE, no me queda otra que reconocer que es más ligero que Gnome y que las utilidades que lo acompañan son realmente fantásticas. De entre ellas, hay una aplicación realmente útil, Yakuake.
Yakuake nos provee de una consola rápida que se muestra y se esconde pulsando la tecla F12, simplemente fantástico.
Para instalar sobra decir apt-get install yakuake
Yakuake nos provee de una consola rápida que se muestra y se esconde pulsando la tecla F12, simplemente fantástico.
Para instalar sobra decir apt-get install yakuake
Calculando la diferencia en días entre dos fechas con Python
Es probable que esta función exista dentro del módulo time de Python pero, al no haberla encontrado, ha tocado hacerse una más casera.
El funcionamiento es simple, aportando dos fechas en formato estándar (YYYY-mm-dd) con separadores estándar (/ - .) se realiza el cálculo con una simple función, tal como sigue:
#!/usr/bin/python
from datetime import date
def daysDifference(date1,date2):
d1 = date(int(date1[0:4]),int(date1[5:7]),int(date1[-2:]))
d2 = date(int(date2[0:4]),int(date2[5:7]),int(date2[-2:]))
diff = d2 - d1
return diff.days
if __name__=='__main__':
numeroDias = daysDifference('20050203','20070423')
El funcionamiento es simple, aportando dos fechas en formato estándar (YYYY-mm-dd) con separadores estándar (/ - .) se realiza el cálculo con una simple función, tal como sigue:
#!/usr/bin/python
from datetime import date
def daysDifference(date1,date2):
d1 = date(int(date1[0:4]),int(date1[5:7]),int(date1[-2:]))
d2 = date(int(date2[0:4]),int(date2[5:7]),int(date2[-2:]))
diff = d2 - d1
return diff.days
if __name__=='__main__':
numeroDias = daysDifference('20050203','20070423')
1.6.07
Caracteres jeroglíficos en la consola, resetear el terminal
A quien no le pasa que la consola se le queda totalmente pez por haber volcado un binario por pantalla? Algo tal que así:
q�x��h�ʺ�40�N$���<�#�!�8�M�O#RՀ���\UP�@���%.���<��UXv�Sp���N>��Qɒ�7�7K�X��▒3ʩ�ͻ������7Gk�qK�=�=.*_���0!+�p��>�\� 8�q�a����#@��Gv�k��N���P�u'�W�?�▒����J5�z���r}]
Resolver este problema es realmente sencillo con el comando reset:
reset
q�x��h�ʺ�40�N$���<�#�!�8�M�O#RՀ���\UP�@���%.���<��UXv�Sp���N>��Qɒ�7�7K�X��▒3ʩ�ͻ������7Gk�qK�=�=.*_���0!+�p��>�\� 8�q�a����#@��Gv�k��N���P�u'�W�?�▒����J5�z���r}]
Resolver este problema es realmente sencillo con el comando reset:
reset
30.5.07
Debian, tarjetas de red que se detectan pero no funcionan (renombrando interfaces de red)
Es un problema muy común instalar Debian y que las tarjetas de red se zurren entre ellas porque todas quieren llamarse eth0 o eth1. En especial, cuando disponemos de un interface firewire y una tarjeta Intel, ambos dispositivos luchan por hacerse con el control del nombre 'eth0', por más que se les diga que no. Lo mismo ocurre en ocasiones que disponemos de varias tarjetas Realtek combinadas con Intel e1000, etc.
La solución es realmente simple para los que estamos acostumbrados a lidiar con Linux, pero para los primerizos suele ser desesperante. Veamos como solventar estas dificultades:
1) (opcional) Si disponemos de un interface firewire y no lo vamos a utilizar para conectarnos a otro equipo, podemos deshabilitar el interface de red firewire:
- Editamos el fichero /etc/modprobe.d/blacklist y añadimos el módulo a los dispositivos que no queremos autocargar, es decir, los módulos que no deseamos que Linux lance. Para ello creamos una línea al final del archivo de la forma:
blacklist eth1394
2) Editamos la configuración de udev y renombramos los interfaces de red a nuestro gusto.
- Alteramos el fichero de configuración de red de udev
vi /etc/udev/rules.d/z25_persistent-net.rules
- Cambiamos los nombres según el nombre del módulo que nos interese. En este ejemplo, yo he cambiado mi tarjeta nvidia integrada al interface eth0 y he puesto el firewire en eth4, la wifi la he dejado como estaba:
# Firewire device 06e40a00b52d5045 (ohci1394)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="06:e4:0a:00:c5:2f:50:45", NAME="eth4"
# PCI device 0x10de:0x0269 (forcedeth)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:16:d3:16:42:ff", NAME="eth0"
# PCI device 0x14e4:0x4311 (ndiswrapper)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:14:f5:d0:a6:87", ATTRS{type}=="1", NAME="wlan0"
3) Reiniciar y cambiar la configuración de red en /etc/network/interfaces o utilizando cualquier herramienta gráfica como NetworkManager.
La solución es realmente simple para los que estamos acostumbrados a lidiar con Linux, pero para los primerizos suele ser desesperante. Veamos como solventar estas dificultades:
1) (opcional) Si disponemos de un interface firewire y no lo vamos a utilizar para conectarnos a otro equipo, podemos deshabilitar el interface de red firewire:
- Editamos el fichero /etc/modprobe.d/blacklist y añadimos el módulo a los dispositivos que no queremos autocargar, es decir, los módulos que no deseamos que Linux lance. Para ello creamos una línea al final del archivo de la forma:
blacklist eth1394
2) Editamos la configuración de udev y renombramos los interfaces de red a nuestro gusto.
- Alteramos el fichero de configuración de red de udev
vi /etc/udev/rules.d/z25_persistent-net.rules
- Cambiamos los nombres según el nombre del módulo que nos interese. En este ejemplo, yo he cambiado mi tarjeta nvidia integrada al interface eth0 y he puesto el firewire en eth4, la wifi la he dejado como estaba:
# Firewire device 06e40a00b52d5045 (ohci1394)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="06:e4:0a:00:c5:2f:50:45", NAME="eth4"
# PCI device 0x10de:0x0269 (forcedeth)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:16:d3:16:42:ff", NAME="eth0"
# PCI device 0x14e4:0x4311 (ndiswrapper)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:14:f5:d0:a6:87", ATTRS{type}=="1", NAME="wlan0"
3) Reiniciar y cambiar la configuración de red en /etc/network/interfaces o utilizando cualquier herramienta gráfica como NetworkManager.
20.5.07
Configurando redes inalámbricas con dos clicks en Debian
De todas las herramientas disponibles para configurar redes de forma fácil en Linux, probablemente la más versátil sea Network Manager. Ámpliamente conocida entre los usuarios de Ubuntu, son muchos los usuarios de Debian que se ven frustrados por no ser capaces de instalar esta aplicación. Esta circunstancia se debe a que los usuarios creados en Debian no forman parte del grupo "netdev", utilizado por esta estupenda aplicación.
Los pasos necesarios para disfrutar de esta herramienta son los siguientes:
1) Añadir nuestro usuario al grupo netdev
adduser mi_nombre_de_usuario netdev
2) Editar el fichero de configuración de red /etc/network/interfaces para acelerar la carga del sistema, ya que Network Manager no lo usará. Podemos dejarlo de forma similar a esta, adecuándolo a los nombres de interface de cada uno:
auto lo
iface lo inet loopback
allow-hotplug eth0
allow-hotplug wlan0
3) Instalar los paquetes de Network Manager, escogiendo entre la versión KDE o Gnome según el gestor de ventanas instalado:
apt-get install network-manager network-manager-kde
4) Reiniciar el sistema
5) Lanzar Network Manager desde nuestro gestor de ventanas y comenzar a disfrutar de la magia
Los pasos necesarios para disfrutar de esta herramienta son los siguientes:
1) Añadir nuestro usuario al grupo netdev
adduser mi_nombre_de_usuario netdev
2) Editar el fichero de configuración de red /etc/network/interfaces para acelerar la carga del sistema, ya que Network Manager no lo usará. Podemos dejarlo de forma similar a esta, adecuándolo a los nombres de interface de cada uno:
auto lo
iface lo inet loopback
allow-hotplug eth0
allow-hotplug wlan0
3) Instalar los paquetes de Network Manager, escogiendo entre la versión KDE o Gnome según el gestor de ventanas instalado:
apt-get install network-manager network-manager-kde
4) Reiniciar el sistema
5) Lanzar Network Manager desde nuestro gestor de ventanas y comenzar a disfrutar de la magia
17.5.07
Python: Como leer tags XML de forma fácil
Las posibilidades de Python con XML son muchas pero, generalmente queremos realizar operaciones sencillas como sería leer el contenido de una etiqueta en concreto. Esto, no está tan claro en la documentación (al menos para mi) y he aquí una pequeña receta de como conseguirlo con minidom:
#Importamos el módulo
from xml.dom import minidom
#Creamos una función que busca un tag dado en un fichero XML
#y nos devuelve una lista con todos los contenidos que había
#dentro de los tags.
def buscaXMLTag(xmlFile,xmlTag):
resultList = []
try:
dom = minidom.parse(xmlFile)
elements = dom.getElementsByTagName(xmlTag)
if len(elements) != 0:
for i in range(0,len(elements)):
resultList.extend([elements[i].childNodes[0].nodeValue])
else:
print 'xxx No hay elementos en el fichero XML con la etiqueta ' + xmlTag
except:
print 'xxx El fichero no existe o está mal formado.'
print 'xxx Path del fichero: ' + xmlFile
print 'xxx Etiqueta sobre la que se realizó la búsqueda: ' + xmlTag
return resultList
#Ejecutamos la función y sacamos por pantalla todo el contenido encontrado
datos = buscaXMLTag('/home/jose/test.xml','titulo')
for elemento in datos:
print elemento
#Importamos el módulo
from xml.dom import minidom
#Creamos una función que busca un tag dado en un fichero XML
#y nos devuelve una lista con todos los contenidos que había
#dentro de los tags.
def buscaXMLTag(xmlFile,xmlTag):
resultList = []
try:
dom = minidom.parse(xmlFile)
elements = dom.getElementsByTagName(xmlTag)
if len(elements) != 0:
for i in range(0,len(elements)):
resultList.extend([elements[i].childNodes[0].nodeValue])
else:
print 'xxx No hay elementos en el fichero XML con la etiqueta ' + xmlTag
except:
print 'xxx El fichero no existe o está mal formado.'
print 'xxx Path del fichero: ' + xmlFile
print 'xxx Etiqueta sobre la que se realizó la búsqueda: ' + xmlTag
return resultList
#Ejecutamos la función y sacamos por pantalla todo el contenido encontrado
datos = buscaXMLTag('/home/jose/test.xml','titulo')
for elemento in datos:
print elemento
7.5.07
La mejor forma de proteger una red wifi: esconderla entre 53.000 redes
De todas utilidades curiosas, esta destaca por ser realmente útil, un programa que simula hasta 53.000 puntos de acceso.
Puede que nuestra red no sea del todo segura, que no tengamos más posibilidad que encriptar en WEP o que simplemente nos apetece agobiar un poquito a los "wardrivers". FakeAP es una utilidad que utiliza el controlador Host AP para chipsets Prism 2/2.5/3 para simular, decenas, cientos o miles de puntos de acceso falso que confundirán a un posible atacante.
Esta utilidad puede obtenerse en la dirección: http://www.blackalchemy.to/project/fakeap/
Puede que nuestra red no sea del todo segura, que no tengamos más posibilidad que encriptar en WEP o que simplemente nos apetece agobiar un poquito a los "wardrivers". FakeAP es una utilidad que utiliza el controlador Host AP para chipsets Prism 2/2.5/3 para simular, decenas, cientos o miles de puntos de acceso falso que confundirán a un posible atacante.
Esta utilidad puede obtenerse en la dirección: http://www.blackalchemy.to/project/fakeap/
25.4.07
Módulos de red para Python
No es raro volverse mico buscando el módulo necesario para ejecutar una tarea en red, como por ejemplo una funcionalidad de correo electrónico. He aquí un listado de los mismos y su función:
socket: Comunicaciones a bajo nivel, TCP, UDP...
cgi: Construcción de aplicaciones web server-side
urllib: Extrae información de urls, en texto plano
httplib,ftplib,nntplib: Módulos para web, ftp y news
poplib, imaplib, smtplib: Módulos para manejar los protocolos de correo
telnetlib, gopherlib: Módulos para protocolos telnet y ghopher
htmllib, sgmllib, xml.*: Parseadores de tags html, sgml y xml
xdrlib: Codifica datos en binario para transmisión
email.*: Parsea y compone correo con asunto, adjuntos, etc
rfc822: Parseador de cabeceras de correo electrónico
mhlib, mailbox: Procesa correos y mbox complejos
mimetools, mimify: Maneja cabeceras MIME
multifile: Lee mensajes con diferentes partes
uu, binhex, base64, binascii, quopri, email.*: Codifica y decodifica datos binarios para transmitirlos como texto
urlparse: Parseador de urls en componentes
SocketServer: Framework para servicios .NET
BaseHTTPServer: Implementación básica de servidor HTTP
simpleHTTPServer, CGIHTTPServer: Manejador de cabeceras HTTP
socket: Comunicaciones a bajo nivel, TCP, UDP...
cgi: Construcción de aplicaciones web server-side
urllib: Extrae información de urls, en texto plano
httplib,ftplib,nntplib: Módulos para web, ftp y news
poplib, imaplib, smtplib: Módulos para manejar los protocolos de correo
telnetlib, gopherlib: Módulos para protocolos telnet y ghopher
htmllib, sgmllib, xml.*: Parseadores de tags html, sgml y xml
xdrlib: Codifica datos en binario para transmisión
email.*: Parsea y compone correo con asunto, adjuntos, etc
rfc822: Parseador de cabeceras de correo electrónico
mhlib, mailbox: Procesa correos y mbox complejos
mimetools, mimify: Maneja cabeceras MIME
multifile: Lee mensajes con diferentes partes
uu, binhex, base64, binascii, quopri, email.*: Codifica y decodifica datos binarios para transmitirlos como texto
urlparse: Parseador de urls en componentes
SocketServer: Framework para servicios .NET
BaseHTTPServer: Implementación básica de servidor HTTP
simpleHTTPServer, CGIHTTPServer: Manejador de cabeceras HTTP
24.4.07
Herramientas de gestión de red
Linux es un sistema conocido por sus bondades en la gestión de redes. Un gran número de firewalls y routers de diversos fabricantes incorporan núcleos de Linux ligeros. Son muchas las aplicaciones de gestión de red disponibles, conocidas por el administrador de sistemas pero extrañas para el usuario de "a pie". Algunas de las más importantes son las siguientes:
/sbin/ifconfig y /sbin/route
Con esta conocida herramienta podemos definir los parámetros de red o consultarlos. Ejecutando ifconfig sin parámetros nos muestra la configuración de red. Veamos un ejemplo de configuración de los parámetros de una red:
ifconfig eth0 192.168.0.5 #Asigna esta dirección ip al interface eth0
route add default eth0 #Indica que eth0 es nuestro interface primario
route add default gw 192.168.0.1 #Asigna esta ip como puerta de enlace
/sbin/ip
Este comando nos proporciona los mismos detalles que las herramientas anteriores pero de forma más estructurada. Tiene dos formas básicas de ejecución:
ip addr #Nos muestra información sobre los adaptadores hardware
ip route #Muestra información sobre ip y las rutas de acceso
/usr/bin/mtr
Se trata de un traceroute avanzado repite la operación de envío de paquetes generando estadísticas. Ejemplo:
mtr www.debian.org
/usr/sbin/tcpdump
tcpdump es un conocido sniffer, muy útil para monitorizar la actividad del sistema. Ejemplo:
tcpdump -i eth0 port 80 #Esta instrucción monitoriza el puerto 80 desde el interface eth0
/usr/sbin/iptraf
iptraf nos indica exactamente lo que está ocurriendo en nuestra red, los protocolos que se están usando, las máquinas con las que se está estableciendo comunicación, etc.
/sbin/ifconfig y /sbin/route
Con esta conocida herramienta podemos definir los parámetros de red o consultarlos. Ejecutando ifconfig sin parámetros nos muestra la configuración de red. Veamos un ejemplo de configuración de los parámetros de una red:
ifconfig eth0 192.168.0.5 #Asigna esta dirección ip al interface eth0
route add default eth0 #Indica que eth0 es nuestro interface primario
route add default gw 192.168.0.1 #Asigna esta ip como puerta de enlace
/sbin/ip
Este comando nos proporciona los mismos detalles que las herramientas anteriores pero de forma más estructurada. Tiene dos formas básicas de ejecución:
ip addr #Nos muestra información sobre los adaptadores hardware
ip route #Muestra información sobre ip y las rutas de acceso
/usr/bin/mtr
Se trata de un traceroute avanzado repite la operación de envío de paquetes generando estadísticas. Ejemplo:
mtr www.debian.org
/usr/sbin/tcpdump
tcpdump es un conocido sniffer, muy útil para monitorizar la actividad del sistema. Ejemplo:
tcpdump -i eth0 port 80 #Esta instrucción monitoriza el puerto 80 desde el interface eth0
/usr/sbin/iptraf
iptraf nos indica exactamente lo que está ocurriendo en nuestra red, los protocolos que se están usando, las máquinas con las que se está estableciendo comunicación, etc.
23.4.07
Todo lo que querías saber sobre las X, pero no te atrevías a preguntar
Todos conocemos las X-Window, pero son pocos los que conocen más allá de cambiar de KDE a Gnome, toquetear xorg.conf para cambiar algunas cosas o cambiar el login manager.
En posts anteriores hemos visto como podemos iniciar una sesión gráfica en remoto, dando vida a equipos anticuados o centralizando los procesos en un servidor princial. Pero podemos llegar más lejos y explotar funcionalidades no tan conocidas de las X, como las siguientes:
Kiosk
Pongamos como ejemplo el clásico punto de información de una entidad, como una universidad, donde los usuarios pueden consultar datos mediante un interface. Realizar esto en Windows implica el programar el interface, deshabilitar las teclas especiales de Windows, eliminar las barras de Windows...
Utilizando las X en Linux podemos lanzar una aplicación sin tener un gestor gráfico que nos dibuje las ventanas, es decir, no podremos arrastrar ventanas, ni tendremos bordes, ni barritas de desplazamiento, ni combinaciones de teclas (excepto las del sistema), nada de nada. La forma de ejecutar una aplicación como Firefox sería:
X > /dev/null 2>&1 & exec firefox &
De querer disponer de un gestor de ventanas ligero como TWM sería:
X > /dev/null 2>&1 & twm & firefox &
Ahora nos quedaría eliminar ciertos botones a Firefox y combinaciones de teclas como Ctl+Alt+Backspace para tener un kiosk a prueba de crackers. En posts anteriores vimos como hacerlo:
· Inhabilitar funcionalidades de Firefox
· Desactivar combinaciones de teclas
Ejecución de aplicaciones en remoto de forma segura
Para ejecutar aplicaciones en remoto, nada mejor que hacerlo a través de SSH. Para ello, debemos habilitar esta funcionalidad en el servidor SSH, editando el fichero de configuración:
vi /etc/ssh/sshd_config
Al que deberemos añadir/cambiar la entrada X11Forwarding a yes
Ahora tan solo nos queda ejecutar la instrucción y dejar que ssh haga el resto:
ssh -X usuario@maquina aplicación
Ej:
ssh -X jose@srv.coruscant.com firefox
En posts anteriores hemos visto como podemos iniciar una sesión gráfica en remoto, dando vida a equipos anticuados o centralizando los procesos en un servidor princial. Pero podemos llegar más lejos y explotar funcionalidades no tan conocidas de las X, como las siguientes:
Kiosk
Pongamos como ejemplo el clásico punto de información de una entidad, como una universidad, donde los usuarios pueden consultar datos mediante un interface. Realizar esto en Windows implica el programar el interface, deshabilitar las teclas especiales de Windows, eliminar las barras de Windows...
Utilizando las X en Linux podemos lanzar una aplicación sin tener un gestor gráfico que nos dibuje las ventanas, es decir, no podremos arrastrar ventanas, ni tendremos bordes, ni barritas de desplazamiento, ni combinaciones de teclas (excepto las del sistema), nada de nada. La forma de ejecutar una aplicación como Firefox sería:
X > /dev/null 2>&1 & exec firefox &
De querer disponer de un gestor de ventanas ligero como TWM sería:
X > /dev/null 2>&1 & twm & firefox &
Ahora nos quedaría eliminar ciertos botones a Firefox y combinaciones de teclas como Ctl+Alt+Backspace para tener un kiosk a prueba de crackers. En posts anteriores vimos como hacerlo:
· Inhabilitar funcionalidades de Firefox
· Desactivar combinaciones de teclas
Ejecución de aplicaciones en remoto de forma segura
Para ejecutar aplicaciones en remoto, nada mejor que hacerlo a través de SSH. Para ello, debemos habilitar esta funcionalidad en el servidor SSH, editando el fichero de configuración:
vi /etc/ssh/sshd_config
Al que deberemos añadir/cambiar la entrada X11Forwarding a yes
Ahora tan solo nos queda ejecutar la instrucción y dejar que ssh haga el resto:
ssh -X usuario@maquina aplicación
Ej:
ssh -X jose@srv.coruscant.com firefox
Recuperando datos de un disco duro defectuoso o un sistema corrupto
Pongámonos en un escenario fatalista, nuestro disco duro se ha estropeado hasta tal punto que tiene tantos sectores defectuosos que es imposible iniciar el equipo. Llegados hasta aquí, es momento de recuperar tantos datos como nos sea posible y, para ello, utilizaremos las herramientas que nos brinda nuestro sistema operativo favorito.
dd_rescue
dd_rescue es una variante de la conocida herramienta de Unix dd, orientada a la recuperación de datos. Comparada con dd, tiene dos diferencias importantes:
a. Al contrario que dd, cuando hay un error de lectura (por ejemplo un sector defectuoso), dd_rescue no aborta la transferencia, se limita a indicarnos el error en el log.
b. dd_rescue utiliza dos tamaños de bloques de datos durante la lectura, 16384 bytes si no encuentra errores y 512 bytes cuando los encuentra.
El proceder para recuperar los datos de un disco duro, sería el siguiente:
1. Asegurarnos de que tenemos espacio suficiente en disco para almacenar el backup (en su defecto podemos instalar otro disco duro y montarlo, montar una unidad de red, etc).
2. Volcar los datos del disco a un fichero, asegurándonos de que tenemos espacio libre suficiente en la unidad de destino (este proceso puede tardar mucho tiempo, dependiendo del tamaño de disco y de la cantidad de errores encontrados):
dd_rescue -A /dev/dispositivo_averiado /tmp/fichero_de_backup.iso
3. Opcional pero recomendable. Intentar checkear el sistema de ficheros del backup (si se dispone de la herramienta):
Para ext3: fsck.ext3 -p /tmp/fichero_de_backup.iso
Para reiserfs: reiserfsck --fix-fixable /tmp/fichero_de_backup.iso
4. Montamos el fichero con la copia de seguridad
mount -o loop,ro /tmp/fichero_de_backup.iso /mnt
5. Copiamos los datos utilizando los métodos tradicionales: cp, rsync, etc
dd_rescue
dd_rescue es una variante de la conocida herramienta de Unix dd, orientada a la recuperación de datos. Comparada con dd, tiene dos diferencias importantes:
a. Al contrario que dd, cuando hay un error de lectura (por ejemplo un sector defectuoso), dd_rescue no aborta la transferencia, se limita a indicarnos el error en el log.
b. dd_rescue utiliza dos tamaños de bloques de datos durante la lectura, 16384 bytes si no encuentra errores y 512 bytes cuando los encuentra.
El proceder para recuperar los datos de un disco duro, sería el siguiente:
1. Asegurarnos de que tenemos espacio suficiente en disco para almacenar el backup (en su defecto podemos instalar otro disco duro y montarlo, montar una unidad de red, etc).
2. Volcar los datos del disco a un fichero, asegurándonos de que tenemos espacio libre suficiente en la unidad de destino (este proceso puede tardar mucho tiempo, dependiendo del tamaño de disco y de la cantidad de errores encontrados):
dd_rescue -A /dev/dispositivo_averiado /tmp/fichero_de_backup.iso
3. Opcional pero recomendable. Intentar checkear el sistema de ficheros del backup (si se dispone de la herramienta):
Para ext3: fsck.ext3 -p /tmp/fichero_de_backup.iso
Para reiserfs: reiserfsck --fix-fixable /tmp/fichero_de_backup.iso
4. Montamos el fichero con la copia de seguridad
mount -o loop,ro /tmp/fichero_de_backup.iso /mnt
5. Copiamos los datos utilizando los métodos tradicionales: cp, rsync, etc
18.4.07
Activando las teclas multimedia del teclado en KDE
KDE en la mayoría de los casos no se entera de que las teclas multimedia existen y, no es que sean muy útiles, pero da rabia que no funcionen, especialmente cuando dispones de un portátil con mando a distancia a lo Apple.
Mientras que en Gnome todo es coser y cantar en KDE necesitamos instalar el demonio lineakd. Veamos como realizar la configuración:
1) Instalar los paquetes necesarios
jose@coruscant:~$ apt-get install lineakd lineak-kdeplugins klineakconfig
2) Ejecutamos klineakconfig y, si nuestro teclado no está entre los ya soportados, establecemos una configuración personalizada
3) Una vez que hemos guardado la configuración, nos vamos al fichero de configuración creado y asignamos los valores de las teclas
jose@coruscant:~$ vi /home/jose/.lineak/lineakd.conf
En mi caso he asignado estos valores:
userdeffile = /home/jose/.lineak/lineakkb.def
Anterior = amarok -r
DVD = kmplayer
Music = amarok
Mute = EAK_MUTE
Play = amarok -t
Siguiente = amarok -f
Stop = amarok -s
VolDown = EAK_VOLDOWN
VolUp = EAK_VOLUP
4) Ponemos el demonio de lineakd en el arranque de KDE
jose@coruscant:~$ ln -s /usr/bin/lineakd /home/jose/.kde/Autostart/lineakd
5) Reiniciamos KDE y a disfrutar
Mientras que en Gnome todo es coser y cantar en KDE necesitamos instalar el demonio lineakd. Veamos como realizar la configuración:
1) Instalar los paquetes necesarios
jose@coruscant:~$ apt-get install lineakd lineak-kdeplugins klineakconfig
2) Ejecutamos klineakconfig y, si nuestro teclado no está entre los ya soportados, establecemos una configuración personalizada
3) Una vez que hemos guardado la configuración, nos vamos al fichero de configuración creado y asignamos los valores de las teclas
jose@coruscant:~$ vi /home/jose/.lineak/lineakd.conf
En mi caso he asignado estos valores:
userdeffile = /home/jose/.lineak/lineakkb.def
Anterior = amarok -r
DVD = kmplayer
Music = amarok
Mute = EAK_MUTE
Play = amarok -t
Siguiente = amarok -f
Stop = amarok -s
VolDown = EAK_VOLDOWN
VolUp = EAK_VOLUP
4) Ponemos el demonio de lineakd en el arranque de KDE
jose@coruscant:~$ ln -s /usr/bin/lineakd /home/jose/.kde/Autostart/lineakd
5) Reiniciamos KDE y a disfrutar
17.4.07
Como solucionar el problema de las pantallas negras en Beryl
Los usuarios que estamos utilizando Beryl directamente con el driver de nVidia en ocasiones sufrimos el fastidioso problema de las pantallas en negro. Generalmente esto ocurre cuando maximizamos una ventana o lanzamos una aplicación nueva, se pone todo el cuerpo en negro y nos obliga a cambiar el gestor de ventanas o reiniciar la sesión.
La forma de solucionarlo o de minimizarlo en gran medida es cambiar dos parámetros en las opciones avanzadas de Beryl, tal y como se ve en la imagen:
Las opciones que debemos tocar son:
Opciones avanzadas -> Compuesto del recubrimiento de la ventana -> Usar CROW
Opciones avanzadas -> Ruta de renderización -> Copia
Con eso debería estar todo arreglado
La forma de solucionarlo o de minimizarlo en gran medida es cambiar dos parámetros en las opciones avanzadas de Beryl, tal y como se ve en la imagen:
Las opciones que debemos tocar son:
Opciones avanzadas -> Compuesto del recubrimiento de la ventana -> Usar CROW
Opciones avanzadas -> Ruta de renderización -> Copia
Con eso debería estar todo arreglado
30.3.07
Mapas gráficos con Gimp
Odio a Macromedia Flash, me mata el tener que tragarme los treinta segundos de introducción de rigor que tanto de moda se ha puesto y que, en muchos casos, ni tan siquiera hay botón de "skip".
Como alternativa somos muchos los que proponemos los mapas gráficos que, además en Gimp se hacen en cuatro patadas:
1) Abrir con Gimp la imagen sobre la que queremos generar el mapa
2) Nos hacemos con el filtro necesario: Filtros -> Web -> Mapas de imagen
3) Utilizando las herramientas de selección del filtro, escogemos la zona y damos valor al evento.
4) Antes de abandonar la ventana del filtro, guardamos el documento en formato htm
5) Copiamos el código o editamos el htm resultante
Y el resultado sería tal que así:
Como alternativa somos muchos los que proponemos los mapas gráficos que, además en Gimp se hacen en cuatro patadas:
1) Abrir con Gimp la imagen sobre la que queremos generar el mapa
2) Nos hacemos con el filtro necesario: Filtros -> Web -> Mapas de imagen
3) Utilizando las herramientas de selección del filtro, escogemos la zona y damos valor al evento.
4) Antes de abandonar la ventana del filtro, guardamos el documento en formato htm
5) Copiamos el código o editamos el htm resultante
Y el resultado sería tal que así:
27.3.07
Plugin Flash 9 para Firefox (Iceweasel) bajo Debian AMD64
Ñapa donde las haya, pero bueno, tira, que es lo que cuenta en este caso:
1) Descargarse el nspluginwrapper de su web, en formato rpm que es más cómodo
http://gwenole.beauchesne.info/en/projects/nspluginwrapper#downloads
2) Instalar los paquetes necesarios para ejecutar el programa y convertir los rpms a debs:
geonosis:/usr/src# apt-get install ia32-libs linux32 alien
3) Instalar el paquete ia32-libs-gtk de la rama experimental
geonosis:/usr/src# wget http://ftp.es.debian.org/debian/pool/main/i/ia32-libs-gtk/ia32-libs-gtk_1.0_amd64.deb
geonosis:/usr/src# dpkg -i ia32-libs-gtk_1.0_amd64.dev
4) Convertir los rpms a .deb e instalarlos
geonosis:/usr/src# alien -d *.rpm
geonosis:/usr/src# dpkg -i nspluginwrapper_0.9.91.3-2_amd64.deb nspluginwrapper-i386_0.9.91.3-2_amd64.deb
5) Descargamos el plugin flash de la página de Macromedia, descomprimimos el archivo y convertimos la librería con nspluginwrapper
geonosis:/usr/src# /usr/lib/nspluginwrapper/x86_64/linux/npconfig -i /home/jose/install_flash_player_9/libflashplayer.so
6) Copiamos el archivo generado al directorio de plugins de iceweasel
geonosis:/usr/src# cp /home/jose/install_flash_player_9/npwrapper.libflashplayer.so /usr/lib/iceweasel/plugins
Y ñapa completada, aunque esperemos que en un futuro cercano todo se solucione con un apt-get install
1) Descargarse el nspluginwrapper de su web, en formato rpm que es más cómodo
http://gwenole.beauchesne.info/en/projects/nspluginwrapper#downloads
2) Instalar los paquetes necesarios para ejecutar el programa y convertir los rpms a debs:
geonosis:/usr/src# apt-get install ia32-libs linux32 alien
3) Instalar el paquete ia32-libs-gtk de la rama experimental
geonosis:/usr/src# wget http://ftp.es.debian.org/debian/pool/main/i/ia32-libs-gtk/ia32-libs-gtk_1.0_amd64.deb
geonosis:/usr/src# dpkg -i ia32-libs-gtk_1.0_amd64.dev
4) Convertir los rpms a .deb e instalarlos
geonosis:/usr/src# alien -d *.rpm
geonosis:/usr/src# dpkg -i nspluginwrapper_0.9.91.3-2_amd64.deb nspluginwrapper-i386_0.9.91.3-2_amd64.deb
5) Descargamos el plugin flash de la página de Macromedia, descomprimimos el archivo y convertimos la librería con nspluginwrapper
geonosis:/usr/src# /usr/lib/nspluginwrapper/x86_64/linux/npconfig -i /home/jose/install_flash_player_9/libflashplayer.so
6) Copiamos el archivo generado al directorio de plugins de iceweasel
geonosis:/usr/src# cp /home/jose/install_flash_player_9/npwrapper.libflashplayer.so /usr/lib/iceweasel/plugins
Y ñapa completada, aunque esperemos que en un futuro cercano todo se solucione con un apt-get install
23.3.07
Kernel a lo Debian para un Turion62X2
Acabo de hacerme con uno de esos portátiles que además son portables (uséase pequeños, con pantalla de 13"), en concreto un HP Pavilion de la serie dv2000. El engendro en cuestión tiende todos los males necesarios como para desechar el kernel de stock, y cito:
Tarjeta wifi Broadcom Wireless 1390
Tarjeta gráfica nVidia Gforce Go
Es un AMD Turion 64 X2
Podría hacer lo típico, compilar los módulos para el hardware no soportado y arreando pero claro, cuando haga un apt-get update y me cambie el kernel la vamos a liar. Además, el nuevo kernel 2.6.20.3 soporta paravirtualización y ya puestos...
Compilar el kernel en Debian tiene su cosa, ya que podemos tratarlo como un paquete más y desinstalarlo más adelante, entre otras cosas. Es por ello que la secuencia de comandos cambia un poco respecto a la manera clásica (a mano) de compilar el núcleo:
Paso previo, instalar los paquetes necesarios:
apt-get install nasm libncurses5 libncurses5-dev gcc make kernel-package
1.- Descargar el kernel
jose@coruscant:/usr/src$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.3.tar.bz2
2.- Descomprimir y desempaquetar
jose@coruscant:/usr/src$ bunzip2 linux-2.6.20.3.tar.bz2 ; tar xf linux-2.6.20.3.tar
3.- Entrar en el directorio creado y "limpiar"
jose@coruscant:/usr/src/linux$ make mrproper
4.- Para ahorrarnos lo gordo de la configuración, copiar la configuración existente del kernel de stock
jose@coruscant:/usr/src/linux$ cp /boot/config-2.6.18-4-amd64 ./
5.- Configurar el kernel
jose@coruscant:/usr/src/linux$ make menuconfig (o make xconfig según gustos)
6.- Compilar y crear los paquetes
jose@coruscant:/usr/src/linux$ make-kpkg clean ; make-kpkg --initrd kernel_image kernel_headers
7.- Instalar los paquetes creados en el directorio precedente
jose@coruscant:/usr/src$ dpkg -i kernel-image-xxxxxx.deb kernel-headers-xxxxx.deb
Y ahora ya podemos configurar todo el hardware que queramos sin miedo a las actualizaciones.
Tarjeta wifi Broadcom Wireless 1390
Tarjeta gráfica nVidia Gforce Go
Es un AMD Turion 64 X2
Podría hacer lo típico, compilar los módulos para el hardware no soportado y arreando pero claro, cuando haga un apt-get update y me cambie el kernel la vamos a liar. Además, el nuevo kernel 2.6.20.3 soporta paravirtualización y ya puestos...
Compilar el kernel en Debian tiene su cosa, ya que podemos tratarlo como un paquete más y desinstalarlo más adelante, entre otras cosas. Es por ello que la secuencia de comandos cambia un poco respecto a la manera clásica (a mano) de compilar el núcleo:
Paso previo, instalar los paquetes necesarios:
apt-get install nasm libncurses5 libncurses5-dev gcc make kernel-package
1.- Descargar el kernel
jose@coruscant:/usr/src$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.3.tar.bz2
2.- Descomprimir y desempaquetar
jose@coruscant:/usr/src$ bunzip2 linux-2.6.20.3.tar.bz2 ; tar xf linux-2.6.20.3.tar
3.- Entrar en el directorio creado y "limpiar"
jose@coruscant:/usr/src/linux$ make mrproper
4.- Para ahorrarnos lo gordo de la configuración, copiar la configuración existente del kernel de stock
jose@coruscant:/usr/src/linux$ cp /boot/config-2.6.18-4-amd64 ./
5.- Configurar el kernel
jose@coruscant:/usr/src/linux$ make menuconfig (o make xconfig según gustos)
6.- Compilar y crear los paquetes
jose@coruscant:/usr/src/linux$ make-kpkg clean ; make-kpkg --initrd kernel_image kernel_headers
7.- Instalar los paquetes creados en el directorio precedente
jose@coruscant:/usr/src$ dpkg -i kernel-image-xxxxxx.deb kernel-headers-xxxxx.deb
Y ahora ya podemos configurar todo el hardware que queramos sin miedo a las actualizaciones.
20.2.07
Instalar Beryl sin XGL ni AIGLX bajo Debian (y probablemente Ubuntu)
Para este pequeño how-to he utilizado como S.O Debian Etch para AMD64 y una tarjeta gráfica nVidia GForce7 7100 (los usuarios de ATI o Intel debereis indagar sobre como instalar vuestro controlador de video).
Disfrutar de un entorno 3D con Beryl es realmente sencillo sin necesidad de instalar Xgl que, además, no se encuentra como paquete para Debian. Los pasos a seguir son los siguientes:
1.- Instalar los controladores de nVidia. Para ello necesitamos instalar los paquetes linux-headers y linux-source en las versiones correspondientes a nuestro sistema y mesa-utils:
apt-get install linux-headers-`uname -r` linux-source-`uname -r` mesa-utils
Probamos el soporte opengl
glxgears
Descargamos el instalador del driver de nVidia de la web del fabricante, en mi caso:
wget http://download.nvidia.com/XFree86/Linux-x86_64/1.0-8756/NVIDIA-Linux-x86_64-1.0-8756-pkg2.run
Salimos de las X y paramos el gdm
/etc/init.d/gdm stop
Instalamos el controlador de nVidia (como root):
sh NVIDIA-Linux-x86_64-1.0-8756-pkg2.run
Reiniciamos gdm y deberíamos ver el logo de nVidia un segundo durante la carga
/etc/init.d/gdm start
2.- Editamos xorg.conf y realizamos los siguientes cambios:
Comentamos las líneas (de tenerlas)
Load "glx"
En la sección Device añadimos lo siguiente:
/etc/init.d/gdm restart
3.- Instalamos los paquetes de beryl, para ello hay que añadir el repositorio correspodiente, pero previamente agraremos el repositorio a pgp
wget http://debian.beryl-project.org/root@lupine.me.uk.gpg -O- | sudo apt-key add -
Editamos /etc/apt/sources.list y añadimos el repositorio
deb http://debian.beryl-project.org/ etch main
Actualizamos la lista de paquetes
apt-get update
E instalamos los paquetes necesarios
apt-get install beryl beryl-core beryl-dev beryl-manager beryl-plugins-data beryl-plugins beryl-settings emerald emerald-themes
4.- Cargamos beryl en el inicio de Gnome utilizando el session manager de gnome:
gnome-session
y agragamos beryl en los programas de inicio
Ahora toca disfrutar del nuevo entorno!
Disfrutar de un entorno 3D con Beryl es realmente sencillo sin necesidad de instalar Xgl que, además, no se encuentra como paquete para Debian. Los pasos a seguir son los siguientes:
1.- Instalar los controladores de nVidia. Para ello necesitamos instalar los paquetes linux-headers y linux-source en las versiones correspondientes a nuestro sistema y mesa-utils:
apt-get install linux-headers-`uname -r` linux-source-`uname -r` mesa-utils
Probamos el soporte opengl
glxgears
Descargamos el instalador del driver de nVidia de la web del fabricante, en mi caso:
wget http://download.nvidia.com/XFree86/Linux-x86_64/1.0-8756/NVIDIA-Linux-x86_64-1.0-8756-pkg2.run
Salimos de las X y paramos el gdm
/etc/init.d/gdm stop
Instalamos el controlador de nVidia (como root):
sh NVIDIA-Linux-x86_64-1.0-8756-pkg2.run
Reiniciamos gdm y deberíamos ver el logo de nVidia un segundo durante la carga
/etc/init.d/gdm start
2.- Editamos xorg.conf y realizamos los siguientes cambios:
Comentamos las líneas (de tenerlas)
# Load "GLcore"
# Load "dri"
y, si no la tenemos, agregamos la siguienteLoad "glx"
En la sección Device añadimos lo siguiente:
Section "Device"
...
...
Option "RenderAccel" "true"
Option "AllowGLXWithComposite" "true"
EndSection
En la sección ScreenOption "AddARGBGLXVisuals" "True"
Y por último añadimos la siguiente secciónSection "Extensions"
Option "Composite" "Enable"
EndSection
Reiniciamos las X y probamos que todo funciona/etc/init.d/gdm restart
3.- Instalamos los paquetes de beryl, para ello hay que añadir el repositorio correspodiente, pero previamente agraremos el repositorio a pgp
wget http://debian.beryl-project.org/root@lupine.me.uk.gpg -O- | sudo apt-key add -
Editamos /etc/apt/sources.list y añadimos el repositorio
deb http://debian.beryl-project.org/ etch main
Actualizamos la lista de paquetes
apt-get update
E instalamos los paquetes necesarios
apt-get install beryl beryl-core beryl-dev beryl-manager beryl-plugins-data beryl-plugins beryl-settings emerald emerald-themes
4.- Cargamos beryl en el inicio de Gnome utilizando el session manager de gnome:
gnome-session
y agragamos beryl en los programas de inicio
Ahora toca disfrutar del nuevo entorno!
17.2.07
Imprimir de Linux a Linux con cups
Esta no es una receta sobre como compartir una impresora en Linux para poder imprimir desde un bindous. Lo que vamos a hacer es partiendo de una impresora conectada a una máquina Linux, imprimir desde otra máquina Linux (¿compartir impresora en linux?). Esta receta es, como siempre, para Debian y debería funcionar en Ubuntu u otras distribuciones.
1) Partiendo de que tenemos una máquina Linux con una impresora instalada editamos el fichero de configuración de cups /etc/cups/cupsd.conf y cambiamos unas cosas:
#Listen localhost:631 lo comentamos y lo cambiamos por
Listen *:631
luego, permitimos el acceso desde nuestra subred
Order allow,deny
Allow localhost
Allow From 192.168.1.0/24
Encryption Required
Order allow,deny
Allow localhost
Allow From 192.168.1.0/24
2) Reiniciar cups y configurar la impresora en el equipo remoto
1) Partiendo de que tenemos una máquina Linux con una impresora instalada editamos el fichero de configuración de cups /etc/cups/cupsd.conf y cambiamos unas cosas:
#Listen localhost:631 lo comentamos y lo cambiamos por
Listen *:631
luego, permitimos el acceso desde nuestra subred
Order allow,deny
Allow localhost
Allow From 192.168.1.0/24
Encryption Required
Order allow,deny
Allow localhost
Allow From 192.168.1.0/24
2) Reiniciar cups y configurar la impresora en el equipo remoto
16.2.07
Configurando la tarjeta wifi de un Sony Vaio N21E (VGN-N21E chipset Atheros) en Debian y/o Ubuntu
Hace unos días le he echado guante a un portátil Sony Vaio VGN-N21E que, entre otras cosas, trae una tarjeta inalámbrica mini-pci con el chipset de Atheros.
La forma de configurar este tipo de dispositivos es realmente sencilla, y este método sirve para todos los que tengais una tarjeta basada en Atheros, en sus diferentes versiones (pci, pcmcia, etc)
1.- Por si nuestro sistema reconoce la tarjeta pero incorpora un controlador antiguo no compatible vamos a desmontar los posibles interfaces inálambricos
coruscant:~# ifconfig ath0 down
coruscant:~# ifconfig wifi0 down
2.- Eliminamos posibles módulos incompatibles que tengamos instalados
coruscant:~# rmmod ath_rate_sample wlan ath_hal ath_pci onoe wlan_wep
3.- Instalamos los paquetes necesarios para poder compilar el nuevo módulo
coruscant:~# apt-get install linux-headers linux-source module-assistant
(Para los que usuais Ubuntu debereis instalar el paquete build-essentials) Ni que decir tiene que la imagen del kernel hay que descomprimirla y crearle el link
cd /usr/src
bunzip linux-image-XXXXXXX.bz2
tar xf linux-image-XXXXXXX.tar
ln -s linux-image-XXXXX/ linux
4.- Descargamos el código fuente del módulo
coruscant:/usr/src# wget http://snapshots.madwifi.org/madwifi-ng-current.tar.gz
coruscant:/usr/src# wget http://patches.aircrack-ng.org/madwifi-ng-r1886.patch
(Nota el patch r1886 es el existente al día de hoy, si el enlace está roto debeis entrar en http://patches.aircrack-ng.org/ y ver la revisión del patch más actual)
5.- Descomprimimos el código del controlador
coruscant:/usr/src#tar zxf madwifi-ng-current.tar.gz
6.- Entramos en el directorio creado y aplicamos el patch
coruscant:/usr/src# cd madwifi-ng-r2119-20070216/
coruscant:/usr/src/madwifi-ng-r2119-20070216# patch -Np1 -i ../madwifi-ng-r1886.patch
7.- Compilamos e instalamos
coruscant:/usr/src/madwifi-ng-r2119-20070216# make
coruscant:/usr/src/madwifi-ng-r2119-20070216# make install
8.- Actualizamos la lista de módulos
coruscant:/usr/src/madwifi-ng-r2119-20070216# depmod -ae
9.- Cargamos el módulo o reiniciamos el sistema y configuramos la wifi
coruscant:/# modprobe ath_pci
Una vez completado, a disfrutar de nuestro nuevo interface
La forma de configurar este tipo de dispositivos es realmente sencilla, y este método sirve para todos los que tengais una tarjeta basada en Atheros, en sus diferentes versiones (pci, pcmcia, etc)
1.- Por si nuestro sistema reconoce la tarjeta pero incorpora un controlador antiguo no compatible vamos a desmontar los posibles interfaces inálambricos
coruscant:~# ifconfig ath0 down
coruscant:~# ifconfig wifi0 down
2.- Eliminamos posibles módulos incompatibles que tengamos instalados
coruscant:~# rmmod ath_rate_sample wlan ath_hal ath_pci onoe wlan_wep
3.- Instalamos los paquetes necesarios para poder compilar el nuevo módulo
coruscant:~# apt-get install linux-headers linux-source module-assistant
(Para los que usuais Ubuntu debereis instalar el paquete build-essentials) Ni que decir tiene que la imagen del kernel hay que descomprimirla y crearle el link
cd /usr/src
bunzip linux-image-XXXXXXX.bz2
tar xf linux-image-XXXXXXX.tar
ln -s linux-image-XXXXX/ linux
4.- Descargamos el código fuente del módulo
coruscant:/usr/src# wget http://snapshots.madwifi.org/madwifi-ng-current.tar.gz
coruscant:/usr/src# wget http://patches.aircrack-ng.org/madwifi-ng-r1886.patch
(Nota el patch r1886 es el existente al día de hoy, si el enlace está roto debeis entrar en http://patches.aircrack-ng.org/ y ver la revisión del patch más actual)
5.- Descomprimimos el código del controlador
coruscant:/usr/src#tar zxf madwifi-ng-current.tar.gz
6.- Entramos en el directorio creado y aplicamos el patch
coruscant:/usr/src# cd madwifi-ng-r2119-20070216/
coruscant:/usr/src/madwifi-ng-r2119-20070216# patch -Np1 -i ../madwifi-ng-r1886.patch
7.- Compilamos e instalamos
coruscant:/usr/src/madwifi-ng-r2119-20070216# make
coruscant:/usr/src/madwifi-ng-r2119-20070216# make install
8.- Actualizamos la lista de módulos
coruscant:/usr/src/madwifi-ng-r2119-20070216# depmod -ae
9.- Cargamos el módulo o reiniciamos el sistema y configuramos la wifi
coruscant:/# modprobe ath_pci
Una vez completado, a disfrutar de nuestro nuevo interface
10.2.07
Bot IRC que captura urls y crea un rss
Para el canal #hardware del IRC-Hispano hemos creado un bot que rastrea las conversaciones en busca de una url y crea un rss que luego importaremos desde Wordpress, para componer la web http://www.cajondesastre.net.
Estoy terminando un segundo módulo que ha de subir este rss por ftp para mantenerlo en pseudo tiempo real accesible.
El código fuente del bot está accesible en este enlace.
Estoy terminando un segundo módulo que ha de subir este rss por ftp para mantenerlo en pseudo tiempo real accesible.
El código fuente del bot está accesible en este enlace.
7.2.07
Creación rápida de firewalls para Iptables
Como dice el anuncio... llega un momento en la vida en que tienes el firewall tan depurado que lo vas reutilizando instalación tras instalación. Pero, cuando no te quieres complicar o ese usuario novel te pide que le expliques como hacerse un firewall, la mejor opción es Easy Firewall Generator for iptables.
En pocos minutos puedes tener un buen script para iptables funcionando.
En pocos minutos puedes tener un buen script para iptables funcionando.
1.2.07
Java SDK para Debian Etch i586/AMD64
Aunque este es un post muy recurrente y suficientemente explicado en cientos de blogs, sigue habiendo mucha gente que se lía a la hora de instalar el paquete.
En lugar de utilizar los repositorios non-free habituales, he aquí los pasos para realizar una instalación de Java a partir de las versiones oficiales:
1) Descargarse el paquete Java apropiado para nuestra versión (i586 o AMD64), desde el site oficial de Sun.
2) Instalar los paquetes fakeroot y java-package
coruscant:/home/jose# apt-get install fakeroot java-package
3) Le damos permiso de ejecución al fichero .bin que nos hemos bajado
jose@coruscant:~/Downloads$ chmod +x jdk-6-linux-amd64.bin
4) Con un usuario sin privilegios creamos el paquete .deb
jose@coruscant:~/Downloads$ fakeroot make-jpkg jdk-6-linux-amd64.bin
4.1) Si nos hemos descargado la "versión 6" y nos da un error el paso 4, renombramos el paquete para engañar al make-jpkg y volvemos al paso anterior (es una ñapa, lo se):
jose@coruscant:~/Downloads$ mv jdk-6-linux-amd64.bin jdk-1_5_0_09-linux-amd64.bin
5) Como root, instalamos el paquete creado
coruscant:/home/jose/Downloads# dpkg -i sun-jdk-6_amd64.deb
31.1.07
Deteccion de intrusos más amigable
Snort es el IDS (Sistema de Detección de Intrusos) probablemente más conocido entre los usarios del software libre. Actúa como sniffer analizando el tráfico de red y comparándolo con reglas pre-establecidas para ataques tipo. Cuestiones de especial relevancia como mantener estas reglas actualizadas o analizar los abstractos reportes se hacen un poco pesadas sin ayuda:
Oinkmaster es un script perl que nos permite mantener las reglas de Snort al día sin grandes complicaciones, incluso añadiéndolo al cron para que la actualización sea totalmente desatendida.
Razorback es un software de análisis de reportes de Snort para Gnome, que nos permite ir viendo en tiempo real las incidencias recogidas por los patrones del IDS.
Oinkmaster es un script perl que nos permite mantener las reglas de Snort al día sin grandes complicaciones, incluso añadiéndolo al cron para que la actualización sea totalmente desatendida.
Razorback es un software de análisis de reportes de Snort para Gnome, que nos permite ir viendo en tiempo real las incidencias recogidas por los patrones del IDS.
El "panadero" de Gnome o como grabar CD/DVD
Se hace atractivo utilizar las QT en los tiempos que corren, sobre todo con aplicaciones tan fantásticas como K3b pero, si te invade ese romanticismo anárquico que te impide instalar estas librerías puedes optar por Gnomebaker.
Gnomebaker es el software de grabación de Gnome aunque, generalmente no viene instalado por defecto en las distribuciones, pero se encuentra en los repositorios sin mayores problemas.
Con esto quedais respondidos todos aquellos que habeis preguntado por un software de grabación "casi" tan fantástico como K3b pra Gnome.
Gnomebaker es el software de grabación de Gnome aunque, generalmente no viene instalado por defecto en las distribuciones, pero se encuentra en los repositorios sin mayores problemas.
Con esto quedais respondidos todos aquellos que habeis preguntado por un software de grabación "casi" tan fantástico como K3b pra Gnome.
18.1.07
Eliminar la posibilidad de imprimir desde Firefox
En ciertas ocasiones, como puede ser el caso de un kiosk o para que los niños no gasten tinta, puede interesarnos deshabilitar la impresora en el navegador.
Para ello debemos editar/crear un fichero user.js dentro del directorio de configuración de Firefox o editar la configuración desde el propio navegador tecleando la dirección about:config, cambiando/creando las siguientes entradas:
user_pref("print.always_print_silent ", true);
user_pref("print.show_print_progress", false);
user_pref("browser.sessionstore.resume_from_crash", false);
Reiniciar Firefox y trabajo completado.
Para ello debemos editar/crear un fichero user.js dentro del directorio de configuración de Firefox o editar la configuración desde el propio navegador tecleando la dirección about:config, cambiando/creando las siguientes entradas:
user_pref("print.always_print_silent ", true);
user_pref("print.show_print_progress", false);
user_pref("browser.sessionstore.resume_from_crash", false);
Reiniciar Firefox y trabajo completado.
Suscribirse a:
Entradas (Atom)