Наличие приложений и устройств, которым необходимо регистрировать, отправлять и получать данные во внешний мир, имеет решающее значение. Таким образом, наличие инструмента, который позволяет вам отслеживать, когда ваша сеть выходит из строя, может помочь вам устранить неполадки в сети или остановить приложения перед отправкой кучи ошибок журнала.
В сегодняшнем руководстве мы создадим простой сетевой монитор, который постоянно отслеживает ваше подключение к Интернету, отправляя запросы ping на внешний ресурс. Сценарий, который мы создадим, также будет вести журналы, когда Интернет не работает и продолжительность простоя:
Требования к проекту
Для этого проекта нам понадобятся только:
- Основы программирования на Python
- Базовое понимание компьютерных сетей.
- Удобно пользоваться терминалом.
Логика проекта
Прежде чем мы углубимся в кодирование, давайте обсудим и поймем, чего мы пытаемся достичь:
Что такое время работы и простоя сети?
Когда мы говорим о работоспособности и простоях сети, мы имеем в виду период, когда сетевое соединение полностью недоступно, и, следовательно, мы не можем общаться с устройствами за пределами нашей сети. Чем дольше нет интернета, тем дольше время простоя.
Как определить время простоя
Теперь, когда мы знаем, что такое простои в Интернете, вы, возможно, задаетесь вопросом: «Как мы можем это определить??”
Не усложняя наш код, мы можем использовать ping. Пинг - это метод, при котором мы постоянно пингуем надежный сервер, например Cloudflare или Google DNS, а затем ждем ответа.
Если мы пингуем сервер и нет ответа, мы отмечаем это конкретное время и продолжаем пинговать, пока не получим пинг, и не отметим время.
Имея разницу во времени, мы можем определить, когда Интернет не работал и как долго.
Мы также должны быть осторожны при пинге одного сервера, потому что мы можем ошибочно принять пинг за DDoS-атаку, что может привести к блокировке нашего IP-адреса, что приведет к отрицательным результатам.
Вот блок-схема, объясняющая эту концепцию:
Обсуждение дешево; Давайте теперь погрузимся в код, показывающий, как реализовать эту логику:
Теперь покажи мне код
Как обычно, в Python мы начинаем с импорта необходимых библиотек. Далее мы создаем файл журнала в текущем рабочем каталоге.
Мы используем библиотеку сокетов для отправки запроса на внешний IP-адрес в первой функции. В этом примере мы используем общедоступный DNS-адрес Cloudflare, который имеет очень высокое время безотказной работы. Мы также передаем порт, и, поскольку это DNS-сервер, используем порт 53.
Затем мы проверяем, что у нас есть доступ к каталогу файла журнала, и выходим, если у нас нет доступа.
Следующим шагом будет вычисление времени отключения сетевого подключения. Наконец, мы оборачиваем всю функциональность в цикл, как показано в приведенном ниже коде.
импортный сокетвремя импорта
дата и время импорта
импорт ОС
import sys
LOG_FNAME = "сеть.бревно"
ФАЙЛ = os.дорожка.присоединиться (os.getcwd (), LOG_FNAME)
def send_ping_request (host = "1.1.1.1 ", порт = 53, тайм-аут = 3):
пытаться:
разъем.setdefaulttimeout (тайм-аут)
s = розетка.розетка (розетка.AF_INET, сокет.SOCK_STREAM)
s.подключить ((хост, порт))
кроме OSError как ошибки:
вернуть ложь
еще:
s.Закрыть()
вернуть True
def write_permission_check ():
пытаться:
с открытым (ФАЙЛ, "a") как файл:
проходить
кроме OSError как ошибки:
print ("Ошибка создания файла журнала")
sys.выход()
наконец-то:
проходить
def calculate_time (начало, остановка):
time_difference = stop - начать
секунды = с плавающей запятой (str (time_difference.total_seconds ()))
return str (datetime.timedelta (секунды = секунды)).расколоть(".") [0]
def mon_net_connection (ping_freq = 2):
monitor_start_time = datetime.дата и время.сейчас()
motd = "Мониторинг сетевого подключения начат в:" + str (monitor_start_time).расколоть(".") [0] +" Отправка запроса ping через "+ str (ping_freq) +" секунды "
печать (motd)
с открытым (ФАЙЛ, "a") как файл:
файл.написать ("\ n")
файл.написать (motd + "\ n")
в то время как True:
если send_ping_request ():
время.спать (ping_freq)
еще:
down_time = datetime.дата и время.сейчас()
fail_msg = "Сетевое соединение недоступно в:" + str (время простоя).расколоть(".") [0]
печать (fail_msg)
с открытым (ФАЙЛ, "a") как файл:
файл.написать (fail_msg + "\ n")
я = 0
пока не send_ping_request ():
время.спать (1)
я + = 1
если i> = 3600:
я = 0
сейчас = дата и время.дата и время.сейчас()
Continous_message = "Постоянная недоступность сети:" + str (сейчас).расколоть(".") [0]
печать (Continous_message)
с открытым (ФАЙЛ, "a") как файл:
файл.написать (Continous_message + "\ n")
up_time = datetime.дата и время.сейчас()
uptime_message = "Сетевое подключение восстановлено в:" + str (up_time).расколоть(".") [0]
down_time = calculate_time (время простоя, время работы)
_m = "Сетевое соединение было недоступно в течение" + время простоя
печать (uptime_message)
печать (_m)
с открытым (ФАЙЛ, "a") как файл:
файл.написать (uptime_message + "\ n")
файл.написать (_m + "\ n")
mon_net_connection ()
Если вы запустите этот сценарий, вы получите результат, аналогичный показанному ниже:
Заключение
Используя приведенный выше сценарий, мы можем отслеживать, когда сетевое соединение потеряно, и постоянно регистрировать его, пока оно не станет доступным. Этот простой скрипт открыт для улучшений. Не стесняйтесь изменять код под свои нужды и расширять его.