bim-core 0.15.4

Client core for bench.im.
Documentation
import argparse
import subprocess
import time

import requests

BASE_URL = "http://127.0.0.1:8000"
BIN_PATH = "./bimc"


def get_machine_id(token: str, name: str) -> int:
    data = {
        "token": token,
        "name": name,
    }
    r = requests.post(f"{BASE_URL}/api/machines/", json=data)
    if not r.ok:
        return 0
    return int(r.json()["id"])


class Runner:
    token = None
    machine_id = None

    def __init__(self, token: str, machine_id: int) -> None:
        self.token = token
        self.machine_id = machine_id

    def get_tasks(self):
        r = requests.get(
            f"{BASE_URL}/api/tasks/?token={self.token}&machine_id={self.machine_id}&status=Ready")
        if not r.ok:
            return []
        res = r.json()
        return res

    def finish_task(self, task, output: str):
        upload, upload_status, download, download_status, latency, jitter = output.split(
            ",")
        task_id = task["id"]

        data = {
            "download": 0,
            "download_status": download_status.strip(),
            "upload": 0,
            "upload_status": upload_status.strip(),
            "latency": 0,
            "jitter": 0
        }

        try:
            data = {
                "download": float(download.strip()),
                "upload": float(upload.strip()),
                "latency": float(latency.strip()),
                "jitter": float(jitter.strip())
            }
        except:
            pass

        requests.post(
            f"{BASE_URL}/api/tasks/{task_id}?token={self.token}", json=data)

    def run(self):
        while True:
            tasks = self.get_tasks()
            print(f"{len(tasks)} tasks")

            for task in tasks:
                server = task['server']
                args = [BIN_PATH, server["download_url"], server["upload_url"]]
                if server["ipv6"]:
                    args.append("-6")
                if server["multi"]:
                    args.append("-m")
                t = subprocess.run(args, capture_output=True)

                output = t.stdout.decode("utf-8")
                self.finish_task(task, output)

            if len(tasks) == 0:
                time.sleep(30)
            else:
                time.sleep(5)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("name")
    parser.add_argument("token")
    args = parser.parse_args()

    machine_id = get_machine_id(args.token, args.name)
    if machine_id > 0:
        runner = Runner(args.token, machine_id)
        runner.run()
    else:
        print("Invalid token or name")