Mít aplikace a zařízení, která potřebují protokolovat, odesílat a přijímat data do vnějšího světa, je zásadní. Mít nástroj, který vám umožní sledovat, kdy vaše síť spadne, vám může pomoci vyřešit problém se sítí nebo zastavit aplikace před odesláním hromady chyb protokolu.
V dnešním tutoriálu sestavíme jednoduchý síťový monitor, který nepřetržitě sleduje vaše připojení k internetu zasíláním požadavků ping na externí zdroj. Skript, který vytvoříme, bude také uchovávat protokoly o výpadku internetu a délce prostoje:
Požadavky na projekt
Pro tento projekt budeme potřebovat pouze:
- Základy programování v Pythonu
- Základní znalosti počítačových sítí.
- Buďte pohodlní pomocí terminálu.
Logika projektu
Než se ponoříme do kódovací části, proberme a pochopme, čeho se snažíme dosáhnout:
Co je síťový provoz a prostoje?
Když mluvíme o zapnutí a výpadku sítě, máme na mysli období, kdy je síťové připojení zcela nedostupné, a proto nemůžeme komunikovat se zařízeními mimo naši síť. Čím déle není internet k dispozici, tím delší jsou prostoje.
Jak určit prostoje
Nyní, když víme, co to je prostoje internetu, možná vás zajímá: „jak to zjistíme?“
Aniž bychom komplikovali náš kód, můžeme jít s pingem. Ping je metoda, kdy neustále pingujeme spolehlivý server - třeba Cloudflare nebo Google DNS - a pak čekáme na odpověď.
Pokud provedeme ping na server a nebudeme reagovat, všimneme si toho konkrétního času a pokračujeme v pingu, dokud nedostaneme ping a nezaznamenáme čas.
S časovým rozdílem si můžeme povšimnout, kdy byl internet vypnutý a na jak dlouho.
Musíme také být opatrní, když pingujete na jeden server, protože můžeme mít falešně mylný ping jako útok DDoS, což může způsobit zablokování naší IP adresy, což by vedlo k negativním výsledkům.
Tady je vývojový diagram vysvětlující tento koncept:
Mluvení je levné; Pojďme se nyní ponořit do kódu, který ukazuje, jak implementovat tuto logiku:
Nyní mi ukažte kód
Jako obvykle v Pythonu začneme importem požadovaných knihoven. Dále vytvoříme soubor protokolu v aktuálním pracovním adresáři.
Knihovnu soketů používáme k odeslání požadavku na externí IP adresu v první funkci. V tomto příkladu používáme veřejnou adresu DNS Cloudflare, která má velmi vysokou dobu provozuschopnosti. Také předáme port a protože se jedná o server DNS, použijte port 53.
Poté ověříme, že máme přístup k adresáři souborů protokolu, a pokud nemáme přístup, ukončíme ho.
Dalším krokem je výpočet doby, kdy je připojení k síti nefunkční. Nakonec zabalíme celou funkčnost do smyčky, jak je znázorněno v níže uvedeném kódu.
importovat zásuvkučas importu
import datetime
import os
import sys
LOG_FNAME = "síť.přihlásit "
SOUBOR = os.cesta.připojit (os.getcwd (), LOG_FNAME)
def send_ping_request (hostitel = "1.1.1.1 ", port = 53, časový limit = 3):
Snaž se:
zásuvka.setdefaulttimeout (timeout)
s = zásuvka.zásuvka (zásuvka.AF_INET, socket.SOCK_STREAM)
s.připojit ((hostitel, port))
kromě OSError jako chyba:
vrátit False
jiný:
s.zavřít()
vrátit True
def write_permission_check ():
Snaž se:
s otevřeným (SOUBOR, "a") jako soubor:
složit
kromě OSError jako chyba:
tisk ("Vytvoření souboru protokolu se nezdařilo")
sys.výstup()
Konečně:
složit
def count_time (start, stop):
time_difference = stop - start
seconds = float (str (time_difference.).total_seconds ()))
návrat str (datetime.timedelta (sekundy = sekundy)).rozdělit(".") [0]
def mon_net_connection (ping_freq = 2):
monitor_start_time = datetime.čas schůzky.Nyní()
motd = "Monitorování síťového připojení začalo v:" + str (monitor_start_time).rozdělit(".") [0] +" Odesílání požadavku na ping za "+ str (ping_freq) +" sekundy "
tisk (motd)
s otevřeným (SOUBOR, "a") jako soubor:
soubor.write ("\ n")
soubor.write (motd + "\ n")
zatímco je pravda:
pokud send_ping_request ():
čas.spánek (ping_freq)
jiný:
down_time = datetime.čas schůzky.Nyní()
fail_msg = "Síťové připojení není k dispozici na:" + str (mimo provoz).rozdělit(".") [0]
print (fail_msg)
s otevřeným (SOUBOR, "a") jako soubor:
soubor.write (fail_msg + "\ n")
i = 0
zatímco není send_ping_request ():
čas.spánek (1)
i + = 1
pokud i> = 3600:
i = 0
nyní = datetime.čas schůzky.Nyní()
continous_message = "Network Unavailabilty Persistent at:" + str (nyní).rozdělit(".") [0]
print (continous_message)
s otevřeným (SOUBOR, "a") jako soubor:
soubor.write (continous_message + "\ n")
up_time = datetime.čas schůzky.Nyní()
uptime_message = "Síťové připojení obnoveno na:" + str (up_time).rozdělit(".") [0]
down_time = vypočítat_čas (down_time, up_time)
_m = "Síťové připojení nebylo k dispozici po dobu" + down_time
tisk (uptime_message)
tisk (_m)
s otevřeným (SOUBOR, "a") jako soubor:
soubor.zápis (uptime_message + "\ n")
soubor.write (_m + "\ n")
mon_net_connection ()
Pokud spustíte tento skript, získáte výstup podobný tomu, který je uveden níže:
Závěr
Pomocí výše uvedeného skriptu můžeme monitorovat ztrátu síťového připojení a neustále jej protokolovat, dokud nebude k dispozici. Tento jednoduchý skript je otevřený vylepšením. Nebojte se upravit kód podle svých potřeb a rozšířit ho.