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.
#!/usr/bin/env ruby
# RubyPing
# =======================================================================
# Hace ping a una lista de servidores de un archivo y si existe un error
# manda un correo electrónico al administrador.
#
# Este programa es software libre. Puede redistribuirlo y/o
# modificarlo bajo los términos de la Licencia Pública General
# de GNU según es publicada por la Free Software Foundation,
# bien de la versión 2 de dicha Licencia o bien (según su
# elección) de cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea
# útil, pero SIN NINGUNA GARANTÍA, incluso sin la garantía
# MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
# PROPÓSITO PARTICULAR. Para más detalles, véase la Licencia
# Pública General de GNU.
#
# Autor: LinuxmanR4 inguanzo@gmail.com http://linuxmanr4.com
# versión 0.1
# =======================================================================
require 'timeout'
require 'socket'
require 'csv'
require 'net/smtp'
# Reemplazar por los parámetros de su instalación
ARCHIVO = "/home/usuario/directorio/servidores_csv.txt"
CORREO_ORIGEN ="rubyping@dominio.com"
CORREO_DESTINO = "destino@dominio.com"
SERVIDOR_SMTP ="smtp.dominio.com"
def ping(host)
begin
Timeout.timeout(5) do
s = TCPSocket.new(host, 'echo')
s.close
return true
end
rescue Errno::ECONNREFUSED
return true
rescue Timeout::Error, Errno::ENETUNREACH, Errno::EHOSTUNREACH
return false
end
end
# Recuperar la información contenida en el archivo y guardarla en una variable.
# La estructura del archivo debe de ser como sigue:
#
# Servidor 1,IP Servidor 1
# Servidor 2,IP Servidor 2
# Servidor n,IP Servidor n
csv_text = File.read(ARCHIVO)
csv = CSV.parse(csv_text, :headers => false)
datos = Hash.new
i = 0 # indice inicial (los indices comienzan en cero)
csv.each do |linea|
datos[[i,:nombre]] = linea[0]
datos[[i,:ip]] = linea[1]
i +=1
end
indice = 0
while indice < i
if ping datos[[indice,:ip]]
puts datos[[indice,:nombre]] +" [OK]"
else
puts datos[[indice,:nombre]] +" [Error]"
mensaje_correo = "From: Ruby Ping<#{CORREO_ORIGEN}>
To: #{CORREO_DESTINO}
Subject: Error de conexión en #{datos[[indice,:nombre]]}
Existe un problema de conexión en el equipo #{datos[[indice,:nombre]]} con dirección IP #{datos[[indice,:ip]]}.
Este es sólo un mensaje de aviso. No es necesario que conteste este mensaje.
Atentamente,
Ruby Ping :)"
# Código para enviar un correo usando un servidor smtp.
Net::SMTP.start(SERVIDOR_SMTP, 25) do |smtp|
smtp.send_message mensaje_correo, CORREO_ORIGEN, CORREO_DESTINO
smtp.finish
end #net
end #if
indice +=1
end #while
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.
