Script de Python para monitorear la conexión de red y guardar en el archivo de registro

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 ). 

  1. El sistema intentará hacer ping a un servidor específico (PUERTO en una IP)
  2. Si la máquina no se conecta, se ejecutará la instrucción EXCEPT
  3. 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()

  1. 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.
  2. 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)
    1. Si es verdadero (conexión adquirida): se iniciará el monitoreo
    2. 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()
      1. Si ping devuelve falso, el bucle se ejecutará cada segundo hasta que la función ping() devuelva verdadero
      2. 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
    1. Si el ping devuelve verdadero, el bucle se ejecutará cada 5 segundos hasta que devuelva falso
    2. 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.
    3. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *