imagen

Detectar y avisar de equipos caídos que son vitales de nuestra red mediante ping

05.May.2015 — Julio

Una forma de ver si un equipo importante de nuestra red está caído es si responde a ping o no.

El siguiente script, instalado en uno de ellos, nos avisa mediante email si alguno no responde bien.

Soy consciente de que puede caerse el equipo donde está instalado y por tanto no avisar de posibles caídas del resto o de incluso, en determinadas circustancias, puede dar falsos positivos por algún relantecimiento de la red.

De momento me ha sido útil incluso para detectar malfuncionamiento de algunos de los routers de mi red por microcortes.


El siguiente script en Python,

  • coge una lista de las ips que nos interesa controlar
  • cogemos una selección aleatoria de ellos (actualmente todos)
  • hace un ping (de 3 echos en mi caso) a la selección
  • si en la respuesta encontramos "100% perdidos", osea que ni uno bueno, entonces avisa por email
  • se guarda en un log la caida
  • para no estar repitiendo email, sólo lo envía una vez cada hora
  • en el email va como adjunto el resultado del ping

Este script yo lo tengo puesto que se ejecute cada 5min.

Por supuesto tiene muchas mejoras, como cargar la lista de equipos a controlar de un fichero .ini por ejemplo, así como los datos del email (destinatario, datos de smtp, etc..), el número de echos del ping, etc... pero como me funciona y es para mi uso particular ... me da pereza.

Además está para equipos en castellano y en windows (en linux param -c por -n)

Lo tengo instalado desde ++junio 2011++ con muy buen resultado, y es por ello que no me pide modificar nada.

ping_vitales.pyw (en gists)

```   
#-------------------------------------------------------------------------------  
# Name:        ping_nodos_vitales  
# Purpose:     ping a los puntos de acceso de radiofrecuencia    
#               y al router netlan  
#               y a los concentradores  
#               cada 5 min de forma aleatoria  
#               solounocadavez = random.randrange(151,153)   
#  
# Author:      julio  
#  
# Created:     20/06/2011  
# Copyright:   (c) julio 2011  
# Licence:     <your licence>  
#-------------------------------------------------------------------------------  
#  
import subprocess, os  
import random,datetime, time  
from envia_email import mandaemail  


comodin = '127.0.0.1'  
concen_va = '10.xx.y.50'  
concen_za = '10.xx.z.50'  
router_netlan_va = '10.xx.y.65'  
router_netlan_za = '10.xx.z.65'  
router_fedicom = '10.xx.y.1'  
router_correo = '10.xx.y.66'  
pa_1 = '10.xx.y.151'  
pa_2 = '10.xx.y.152'  
controla_dom = '10.xx.y.38'  
ip_fedicom = '214.xx.y.143'  
ip_correo = '81.xx.y.216'  
ip_knapp = '211.xx.y.189'  
fic_ping = 'ping_vitales_ultimo.txt'  
fic_log = "ping_vitales_log.txt"  
fich_error = open('ping_vitales_error.txt','a')  
email = 'si'  

nodos_vitales = [concen_va, concen_za, router_netlan_va, router_netlan_za, router_fedicom, pa_1, pa_2, controla_dom, ip_fedicom, ip_correo, ip_knapp]  
solounocadavez = random.sample(nodos_vitales, len(nodos_vitales))  
puntosacceso = solounocadavez  
dt = datetime.datetime.now()  

for host in puntosacceso:  
    ejecuta = ' ping -n 3 '+host  
    ping = subprocess.call(ejecuta,shell=True,stdout=open(fic_ping,'w'),stderr = fich_error)  
    salida = open(fic_ping,'r').read()  
    if salida.find('100% perdidos') <> -1:  
        fich_log =open(fic_log,"a+")  
        fich_log.write('nodo vital caido '+ str(host) + '  '+ str(dt) + '\n')  
    fich_log.close()  
        # flag para no repetir  
        fic_flag = 'ping_vitales_caido_'+ host.replace(".","_") + '__' + dt.strftime("%Y%m%d_%H")+ 'h.txt'  
        if (email=='si') and (os.path.exists(fic_flag)==False):  
            fich_flag=open(fic_flag,"w+")  
            fich_flag.close()  
            texto=salida  
            adjunto=''  
            asunto = host.replace(".","_") + '_caido_' + dt.strftime("%Y%m%d_%Hh%M")  
            mandaemail('remitente','passw','smtp',['aquien@quieras.com'],asunto,texto,adjunto)  
            time.sleep(1)  # damos unos segundos para respirar por si acaso  
```

pd: para el envio por email se necesita otro script en python (mandaemail.py)

Tags: python, security bots

Comments? Tweet