Detectar y avisar de equipos caídos que son vitales de nuestra red mediante ping
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