Python Ping, un script que revisa las direcciones IP de tu red

La mejor forma de aprender un lenguaje de programación es tomando un proyecto y resolviendo sus problemas. En el proceso se investiga como hacer las cosas, resolver algunas dudas, depurar el código y probar su funcionalidad.

Soy fan de Python, pero no soy un experto. Python Ping es un programa que toma un archivo CSV (delimitado por comas) que tiene dos datos, una descripción del equipo y su dirección IP.

El programa toma esa información y hace ping, si el equipo responde, muestra un mensaje de OK, de lo contrario, reproduce un sonido y muestra un mensaje de error.

Hace una pausa de 10 minutos y vuelve a empezar. De esa forma es posible detectar problemas en la red, su ubicación y su frecuencia.

En una operación normal, todo debería de estar OK, pero todos sabemos que eso no siempre es así.

El archivo CSV.

Lo bonito de almacenar la información en un archivo CSV es que es muy sencillo de editar, actualizar y mantener.

Para ejemplo de este artículo elegí servidores que todos conocemos:

Archivo servidores.csv

Google , google.com
Bing , bing.com
Facebook , facebook.com
Twitter , twitter.com
Wikipedia , wikipedia.com

Una descripción, luego una coma y al final una dirección. Para el ejemplo puse los dominios, pero se pueden reemplazar por las direcciones IP. Eso lo hago porque a mi me interesa revisar una red local.

Desmenuzando el programa.

Al final del artículo pondré el código completo, aquí voy a ir desmenuzando algunas de las partes del mismo.

Import

import os
import csv
from colorama import Fore
import time
import datetime

Esta es la lista de los import del programa. Para que algunas cosas funcionen es necesario declararlas primero.

os lo utilizo para ejecutar instrucciones como si estuviera en la terminal.

csv para importar la información del archivo CSV en una variable dentro del programa.

colorama le da color, poniendo los errores en rojo, lo que esta bien en verde, los textos en blanco.

time y datetime los uso para formatear algunas salidas de tiempo.

check_ping

La función check_ping es la que hace el trabajo pesado. Quiero hacer notar que en lugar de utilizar el comando ping tradicional uso el comando fping que es más rápido y se adapta mejor cuando se llama desde un script.

La instrucción fping hace 10 reintentos antes de declarar un error de conexión.

sonido_alerta

Esta función es un plus. No voy a estar viendo la pantalla todo el tiempo durante la ejecución del script. Así que si hay un error hace un sonido. Como pueden ver en el código, lo que hace es reproducir un archivo mp3 a su elección.

El loop

El programa se repite indefinidamente en un ciclo haciendo una pausa de 10 minutos. De esta forma está revisando continuamente la red y avisa si hay algún problema. Para terminar el ciclo hay que presionar Control + C y se interrumpe la ejecución.

#!/usr/bin/python3

# python_ping.py - Hace ping a ciertos elementos de la red.
# ---------------------------------------------------------
# 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 https://linuxmanr4.com
# versión 1.0
#

import os
import csv
from colorama import Fore
import time
import datetime


def check_ping(hostname):
    response = os.system("fping -r 10 -q " + hostname + " >/dev/null")
    if response == 0:
        check_ping = "[OK]"
    else:
        check_ping = "[Error]"

    return check_ping


def sonido_alerta():
    os.system("play -q ent_communicator1.mp3")

# Lee los datos del archivo y los guarda en una variable.
archivo_servidores = open('servidores.csv')
servidores_reader = csv.reader(archivo_servidores)
datos_servidores = list(servidores_reader)

# Prueba si hay conexión en todos los servidores
contador = 0

while True:
    for i in range(len(datos_servidores)):
        servidorTexto = datos_servidores[i][0]
        servidorIP = datos_servidores[i][1]
        resultado = check_ping(datos_servidores[i][1])

        if resultado == "[Error]":
            print("{0:30} {1:17} {2:7}".format(
                Fore.WHITE + servidorTexto, servidorIP, Fore.RED + resultado))
            sonido_alerta()
        else:
            print("{0:30} {1:17} {2:7}".format(
                Fore.WHITE + servidorTexto, servidorIP, Fore.GREEN + resultado))

    contador += 1
    print(Fore.BLUE)
    print('{0} {1:%H:%M:%S} {2}'.format(contador, datetime.datetime.now(),
                                    "________________________________________"))
    print()

    # Pausa de 10 minutos.
    time.sleep(600)
python_ping en acción

Como pueden ver, el programa es relativamente sencillo. Estoy consciente de que hay muchas cosas que se pueden mejorar, así que estoy abierto a sus comentario. Si desean utilizarlo, lo pueden hacer respetando claro la licencia pública general GNU, que permite utilizar, distribuir y modificar este código.

12 comentarios en “Python Ping, un script que revisa las direcciones IP de tu red”

  1. Gracias por los aportes; tengo que ser sincero, a partir de los scripts de ping que has subido, he hecho los míos y paso a dejarte un muchas gracias y dandote buena vibra para que sigas compartiendo.

    Saludos desde Zacatecas.

    Responder
  2. muchas gracias por tu aporte, me fue muy útil, pero cuan una ip no responde tarda mucho en continuar. Intente con ping pero me da error la conexión, sabes que puede ser?

    Responder
    • Hola Seven,

      Es que sería cosa de cambiar la programación del script, a lo mejor algo de paralelismo, pero a menos que sean muchas direcciones ip no le veo mucho caso.

      Si quieres hacer más breve el tiempo, puedes disminuir los reintentos de 10 a 5

      fping -r 5

      De esa forma no se tardará tanto.

      Saludos 🙂

      Responder

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: