#!/usr/bin/env python
-from electrum import Interface, DEFAULT_SERVERS
+from electrum import Interface, SimpleConfig, set_verbosity
+from electrum.network import DEFAULT_SERVERS, filter_protocol
import time, Queue
+from collections import defaultdict
-servers = DEFAULT_SERVERS
-interfaces = map ( lambda server: Interface({'server':server} ), servers )
-results = []
+set_verbosity(False)
-for i in interfaces:
+config = SimpleConfig()
+servers = filter_protocol(DEFAULT_SERVERS,'t')
+interfaces = map ( lambda server: Interface(server, config), servers )
+
+q = Queue.Queue()
+results_queue = Queue.Queue()
+
+for i in interfaces: i.start(q)
+
+reached_servers = []
+
+while servers:
+ i = q.get(timeout=1000)
+ servers.remove(i.server)
if i.is_connected:
- i.start()
- i.send([('blockchain.numblocks.subscribe',[])])
+ i.send([('blockchain.headers.subscribe',[])], lambda i,x: results_queue.put((i,x)))
+ reached_servers.append(i.server)
+ i.status = "ok"
else:
- servers.remove(i.server)
+ i.status = "unreachable"
-while servers:
- for i in interfaces:
- try:
- r = i.responses.get(False)
- except Queue.Empty:
- continue
+d = defaultdict(int)
- if r.get('method') == 'blockchain.numblocks.subscribe':
- results.append((i.host, r.get('result')))
- servers.remove(i.server)
+while reached_servers:
+ i, r = results_queue.get(timeout=1000)
+ i.blocks = r.get('result').get('block_height')
+ d[i.blocks] += 1
+ reached_servers.remove(i.server)
-from collections import defaultdict
-d = defaultdict(int)
-for e in results:
- d[e[1]] += 1
v = d.values()
numblocks = d.keys()[v.index(max(v))]
-for s,n in results:
- print "%30s %d "%(s, n), "ok" if abs(n-numblocks)<2 else "lagging"
+for i in interfaces:
+ if i.status == "ok":
+ if abs(i.blocks-numblocks)>1: i.status = "lagging"
+ else:
+ i.blocks = 0
+
+ print "%30s %d %s "%(i.host, i.blocks, i.status)