move network dialog in a new class; simplify interface.get_servers
This commit is contained in:
111
lib/interface.py
111
lib/interface.py
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user