De vuelta de unas breves vacaciones traigo un pequeño script Python para verificar el estado de una conexión a Internet. Este script simplemente hace ping a una serie de hosts (configurables) y si al menos uno de ellos responde correctamente asume que la conexión a Internet (y por ende la red) está funcionando. De lo contrario (si no obtiene respuesta desde ningún host) asume que la red no está funcionando. Por supuesto, este script no sirve si en algún nodo de la ruta hasta llegar a Internet se está filtrando el tráfico ICMP. Por otro lado, si se cae un nodo intermedio, pero la interfaz de red en el host funciona correctamente, asume que la red está fallando.



El script, el cual he decidido llamar "netisup.py", posee una variable hosts, la cual es un arreglo de nombres de host o direcciones IP a las cuales hacer ping.

#!/usr/local/bin/python

import subprocess, time

hosts = ('8.8.8.8', 'kernel.org', 'yahoo.com')

def ping(host):
  ret = subprocess.call(['ping', '-c', '3', '-W', '5', host],
    stdout=open('/dev/null', 'w'),
    stderr=open('/dev/null', 'w'))
  return ret == 0

def net_is_up():
  print "[%s] Checking if network is up..." % time.strftime("%Y-%m-%d %H:%M:%S")

  xstatus = 1

  for h in hosts:
    if ping(h):
      print "[%s] Network is up!" % time.strftime("%Y-%m-%d %H:%M:%S")
      xstatus = 0
      break

  if xstatus:
    print "[%s] Network is down :(" % time.strftime("%Y-%m-%d %H:%M:%S")

  return xstatus

quit(net_is_up())

 

Personalmente he configurado el script para que intente hacer ping a Google, kernel.org y Yahoo!, pero se puede modificar a gusto.

Antes de ejecutar el script se debe ajustar adecuadamente el hashbang para que apunte correctamente al binario del intérprete de Python. En mi caso se trata de un sistema FreeBSD, por ello se encuentra dentro de /usr/local/bin, pero en sistemas Linux puede estar dentro de /usr/bin u otro directorio (utilizar el comando wich para determinar dónde se encuentra el ejecutable).

Lo interesante del script es que retorna un código de error 1 si la red no funciona, ó 0 si no hay problemas:

emi@hal9000:~/scripts % ./netisup.py
[2016-02-01 12:27:13] Checking if network is up...
[2016-02-01 12:27:19] Network is up!
emi@hal9000:~/scripts % echo $?
0

En este caso decidí configurar direcciones IP inexistentes en el arreglo hosts para que el ping falle:

emi@hal9000:~/scripts % ./netisup.py     
[2016-02-01 12:27:36] Checking if network is up...
[2016-02-01 12:27:38] Network is down :(
emi@hal9000:~/scripts % echo $?
1

Puede ser útil para monitorear enlaces.

netisup.py en GitHub

Para más información

man ping
man icmp
man which
man python


Tal vez pueda interesarte



Compartí este artículo y dejá tu comentario