#!/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