1
0

move network dialog in a new class; simplify interface.get_servers

This commit is contained in:
ecdsa
2013-04-28 13:47:19 +02:00
parent 7d1075d85d
commit 86fd728a47
8 changed files with 343 additions and 277 deletions

View File

@@ -26,34 +26,39 @@ from util import print_error, print_msg
DEFAULT_TIMEOUT = 5
DEFAULT_PORTS = {'t':'50001', 's':'50002', 'h':'8081', 'g':'8082'}
DEFAULT_SERVERS = [
'electrum.bitcoin.cz:50002:s',
'electrum.novit.ro:50002:s',
'electrum.be:50002:s',
'electrum.bysh.me:50002:s',
'electrum.pdmc.net:50002:s',
'electrum.no-ip.org:50002:s',
'ecdsa.org:50002:s',
'electra.datemas.de:50002:s',
'electrum.datemas.de:50002:s',
'electrum.mooo.com:50002:s',
'btcback.com:50002:s',
'electrum.bitcoins.sk:50002:s',
'btc.stytt.com:50002:s',
'electrum.stepkrav.pw:50002:s',
'btc.it-zone.org:110:s'
]
# add only port 80 servers here
DEFAULT_HTTP_SERVERS = [
'electrum.no-ip.org:80:h'
]
DEFAULT_SERVERS = {
'electrum.thecoinwillprevail.com': {'h': '8081', 's': '50002', 't': '50001'},
'the9ull.homelinux.org': {'h': '8082', 't': '50001'},
'electra.datemas.de': {'h': '8081', 's': '50002', 't': '50001', 'g': '808'},
'electrum.datemas.de': {'h': '8081', 's': '50002', 't': '50001', 'g': '8082'},
'ecdsa.org': {'h': '8081', 's': '50002', 't': '50001', 'g': '8082'},
'electrum.mooo.com': {'h': '8081', 't': '50001'},
'btcback.com': {'h': '8081', 's': '50002', 't': '50001', 'g': '8082'},
'electrum.bitcoins.sk': {'h': '8081', 's': '50002', 't': '50001', 'g': '8'},
'electrum.no-ip.org': {'h': '80', 's': '50002', 't': '50001', 'g': '443'},
'electrum.drollette.com': {'h': '8081', 's': '50002', 't': '50001', 'g': '8082'},
'btc.it-zone.org': {'h': '80', 's': '110', 't': '50001', 'g': '443'},
'electrum.yacoin.com': {'h': '8081', 's': '50002', 't': '50001', 'g': '8082'},
'electrum.be': {'h': '8081', 's': '50002', 't': '50001', 'g': '8082'}
}
def filter_protocol(servers, p):
l = []
for k, protocols in servers.items():
if p in protocols:
l.append( ':'.join([k, protocols[p], p]) )
return l
proxy_modes = ['socks4', 'socks5', 'http']
def pick_random_server():
return random.choice( DEFAULT_SERVERS )
return random.choice( filter_protocol(DEFAULT_SERVERS,'s') )
@@ -119,9 +124,10 @@ class Interface(threading.Thread):
elif method == 'server.peers.subscribe':
servers = {}
for item in result:
s = []
host = item[1]
ports = []
out = {}
version = None
pruning_level = '-'
if len(item) > 2:
@@ -129,7 +135,7 @@ class Interface(threading.Thread):
if re.match("[stgh]\d*", v):
protocol, port = v[0], v[1:]
if port == '': port = DEFAULT_PORTS[protocol]
ports.append((protocol, port))
out[protocol] = port
elif re.match("v(.?)+", v):
version = v[1:]
elif re.match("p\d*", v):
@@ -139,8 +145,11 @@ class Interface(threading.Thread):
is_recent = float(version)>=float(PROTOCOL_VERSION)
except:
is_recent = False
if ports and is_recent:
servers[host] = {'ports':ports, 'pruning':pruning_level}
if out and is_recent:
out['pruning'] = pruning_level
servers[host] = out
self.servers = servers
self.trigger_callback('peers')
@@ -309,26 +318,28 @@ class Interface(threading.Thread):
s.setproxy(proxy_modes.index(self.proxy["mode"]) + 1, self.proxy["host"], int(self.proxy["port"]) )
if self.use_ssl:
s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv23)
s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv23, do_handshake_on_connect=True)
s.settimeout(2)
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
try:
s.connect(( self.host.encode('ascii'), int(self.port)))
s.settimeout(60)
self.s = s
self.is_connected = True
except:
traceback.print_exc(file=sys.stdout)
self.is_connected = False
self.s = None
return
s.settimeout(60)
self.s = s
self.is_connected = True
def run_tcp(self):
try:
#if self.use_ssl: self.s.do_handshake()
out = ''
while self.is_connected:
try:
timeout = False
msg = self.s.recv(1024)
@@ -395,7 +406,7 @@ class Interface(threading.Thread):
def __init__(self, config=None, loop=False):
self.server = random.choice(DEFAULT_SERVERS[:])
self.server = random.choice(filter_protocol(DEFAULT_SERVERS, 's'))
self.proxy = None
if config is None:
@@ -431,16 +442,10 @@ class Interface(threading.Thread):
if not self.is_connected and self.config.get('auto_cycle'):
print_msg("Using random server...")
servers_tcp = DEFAULT_SERVERS[:]
servers_http = DEFAULT_HTTP_SERVERS[:]
while servers_tcp or servers_http:
if servers_tcp:
server = random.choice( servers_tcp )
servers_tcp.remove(server)
else:
# try HTTP if we can't get a TCP connection
server = random.choice( servers_http )
servers_http.remove(server)
servers = filter_protocol(DEFAULT_SERVERS, 's')
while servers:
server = random.choice( servers )
servers.remove(server)
print server
self.config.set_key('server', server, False)
self.init_with_server(self.config)
@@ -559,25 +564,11 @@ class Interface(threading.Thread):
self.s.close()
def get_servers_list(self):
plist = {}
def get_servers(self):
if not self.servers:
servers_list = {}
for x in DEFAULT_SERVERS:
h,port,protocol = x.split(':')
servers_list[h] = {'ports':[(protocol,port)]}
return DEFAULT_SERVERS
else:
servers_list = self.servers
for _host, v in servers_list.items():
pp = v['ports']
z = {}
for item2 in pp:
_protocol, _port = item2
z[_protocol] = _port
plist[_host] = z
return plist, servers_list
return self.servers
def is_empty(self, channel):