Esempio n. 1
0
    def setup_speedtest(self):

        speedtest.build_user_agent()

        print('Getting speedtest.net Configuration')
        try:
            self.speedtest = speedtest.Speedtest()
        except speedtest.ConfigRetrievalError:
            print('ERROR: Failed to get speedtest.net configuration.  Aborting')
            sys.exit(1)

        try:
            if self.config.test_server:
                self.speedtest.get_servers(self.config.test_server)
            else:
                self.speedtest.get_servers()
        except speedtest.NoMatchedServers:
            print('ERROR: No matched servers: {}'.format(self.config.test_server[0]))
            sys.exit(1)
        except speedtest.ServersRetrievalError:
            print('ERROR: Cannot retrieve speedtest server list')
            sys.exit(1)
        except speedtest.InvalidServerIDType:
            print('{} is an invalid server type, must be int'.format(self.config.test_server[0]))
            sys.exit(1)

        print('Picking the closest server')
        self.speedtest.get_best_server()

        self.results = self.speedtest.results
Esempio n. 2
0
    def setup_speedtest(self, server=None):
        """
        Initializes the Speed Test client with the provided server
        :param server: Int
        :return: None
        """
        speedtest.build_user_agent()

        log.debug('Setting up SpeedTest.net client')

        if server is None:
            server = []
        else:
            server = server.split()  # Single server to list

        try:
            self.speedtest = speedtest.Speedtest()
        except speedtest.ConfigRetrievalError:
            log.critical(
                'Failed to get speedtest.net configuration.  Aborting')
            sys.exit(1)

        self.speedtest.get_servers(server)

        log.debug('Picking the closest server')

        self.speedtest.get_best_server()

        log.info('Selected Server %s in %s', self.speedtest.best['id'],
                 self.speedtest.best['name'])

        self.results = self.speedtest.results
Esempio n. 3
0
    def setup_speedtest(self, servers=None, mode='select'):
        """
        Initializes the Speed Test client with the provided server
        :param server: Int
        :return: None
        """
        speedtest.build_user_agent()

        log.debug('Setting up Speedtest.net client')

        if servers:
            log.info(
                f"Selecting server {('excluding','from')[mode!='exclude']}: {servers}"
            )

        try:
            self.speedtest = speedtest.Speedtest(secure=config.secure)
        except speedtest.ConfigRetrievalError:
            log.critical(
                'Failed to get speedtest.net configuration.  Aborting')
            sys.exit(1)

        servers_in = None
        servers_ex = None

        if mode == 'select':
            servers_in = servers
        else:
            servers_ex = servers

        self.speedtest.get_servers(servers_in, servers_ex)

        # log.debug(self.speedtest.servers)

        if len(self.speedtest.servers) != 1:
            log.debug('Selecting the closest server')
            self.speedtest.get_best_server()

            log.info(
                f"Selected server {self.speedtest.best['name']} (id:{self.speedtest.best['id']})"
            )
Esempio n. 4
0
    def get_best_server(self, servers=None):
        """Perform a speedtest.net "ping" to determine which speedtest.net
        server has the lowest latency
        """

        if not servers:
            if not self.closest:
                servers = self.get_closest_servers()
            servers = self.closest

        if self._source_address:
            source_address_tuple = (self._source_address, 0)
        else:
            source_address_tuple = None

        user_agent = speedtest.build_user_agent()

        results = {}
        for server in servers:
            cum = []
            url = os.path.dirname(server["url"])
            stamp = int(timeit.time.time() * 1000)
            latency_url = "%s/latency.txt?x=%s" % (url, stamp)
            for i in range(0, 3):
                urlparts = urlparse(latency_url)
                try:
                    if urlparts[0] == "https":
                        h = speedtest.SpeedtestHTTPSConnection(
                            urlparts[1],
                            timeout=0.5,
                            source_address=source_address_tuple,
                        )
                    else:
                        h = speedtest.SpeedtestHTTPConnection(
                            urlparts[1],
                            timeout=0.5,
                            source_address=source_address_tuple,
                        )
                    headers = {"User-Agent": user_agent}
                    path = "%s?%s" % (urlparts[2], urlparts[4])
                    start = timeit.default_timer()
                    h.request("GET", path, headers=headers)
                    r = h.getresponse()
                    total = timeit.default_timer() - start
                except speedtest.HTTP_ERRORS:
                    cum.append(3600)
                    continue

                text = r.read(9)
                if int(r.status) == 200 and text == "test=test".encode():
                    cum.append(total)
                else:
                    cum.append(3600)
                h.close()

            avg = round((sum(cum) / 6) * 1000.0, 3)
            results[avg] = server

        try:
            fastest = sorted(results.keys())[0]
        except IndexError:
            raise speedtest.SpeedtestBestServerFailure(
                "Unable to connect to servers to "
                "test latency.")
        best = results[fastest]
        best["latency"] = fastest

        self.results.ping = fastest
        self.results.server = best

        self._best.update(best)
        return best