Постоянное подключение наших устройств к Интернету становится скорее основной потребностью, чем дополнительной привилегией.
Наличие приложений и устройств, которым необходимо регистрировать, отправлять и получать данные во внешний мир, имеет решающее значение. Таким образом, наличие инструмента, который позволяет вам отслеживать, когда ваша сеть выходит из строя, может помочь вам устранить неполадки в сети или остановить приложения перед отправкой кучи ошибок журнала.
В сегодняшней статье мы создадим простой сетевой монитор, который постоянно отслеживает ваше подключение к Интернету, отправляя запросы ping на внешний ресурс. Сценарий, который мы создадим, также будет вести журналы, когда интернет не работает и продолжительность простоя:
Требования к проекту
Для этого проекта нам понадобятся только:
- Основы программирования на Python
- Базовое понимание компьютерных сетей.
- Удобно пользоваться терминалом.
Логика проекта
Прежде чем мы углубимся в кодирование, давайте обсудим и поймем, чего мы пытаемся достичь:
Что такое время работы и простоя сети?
Когда мы говорим о работоспособности и простоях сети, мы имеем в виду период, когда сетевое соединение полностью недоступно, и, таким образом, мы не можем общаться с устройствами за пределами нашей сети. Чем дольше недоступен Интернет, тем дольше будет время простоя.
Как определить время простоя
Теперь, когда мы знаем, что такое простои в Интернете, вы, возможно, задаетесь вопросом: «Как нам его определить?»
Не усложняя наш код, мы можем использовать ping. Проверка связи – это метод, при котором мы постоянно проверяем связь с надежным сервером, например Cloudflare или Google DNS, а затем ждем ответа.
Если мы пингуем сервер и нет ответа, мы отмечаем это конкретное время и продолжаем пинговать, пока не получим пинг и не отметим время.
По разнице во времени мы можем отметить, когда и как долго не работал интернет.
Мы также должны быть осторожны при пинге отдельного сервера, потому что мы можем ошибочно принять пинг за DDoS-атаку, что может привести к блокировке нашего IP-адреса, что приведет к отрицательным результатам.
Вот блок-схема, объясняющая эту концепцию:
Давайте теперь погрузимся в код, показывающий, как реализовать эту логику:
Теперь покажите мне код
Как обычно, в 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()
Заключение
Используя приведенный выше сценарий, мы можем отслеживать, когда сетевое соединение потеряно, и постоянно регистрировать его, пока оно не станет доступным. Этот простой сценарий открыт для улучшений. Не стесняйтесь изменять код в соответствии со своими потребностями и расширять его.