Featured image of post Ruby Ping un script para monitorear equipos de red

Ruby Ping un script para monitorear equipos de red

Ruby Ping 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.

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

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.

Todas las imágenes, nombres de productos y nombres de empresa o logotipos citados en esta página web son propiedad de sus respectivos propietarios.
Creado con Hugo
Tema Stack diseñado por Jimmy