new file: mmnode-netrate

new file:   mmnode-peerblocks
This commit is contained in:
philemon 2017-08-05 13:54:53 +03:00
commit 3a1eb46bfd
Signed by untrusted user who does not match committer: mmgen
GPG key ID: 62DBE9E5212F05BE
2 changed files with 136 additions and 0 deletions

39
mmnode-netrate Executable file
View file

@ -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')

97
mmnode-peerblocks Executable file
View file

@ -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