Pyton

Skrypt Pythona do monitorowania połączenia sieciowego

Skrypt Pythona do monitorowania połączenia sieciowego
Potrzeba stałego połączenia naszych urządzeń z Internetem staje się bardziej podstawową potrzebą niż dodatkowym przywilejem.

Posiadanie aplikacji i urządzeń, które muszą rejestrować, wysyłać i odbierać dane do świata zewnętrznego, ma kluczowe znaczenie. W związku z tym posiadanie narzędzia, które pozwala monitorować awarię sieci, 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 sieci, który stale monitoruje połączenie internetowe, wysyłając żądania ping do zasobu zewnętrznego. Skrypt, który stworzymy, będzie również rejestrował czasy niedostępności internetu i czas trwania przestoju:

Wymagania projektowe

Do tego projektu będziemy potrzebować tylko:

Logika projektu

Zanim zagłębimy się w część dotyczącą kodowania, omówmy i zrozummy, co staramy się osiągnąć:

Co to jest działanie sieci i przestoje??

Kiedy mówimy o dostępności i przestoju sieci, mamy na myśli okres, w którym połączenie sieciowe jest całkowicie niedostępne, a tym samym nie możemy komunikować się z urządzeniami spoza naszej sieci. Im dłużej internet jest niedostępny, tym dłuższy czas przestoju.

Jak określić czas przestoju

Teraz, gdy wiemy, czym jest przestój Internetu, możesz się zastanawiać „jak to zrobić?”?”

Bez komplikowania naszego kodu możemy skorzystać z ping. Ping to metoda, w której stale pingujemy niezawodny serwer — na przykład Cloudflare lub Google DNS — a następnie czekamy na odpowiedź.

Jeśli pingujemy serwer i nie ma odpowiedzi, odnotowujemy konkretną godzinę i kontynuujemy pingowanie, aż otrzymamy ping i zanotujemy godzinę.

Mając różnicę czasu, możemy zauważyć, kiedy internet nie działał i na jak długo.

Musimy również uważać podczas pingowania pojedynczego serwera, ponieważ ping może zostać błędnie pomylony z atakiem DDoS, co może spowodować zablokowanie naszego adresu IP, co przyniesie negatywne wyniki.

Oto schemat blokowy wyjaśniający tę koncepcję:

Rozmowa jest tania; zagłębmy się teraz w kod pokazujący, jak zaimplementować tę logikę:

Teraz pokaż mi kod

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

Używamy biblioteki gniazd do wysłania żądania na zewnętrzny adres IP w pierwszej funkcji. W tym przykładzie używamy publicznego adresu DNS Cloudflare, który ma bardzo długi czas pracy. Przekazujemy również port, a ponieważ jest to serwer DNS, użyj portu 53.

Następnie weryfikujemy, czy mamy dostęp do katalogu plików dziennika i kończymy pracę, jeśli nie mamy dostępu.

Następnym krokiem jest obliczenie czasu, w którym połączenie sieciowe nie działa. Na koniec zawijamy całą funkcjonalność w pętlę, jak pokazano w poniższym kodzie.

importuj gniazdo
czas importu
importuj datę i godzinę
importuj system
system importu
LOG_FNAME = "sieć.log"
PLIK = os.ścieżka.dołącz(os.getcwd(), LOG_FNAME)
def send_ping_request (host="1.1.1.1", port=53, czas oczekiwania=3):
próbować:
gniazdo elektryczne.setdefaulttimeout(limit czasu)
s = gniazdo.gniazdo (gniazdo).AF_INET, gniazdo.SOCK_STREAM)
s.połącz((host,port))
z wyjątkiem OSError jako błędu:
powrót Fałsz
jeszcze:
s.blisko()
zwróć Prawda
def write_permission_check():
próbować:
z open(PLIK, "a") jako plik:
przechodzić
z wyjątkiem OSError jako błędu:
print("Utworzenie pliku dziennika nie powiodło się")
system.Wyjście()
Wreszcie:
przechodzić
def oblicz_czas(start, stop):
różnica_czasu = stop - start
sekundy = float(str(czas_różnica.total_seconds()))
return str(data/godzina.delta czasu (sekundy=sekundy)).rozdzielać(".")[0]
def mon_net_connection(ping_freq=2):
monitor_start_time = data/godzina.data i godzina.teraz()
motd = "Monitorowanie połączenia sieciowego rozpoczęte o: " + str(monitor_start_time).rozdzielać(".")[0] + " Wysyłanie żądania ping za " + str(ping_freq) + " sekundy"
drukuj (motd)
z open(PLIK, "a") jako plik:
plik.napisz("\n")
plik.napisz(motd + "\n")
podczas gdy prawda:
jeśli send_ping_request():
czas.sen (częst._ping)
jeszcze:
czas_przestoju = data/godzina.data i godzina.teraz()
fail_msg = "Połączenie sieciowe niedostępne o: " + str(down_time).rozdzielać(".")[0]
drukuj(fail_msg)
z open(PLIK, "a") jako plik:
plik.write(fail_msg + "\n")
ja = 0
podczas gdy nie send_ping_request():
czas.sen(1)
ja += 1
jeśli ja >= 3600:
ja = 0
teraz = data i godzina.data i godzina.teraz()
continous_message = "Niedostępność sieci trwała w: " + str(teraz).rozdzielać(".")[0]
drukuj(continous_message)
z open(PLIK, "a") jako plik:
plik.write(continous_message + "\n")
up_time = data-godzina.data i godzina.teraz()
uptime_message = "Łączność sieciowa przywrócona o: " + str(up_time).rozdzielać(".")[0]
czas_przestoju = oblicz_czas(czas_przestoju, czas_pracy)
_m = "Połączenie sieciowe było niedostępne przez " + czas_przestoju
drukuj (wiadomość_czasu pracy)
drukuj(_m)
z open(PLIK, "a") jako plik:
plik.write(uptime_message + "\n")
plik.napisz(_m + "\n")
mon_net_connection()

Jeśli uruchomisz ten skrypt, otrzymasz wynik podobny do pokazanego poniżej:

Wniosek

Korzystając z powyższego skryptu, możemy monitorować utratę połączenia sieciowego i stale je rejestrować, dopóki nie będzie dostępne. Ten prosty skrypt jest otwarty na ulepszenia. Dostosuj kod do swoich potrzeb i rozwijaj go expand.

Gry Bitwa o Wesnoth 1.13.6 Wydanie rozwojowe
Bitwa o Wesnoth 1.13.6 Wydanie rozwojowe
Bitwa o Wesnoth 1.13.6 wydana w zeszłym miesiącu jest szóstą wersją rozwojową w 1.13.Seria x i zapewnia szereg ulepszeń, w szczególności w interfejsie...
Gry Jak zainstalować League Of Legends na Ubuntu 14.04
Jak zainstalować League Of Legends na Ubuntu 14.04
Jeśli jesteś fanem League of Legends, to jest okazja do przetestowania League of Legends. Pamiętaj, że LOL jest obsługiwany w PlayOnLinux, jeśli jeste...
Gry Zainstaluj najnowszą grę strategiczną OpenRA na Ubuntu Linux
Zainstaluj najnowszą grę strategiczną OpenRA na Ubuntu Linux
OpenRA to darmowy silnik gier strategicznych czasu rzeczywistego, który odtwarza wczesne gry Westwood, takie jak klasyczny Command & Conquer: Red Aler...