|
|
@ -13,6 +13,7 @@ |
|
|
|
import argparse |
|
|
|
import asyncio |
|
|
|
import json |
|
|
|
import pprint |
|
|
|
from functools import partial |
|
|
|
from os import environ |
|
|
|
|
|
|
@ -21,6 +22,7 @@ class RPCClient(asyncio.Protocol): |
|
|
|
|
|
|
|
def __init__(self, loop): |
|
|
|
self.loop = loop |
|
|
|
self.method = None |
|
|
|
|
|
|
|
def connection_made(self, transport): |
|
|
|
self.transport = transport |
|
|
@ -28,15 +30,28 @@ class RPCClient(asyncio.Protocol): |
|
|
|
def connection_lost(self, exc): |
|
|
|
self.loop.stop() |
|
|
|
|
|
|
|
def send(self, payload): |
|
|
|
def send(self, method, params): |
|
|
|
self.method = method |
|
|
|
payload = {'method': method, 'params': params} |
|
|
|
data = json.dumps(payload) + '\n' |
|
|
|
self.transport.write(data.encode()) |
|
|
|
|
|
|
|
def data_received(self, data): |
|
|
|
payload = json.loads(data.decode()) |
|
|
|
self.transport.close() |
|
|
|
print(json.dumps(payload, indent=4, sort_keys=True)) |
|
|
|
|
|
|
|
result = payload['result'] |
|
|
|
error = payload['error'] |
|
|
|
if error: |
|
|
|
print("ERROR: {}".format(error)) |
|
|
|
else: |
|
|
|
if self.method == 'sessions': |
|
|
|
fmt = '{:<4} {:>23} {:>7} {:>15} {:>7}' |
|
|
|
print(fmt.format('Type', 'Peer', 'Subs', 'Client', 'Time')) |
|
|
|
for kind, peer, subs, client, time in result: |
|
|
|
print(fmt.format(kind, peer, '{:,d}'.format(subs) |
|
|
|
client, '{:,d}'.format(int(time))) |
|
|
|
else: |
|
|
|
pprint.pprint(result, indent=4) |
|
|
|
|
|
|
|
def main(): |
|
|
|
'''Send the RPC command to the server and print the result.''' |
|
|
@ -52,14 +67,12 @@ def main(): |
|
|
|
if args.port is None: |
|
|
|
args.port = int(environ.get('ELECTRUMX_RPC_PORT', 8000)) |
|
|
|
|
|
|
|
payload = {'method': args.command[0], 'params': args.param} |
|
|
|
|
|
|
|
loop = asyncio.get_event_loop() |
|
|
|
proto_factory = partial(RPCClient, loop) |
|
|
|
coro = loop.create_connection(proto_factory, 'localhost', args.port) |
|
|
|
try: |
|
|
|
transport, protocol = loop.run_until_complete(coro) |
|
|
|
protocol.send(payload) |
|
|
|
protocol.send(args.command[0], args.param) |
|
|
|
loop.run_forever() |
|
|
|
except OSError: |
|
|
|
print('error connecting - is ElectrumX catching up or not running?') |
|
|
|