cowmesh-network-test/cowmesh_pi_speedtest.py

104 lines
3.0 KiB
Python

"""
run speedtest-cli on every computer in mesh
"""
import datetime
import os
import re
import time
import asyncio, asyncssh, sys
import paramiko
import subprocess
import json
from cowmesh_helpers import cleanup_iperf_server
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
SECRETS_PATH = os.path.join(PROJECT_PATH, "secrets.json")
with open(SECRETS_PATH, 'r') as f:
SECRETS = json.loads(f.read())
base_node = "janastunuc" # nuc in jaaga
nodes = [
"janastunuc", # nuc in jaaga
"solipi", # pi in guard
"writer", # pi in new-gazebo
]
class CowmeshPiSpeedtestTester:
def __init__(self, log=None, debug=False):
if log:
self.log = log
self.debug = debug
self.results = {}
async def log(self, msg):
print(msg)
async def debug_log(self, msg):
if self.debug:
await self.log(msg)
async def speedtest_node(self, node):
await self.log("++ running speedtest on {}".format(node))
user = SECRETS["HOST_INFO"][node]["user"]
password = SECRETS["HOST_INFO"][node]["password"]
myconn = paramiko.SSHClient()
myconn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ip = SECRETS["HOST_INFO"][node]["ip"]
myconn.connect(ip, username=user, password=password)
remote_cmd = 'speedtest-cli --simple'
(stdin, stdout, stderr) = myconn.exec_command(remote_cmd)
output = str(stdout.read())
await self.debug_log("output: {}".format(output))
await self.debug_log("errors: {}".format(stderr.read()))
myconn.close()
return output
async def run_test(self):
for node in nodes:
result_key = "{}".format(node)
try:
r = await self.speedtest_node(node)
self.results[result_key] = r
except Exception as e:
try:
self.log("error: {}".format(e))
except:
continue
self.results[result_key] = "error: {}".format(e)
async def output_results(self):
results_str = ""
now = datetime.datetime.now()
date = now.date()
time = now.time()
results_str += "**** computer speedtests on {date:%m-%d-%Y} at {time:%H:%M}:\n\n".format(date=date, time=time)
for test_name, result in self.results.items():
result = str(result)
result = result.replace("b'", "")
result = result.replace("'", "")
result = result.replace("\\n", " | ")
results_str += "{}: {}\n".format(test_name, result)
await self.log(results_str)
if __name__ == "__main__":
try:
tester = CowmeshPiSpeedtestTester()
async def main_fun():
await tester.run_test()
await tester.output_results()
asyncio.get_event_loop().run_until_complete(main_fun())
except (OSError, asyncssh.Error) as exc:
sys.exit('SSH connection failed: ' + str(exc))