PHP 7.4.33
Preview: iperf3.py Size: 1.96 KB
/home/godevadmin/public_html/upload_images/home/000~ROOT~000/lib/fm-agent/library/iperf3.py

import json
import logging
import os
import subprocess
import requests


class Iperf3Runner:
    default_start_url = "https://speed.fortisase.com/start_iperf"
    cached_start_info = None

    def __init__(self, iperf3_bin, start_url=None):
        if start_url is None:
            start_url = self.default_start_url
        self.start_url = start_url
        self.iperf_bin = iperf3_bin
        stat = os.stat(self.iperf_bin)
        perms = oct(stat.st_mode)[-3:]
        if "744" != perms:
            os.chmod(iperf3_bin, 0o744)
        self.log = logging.getLogger("Agent")

    def _fetch_info(self):
        if self.cached_start_info is not None:
            return self.cached_start_info
        r = requests.get(self.start_url, timeout=10)
        if 200 != r.status_code:
            raise Exception(f"Start_perf failure: {r.status_code}")
        self.cached_start_info = r.json()
        return self.cached_start_info

    def _run_test(self, iperf_args, response_key):
        p = subprocess.run(
            iperf_args, shell=True, capture_output=True, check=True, encoding="utf-8"
        )
        response = json.loads(p.stdout)
        bps = response["end"]["streams"][0][response_key]["bits_per_second"]
        metric_name = "download speed"
        if response_key == "sender":
            metric_name = "upload speed"
        self.log.info(
            "Metric {} args {} -> {} bits/s".format(metric_name, iperf_args, bps)
        )
        return bps

    def get_download_speed(self):
        info = self._fetch_info()
        args = "{} -c {} -p {} -t 10 -R --json".format(
            self.iperf_bin, info["ip"], info["upload_port"]
        )
        return self._run_test(iperf_args=args, response_key="receiver")

    def get_upload_speed(self):
        info = self._fetch_info()
        args = "{} -c {} -p {} -t 10 --json".format(
            self.iperf_bin, info["ip"], info["download_port"]
        )
        return self._run_test(iperf_args=args, response_key="sender")

Directory Contents

Dirs: 1 × Files: 23

Name Size Perms Modified Actions
- drwxr-xr-x 2025-06-19 05:08:01
Edit Download
107.89 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
110 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
9.19 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
14.82 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.17 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
807 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.54 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.12 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.99 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
16.17 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
2.97 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.96 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
4.25 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.62 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.34 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
5.32 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
11.69 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
872 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
874 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.99 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
3.23 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
1.48 KB lrw-r--r-- 2025-06-18 20:44:50
Edit Download
0 B lrw-r--r-- 2025-06-18 20:44:50
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).