Ruby Ping un script para monitorear equipos de red

ruby ping

 

Ruby Ping es un programa que hace ping a una lista de servidores de un archivo y si existe un error de conexión manda un correo electrónico al administrador.

Anteriormente ya había desarrollado algo similar en bash, pero ahora quise hacerlo en Ruby y añadirle algunas mejoras.

La primera es que este script toma los datos de un archivo en formato CSV, es decir, separado por comas. Un archivo como este se puede generar muy fácilmente usando LibreOffice o Excel.

Primero el nombre del equipo y luego la dirección IP del mismo. Esto sirve para que sean más claros los mensajes que manda el script.

En el caso de que Ruby Ping llegara a encontrar algún error de conexión, manda un correo electrónico al administrador avisándole de la falla.

mensaje de correo rubyping

Parámetros del script

Configurar el script es muy sencillo, solo tiene 4 parámetros:

  • ARCHIVO Que es la ruta al archivo que contiene el listado de servidores en formato CSV.
  • CORREO_ORIGEN El correo de origen, lo puse como parámetro por si quieren aplicar alguna especie de filtro personalizado en su programa de correo electrónico.
  • CORREO_DESTINO El correo a donde quieren que lleguen las alertas.
  • SERVIDOR_SMTP Y por último el servidor SMTP que van a utilizar para mandar los correos.

El código lo pueden descargar, guardar en un archivo, darle permisos de ejecución y eso es todo. Y bueno, claro que deben de tener Ruby instalado.

Estoy considerando agregarlo en una tarea cron, pero por el momento sólo lo ejecuto cuando tengo algunos problemas en mi red. Me es muy útil porque puedo localizar rápidamente donde se podrían localizar algunos problemas (tengo mis sospechosos comunes).

El programa es software libre, así que lo pueden personalizar, copiar, modificar y hacer lo que quieran con él.

Espero que les sea de utilidad.

Lotería Mexicana en Ruby

Lotería mexicana El valiente

Ayer se me ocurrió una idea que puede sonar muy simple, un script desarrollado en Ruby que tome las figuras de la lotería mexicana, las reboruje y corra la baraja.

loteria mexicana en ruby

Como pueden ver no hay mucho que decir, el código es muuuuuy pero muy sencillo, le agregué una variable para ajustar la velocidad en la que se corre la lotería. Si tienen las tablas pero por alguna extraña razón, de esas que casi nunca ocurren se les perdió alguna baraja puedes usar este script para jugar.

Para aquellos que todavía me leen desde el sistema operativo de las ventanas, no os preocupéis, hice un ejecutable del programa, pero en este caso no se le puede ajustar la velocidad. Lo único que tienen que hacer es descargar el archivo zip, descomprimirlo en donde gusten y darle doble clic.

loteria_mexicana md5sum 75ee481965d71d0b643c42ab5da52323.

Espero que se diviertan un buen rato con este juego ¡BUENAS CON LA ESTRELLA!

Referencias

Expresiones regulares con Ruby

El otro día me pusieron un reto programático bastante interesante. Me dieron un archivo de texto del cual tenía que extraer ciertos datos y entregarlos en un archivo de Excel. ¡Interesante! ¿No creen?.

Al principio intenté con un programa que fuera libre o gratuito, algún editor que buscara información de archivos de texto para luego entregarlos en otro diferente, pero no fue tan sencillo.

El archivo de texto que me entregaron no tenía un formato más o menos constante e implicaba varios retos, lo siguiente que se me ocurrió fue hacer un script.

Un amigo me sugirió que usara Perl, pero para ser sincero no estoy familiarizado con este lenguaje así que sería un volver a empezar. Así que mi siguiente opción fue la de utilizar Ruby que es un lenguaje que me agrada y más o menos le entiendo.

Ruby al rescate

Para este problema decidí dividir las tareas principales, cargar el archivo de texto en un arreglo, mi idioma iniciar la búsqueda de la información, guardar esa información en otro arreglo (array) o en un hash para luego vaciarlo a un archivo de texto separado por pipes( | ).

Como es mi primer contacto con Expresiones regulares necesité un poco de ayuda.

El sitio txt2re ayuda a seleccionar ese patrón que quieres extraer y además te hace un ejemplo en varios lenguajes como Perl, PHP, Python, Java, C, C++ y claro Ruby. Este sitio fue un buen comienzo, sin embargo, con un poco de práctica pude simplificar mucho el script.

txt2re
El sitio txt2re permite juguetear un poco con las expresiones regulares.

Otro tutorial que me ayudó mucho fue Aprende a Programar con Ruby. Esta muy bien explicado, en español y repleto de ejemplos que explican claramente cada tema. Si están empezando a programar en Ruby debes de tenerlo en cuenta.

Aprende a Programar con Ruby
Si no estas familiarizado con Ruby, lo mejor es darle un vistazo a este tutorial.

Y como tumbaburros de la enorme cantidad de clases y métodos que tiene Ruby les recomiendo el sitio DevDocs Ruby.

DevDocs Ruby
Como guía rápida de Clases y Métodos de Ruby.

Ahora si, como dice “Jack el destripador” ¡Vámonos por partes!.

Cargar un archivo a un arreglo.

Esto es importante, al momento de programar es mucho más sencillo manipular un arreglo que un archivo. Una de las razones por las que me gusta Ruby es que simplifica mucho las tareas, hacer esto es algo que toma solamente dos líneas:

archivo = File.new("archivo.txt","r")
txt = archivo.readlines

Y todo el contenido del archivo se guarda en arreglo de nombre txt línea por línea, por ejemplo, si quiero leer la primer línea del archivo hago referencia de esta forma txt[0] (los índices de los arreglos comienzan en cero) y así hasta el final del archivo.

Expresiones regulares en ruby.

Ahora viene lo realmente complicado, para aplicar una expresión regular voy a usar el método match, por ejemplo:

num = /\d{6}/.match(txt[0])

La expresión regular

/\d{6}/

busca un patrón de 6 digitos seguidos y num guarda un valor de cierto o falso, cierto si encuentra la expresión regular en el texto analizado y falso si no lo encuentra.

num =/\d{6}/.match("12345 Regresa False")
num =/\d{6}/.match("123456 Regresa True")

Pero eso solo nos dice si encontró o no la expresión regular, el valor de lo que encontró lo podemos revisar en el índice cero de la variable.

puts num[0] #regresa 123456

Búsquedas indirectas

Ahora viene algo interesante, a veces no me interesa tanto la expresión regular, si no lo que está a la derecha de ella. Por ejemplo la clásica combinación clave descripción. Se que la descripción está a la derecha de la clave.

texto = "000001 Manjaro Linux 0.9.9 xfce CD de Instalación"
num = /\d{6}/.match(texto)
if num #Revisa si encontró la expresión regular.
    descripcion = texto[8,42] #Si la encuentra regresa lo que esta a derecha del número.
    puts descripcion
end

Extraer una parte de un texto en Ruby es sencillo, en donde dice texto[8,42] quiere decir que a partir de la posición 8 toma los 42 caracteres de la derecha, por lo tanto el contenido de la variable descripcion es:

"Manjaro Linux 0.9.9 xfce CD de Instalación"

Como ven esto apenas es un esbozo de todo lo que se puede realizar con expresiones regulares con Ruby, espero que les sea de utilidad.

Enlaces de interés.