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
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
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']})" )
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