104 lines
3.0 KiB
Python
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)) |