Archivo de la categoría: Informática

Un cajón de sastre donde comento temas relacionados con el mundo de la informática

Ejecutar un script nada más recibir un correo con postfix

El servidor de correo Postfix es muy potente y altamente configurable.

Ente sus multiples opciones, una de ellas es permitir realizar una acción al recibir un correo y esto se puede aprovechar (como se verá más adelante) para ejecutar un script o programa al recibir un correo.

La ventaja con respecto a estar comprobando cada cierto tiempo un buzón de correo es que el script se ejecuta inmediatamente al recibir un correo , no hace falta tener un servidor pop3 y no hace falta borrar el mensaje porque postfix se lo pasa a la aplicación y no lo guarda en ningún sitio.

Para explicar como configurarlo, parto de la base de que ya se tiene configurado el postfix con un dominio y recibe correos en ese dominio. En mi caso tengo el dominio sistemasorp.com dirigido a mi servidor casero.

Como no quiero que interfiera con el correo de mi dominio actual, he de crear un nuevo registro MX en mi servidor DNS para añadir un subdominio, por ejemplo servicios.sistemasorp.com (esto también me dá una ventaja que comentaré más adelante).

El siguiente paso es acceder como root a la consola y entrar en el directorio /etc/postfix (o donde se encuentre el directorio de configuración del postfix).

Editar el fichero main.cf y añadirlas siguientes lineas (si no existían ya)

transport_maps = hash:/etc/postfix/transport

local_recipient_maps=

Editar el fichero master.cf y añadir la siguiente linea:

XXX unix    –       n       n       –       1       pipe  flags= user=YYY argv=ZZZ ${sender} ${recipient}

  • XXX indica el nombre de una alias, en mi caso servicios
  • YYY es el usuario del sistema con el que se ejecutará el script (escoge uno que tenga persmisos para lo que quieras hacer)
  • ZZZ es la ruta del script o programa que quieres que se ejecute, en mi caso /usr/local/bin/emailprueba.sh
  • ${sender} y ${recipient} son dos variables que le pasamos por parámetros al script.

Editar el fichero transport y añadir la siguiente linea:

subdominio      XXX:localhost

  • subdominio es la parte entera del dominio, en mi caso servicios.sistemasorp.com
  • XXX indica el nombre del alias que usamos en el fichero master.cf, en mi caso servicios

Finalmente ejecutar postmap /etc/postfix/transport para crear la base de datos de transportes de postfix.

Con esto, cualquier correo que se dirija al subdominio que hemos creado se pasará directamente a nuestro script. De ahí nuestra ventaja que comentaba antes: da igual el nombre que aparezca a la izquierda de la arroba, no hace falta que esté dado de alta como usuario en linux, por lo que podemos usarlo como un identificador de servicio, el número de un móvil, etc.

Postfix lo que hace es ejecutar el script pasándole por la entrada estandar todo el contenido del mensaje (cabeceras y cuerpo) y como parámetros los que se le indiquen en el master.cf : la variable ${sender} es la cuenta de correo electrónico del remitente y ${recipient} es el nombre que aparece a la izquierda de la arroba, aunque hay muchos más.

Así por ejemplo si queremos tener un servicio de envío de sms podemos crear un mensaje dirigido a 699999999@servicios.sistemasorp.com desde nuestra cuenta google@gmail.com, por lo que el script además de recibir el mensaje entero recibe como parámetros google@gmail.com y 699999999.

Otro ejemplo es tener un servicio de envío de ficheros y uno de traducción de palabras. En el primer caso si enviamos un correo desde nuestra cuenta google@gmail.com a enviame@servicios.sistemasorp.com y como asunto ponemos una URL nos enviaría de vuelta como fichero adjunto el indicado en la URL. En el segundo caso si enviamos un correo desde nuestra cuenta google@gmail.com a traduce@servicios.sistemasorp.com y como asunto ponemos una palabra en inglés nos enviaría de vuelta la traducción del termino. En ambos casos el script es el mismo y se encarga de saber qué servicio estas solicitando por el nombre de la cuenta de correo al que va dirigido y actuar en consecuencia.

Un script sencillo para ir probando los conceptos es este:

Simplemente recibe un correo y vuelve a enviar al remitente otro correo con los datos que envió. Lo podeis probar enviando un mensaje a pepe@servicios.sistemasorp.com, prueba_de_concepto@servicios.sistemasorp.com, asdfhasdjlfhasdjkfhjkdfh@servicios.sistemasorp.com o el destinatario que querais@servicios.sistemasorp.com y un asunto cualquiera (si no lo recibis mirad que no se haya puesto en vuestra carpeta de spam).

Adiós dominios, adiós

Me he deshecho de dos dominios de internet que ya no quería seguir manteniendo.

Uno de ellos es quejateportodo.com. Este es muy antiguo y data de 2001. Su función principal fue albergar una especie de foro donde la gente expusiera sus quejas sobre los temas que quisieran. Estába organizado por secciones para poder clasificar mejor las quejas. Como anécdota os puedo contar que una vez me llamó la Policía Local de Granada por una denuncia que había puesto el dueño de unos parkings por unas criticas feroces a su gestión publicadas en la web; como le pedí una orden judicial para darle los logs del servidor web se calló y no volví a saber nada de el (¿Sería el propio dueño de los parkings haciendose pasar por la policía?). Finalmente como hice varios cambios y veía que no tenía mucho éxito lo dediqué a otras cosas.

El segundo es horaylugar.com. Una web donde podías crear citas, eventos, reuniones, etc y localizarlas en un mapa para después enviarselo a quien quisieras. Lo presenté al único concurso de mashups de Google Maps y quedó 4º, pero debido a su poco éxito lo abandoné a su suerte.

Actualmente ya sólo tengo los dominios sistemasorp.com (el dominio que apunta a mi servidor casero basado el linux), sistemasorp.es (el dominio asociado a mi cuenta de hosting) y sistemasorp.es (este blog)

Geocities cierra

Hoy me he enterado que Geocities cierra, la web de hosting que operaba desde 1994 y que más tarde fue comprada por Yahoo.

La verdad es que me ha entrado un poco de nostalgia. No en vano fue mi primer sitio de hosting allá por 1996 (me dí de alta en hotmail y geocities con un equipo que estaba en el SIMO conectado a Internet).

Aún recuerdo cuando me compré un libro de bolsillo de HTML de Anaya y pocos días después fuí con un disquete de 720 kbytes al primer cybercafé que hubo en Madrid (no recuerdo su nombre) en los bajos de Azca y subí todos los ficheros de lo que fué mi primera página web. Por aquél entonces tenías que elegir tu vecindario donde clasificar tu web, yo usé SiliconValley.

Ha llovido mucho desde entonces, pero es bueno saber que yo, como muchos, fuimos testigos de la revolución que Internet estaba a punto de ser.

Antes de Internet mi conexión era por modem a BBS y hasta fuí punto de Fidonet, de Subnet y de Darknet. Era otro mundo: frontdoor, fmail, golded…

Es una lástima cómo van cayendo los veteranos de Internet al igual que fue una lástima ver como Fidonet y las BBS fueron desapareciendo y perdiendo importancia.

Programar la cámara IP Zaapa CIPRW (ZA-CIPRW) en .NET

Uno de los problemas que veo con la cámara IP Zaapa que me compré es que sólo se puede manejar desde un navegador Internet Explorer, y la verdad es que eso le quita mucho potencial a una cámara tan completa y barata como esta. Por eso me he puesto manos a la obra para desengranar un poco el funcionamiento y poder crear una aplicación de escritorio para poder manejarla.

Todo el trabajo de investigación ha estado centrado en ver cómo funciona el código fuente javascript de la página web que ofrece la cámara zaapa, ya que buscando por internet no he encontrado nada sobre cómo manejarla.

Lo primero que nos encontramos es que instancia un objeto llamado DVM_IPCam2.ocx. Buscando por internet he encontrado muy poca información sobre ese fichero en cuestión y mucho menos de la API OLE que encierra.

Por suerte el Visual Studio .NET puede incorporar ocx y ver de una tacada todos los métodos, propiedades y eventos que maneja el control ocx. Para ello dentro del Cuadro de herramientas, se pulsa con el botón derecho en Componentes y se selecciona Elegir Elementos… Después se pulsa sobre la pestaña Componentes COM y se selecciona DVM_IPCam2 Control.

dvmipcam2

Si no existiese es que no está registrado en Windows. Entonces habría que descargar el ocx desde la dirección http://<ip de la camara>/codebase/DVM_IPCam2.ocx, guardarlo en c:\windows\system32 y desde una consola de ms-dos ejecutar regsvr32 c:\windows\system32\DVM_IPCam2.ocx y después volver a repetir el proceso de Visual Studio.

Con esto ya tendremos el componente ocx para insertarlo en el formulario. Ahora para acceder a la cámara hay que seguir los siguientes pasos:

  • Conectar con la cámara usando el método MonitorConnect, pasándole como parámetros la dirección host o ip de la cámara, el puerto por el que escucha (normalmente el 80), el usuario y la contraseña.
  • Capturar el evento OnMonitorConnectResult y si la conexión ha sido satisfactoria pasar al siguiente punto
  • Empezar a recibir las imágenes dentro del control ocx usando el método PlayVideo.
  • Esperar a recibir las imágenes con el evento OnPlayVideoResult.
  • Hacer el resto de operaciones: mover la cámara con el método DecoderControl, hacer fotografías con el método Photo2, grabar un video con el método StartRecord2, reiniciar la cámara con el método RebootCamera, etc.
  • Cuando se termine de trabajar con la cámara llamar a los métodos StopVideo, StopRecord y MonitorDisconnect.

He desarrollado una pequeña aplicación que muestra estos conceptos. No hace comprobaciones de errores para simplificar el código:

aplicacioncamara

Podeis descargar el código fuente en c# y un ejecutable desde aquí.

El siguiente paso sería tratar de hacer que funcionase el firefox para windows y en un futuro conocer el protocolo para manejarlo desde linux, desde un iphone o desde cualquier otro entorno.

Capturar el escritorio o una ventana de windows con .NET

En el trabajo los usuarios nos envían incidencias de las aplicaciones, pero en muy pocas ocasiones adjuntan un «pantallazo» del error. Entiendo que el proceso de pulsar Impr Pant, irse al paint, pegar la imágen, guardarla en JPG y adjuntarla a la incidencia es algo que no saben muchos usuarios.

Por eso se me ocurrió crear una aplicación sencilla en c# que gestionase todo ese proceso (excepto adjuntar la imágen a la incidencia). Tomando como base este artículo he desarrollado la aplicación CapturaVentana (ciertamente no me he escornado buscando el nombre) debido a que el escritorio o una ventana son lo mismo para windows.

ventana

Su uso es muy sencillo. Elegimos si queremos copiar el resultado al portapapeles o a un fichero jpg y pulsamos sobre el botón correspondiente de lo que queremos capturar (escritorio entero o una ventana individual). En el caso de capturar el escritorio la aplicación se esconde momentaneamente para que no aparezca en la «foto». Si se trata de capturar una ventana hay que pulsar con el ratón sobre la ventana que queremos fotografiar después de haber pulsado el botón.

El código fuente se puede descargar desde aquí.

alarma

Hacía tiempo que no desarrollaba un proyecto con la fonera. En esta ocasión voy a hacer un sistema de alarma, la cual se activa cuando se pulsa un botón. Para ello me he hecho con lo siguientes materiales:

Emisor de 1 canal

Receptor de 1 canal

Fonera

getfile

Cuando alguien pulse el mando emisor, el receptor (alimentado por la fonera) recibirá la señal e informará a la fonera que se ha activado. Después la fonera se conectará a una página web para mandar un mensaje sms a un número de teléfono. Esto es útil por ejemplo para ancianos que desean solicitar asistencia, con sólo llevar el emisor colgado ya pueden enviar la alarma. Otra aplicación es una tienda donde se solicite ayuda en caso de robo, guardando el emisor debajo del mostrador o en el suelo.

Para ello, lo primero que se debe tener es la fonera con el firmware openwrt. Los pasos se pueden seguir aquí.

Después hay que instalar el módulo gpio. Los pasos se pueden seguir aquí.

A continuación hay que hacer que la fonera sea independiente del cable de red y se conecte como cliente al router wireless. Primero editamos el fichero /etc/config/wireless y ponemos lo siguiente:

Donde SSID es el nombre de la red wireless y CLAVE HEX la clave wep en hexadecimal (Para otras configuraciones mirar el documento de configuración aquí)

Segundo editamos el fichero /etc/config/network y ponemos lo siguiente:

Con estas configuraciones hacemos que el router de la fonera se conecte al punto de acceso como cliente y coja una ip mediante dhcp, sin la necesidad de tener un cable de red, por lo que podemos ponerla en cualquier lado. Por si acaso se deja una ip 192.168.1.200 en el puerto ethernet por si hubiera que conectarse a ella y no funcionase el wifi.

El siguiente paso es crear el script que recibirá por el gpio la señal del receptor. Creamos el fichero /usr/bin/alarma.sh con este contenido (poniendo el usuario, contraseña, numero de móvil y el mensaje a enviar):

Lo que hace el script es comprobar la salida del receptor cada segundo, si está activada enciende el led wlan de la fonera y accede a una página web php que envía mensajes sms con la API de envío de SMS del open movil forum, este es el código fuente:

El fichero SMSSenderAPI.php lo podeis descargar aquí. Los campos LOGIN y PASSWORD son para la api de open movilforum, el campo DESTINO es el número de móvil del destinatario y el campo MENSAJE el texto que se le enviará.

Después se edita el fichero /etc/firewall.user y se añade al final la siguiente linea sh /usr/bin/programa.sh &.

En la parte hardware he sacado los cables de GPIO de la fonera y alimentación y masa al exterior:

imgp0885imgp0886

Igualmente he quitado en el receptor el integrado 7805 para alimentar el circuito directamente desde la fonera con dos cables (alimentación y masa):

imgp0887

Y soldado al pin 1 (el que se pone a 5 voltios si el circuito ha recibido una señal) del chip HEF4013BP un cable que irá directamente conectado al gpio 1 de la fonera:

imgp0888

Y como colofón un video demostrativo:

En el vídeo se puede ver como pulso el botón del emisor, después el led de la fonera se pone en verde y finalmente se recibe un mensaje de texto indicando Alarma activada.

Matar procesos desde .NET

El otro día me surgió la necesidad de matar un proceso desde  mi programa en .NET. Este proceso debía estar mal programado y se quedaba cargado en memoria constantemente si daba un error, pero necesitaba cargarlo cada vez que el usuario necesitaba interactuar con él desde mi programa.

Por ello tuve que desarollar una función que hiciese esa labor:

Se le pasa como parámetro el nombre del proceso o los primeros carácteres y devuelve true si lo ha matado o false en caso contrario. Este internamente recorre toda la lista de procesos comprobando el nombre de cada uno de ellos y cuando coincida procede a matarlo. Se debe incluir el espacio de nombres System.Diagnostics.

Trucos para el buscaminas y el Pinball

He estado un tiempo sin escribir en el blog porque me han operado en Febrero y he estado de baja por más de un mes.

Ahora que ya me estoy recuperando e incluso ya estoy trabajando desde principios de este mes empiezo a retomar mi vida normal, entre otras cosas mi blog.

Para empezar, unos trucos para el juego del buscaminas y para el pinball que vienen en cualquier windows por defecto.

Buscaminas:

Si arrancas el buscaminas, pulsas X Y Z Z Y y luego shift + Intro podrás poner el cursor del ratón encima de cualquier cuadrado y en la esquina superior izquierda de la pantalla verás un pixel blanco que te indica que no hay mina debajo o negro si la hay.

Pinball:

  • Para conseguir bolas extras escribe 1max
  • Para activar el pozo gravitatorio teclea gmax
  • Para ascender de rango escribe rmax
  • Para tener un número de bolas infinito escribe bmax
  • Para mover la bola con el ratón escribe hidden test (con espacio incluido).