85 lines
2.2 KiB
Python
85 lines
2.2 KiB
Python
import curses
|
|
import time
|
|
import datetime
|
|
from jsonrpc.proxy import JSONRPCProxy
|
|
|
|
stdscr = curses.initscr()
|
|
|
|
api = JSONRPCProxy.from_url("http://localhost:5280")
|
|
|
|
|
|
def init_curses():
|
|
curses.noecho()
|
|
curses.cbreak()
|
|
stdscr.nodelay(1)
|
|
stdscr.keypad(1)
|
|
|
|
|
|
def teardown_curses():
|
|
curses.nocbreak()
|
|
stdscr.keypad(0)
|
|
curses.echo()
|
|
curses.endwin()
|
|
|
|
|
|
def refresh(node_index):
|
|
height, width = stdscr.getmaxyx()
|
|
node_ids = api.get_node_ids()
|
|
node_id = node_ids[node_index]
|
|
node_statuses = api.node_status()
|
|
running = node_statuses[node_id]
|
|
buckets = api.node_routing_table(node_id=node_id)
|
|
|
|
for y in range(height):
|
|
stdscr.addstr(y, 0, " " * (width - 1))
|
|
|
|
stdscr.addstr(0, 0, "node id: %s, running: %s (%i/%i running)" % (node_id, running, sum(node_statuses.values()), len(node_ids)))
|
|
stdscr.addstr(1, 0, "%i buckets, %i contacts" %
|
|
(len(buckets), sum([len(buckets[b]['contacts']) for b in buckets])))
|
|
|
|
y = 3
|
|
for i in sorted(buckets.keys()):
|
|
stdscr.addstr(y, 0, "bucket %s" % i)
|
|
y += 1
|
|
for h in sorted(buckets[i]['contacts'], key=lambda x: x['node_id'].decode('hex')):
|
|
stdscr.addstr(y, 0, '%s (%s:%i) failures: %i, last replied to us: %s, last requested from us: %s' %
|
|
(h['node_id'], h['address'], h['port'], h['failedRPCs'],
|
|
datetime.datetime.fromtimestamp(float(h['lastReplied'] or 0)),
|
|
datetime.datetime.fromtimestamp(float(h['lastRequested'] or 0))))
|
|
y += 1
|
|
y += 1
|
|
|
|
stdscr.addstr(y + 1, 0, str(time.time()))
|
|
stdscr.refresh()
|
|
return len(node_ids)
|
|
|
|
|
|
def do_main():
|
|
c = None
|
|
nodes = 1
|
|
node_index = 0
|
|
while c not in [ord('q'), ord('Q')]:
|
|
try:
|
|
nodes = refresh(node_index)
|
|
except:
|
|
pass
|
|
c = stdscr.getch()
|
|
if c == curses.KEY_LEFT:
|
|
node_index -= 1
|
|
node_index = max(node_index, 0)
|
|
elif c == curses.KEY_RIGHT:
|
|
node_index += 1
|
|
node_index = min(node_index, nodes - 1)
|
|
time.sleep(0.1)
|
|
|
|
|
|
def main():
|
|
try:
|
|
init_curses()
|
|
do_main()
|
|
finally:
|
|
teardown_curses()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|