Ruby Ping un script para monitorear equipos de red

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 https://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.

4 comentarios en «Ruby Ping un script para monitorear equipos de red»

    • Hola hola !!!

      Efectivamente había un problema al mostrar el código. Eliminé un sistema anterior que me estaba provocando problemas. Lo acabo de subir nuevamente, pero ten en cuenta que es muy probable que esté desactualizado.

      Tengo otro que hace lo mismo pero escrito en Python llamado Python Ping por si le quieres dar un vistazo.

      Saludos.

      Responder
  1. Hola buen dia. Disculpa mi ignorancia, pero me interesa mucho aprender sobre este script, pero no lo entiendo muy bien. Hay cosas que estan redactadas a modo de modificar y rellenar, pero especificamente cuales son las que hay que modificar? Donde y como se debe ejecutar el script?

    Responder
    • Vas a tener que estudiar algunos temas. Primero debes de instalar Ruby. Luego copiar en un editor de texto el script y modificarlo a tus necesidades. Luego ejecutarlo en una terminal. No es tán dificil ¡Animo!.

      Responder

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.