Archivo de la categoría: Sistemas

Habilitar el escritorio remoto multiusuario y multisesión en Windows8

Vuelvo de mi voluntario retiro bloguero para la segunda parte y continuación de Habilitar el escritorio remoto multiusuario y multisesión en Windows7.

Toda la explicación está en el artículo original. El procedimiento es exactamente el mismo pero con el nuevo archivo.

El funcionamiento es muy sencillo, se descomprime el fichero y se ejecuta el archivo install.cmd con privilegios de administrador. Para logarlo ya sabéis, botón derecho sobre el mismo y “Ejecutar como administrador”.

Si todo va bien cambiará la dll correspondiente por la parcheada y reiniciará el servicio de Escritorio Remoto con las opciones por defecto, es decir, permitir múltiples usuarios simultáneos.

Más información en el artículo original de Windows7.

Descarga aquí el archivo.

Mi pequeña biblioteca técnica

Hoy voy a mostraros la pequeña colección de libros técnicos que he ido acumulando durante los últimos diez años. A tiempo pasado me he dado cuenta de que una gran mayoría de ellos no pintan nada ya en la estantería ya que son tecnologías desfasadas o superadas por nuevas versiones, tal es el caso, por ejemplo, de Visual Basic 6.0, Windows NT, Oracle 8i… Otros pueden servir aún como introducción general (Java2, SQL Server, MySQL, etc.), pero nunca serán un referente en sí mismos ya que están también “anticuados“. Bien es verdad, y considero importante puntualizarlo, que el grueso de mi biblioteca data del periodo 2000-2005, los últimos años apenas he comprado nada, Internet es, sin lugar a dudas, la biblioteca particular de todos nosotros. Mis últimas adquisiciones tratan temas más relacionados con la gestión (de proyectos, personas y negocios) que con la tecnología en sí misma, y es que estos últimos no pierden su capacidad de enseñanza, con los años siguen ahí para quien quiera consultarlos.

Estos son mis libros, agrupados, más o menos, por temática. Indico entre paréntesis el/los autor/es y la editorial, a continuación el año en que lo compré y una pequeña reseña del mismo.

  • Sistemas Operativos:
    • Guía completa de Microsoft Windows NT Server 4.0 (Russel y Crawlord, Mc Graw Hill), 2000. Con este y los dos siguientes aprendí todo lo relacionado con redes Windows, controladores de dominio, usuarios, etc. En su momento me fueron de muchísima utilidad e incluso gracias a ellos llegué a impartir formación sobre Windows NT, ha pasado mucho tiempo ya.
    • Windows NT 4.0 Server, instalación y gestión (J.M. Martínez y M. Martínez, Prentice Hall), 2000.
    • Windows NT Server 4.0 (Anaya Multimedia), 2000.
    • Linux Máxima Seguridad (Anónimo, Sams), 2002. En su momento me pareció una joya y me sirvió para profundizar y mejorar considerablemente mis conocimientos en temas de seguridad, auditoría e IDS en sistemas Linux. Aún sigo haciendo alguna consulta de vez en cuando.
    • El Libro Oficial de Red Hat Linux – Firewalls (Bill McCarty, Anaya Multimedia), 2003. Fundamental junto al anterior en mi formación sobre sistemas de red avanzados bajo Linux. También sigo echándole un ojo de vez en cuando aunque en Internet esté toda la información más que explicada.
  • Programación y lenguajes:
    • Teach yourself Java2 in 21 Days Second Edition (Lemay & Cadenhead), 2001. Un clásico. Con la primera edición aprendí Java allá por 1996. Con este libro recuperé mi formación en Java, importante en aquel momento.
    • Core Servlets and Java Server Pages (Marty Hall), 2002. Tras mejorar mis conocimientos de java con el anterior y junto al siguiente, aprendí todo lo relacionado con aplicaciones web en Java. En su momento me parecieron un par de libros fundamentales.
    • More Servlets and Java Server Pages (Marty Hall), 2002.
    • Creación de sitios web con XML y Java (Maruyama, Tamura y Uramoto, Prentice Hall), 2002. Lo compré a raíz de los anteriores, supongo que lo habría visto recomendado en algún lado, pero no recuerdo que me pareciese un libro impactante.
    • Learning Perl 3rd Edition (Schwartz & Phoenix, O’Reilly), 2002. Necesitaba algo de formación en Perl pero nunca llegué a leérmelo entero, más que nada porque nunca llegué a necesitar un nivel avanzado en Perl.
    • ActionScript con FlashMX Edición Especial (Prentice Hall), 2003. Sin duda otro libro básico en mi formación. Gracias a él aprendí todo lo relacionado con ActionScript, algo que me ayudó enormemente a dar el paso a Flex algún tiempo después.
    • Desarrollo de juegos con J2ME (Manuel J. Prieto, Ra-Ma), 2005. Un proyecto fracasado :P, en aquel momento tenía algunas ideas en la cabeza pero nunca llegué a leerme este libro.
    • Visual C#.NET (Fco. Charte Ojeda, Anaya Multimedia), 2004. No lo compré, llegó a mis manos por casualidad y tampoco hice nada con él.
    • Enciclopedia de Microsoft Visual Basic 6.0 (Fco. Javier Ceballos, Ra-Ma), 2000. Sin lugar a dudas fue básico en mi formación inicial allá por el año 2000. Hoy está completamente desfasado gracias a la tecnología .NET, pero en aquel momento era imprescindible. Creo que fue el primero de todos.
    • Programación de Active Server Pages (Hillier & Mezick, Mc Graw Hill), 2000. Gracias a este libro conseguí mi primer trabajo de programador web. Corría el año 2000 y comenzaba mi carrera profesional. Junto al anterior, fueron mis primeros libros.
    • XML (Óscar González, Anaya Multimedia), 2001. Cuando estaba aprendiendo Java, no recuerdo por qué, necesitaba conocimientos avanzados en XML y este pequeño libro de bolsillo me dio lo que buscaba.
    • WebServices (Joan Ribas Lequerica, Anaya Multimedia), 2003. Lo mismo que el anterior pero para WebServices, va al meollo del asunto sin complicaciones.
    • La Biblia ASP.Net (Mridula Parihar, Anaya Multimedia), 2009. Mi última adquisición. Por cuestiones profesionales he de ponerme las pilas con .NET, ahí lo tengo esperando :P.
    • The Pragmatic Programmer – From Journeyman to Master (Andrew Hunt & David Thomas, Addison Wesley), 2006. Fundamental para cualquier programador, todo lo que cuenta es completamente lógico y de cajón, tanto que muchas veces lo olvidamos todo.
    • The Unified Modelling LAnguage User Guide Second Edition (Booch, Rumbaugh & Jacobson, Addison Wesley), 2007. La biblia del UML.
    • UML y Patrones Segunda Edición (Craig Larman, Pearson – Prentice Hall), 2005. Empieza bien, pero me lo dejé a mitad, es bastante espeso. Espero retomarlo pronto.
    • The Zen of CSS Design (Dave Shea & Molly E. Holzschlag, New Riders), 2005. Éste y el siguiente me ayudaron considerablemente a entrar en el mundo del CSS, hay miles de recursos en Internet, pero no está de más tener algo de ayuda “a mano“.
    • Stylin’ with CSS – A Designer’s guide (Charles Wyke-Smith, New Riders), 2005.
    • Usabilidad – Diseño de sitios web (Jakob Nielsen, Prentice Hall), 2002. Completamente imprescindible. Recuerdo cómo me impactó su lectura y cómo me abrió los ojos hacia el desconocido campo de la usabilidad en un momento donde no estaba tan de moda como ahora. Todos los que trabajamos en diseño de software deberíamos leerlo, no es que aporte nada concreto, lo importante es la visión global que te hace tener sobre cómo deben pensarse las cosas que fabricas teniendo en cuenta en quién las utilizará.
  • Bases de datos:
    • Oracle 8i Guía de aprendizaje (Abbey, Corey y Abramson, Oracle Press), 2001. Este libro me permitió salir airoso de una tarea que me habían encomendado por aquella época, gracias a él conseguí aprender los conceptos básicos de Oracle.
    • Oracle 9i – Servidor de aplicaciones, red y programación (Cesa Pérez, Ra-Ma), 2003. La idea era prolongar los conocimientos que había alcanzado con el anterior, pero al final todo se quedó en nada ya que profesionalmente me aparté de Oracle.
    • MySQL  Edición Especial (Paul DuBois, Prentice Hall), 2001. La lectura de este libro fue fundamental para mi en aquel momento, con él aprendí a tunear y optimizar un sistema con una elevada carga. En 2001 no había tanta literatura al respecto en Internet como hay hoy en día.
    • Microsoft SQL Server a Fondo (Soukup, Mc Graw Hill), 2001. Mi primera toma de contacto con la base de datos de Microsoft.
  • Management y gestión de proyectos:
  • Negocios y emprendedurismo:
    • El Manifiesto Cultrain (Levine, Locke, Searls & Weinberger, Deusto), 2008. Un clásico sobre la gestión de negocios en Internet orientado hacia el trato con el cliente, la apertura de información en ambos sentidos, etc.
    • El Arte de Empezar (Guy Kawasaki, Ilustrae), 2007.  Otro clásico. Kawasaki expone su experiencia en la creación y desarrollo de startups.
    • El libro negro del emprendedor (Fernando Trías de Bes, Empresa Activa), 2008. Sería el equivalente en  español al de Guy Kawasaki. Muy recomendables los tres en todo caso.
  • Multimedia:
    • Premiere 6.5 (Antonio Paniagua Navarro, Anaya Multimedia) 2002. Con este pequeño manual dí mis primeros pasos en la edición de vídeo digital.
    • Adobe AfterEfeects 5 (Anaya Multimedia), 2002. Y con este otro profundicé un poco en ellos :).
    • Photoshop 5.5 para Windows (Miguel Angel Casanova González & Azucena González Ajenjo, Anaya Multimedia), 2001. Nunca llegué a leerlo, ni ganas de hacerlo :P.

Como conclusión, lo que os comentaba anteriormente. La mayoría de libros decentes sobre lenguajes de programación son muy caros y su vida útil es, como mucho, un par de años, a no ser que sea algo más tradicional como C ó C++. Hoy en día en Internet hay literatura de sobra para aprender cualquier cosa, la única pega que teníamos era tener que pegarte al monitor para leer un pdf o imprimirlo. Por suerte, la bajada de precios de los ebooks hace que durante los próximos meses asistamos a una migración paulatina de lectura técnica hacia los libros electrónicos, y es que así ya puedes ojear tranquilamente ese pdf de Python que tienes pendiente ;).

Desempaquetar varios archivos tar a la vez

Este es uno de esos problemas que cada vez que me pasa no recuerdo como lo solucioné la vez anterior.

Imaginemos la situación. Tenemos varios archivos tar (o tgz) en una carpeta y queremos desempaquetarlos todos del tirón. Como somos muy listos haremos algo tan sencillo como:

tar xvf *.tar

Vaya, no funciona… En efecto, no funciona porque tar no entiende esta sintaxis como nosotros.

Hay varias posibles soluciones, a mi me gusta la que considero más sencilla y fácil de recordar:

find . -name *.tar -exec tar xvf {} ;

Útil ¿no?

Reempaquetar el rpm de Portsentry para que loguee en su propio archivo

Desde hace mucho tiempo utilizo como media preventiva de seguridad el paquete Portsentry en los servidores para detectar potenciales accesos maliciosos y bloquearlos directamente en el firewall. El problema es que por defecto Portsentry deja sus logs en el archivo principal del sistema, /var/log/messages, lo que genera tal cantidad de ruido que es imposible encontrar algo útil en el log. El archivo donde loguea Portsentry no es configurable sino que viene predefinido en tiempo de compilación, con lo que deberemos recompilarlo si queremos que sea otro. Podríamos compilar e instalar el fuente directamente, pero no quiero perder las ventajas que ofrece rpm, veamos como hacerlo para Centos5.5 (o RHEL5.5).

Lo primero que debemos hacer es descargar e instalar el rpm con los fuentes desde aquí.

#rpm -ivh portsentry-1.2-1.te.src.rpm

Ahora debemos modificar el archivo donde se configura dónde logueará:

#cd /usr/src/redhat/SOURCES
#tar xvfz portsentry-1.2.tar.gz
#cd portsentry_beta

Editamos el archivo portsentry_config.h cambiando la línea 32 para que quede así:

#define SYSLOG_FACILITY LOG_LOCAL6

Con esto simplemente le decimos que loguee al “facility” local6 en vez de al “daemon” por defecto.

Se guarda el archivo y se empaqueta de nuevo:

#tar cvfz portsentry-1.2.tar.gz portsentry_beta

Ya podemos reconstruir el rpm:

#cd /usr/src/redhat/SPECS
#rpmbuild -ba portsentry.spec

Si todo va bien tendremos el paquete generado:

#cd /usr/src/redhat/RPMS/x86_64

Y ahí estará nuestro portsentry-1.2-1.te.x86_64.rpm preparado para loguear donde queremos que lo haga. Sólo queda instalarlo. Si tu arquitectura es de 32bits lo encontrarás en /usr/src/redhat/RPMS/i386.

Nos queda un detalle, configurar syslog para que guarde donde nos interesa la facility local6. Para eso editamos /etc/syslog.conf. Añadimos al final de todo la línea:

local6.*   /var/log/portsentry.log

y al principio de todo veremos algo parecido a:

*.info;mail.none;authpriv.none;cron.none /var/log/messages

La cambiaremos por:

*.info;mail.none;authpriv.none;cron.none;local6.none    /var/log/messages

Es decir, le decimos que de local6 no loguee nada en /var/log/messages. Solo nos queda reiniciar los demonios:

#/sbin/service syslog restart
#/sbin/service portsentry start

A partir de ahora tendremos nuestro log general bien limpio y la información de se seguridad separada.

SAI Salicru bajo Linux con nut y monitorización en Cacti

Recientemente he tenido que cambiar el SAI que tenía en casa desde hace unos años, un Powermust 1000 que me había dado muy buen resultado, sin embargo las baterías habían llegado a su fin. En App encontré uno con muy buena pinta, con puerto USB para monitorización, indicaban que soportaba Linux y, además, fabricado en España :|, el Salicru SPS 900 One, a un precio insuperable. Me lo llevo :P.

La decepción llegó al instalarlo. La monitorización se hace a través de una aplicación propia, algo que no me convencía ya que estaba acostumbrado a utilizar nut y a tenerlo integrado en Cacti.

Leyendo y probando algunos drivers encontré cómo hacerlo funcionar :). Muy sencillo.

./configure --with-usb --with-snmp --with-cgi --prefix=/usr --with-cgipath=/path/to/cgi-bin/nut/
make
make install

Esto instalará todo lo necesario y dejará los scripts para acceder vía web al estado del SAI en la ruta indicada.

No voy a entrar en detalles de la configuración, sólo indicar que el driver a utilizar es blazer_usb:

cat /etc/ups/ups.conf
[salicru]
driver = blazer_usb
port    = auto
desc    = "Sai Salicru 900"

Con eso iniciamos los demonios upsd y si todo va bien  lo tendremos funcionando. Si vamos a la ruta donde dejamos los scripts web veremos:

Primer paso preparado. Vamos ahora a configurar el monitor de avisos para que sepamos cuando el SAI cambia de estado (se va la luz en casa, vuelve, se queda sin batería, etc.). Esto lo controla el demonio upsmon. Como veis se monitoriza todo bien excepto el nivel de batería, este SAI no informa de ese dato, pero tampoco es algo crítico, los cambios de estado sí que funcionan correctamente, con eso es suficiente para nuestro propósito.

Primero preparamos la configuración.

# cat upsmon.conf
MONITOR salicru@localhost 1 monmaster momi master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"

NOTIFYCMD /bin/avisoups

POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower

NOTIFYMSG ONBATT "El SAI esta funcionando con bateria."
NOTIFYMSG LOWBATT "La bateria del SAI esta muy baja"
NOTIFYMSG SHUTDOWN "El servidor sera apagado inmediatamente"
NOTIFYMSG ONLINE "EL SAI esta funcionando con alimentacion externa"

NOTIFYFLAG ONBATT WALL+EXEC
NOTIFYFLAG LOWBATT WALL+EXEC
NOTIFYFLAG SHUTDOWN WALL+EXEC
NOTIFYFLAG ONLINE WALL+EXEC

RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Además de definir los mensajes que queremos recibir, le indicamos también que en los cambios de estado llame al script /bin/avisoups.

# cat /bin/avisoups
#!/bin/bash
/bin/echo "$*" | /usr/local/bin/gammu --sendsms TEXT 666666666
echo "$*" | mail -s "Aviso del SAI" [email protected]

Este script se ejecutará en cada cambio de estado que se produzca en el SAI y recibirá como parámetro el texto correspondiente al nuevo estado. En mi caso me envío un email y un SMS a través de Gammu.

Levantamos el demonio upsmon y probamos a enchufar y desenchufar la alimentación externa del SAI. Si todo va bien recibirás un email y/o un sms con el aviso :).

Cuando al SAI se le termine la batería apagará el servidor para evitar que se corte la alimentación de golpe. Si configuras la Bios para que arranque automáticamente cuando reciba alimentación, se reiniciará él solito en cuanto vuelva la luz :).

Integración con Cacti

Para integrar la monitorización en Cacti podemos utilizar estas plantillas ya creadas.

Una vez instalada y creada en el host que hace de monitor debemos configurar el “Data source” correspondiente indicando el SAI que debe monitorizar, en mi caso salicru@localhost.

Si todo ha ido bien, comenzaremos a ver la gráfica de nuestro SAI. Tendremos sólo las líneas Input, Output y Load, la de Batteries, como he indicado, no se recibe en este SAI.

Ya tenemos nuestro SAI baratito bien instalado y configurado. A partir de ahora nos avisará cuando haya cortes de luz, apagará el equipo, se encenderá de nuevo automáticamente y, si lo configuramos todo bien, tendremos hasta un SMS en nuestro móvil. Y todo ello monitorizado a través de Cacti :).

Segmentation fault al instanciar un webservice WCF de .NET desde PHP

Recientemente nos hemos encontrado con un problema que nos ha tenido varios días bloqueados hasta conseguir averiguar el origen. Llevamos mucho tiempo utilizando webservices programados en .NET desde aplicaciones PHP sin ningún problema, pero esta vez estaba hecho con la nueva tecnología WCF (Windows Communication Foundation) de Microsoft .NET 3.5. El problema era que en cuanto lo subimos a producción la aplicación PHP devolvía un pantallazo en blanco sin más información. Analizando los logs vimos que el proceso de Apache provocaba un Segmentation Fault con lo que no llegábamos a ver ninguna excepción.

Tras muchas pruebas conseguimos aislar el error en la línea de código que instanciaba el nuevo webservice, si eliminábamos esa parte todo funcionaba correctamente.

$client=new SoapClient("http://wcf.tudominio.com/webservice/ws.svc?wsdl");

Lo más curioso es que en los entornos de preproducción sí que funcionaba, no entendíamos nada. Analizando las máquinas de los distintos entornos todas eran idénticas en cuanto a versiones y configuración excepto algunos parámetros SOAP para PHP, en la máquina de producción tienen la caché de wsdl activada mientras que en los demás está desactivada.

soap.wsdl_cache_enabled = 1
soap.wsdl_cache_dir = /tmp/
soap.wsdl_cache_ttl = 7200
soap.wsdl_cache_limit = 50

No puede ser que el error sea el cacheo. Pues sí, lo es, en cuanto desactivamos la caché del servidor de producción todo comenzó a funcionar correctamente.

Perfecto, pero la caché tiene que estar activada, la aplicación hace uso de unos 35 webservices, si para cada instancia de cada uno de ellos hay que cargar previamente el wsdl, el rendimiento cae por los suelos, es imprescindible.

Pues nada, solución increíblemente cutre:

ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
ini_set('soap.wsdl_cache', '0');

$client = new SoapClient("http://wcf.tudominio.com/webservice/ws.svc?wsdl");

ini_set('soap.wsdl_cache_enabled', '1');
ini_set('soap.wsdl_cache_ttl', '7200');
ini_set('soap.wsdl_cache', '3');

Así es, desactivamos la caché antes de instanciar sólo este webservice y la volvemos a activar después. No hemos encontrado otra manera de solucionarlo ni hemos encontrado ninguna referencia de alguien que haya sufrido el mismo problema. La solución es mala, muy mala, no deja de ser un apaño, pero funciona y nos permite salir del paso hasta que sepamos por qué ocurre.

Usando Amazon S3 como sistema de backup

Estoy tratando de mejorar el sistema de backups que utilizo habitualmente usando Amazon S3 como plataforma de almacenamiento. S3 (así como otros servicios Cloud de Amazon) tienen dos ventajas importantes, por un lado la disponibilidad, del orden del 99,99% y por otro el precio, altamente competitivo, cobran por espacio utilizado y por peticiones realizadas pero aún así sale por un precio espectacular.

Nuestro backup es del orden de 40gb, y, si el sistema va bien, planeo utilizarlo también para backups personales (fotos sobre todo :P).

El requerimiento básico es que la sincronización se realizará de manera automatizada desde un servidor Linux con lo que el sistema debe permitir el envío desatentido.

Buscando por ahí como hacerlo encontré FuseOverAmazon, un sistema basado en Fuse que permite montar un “bucket” de S3 como si fuese una unidad local y sobre la que posteriormente podríamos utilizar rsync. ¿Qué más se puede pedir? Dicho y hecho, vamos a probarlo. En mi caso utilizo CentOS.

yum install fuse fuse-devel curl-devel libxml2-devel
wget http://s3fs.googlecode.com/files/s3fs-r191-source.tar.gz
tar xvfz s3fs-r191-source.tar.gz
cd s3fs
make
make install

Vamos a probarlo.

/usr/bin/s3fs nombrebucket -o accessKeyId=TUACCESSKEYID -o secretAccessKey=TUSECRETKEY /mnt/s3

Si todo ha ido bien tendrás montado en /mnt/s3 tu “nombrebucket” y podrás listar los archivos, copiar, eliminar, etc., como si fuese una unidad del equipo. Hasta aquí todo ha ido bien.  Sólo nos queda sincronizar nuestro backup:

/usr/bin/rsync -avz --delete /usr1 /mnt/s3

Y aquí es donde viene el problema. En mi caso han pasado 4 días y aún no ha pasado del 10% de la sincronización, funciona todo bien pero la sincronización es extremadamente lenta, no sé si estoy haciendo algo mal, si es normal, o no, pero es imposible de utilizar así.

Como la idea no ha sido del todo buena, tenemos un plan B. Se trata de utilizar s3sync, un script en Ruby que hace el proceso muy sencillo, sólamente hay que configurarlo indicando tus datos de acceso y a funcionar:

s3sync -r /mnt/backup nombrebucket:prefijo

Donde “prefijo” puede ser nulo.

Esto enviará a nombrebucket/prefijo/ tu backup.  De momento las pruebas son mucho más satisfactorias que con s3fs, la velocidad se puede considerar más que adecuada, sobre todo comparada con el anterior.

Como decía, de momento estoy probando el rendimiento y la velocidad, pero no estoy del todo convencido, así que estoy pensando en utilizar Amazon EC2 en vez de S3, de manera que lanzando una instancia de una máquina virtual pueda hacer un rsync clásico contra un sistema de ficheros de verdad. La ventaja es que la máquina virtual puedo lanzarla sólo cuando la necesite y pararla después, con lo que con una hora diaria podría ser suficiente, recordemos que Amazon EC2 cuesta, entre otras cosas, por cada hora que utilizas la instancia. Adicionalmente se podría hacer después un volcado del backup desde EC2 a S3, pero en nuestro caso los 40gb sería una limitación que encarecería el precio considerablemente aún en el caso de utilizar rotaciones semanales.

Ya os contaré :P.

Habilitar el escritorio remoto multiusuario y multisesión en Windows7

Como siempre, esas extrañas manías de Microsoft de no permitir ciertas cosas con su sistema operativo que la mayoría vemos útiles.

En mi caso, era utilizar mi HTPC para algo más que ver películas, con lo que quería dos cosas, por un lado permitir que varios usuarios se pudiesen conectar concurrentemente a la misma máquina y por otro, a ser posible, poder utilizar el mismo usuario en varias sesiones (esto ya es para tonterías mías :P).

Total, que lo segundo ya sería increíble, pero es que por defecto, con cualquier Windows, lo primero es imposible, al conectarte con el Escritorio Remoto a una máquina, automáticamente desconecta al que estuviese en consola, en mi caso la sesión por defecto del HTPC, que además queda bloqueada al desconectarte tú, con lo cual no solucionamos nada.

La solución pasa por crackear la librería del servidor de Escritorio Remoto, así se hacía en XP y así se sigue haciendo en Windows 7, incríble pero cierto.

Encontré por ahí el parche para las últimas versiones de Windows7, pero la pega es que estaba preparado para el idioma inglés, con lo que al intentar dar permisos al grupo “Administrators” o parar el servicio “Remote desktop” devolvía error. He cambiado un poco el script para que funcione con las versiones en español. Podéis descargarlo aquí.

El funcionamiento es muy sencillo, se descomprime el fichero y se ejecuta el archivo install.cmd con privilegios de administrador. Para logarlo ya sabéis, botón derecho sobre el mismo y “Ejecutar como administrador”.

Si todo va bien cambiará la dll correspondiente por la parcheada y reiniciará el servicio de Escritorio Remoto con las opciones por defecto, es decir, permitir múltiples usuarios simultáneos. Si queremos permitir varias sesiones del mismo usuario, habrá que hacerlo de otro modo.

Inicio->Todos los programas->Accesorios->Símbolo del sistema

Ejecutado también cómo administrador, el mismo sistema, con el botón derecho. Una vez ahí nos desplazamos a la carpeta donde descomprimimos el parche y ejecutamos:

install.cmd multi

Con esto habilitaremos la multisesión de un mismo usuario.

Si ahora probamos a conectarnos desde otro ordenador con otro usuario (o el mismo si hemos activado la multisesión) tendremos las dos sesiones activas.

Ya puedo puedo utilizar mi HTPC para algo más útil :).

Segmentation fault en WordPress al utilizar eAccelerator

Hacía casi un mes que no escribía nada :O, cosas del periodo navideño. Espero retomar mis hábitos de escritura con ganas con el año nuevo, tengo muchas cosas pendientes por contar.

Llevaba un par de meses preocupado por mi blog. Por alguna extraña razón, de vez en cuando comenzaba a devolverme pantallas en blanco al acceder a cualquier artículo e incluso al acceder al tablero de administración, la pantalla de login funcionaba bien pero una vez te autentificabas saltaba el error. Reiniciando el servidor web volvía a funcionar correctamente por un periodo indeterminado de tiempo, a veces unas horas a veces varios días, pero terminaba saltando de nuevo la pantalla en blanco.

Al comprobar los logs de errores de Apache lo único que aparecía era algo como:

[Mon Jan 08 09:34:14 2010] [notice] child pid 4899 exit signal Segmentation fault (11)

Es decir, no me aportaba nada, un misterio, y tampoco encontré ninguna referencia útil buscando “wordpress segmentation fault“. Me tocó poner sobre la mesa todas mis habilidades de depuración y a base de echo’s y exits ir siguiendo la pista hasta llegar al punto donde saltaba el error. Tras un par de horas llegué a la conclusión de que el problema estaba en la función wp_filter_kses del archivo:

wp-includes/kses.php

Faltaba saber por qué provocaba un Segmentation fault y no un error de PHP estándar. Descubrí además que reescribiendo el mismo archivo sin hacer cambios, es decir, cambiando la fecha de actualización, todo comenzaba a funcionar correctamente… hasta que volvía a fallar. Raro, raro, raro…

Teniendo ya una referencia clara del origen del problema, una sencilla búsqueda de “kses.php segmentation fault”  me condujo al origen del problema, y éste no era otro que el sistema de cacheo que se utiliza en el servidor, eAccelerator. Al parecer, y sin una causa lógica, la caché de ese archivo se corrompe periódicamente y al intentar leerlo provoca el “Segmentation fault“. Tiene sentido entonces que al cambiar la fecha del archivo volviese a funcionar, este cambio provocaba que se regenerase la caché del mismo y funcionase correctamente.

La solución es indicarle a eAccelerator que no cachee ese archivo concreto. Para ello añadimos al archivo de configuración:

/etc/php.d/eaccelerator.ini

eaccelerator.filter="!*kses.php"

Con esto se acabaron los pantallazos en blanco, espero recuperar algo de las visitas perdidas las últimas semanas ya que ha estado la mayor parte de las vacaciones caído por culpa de este error.

Vistas en un servidor DNS ó cómo resolver en función del cliente

Hoy voy a hablaros de algo que utilizo desde 2001 aproximadamente y que creo que cualquiera que trabaje en un entorno soho debería conocer ya que es la solución a todos sus problemas de resolución DNS, sin embargo he llegado a la conclusión de que es un completo desconocido. En esta situación nuestra infraestructura de red sería algo del estilo de la imagen que muestro a continuación.

SOHOEs decir, del router hacia adentro estamos en la red local de la oficina con direcciones privadas mientras que hacia el exterior se utiliza la IP pública del router, la que nos da nuestro proveedor de ADSL/Cable.

Supongamos ahora que por motivos de trabajo necesitamos que nuestro servidor responda ante algún dominio o subdominio de manera que desde el exterior se pueda acceder a determinados servicios que ofrecemos (y no, no queremos usar la IP directamente :P). Utilizando NAT configuramos el router para que las peticiones que le lleguen desde el exterior a determinados puertos las redirija al servidor.

En la imagen he pintado en rojo el camino que seguirían las solicitudes que llegan desde el exterior y en verde las que llegan de la propia red local. El problema habitual de un entorno de este tipo es que desde dentro de la red no se puede acceder al servidor con el nombre de dominio ya que la resolución devuelve una IP pública que está al otro lado del router, es decir, por simplificarlo un poco, el router no permite acceder desde el interior a los servicios que ofrece al exterior. Es simplemente un problema de interfaces y enrutamiento.

La solución pasa por convertir a nuestro servidor en el DNS principal de los usuarios de la red en vez de utilizar los que nos da nuestro proveedor, y configurar en él nuestro dominio de manera que dependiendo de quien lo interrogue nos devuelva la ip pública del router o la ip privada del servidor. Esto se puede hacer con las llamadas “vistas” de bind, imagino que en otros servidores DNS se podrán configurar del mismo modo.

Vale, creo que no he entendido nada de lo que has dicho. ¿Qué son esas vistas de las que hablas? Tranquilos que os lo explico.

Fíjate de nuevo en la imagen de arriba. Es obvio que los clientes que intentan acceder desde el exterior a nuestro servidor deberán utilizar la IP pública del router, NAT se encarga después de hacerlas llegar al servidor. Desde el interior es diferente, nuestras máquinas están en la misma red local que el servidor, sólo debemos saber la IP del servidor para acceder a él. Bien, pues esto es, a grandes rasgos, lo que hacen las vistas: si el cliente que me llama lo hace desde el exterior le digo la IP pública, si es desde el interior le digo la privada.

La configuración es extremadamente sencilla. Deberemos editar /etc/named.conf y hacer algo así:

#DNSINTERNO
view "internal" {
	match-clients { 192.168.0.0/24; 127.0.0.0/8; };
        zone  "dominio.com" {
                type master;
                file  "dominio.com.internal.zone";
        };
};
#DNSEXTERNO
view "external" {
        match-clients { any; };
        zone  "dominio.com" {
                type master;
                file  "dominio.com.external.zone";
        };
};

Eso es todo, sí, no hay más truco. El nombre de las vistas lo pones tú, algo que te permita identificar qué es cada una. Para cada vista le indicas qué clientes la verán y el archivo de zona con las resoluciones. Ya sólo nos falta configurar los clientes para que utilicen tu servidor DNS y preparar el dominio para que tu máquina local sea el servidor DNS mediante la IP pública.

Obviamente os he dado los detalles a grandes rasgos, a partir de ahí seguro que se os ocurren utilidades y combinaciones entre redes y subredes mucho más útiles. Al menos os ayudará a muchos a crear un entorno mucho más productivo y cómodo.