From c0f0087fd6de6840092b3dceecdbcf84f3deffc5 Mon Sep 17 00:00:00 2001 From: Andrew Parker Date: Tue, 22 Jan 2013 16:52:46 -0700 Subject: [PATCH 1/2] Bug fixes, etc. If multiple servers reported the exact same lat. and long. then they would overwrite eachother in the dict. I changed it to use a defaultdict so that you could have multiple servers with the exact same distance. (3 of my closest 5 reported the exact same corrdinates.) The latency it was printing was not the latency from the chosen best server. Now it is. Added a print out of the IP and ISP info. --- speedtest-cli | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/speedtest-cli b/speedtest-cli index 0c5d63c..e3cc3dc 100755 --- a/speedtest-cli +++ b/speedtest-cli @@ -23,6 +23,7 @@ import sys import threading from Queue import Queue from xml.dom import minidom as DOM +from collections import defaultdict try: from urlparse import parse_qs except ImportError: @@ -197,16 +198,22 @@ def closestServers(client): return None uh.close() root = DOM.parseString(serversxml) - servers = {} + servers = defaultdict(list) for server in root.getElementsByTagName('server'): attrib = dict(server.attributes.items()) d = distance([float(client['lat']), float(client['lon'])], [float(attrib.get('lat')), float(attrib.get('lon'))]) - servers[d] = attrib + servers[d].append(attrib) closest = [] - for d in sorted(servers.keys())[0:4]: - closest.append(servers[d]) + for d in sorted(servers.keys()): + for s in servers[d]: + closest.append(s) + if(len(closest) == 5): + break + else: + continue + break del servers del root @@ -235,8 +242,9 @@ def getBestServer(servers): avg = round((cum / 3) * 1000000, 3) results[avg] = server - best = results[sorted(results.keys())[0]] - best['latency'] = avg + fastest = sorted(results.keys())[0] + best = results[fastest] + best['latency'] = fastest return best @@ -247,6 +255,9 @@ def speedtest(): print 'Retrieving speedtest.net configuration...' config = getConfig() + client = dict(config['client'].items()) + print 'Testing IP: %(ip)s from ISP: %(isp)s' % client + print 'Retrieving speedtest.net server list...' servers = closestServers(config['client']) From 76204accc9c6776e4f1207824ce13d1219c3999a Mon Sep 17 00:00:00 2001 From: Andrew Parker Date: Wed, 23 Jan 2013 12:24:02 -0700 Subject: [PATCH 2/2] Remove use of defaultdict Remove the use of defaultdict to preserve Python 2.4 compatibility. --- speedtest-cli | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/speedtest-cli b/speedtest-cli index e3cc3dc..9bd5d36 100755 --- a/speedtest-cli +++ b/speedtest-cli @@ -23,7 +23,6 @@ import sys import threading from Queue import Queue from xml.dom import minidom as DOM -from collections import defaultdict try: from urlparse import parse_qs except ImportError: @@ -198,12 +197,15 @@ def closestServers(client): return None uh.close() root = DOM.parseString(serversxml) - servers = defaultdict(list) + servers = {} for server in root.getElementsByTagName('server'): attrib = dict(server.attributes.items()) d = distance([float(client['lat']), float(client['lon'])], [float(attrib.get('lat')), float(attrib.get('lon'))]) - servers[d].append(attrib) + if d not in servers: + servers[d] = [attrib] + else: + servers[d].append(attrib) closest = [] for d in sorted(servers.keys()):