- Test for internet

- Improve handling of no internet
- Allow null values
- Add netutils
master
Nixellion 2020-06-26 18:22:10 +03:00
parent 99b16b2ae3
commit c33c637fd0
4 changed files with 107 additions and 22 deletions

4
dbo.py
View File

@ -43,8 +43,8 @@ class BroModel(Model):
self.save()
class Entry(BroModel):
upload = FloatField()
download = FloatField()
upload = FloatField(null=True)
download = FloatField(null=True)
class Meta:

47
netutils.py Normal file
View File

@ -0,0 +1,47 @@
from platform import system as system_name # Returns the system/OS name
from os import system as system_call # Execute a shell command
import time
test_ips = ['duckduckgo.com',
'cloudflare.com',
'google.com',
'ya.ru']
try_delay = 0.5
def ping(host):
"""
Returns True if host (str) responds to a ping request.
Remember that some hosts may not respond to a ping request even if the host name is valid.
"""
# Ping parameters as function of OS
parameters = "-n 1 -w 1000" if system_name().lower().strip() == "windows" else "-c 1 -W 1000"
# Pinging
return system_call("ping " + parameters + " " + host) == 0
def wait_for_internet_connection():
while True:
for ip in test_ips:
if ping(ip):
return
else:
print("Could not reach internet. Trying again...")
time.sleep(try_delay)
def test_intertnet_connection():
for ip in test_ips:
if ping(ip):
return True
else:
print("Could not reach internet. Trying another IP...")
time.sleep(try_delay)
return False
#########################################################
#########################################################
#########################################################

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -121,6 +121,7 @@ wan_upload = None
wan_download = None
results_dict = None
test_started = False
speedtest_failed = False
downloading = True # True for download, False for upload
threads = None
servers = []
@ -129,21 +130,26 @@ servers = []
def threaded_speedtest():
global test_started
global downloading
s = speedtest.Speedtest()
s.get_servers(servers)
s.get_best_server()
print(f"Running test...")
test_started = True
downloading = True
s.download(threads=threads)
downloading = False
s.upload(threads=threads, pre_allocate=False)
global results_dict
results_dict = s.results.dict()
log.info(
f"Speedtest.net result: DOWN {mbits(results_dict['download'])} mbps; UP {mbits(results_dict['upload'])} mbps;")
global speedtest_failed
try:
s = speedtest.Speedtest()
s.get_servers(servers)
s.get_best_server()
print(f"Running test...")
test_started = True
downloading = True
s.download(threads=threads)
downloading = False
s.upload(threads=threads, pre_allocate=False)
results_dict = s.results.dict()
log.info(
f"Speedtest.net result: DOWN {mbits(results_dict['download'])} mbps; UP {mbits(results_dict['upload'])} mbps;")
except Exception as e:
speedtest_failed = True
log.error(f"Speedtest.net failed: {e}", exc_info=True)
return results_dict
@ -153,13 +159,15 @@ def threaded_wan_speed():
global downloading
print("Waiting for test to start...")
while not test_started:
if speedtest_failed:
return
time.sleep(1)
print("Allow warm-up...")
time.sleep(2)
uploads = []
downloads = []
print("Monitoring...")
while not results_dict:
while results_dict == None:
connection = routeros_api.RouterOsApiPool(config['ros_ip'], username=secrets["ros_login"],
password=secrets["ros_password"], plaintext_login=True)
api = connection.get_api()
@ -194,6 +202,31 @@ def test_speed():
sws.join()
def generate_database_reports():
dates, downloads, uploads = gather_data()
generate_txt_output(dates, downloads, uploads)
generate_plot_image(dates, downloads, uploads)
import sys
from netutils import test_intertnet_connection
def on_fail_or_no_connection():
ros_fastrack_enable(False)
entry = Entry()
entry.upload = None
entry.download = None
entry.save()
generate_database_reports()
log.warning("No internet connection! Exiting.")
sys.exit()
if __name__ == "__main__":
'''
This script will run a few speed tests, calculate average upload and download speeds and record them into database.
@ -206,12 +239,21 @@ if __name__ == "__main__":
from random import uniform
try:
log.debug("Test internet connection...")
# if not test_intertnet_connection():
# no_internet()
if config["ros_dynamic_speed"]:
ros_fastrack_enable(True)
time.sleep(5)
test_speed()
if speedtest_failed:
on_fail_or_no_connection()
entry = Entry()
entry.upload = mbits(wan_upload)
entry.download = mbits(wan_download)
@ -224,11 +266,7 @@ if __name__ == "__main__":
ros_dynamic_speed(wan_upload, wan_download)
ros_fastrack_enable(False)
dates, downloads, uploads = gather_data()
generate_txt_output(dates, downloads, uploads)
generate_plot_image(dates, downloads, uploads)
generate_database_reports()
except: