Логотип

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

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

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

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

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

 

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

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

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

 

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

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

 

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

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

Читать  Как сделать резервное копирование базы данных WordPress вручную

 

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

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

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

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

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

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

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

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

 

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

 

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

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

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

Читать  Как я могу увидеть изменения каталога в Python?

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

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

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

Заключение

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

Редактор: AndreyEx

Рейтинг: 4.4 (65 голосов)
Если статья понравилась, то поделитесь ей в социальных сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Андрей

Не работает ругается на то что

file.write(motd + "\n")

не определён

Это может быть вам интересно


Загрузка...

Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала