Load, Save and List servers

This commit is contained in:
Andrew Cammell 2014-10-05 13:20:43 +08:00
parent b0e1e58a0b
commit 066f8acaad

View File

@ -30,6 +30,7 @@ import signal
import socket import socket
import timeit import timeit
import threading import threading
from json import dump as jsonDump, load as jsonLoad
# Used for bound_interface # Used for bound_interface
socket_socket = socket.socket socket_socket = socket.socket
@ -352,9 +353,10 @@ def getConfig():
return config return config
def closestServers(client, all=False): def closestServers(client, numServers = 5):
"""Determine the 5 closest speedtest.net servers based on geographic """Determine the closest speedtest.net servers based on geographic
distance distance. The default number of servers to return is 5. If the
number of servers is specified as 0 then all servers are returned.
""" """
url = 'http://www.speedtest.net/speedtest-servers-static.php' url = 'http://www.speedtest.net/speedtest-servers-static.php'
@ -399,7 +401,7 @@ def closestServers(client, all=False):
for d in sorted(servers.keys()): for d in sorted(servers.keys()):
for s in servers[d]: for s in servers[d]:
closest.append(s) closest.append(s)
if len(closest) == 5 and not all: if len(closest) == numServers and numServers != 0:
break break
else: else:
continue continue
@ -499,6 +501,13 @@ def speedtest():
parser.add_argument('--list', action='store_true', parser.add_argument('--list', action='store_true',
help='Display a list of speedtest.net servers ' help='Display a list of speedtest.net servers '
'sorted by distance') 'sorted by distance')
parser.add_argument('--listservers', action='store_true',
help='Display a list of speedtest.net servers '
'sorted by distance. Synonym for --list')
parser.add_argument('--saveservers', help='Specify a file to save the speedtest.net '
'servers list to')
parser.add_argument('--loadservers', help='Specify a file of speedtest.net servers '
'to use instead of downloading the list')
parser.add_argument('--server', help='Specify a server ID to test against') parser.add_argument('--server', help='Specify a server ID to test against')
parser.add_argument('--mini', help='URL of the Speedtest Mini server') parser.add_argument('--mini', help='URL of the Speedtest Mini server')
parser.add_argument('--source', help='Source IP address to bind to') parser.add_argument('--source', help='Source IP address to bind to')
@ -533,11 +542,14 @@ def speedtest():
print_('Cannot retrieve speedtest configuration') print_('Cannot retrieve speedtest configuration')
sys.exit(1) sys.exit(1)
if not args.simple: # Retrieve speedtest server list
print_('Retrieving speedtest.net server list...') if args.list or args.listservers or args.saveservers != None or (args.server and args.loadservers == None):
if args.list or args.server: if not args.simple:
servers = closestServers(config['client'], True) print_('Retrieving speedtest.net server list...')
if args.list: servers = closestServers(config['client'], 0) # return all servers
# Display the server list and exit
if args.list or args.listservers:
serverList = [] serverList = []
for server in servers: for server in servers:
line = ('%(id)4s) %(sponsor)s (%(name)s, %(country)s) ' line = ('%(id)4s) %(sponsor)s (%(name)s, %(country)s) '
@ -554,8 +566,36 @@ def speedtest():
except IOError: except IOError:
pass pass
sys.exit(0) sys.exit(0)
elif args.saveservers != None:
if not args.simple:
print_('Saving speedtest.net server list to %s...' % args.saveservers)
try:
svrFile = open(args.saveservers, 'w')
except:
print_('Unable to open server file')
sys.exit(1)
jsonDump(servers, svrFile)
svrFile.close()
print_('Done')
sys.exit(0)
elif args.loadservers != None:
if not args.simple:
print_('Loading speedtest.net server list from %s' % args.loadservers)
try:
svrFile = open(args.loadservers, 'r')
except:
print_('Unable to open server file')
sys.exit(1)
allServers = jsonLoad(svrFile)
svrFile.close()
if len(allServers) > 10:
servers = allServers[:5]
else:
servers = allServers
else: else:
servers = closestServers(config['client']) if not args.simple:
print_('Retrieving speedtest.net server list...')
servers = closestServers(config['client']) # return closest 5 servers
if not args.simple: if not args.simple:
print_('Testing from %(isp)s (%(ip)s)...' % config['client']) print_('Testing from %(isp)s (%(ip)s)...' % config['client'])