En este artículo, veremos cómo monitorear la conexión de red y guardar el archivo de registro en Python.
La ideología básica de este script es brindar información en tiempo real sobre si el sistema en el que se ejecuta el script está conectado a Internet o no, y guardar esa información en un archivo de registro simultáneamente, manteniendo registros de cuándo se conectó el sistema. a Internet cuando se desconectó y el tiempo durante el cual estuvo desconectado.
Este script se realiza utilizando la biblioteca de sockets en Python , que en este programa se utiliza para enviar o recibir paquetes en una red.
Archivo de registro:
Comenzando simplemente creando un archivo de registro en el directorio de trabajo actual para almacenar el estado de conectividad a Internet.
Python
FILE = os.path.join(os.getcwd(), "networkinfo.log")
silbido():
Con esta función, el script intentará conectarse al servidor definido para verificar si el sistema tiene una conexión a Internet activa. Esta tarea se realizará mediante el manejo de excepciones en python ( try, except, else ).
- El sistema intentará hacer ping a un servidor específico (PUERTO en una IP)
- Si la máquina no se conecta, se ejecutará la instrucción EXCEPT
- De lo contrario, la conexión se cerrará después de que el sistema se conecte correctamente al servidor.
Código:
Python
def ping(): # to ping a particular PORT at an IP # if the machine won't receive any packets from # the server for more than 3 seconds # i.e no connection is # made(machine doesn't have a live internet connection) # <except> part will be executed try: socket.setdefaulttimeout(3) # AF_INET: address family (IPv4) # SOCK_STREAM: type for TCP (PORT) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "8.8.8.8" port = 53 server_address = (host, port) # send connection request to the defined server s.connect(server_address) except OSError as error: # function returning false after # data interruption(no connection) return False else: # the connection is closed after # machine being connected s.close() return True
Funciones utilizadas en el programa anterior
- socket.setdefaulttimeout() : es una función de biblioteca de socket incorporada en python. al configurar el tiempo de espera predeterminado en 3 segundos, especificamos que si no recibimos ninguna respuesta del servidor durante más de 3 segundos, la conexión no se realiza.
- socket.socket(socket.AF_INET, socket.SOCK_STREAM): socket.socket() se usa para definir parámetros para conectar dos Nodes en una red, es decir, su sistema a un PUERTO particular en una IP particular para que puedan comunicarse entre sí .
- AF_INET es una familia de direcciones que se utiliza para aceptar IP de tipo de dirección v4 como un parámetro con el que se comunicará el socket definido
- SOCK_STREAM es un protocolo basado en conexión, en este programa se usa TCP (protocolo de control de transmisión) para aceptar un número de puerto. como parámetro
calcular_tiempo():
El tiempo de indisponibilidad es el tiempo durante el cual la conexión a Internet no estuvo disponible. se calcula utilizando el tiempo de inactividad (parada) cuando se perdió la conexión a Internet y el tiempo de actividad (inicio) cuando se restableció la conexión a Internet
Python
def calculate_time(start, stop): # to calculate unavailability time difference = stop - start seconds = float(str(difference.total_seconds())) return str(datetime.timedelta(seconds=seconds)).split(".")[0]
primera_comprobación():
Esta función solo se ejecutará una vez, es decir, al comienzo del script para verificar si el sistema ya está conectado a Internet o no, y escribirlo en el archivo de registro. Se llama a la función ping()
- Si el ping devuelve verdadero (la máquina está conectada a Internet), el script imprimirá «CONEXIÓN ADQUIRIDA» y escribirá lo mismo en el archivo de registro.
- Si el ping devuelve falso (el sistema no está conectado a Internet), el script imprimirá «CONEXIÓN NO ADQUIRIDA» y escribirá lo mismo en el archivo de registro.
Python
def first_check(): # to check if the machine already have a live internet connection # if ping returns true if ping(): live = "\nCONNECTION ACQUIRED\n" print(live) connection_acquired_time = datetime.datetime.now() acquiring_message = "connection acquired at: " + \ str(connection_acquired_time).split(".")[0] print(acquiring_message) # writes into the log file with open(FILE, "a") as file: file.write(live) file.write(acquiring_message) return True # if ping returns false else: not_live = "\nCONNECTION NOT ACQUIRED\n" print(not_live) # writes into the log file with open(FILE, "a") as file: file.write(not_live) return False
principal():
La función principal, donde se ejecutarán todos los programas definidos por el usuario y el estado de Internet en vivo se escribirá en un archivo de registro.
Python
def main(): # MAIN monitor_start_time = datetime.datetime.now() # monitoring time is when the script # started monitoring internet connection status monitoring_date_time = "monitoring started at: " + \ str(monitor_start_time).split(".")[0] if first_check(): # if true print(monitoring_date_time) # monitoring will only start when # the connection will be acquired else: # if false while True: # infinite loop to check if the connection is acquired # will run until there is a live internet connection if not ping(): # if connection not acquired time.sleep(1) else: # if connection is acquired first_check() print(monitoring_date_time) break with open(FILE, "a") as file: # writes into the log file file.write("\n") file.write(monitoring_date_time + "\n") while True: # FIRST WHILE, infinite loop, # will run until the machine is on # or the script is manually terminated if ping(): # if true: the loop will execute after every 5 seconds time.sleep(5) else: # if false: fail message will be displayed down_time = datetime.datetime.now() fail_msg = "disconnected at: " + str(down_time).split(".")[0] print(fail_msg) with open(FILE, "a") as file: # writes into the log file file.write(fail_msg + "\n") while not ping(): # infinite loop, # will run till ping() return true time.sleep(1) up_time = datetime.datetime.now() # will execute after while true is # false (connection restored) uptime_message = "connected again: " + str(up_time).split(".")[0] down_time = calculate_time(down_time, up_time) # calling time calculating # function, printing down time unavailablity_time = "connection was unavailable for: " + down_time print(uptime_message) print(unavailablity_time) with open(FILE, "a") as file: # log entry for connected restoration time, # and unavailability time file.write(uptime_message + "\n") file.write(unavailablity_time + "\n")
Explicación:
- Primero, se ejecutará first_check() (esta función se ejecutará solo una vez, es decir, al comienzo del script)
- Si es verdadero (conexión adquirida): se iniciará el monitoreo
- Si es falso (conexión no adquirida): otra declaración se ejecutará con un ciclo while infinito para verificar la conexión a Internet usando la función ping()
- Si ping devuelve falso, el bucle se ejecutará cada segundo hasta que la función ping() devuelva verdadero
- Si el ping devuelve verdadero (conexión adquirida), el ciclo se romperá y se iniciará el monitoreo
- En segundo lugar, para monitorear la conexión de red, se ejecutará la primera instrucción while, que es un ciclo infinito
- Si el ping devuelve verdadero, el bucle se ejecutará cada 5 segundos hasta que devuelva falso
- Si el ping devuelve falso, se imprimirá el tiempo de inactividad y el bucle se ejecutará cada segundo hasta que se restablezca la conexión a Internet.
- Después de que se restablezca la conexión a Internet, se imprimirá el tiempo de actividad y el tiempo de indisponibilidad, y la iteración volverá al inicio del ciclo.
Diagrama de flujo:
A continuación se muestra la implementación:
Python
import os import sys import socket import datetime import time FILE = os.path.join(os.getcwd(), "networkinfo.log") # creating log file in the currenty directory # ??getcwd?? get current directory, # os function, ??path?? to specify path def ping(): # to ping a particular IP try: socket.setdefaulttimeout(3) # if data interruption occurs for 3 # seconds, <except> part will be executed s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET: address family # SOCK_STREAM: type for TCP host = "8.8.8.8" port = 53 server_address = (host, port) s.connect(server_address) except OSError as error: return False # function returns false value # after data interruption else: s.close() # closing the connection after the # communication with the server is completed return True def calculate_time(start, stop): # calculating unavailability # time and converting it in seconds difference = stop - start seconds = float(str(difference.total_seconds())) return str(datetime.timedelta(seconds=seconds)).split(".")[0] def first_check(): # to check if the system was already # connected to an internet connection if ping(): # if ping returns true live = "\nCONNECTION ACQUIRED\n" print(live) connection_acquired_time = datetime.datetime.now() acquiring_message = "connection acquired at: " + \ str(connection_acquired_time).split(".")[0] print(acquiring_message) with open(FILE, "a") as file: # writes into the log file file.write(live) file.write(acquiring_message) return True else: # if ping returns false not_live = "\nCONNECTION NOT ACQUIRED\n" print(not_live) with open(FILE, "a") as file: # writes into the log file file.write(not_live) return False def main(): # main function to call functions monitor_start_time = datetime.datetime.now() monitoring_date_time = "monitoring started at: " + \ str(monitor_start_time).split(".")[0] if first_check(): # if true print(monitoring_date_time) # monitoring will only start when # the connection will be acquired else: # if false while True: # infinite loop to see if the connection is acquired if not ping(): # if connection not acquired time.sleep(1) else: # if connection is acquired first_check() print(monitoring_date_time) break with open(FILE, "a") as file: # write into the file as a into networkinfo.log, # "a" - append: opens file for appending, # creates the file if it does not exist??? file.write("\n") file.write(monitoring_date_time + "\n") while True: # infinite loop, as we are monitoring # the network connection till the machine runs if ping(): # if true: the loop will execute after every 5 seconds time.sleep(5) else: # if false: fail message will be displayed down_time = datetime.datetime.now() fail_msg = "disconnected at: " + str(down_time).split(".")[0] print(fail_msg) with open(FILE, "a") as file: # writes into the log file file.write(fail_msg + "\n") while not ping(): # infinite loop, will run till ping() return true time.sleep(1) up_time = datetime.datetime.now() # after loop breaks, connection restored uptime_message = "connected again: " + str(up_time).split(".")[0] down_time = calculate_time(down_time, up_time) unavailablity_time = "connection was unavailable for: " + down_time print(uptime_message) print(unavailablity_time) with open(FILE, "a") as file: # log entry for connection restoration time, # and unavailability time file.write(uptime_message + "\n") file.write(unavailablity_time + "\n") main()
Producción:
CONNECTION ACQUIRED connection acquired at: 2021-09-16 15:03:18 monitoring started at: 2021-09-16 15:03:18 disconnected at: 2021-09-16 15:03:49 connected again: 2021-09-16 15:03:50 connection was unavailable for: 0:00:01
Publicación traducida automáticamente
Artículo escrito por chouhanharshit87 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA