diff --git a/mmnode-netrate b/mmnode-netrate new file mode 100755 index 0000000..e11363e --- /dev/null +++ b/mmnode-netrate @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +import time +from mmgen.common import * + +opts_data = { + 'desc': 'Bitcoin daemon network rate monitor', + 'usage': '[opts]', + 'options': """ +-h, --help Print this help message +--, --longhelp Print help message for long options (common options) +""" +} + +cmd_args = opts.init(opts_data) + +ERASE_LINE,CUR_UP = '\033[K','\033[1A' +c = bitcoin_connection() + +def do_loop(): + def get_data(): + d = c.getnettotals() + return [float(e) for e in (d['totalbytesrecv'],d['totalbytessent'],d['timemillis'])] + + r,s,t = get_data() + time.sleep(0.2) + while True: + rs,ss,ts = r,s,t + r,s,t = get_data() + td = t-ts + sys.stderr.write('\rrcvd: {:9.2f} kB/s\nsent: {:9.2f} kB/s '.format((r-rs)/td,(s-ss)/td)) + time.sleep(2) + sys.stderr.write('{}{}{}'.format(ERASE_LINE,CUR_UP,ERASE_LINE)) + +try: + do_loop() +except KeyboardInterrupt: + sys.stderr.write('\n') diff --git a/mmnode-peerblocks b/mmnode-peerblocks new file mode 100755 index 0000000..53db914 --- /dev/null +++ b/mmnode-peerblocks @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +import time,threading +from mmgen.common import * + +opts_data = { + 'desc': 'List blocks in flight, disconnect stalling nodes', + 'usage': '[opts]', + 'options': """ +-h, --help Print this help message +--, --longhelp Print help message for long options (common options) +""" +} + +cmd_args = opts.init(opts_data) + +colors = ['\033[38;5;%s;1m' % c for c in 238,240,242,244,246,247,249,251,253,255] +_red,_reset = '\033[31m','\033[0m' + +ERASE_ALL,ERASE_LINE,CUR_HOME,CUR_HIDE,CUR_SHOW = \ + '\033[J','\033[K','\033[H','\033[?25l','\033[?25h' + +import atexit +def at_exit(): + import os + os.system('stty sane') + sys.stderr.write('\n') +atexit.register(at_exit) + +bc = bitcoin_connection() + +msg_r(CUR_HOME+ERASE_ALL) + +def do_display(): + from mmgen.term import get_terminal_size + global data + count = 1 + while True: + twid = get_terminal_size()[0] + data = bc.getpeerinfo() + min_t = None + lines = [] + with lock: + msg('{}{}{}ACTIVE PEERS ({}) - poll {}'.format( + CUR_HOME,ERASE_ALL,CUR_HOME,len(data),count)) + for d in data: + line = { 'id': d['id'], 'data': [] } + if 'inflight' in d and d['inflight']: + blks = [str(e) for e in d['inflight']] + min_p = min(e for e in d['inflight']) + if not min_t or min_t > min_p: min_t = min_p + line_d = ' '.join(blks)[:twid-6] + blks = blks[:len(line_d) - len(line_d.replace(' ','')) + 1] + blks[-1] = blks[-1][:len(line_d.split(' ')[-1])] + line['data'] = [[colors[int(i)%10],i,_reset] for i in blks if i] + else: + line['data'] = [] + lines.append(line) + for line in lines: + d = ' '.join([(a,_red)[int(b)==min_t]+b+c for a,b,c in line['data']]) + sys.stderr.write('\r{} {:>3}: {}\n'.format(ERASE_LINE,line['id'],d)) + msg_r(ERASE_ALL+'Hit ENTER for disconnect prompt: ') + time.sleep(2) + count += 1 + +lock = threading.Lock() +data = {} + +t = threading.Thread(target=do_display,name='display') +t.daemon = True +t.start() + +def do_loop(): + global data + while True: + raw_input() + with lock: + ids = [str(d['id']) for d in data] + msg('{}{}{}ACTIVE PEERS ({})'.format(CUR_HOME,ERASE_ALL,CUR_HOME,len(data))) + msg(' '+'\n '.join(['{:>3}: {:30} {}'.format(*[d[k] for k in 'id','addr','subver']) for d in data])) + reply = raw_input('Enter a peer number to disconnect> ') + if reply == '': + pass + elif reply in ids: + idx = ids.index(reply) + msg("Disconnecting peer {} ('{}')".format(reply,data[idx]['addr'])) + bc.disconnectnode(data[idx]['addr']) + time.sleep(1.5) + else: + msg("'{}': invalid peer number".format(reply)) + time.sleep(0.5) + +try: + do_loop() +except KeyboardInterrupt: + pass