-
Notifications
You must be signed in to change notification settings - Fork 569
/
Copy pathnode-status-crawl.py
executable file
·122 lines (86 loc) · 3.06 KB
/
node-status-crawl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python3
# script to gather and store all node status data from peers reachable from the local daemon
import subprocess
import sys
import os
import argparse
import json
default_port=8301
default_prog='mina'
parser = argparse.ArgumentParser(description='Get node status from all Mina nodes reachable from localhost daemon')
parser.add_argument('--daemon-port',
help='daemon port on localhost (default: ' + str(default_port) + ')')
parser.add_argument('--executable',
help='Mina program on localhost (default: ' + str(default_prog) + ')')
args = parser.parse_args()
if args.daemon_port is None :
daemon_port = str(default_port)
else :
daemon_port = args.daemon_port
if args.executable is None :
prog = default_prog
else :
prog = args.executable
# map from peer IDs to node status
node_statuses = dict ()
# the peer ids we've already queried
seen_peer_ids = set ()
def add_node_statuses (output) :
lines = output.decode ('utf-8').split ('\n')
# set of peers to query on next round
peers_to_query = {}
# populate map from responses
for line in lines :
if line == '' :
continue
status = json.loads (line)
try :
node_statuses[status['node_peer_id']] = status
for peer in status['peers'] :
peer_id = peer['peer_id']
peers_to_query[peer_id] = peer
# don't consider this peer_id again
# the query to this peer may not succeed, though
seen_peer_ids.add (peer_id)
except :
print ('Error in node status response: ' + line)
return peers_to_query.items()
# get node status from peers known to daemon
output = subprocess.check_output([prog, 'advanced', 'node-status', '-daemon-peers', '-daemon-port', daemon_port])
peers_to_query = add_node_statuses (output)
done = False
def peer_to_multiaddr(peer):
return '/ip4/{}/tcp/{}/p2p/{}'.format(
peer['host'],
peer['libp2p_port'],
peer['peer_id'] )
# calculate fixpoint: add node statuses from peer ids until we see no new peer ids
while not done :
done = True
formatted_peers = ''
for (peer_id, peer) in peers_to_query :
peer = peer_to_multiaddr(peer)
if peer_id in seen_peer_ids :
continue
else :
done = False
if peer_id_count == 0 :
formatted_peers = peer
else :
formatted_peers = peer + ',' + formatted_peers
if done :
break
output = subprocess.check_output([prog, 'advanced', 'node-status', '-peers', formatted_peers, '-daemon-port', daemon_port])
peers_to_query = add_node_statuses (output)
print ('{ "peer_ids_queried": ' + str(len(seen_peer_ids)) + ',')
print (' "node_statuses": [')
num_node_statuses=len(node_statuses)
count = 0
for status in node_statuses.values () :
s = str(status).replace("'",'"')
if count < num_node_statuses - 1:
print (' ' + s + ',')
else :
print (' ' + s)
count += 1
print (' ]}')