Skrypt Python do monitorowania połączenia sieciowego

Skrypt Python do monitorowania połączenia sieciowego
Potrzeba, aby nasze urządzenia były zawsze podłączone do Internetu, staje się bardziej podstawową potrzebą niż dodany uprawnienie.

Posiadanie aplikacji i urządzeń, które muszą się zalogować, wysyłać i odbierać dane do świata zewnętrznego, ma kluczowe znaczenie. Zatem posiadanie narzędzia, które umożliwia monitorowanie, gdy sieć spadnie, może pomóc w rozwiązywaniu problemów z sieci lub zatrzymaniu aplikacji przed wysłaniem wielu błędów dziennika.

W dzisiejszym samouczku zbudujemy prosty monitor sieciowy, który nieustannie monitoruje Twoją łączność z Internetem, wysyłając żądania ping do zewnętrznego zasobu. Skrypt, który utworzymy, będzie również zachowywać dzienniki, kiedy Internet spadnie i czas przestoju:

Wymagania projektu

Do tego projektu będziemy potrzebować tylko:

  • Podstawy programowania Pythona
  • Podstawowe zrozumienie sieci komputerowych.
  • Czuj się komfortowo za pomocą terminalu.

Logika projektu

Zanim zanurzymy się w części kodowania, omówmy i zrozumiemy, co staramy się osiągnąć:

Co to jest sieć w górę i przestoju?

Kiedy mówimy o sieci w górę i przestojach, rozumiemy okres, w którym połączenie sieciowe jest całkowicie niedostępne, a zatem nie możemy komunikować się z urządzeniami poza naszą siecią. Im dłużej Internet jest niedostępny, tym dłużej przestoju.

Jak określić przestoje

Teraz, gdy wiemy, czym jest przesto?"

Bez komplikowania naszego kodu możemy iść z ping. Ping to metoda, w której ciągle pingujemy niezawodny serwer-być może Cloudflare lub Google DNS-a następnie czekamy na odpowiedź.

Jeśli pingujemy serwer i nie ma odpowiedzi, zauważamy ten konkretny czas i kontynuujemy ping, dopóki nie otrzymamy ping i nie zauważymy czasu.

Mając różnicę czasową, możemy zauważyć, kiedy Internet był opuszczony i na jak długo.

Musimy również zachować ostrożność podczas pingowania jednego serwera, ponieważ możemy fałszywie pomylić ping jako atak DDOS, który może spowodować zablokowanie naszego adresu IP, co dałoby negatywne wyniki.

Oto wykres przepływowy wyjaśniający tę koncepcję:

Rozmowa jest tania; Zanurzmy się teraz w kodzie pokazującym, jak zaimplementować tę logikę:

Teraz pokaż mi kod

Jak zwykle w Python zaczynamy od zaimportowania wymaganych bibliotek. Następnie tworzymy plik dziennika w bieżącym katalogu roboczym.

Używamy biblioteki gniazda, aby wysłać żądanie na zewnętrzny adres IP w pierwszej funkcji. W tym przykładzie używamy Cloudflare Public DNS, który ma bardzo wysoki czas pracy. Mamy również port, a ponieważ jest to serwer DNS, użyj portu 53.

Następnie weryfikujemy, że mamy dostęp do katalogu plików dziennika i zrezygnujemy, jeśli nie mamy dostępu.

Następnym krokiem jest obliczenie czasu, w którym połączenie sieciowe spadło. Na koniec owijamy całą funkcjonalność w pętli, jak pokazano w poniższym kodzie.

Gniazdo importu
czas importu
Importuj datetime
Import OS
Import Sys
Log_fname = "Network.dziennik"
File = OS.ścieżka.Dołącz (OS.getCwd (), log_fname)
def send_ping_request (host = "1.1.1.1 ", port = 53, limit czasu = 3):
próbować:
gniazdo elektryczne.setdefaultTimeout (limit czasu)
S = gniazdo.gniazdo (gniazdo.AF_INET, gniazdo.Sock_stream)
S.Connect ((host, port))
Z wyjątkiem Oserror jako błędu:
zwróć false
w przeciwnym razie:
S.zamknąć()
zwróć prawdziwie
def write_permission_check ():
próbować:
z otwartym (plik, „a”) jako plik:
przechodzić
Z wyjątkiem Oserror jako błędu:
druk („tworzenie pliku dziennika nie powiodło się”)
Sys.Wyjście()
Wreszcie:
przechodzić
def calculate_time (start, stop):
time_difference = stop - start
sekundy = float (str (time_difference.total_seconds ()))
return STR (DateTime.timedelta (sekundy = sekundy)).podział(".") [0]
def mon_net_connection (ping_freq = 2):
monitor_start_time = DateTime.Datetime.Teraz()
mOTD = "Monitorowanie połączeń sieciowych zaczęło się od:" + str (monitor_start_time).podział(".") [0] +„ Wysyłanie żądania ping w „ + str (ping_freq) +„ sekund ”
Drukuj (MOTD)
z otwartym (plik, „a”) jako plik:
plik.Napisz („\ n”)
plik.Write (MOTD + „\ n”)
Choć prawda:
Jeśli send_ping_request ():
czas.Sleep (ping_freq)
w przeciwnym razie:
Down_Time = DateTime.Datetime.Teraz()
fail_msg = "Połączenie sieciowe niedostępne na:" + str (down_time).podział(".") [0]
print (fail_msg)
z otwartym (plik, „a”) jako plik:
plik.Write (fail_msg + „\ n”)
i = 0
Chociaż nie send_ping_request ():
czas.sen (1)
I += 1
Jeśli i> = 3600:
i = 0
teraz = dataTime.Datetime.Teraz()
continous_message = "Network niewidoczny trwałość na:" + str (teraz).podział(".") [0]
Drukuj (Continous_message)
z otwartym (plik, „a”) jako plik:
plik.Napisz (Continous_message + „\ n”)
up_time = DateTime.Datetime.Teraz()
uptime_message = "Łączność sieciowa przywrócona na:" + str (up_time).podział(".") [0]
Down_Time = calculate_time (down_time, up_time)
_m = "Połączenie sieciowe było niedostępne dla" + down_time
Drukuj (uptime_message)
Drukuj (_m)
z otwartym (plik, „a”) jako plik:
plik.Write (uptime_message + „\ n”)
plik.Write (_m + "\ n")
mon_net_connection ()

Jeśli uruchomisz ten skrypt, otrzymasz wyjście podobne do tego pokazanego poniżej:

Wniosek

Korzystając z powyższego skryptu, możemy monitorować, gdy połączenie sieciowe zostanie utracone i stale logowanie się, aż będzie dostępne. Ten prosty skrypt jest otwarty na ulepszenia. Zapraszam do dostosowania kodu, aby pasowały do ​​twoich potrzeb i rozwinąć go.