Скрипт Python для мониторинга сетевого подключения

Постоянное подключение наших устройств к Интернету становится скорее основной потребностью, чем дополнительной привилегией.

Наличие приложений и устройств, которым необходимо регистрировать, отправлять и получать данные во внешний мир, имеет решающее значение. Таким образом, наличие инструмента, который позволяет вам отслеживать, когда ваша сеть выходит из строя, может помочь вам устранить неполадки в сети или остановить приложения перед отправкой кучи ошибок журнала.

В сегодняшней статье мы создадим простой сетевой монитор, который постоянно отслеживает ваше подключение к Интернету, отправляя запросы ping на внешний ресурс. Сценарий, который мы создадим, также будет вести журналы, когда интернет не работает и продолжительность простоя:

 

Требования к проекту

Для этого проекта нам понадобятся только:

  • Основы программирования на Python
  • Базовое понимание компьютерных сетей.
  • Удобно пользоваться терминалом.

 

Логика проекта

Прежде чем мы углубимся в кодирование, давайте обсудим и поймем, чего мы пытаемся достичь:

 

Что такое время работы и простоя сети?

Когда мы говорим о работоспособности и простоях сети, мы имеем в виду период, когда сетевое соединение полностью недоступно, и, таким образом, мы не можем общаться с устройствами за пределами нашей сети. Чем дольше недоступен Интернет, тем дольше будет время простоя.

 

Как определить время простоя

Теперь, когда мы знаем, что такое простои в Интернете, вы, возможно, задаетесь вопросом: «Как нам его определить?»

Не усложняя наш код, мы можем использовать ping. Проверка связи — это метод, при котором мы постоянно проверяем связь с надежным сервером, например Cloudflare или Google DNS, а затем ждем ответа.

Если мы пингуем сервер и нет ответа, мы отмечаем это конкретное время и продолжаем пинговать, пока не получим пинг и не отметим время.

По разнице во времени мы можем отметить, когда и как долго не работал интернет.

Мы также должны быть осторожны при пинге отдельного сервера, потому что мы можем ошибочно принять пинг за DDoS-атаку, что может привести к блокировке нашего IP-адреса, что приведет к отрицательным результатам.

Вот блок-схема, объясняющая эту концепцию:

Скрипт Python для мониторинга сетевого подключения

 

Давайте теперь погрузимся в код, показывающий, как реализовать эту логику:

 

Теперь покажите мне код

Как обычно, в Python мы начинаем с импорта необходимых библиотек. Затем мы создаем файл журнала в текущем рабочем каталоге.

Мы используем библиотеку сокетов для отправки запроса на внешний IP-адрес в первой функции. В этом примере мы используем общедоступный DNS-адрес Cloudflare, который имеет очень высокое время безотказной работы. Мы также передаем порт, и, поскольку это DNS-сервер, используем порт 53.

Затем мы проверяем, что у нас есть доступ к каталогу файла журнала, и выходим, если у нас нет доступа.

Следующим шагом будет вычисление времени отключения сетевого подключения. Наконец, мы заключаем всю функциональность в цикл, как показано в приведенном ниже коде.

import socket

import time

import datetime

import os

import sys

LOG_FNAME = "network.log"

FILE = os.path.join(os.getcwd(), LOG_FNAME)

def send_ping_request(host="1.1.1.1", port=53, timeout=3):

try:

socket.setdefaulttimeout(timeout)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host,port))

except OSError as error:

return False

else:

s.close()

return True

def write_permission_check():

try:

with open(FILE, "a") as file:

pass

except OSError as error:

print("Ошибка создания файла журнала")

sys.exit()

finally:

pass

def calculate_time(start, stop):

time_difference = stop - start

seconds = float(str(time_difference.total_seconds()))

return str(datetime.timedelta(seconds=seconds)).split(".")[0]

def mon_net_connection(ping_freq=2):

monitor_start_time = datetime.datetime.now()

motd = "Мониторинг сетевого подключения начат в: " + str(monitor_start_time).split(".")[0] + " Отправка запроса ping в " + str(ping_freq) + " секунды"

print(motd)



with open(FILE, "a") as file:

file.write("n")

file.write(motd + "n")

while True:

if send_ping_request():

time.sleep(ping_freq)

else:

down_time = datetime.datetime.now()

fail_msg = "Сетевое соединение недоступно в: " + str(down_time).split(".")[0]

print(fail_msg)

with open(FILE, "a") as file:

file.write(fail_msg + "n")

i = 0

while not send_ping_request():

time.sleep(1)

i += 1

if i >= 3600:

i = 0

now = datetime.datetime.now()

continous_message = "Постоянная недоступность сети: " + str(now).split(".")[0]

print(continous_message)

with open(FILE, "a") as file:

file.write(continous_message + "n")

up_time = datetime.datetime.now()

uptime_message = "Сетевое подключение восстановлено: " + str(up_time).split(".")[0]



down_time = calculate_time(down_time, up_time)

_m = "Подключение к сети было недоступно для " + down_time



print(uptime_message)

print(_m)



with open(FILE, "a") as file:

file.write(uptime_message + "n")

file.write(_m + "n")

mon_net_connection()




Заключение

Используя приведенный выше сценарий, мы можем отслеживать, когда сетевое соединение потеряно, и постоянно регистрировать его, пока оно не станет доступным. Этот простой сценарий открыт для улучшений. Не стесняйтесь изменять код в соответствии со своими потребностями и расширять его.



2021-01-25T11:27:42
Python