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)

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.
Consulta cuales son las dependencias para ejecutar el script, instale python python-colorama fping y aún no puedo hacerlo funcionar
Pues si ya instalaste lo que viene en sección de import. ¿Puedes pegar los mensajes de error? sirve que practico la depuración.
por algpun motivo se pego un tab de más en el archivo, ya esta funcionando muy bien script
Ahhh si, eso es muy común en Python, cuando lo desarrollé lo hice con el editor Sublime y de forma automática le daba una enchulada al código. Si gustas puedes copiar el código desde https://linuxmanr4.com/paste/view/9533a835
A fin de cuentas, que bueno que resolviste el problema.
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.
Pues es que de eso se trata … De compartir y avanzar. Python es un lenguaje muy noble.
Me pregunto cuántas líneas costaría hacer esta funcionalidad en Bash…
¿Y porque no lo intentas? sería interesante ver el resultado 🙂
Saludos.
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?
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 🙂
Estoy en windows y me sale el error El sistema no puede encontrar la ruta especificada.
Al instalar Python agregaste la ruta al Path?
Ten en cuenta que casi no uso Python en Windows, pero me suena a que ese es el problema.
Saludos 🙂