From 047af5c3430c90f93b7d00bcd86b189115b7f685 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Sat, 6 Apr 2019 11:34:59 +0000 Subject: [PATCH] console.py: can now connect to several daemons/wallets Also throw exceptions instead of print+exit, since that makes the error print last, below the python stack trace, where it's much less easy to miss it. --- utils/python-rpc/console.py | 118 +++++++++++++++------------ utils/python-rpc/framework/daemon.py | 2 + utils/python-rpc/framework/wallet.py | 2 + 3 files changed, 69 insertions(+), 53 deletions(-) diff --git a/utils/python-rpc/console.py b/utils/python-rpc/console.py index 1d831c711..57a04528b 100755 --- a/utils/python-rpc/console.py +++ b/utils/python-rpc/console.py @@ -5,63 +5,62 @@ import sys import subprocess import socket import urlparse -from framework import rpc -from framework import wallet -from framework import daemon +import framework.rpc +import framework.daemon +import framework.wallet -scheme='http' -host='127.0.0.1' -port=None - -USAGE = 'usage: python -i console.py [[scheme]:]' -try: +USAGE = 'usage: python -i console.py [[[scheme]:] [[[scheme]:]...]]' +daemons = [] +wallets = [] +rpcs = [] +for n in range(1, len(sys.argv)): + scheme='http' + host='127.0.0.1' + port=None try: - port = int(sys.argv[1]) - except: - t = urlparse.urlparse(sys.argv[1], allow_fragments = False) - scheme = t.scheme or scheme - host = t.hostname or host - port = t.port or port - if scheme != 'http' and scheme != 'https': - print(USAGE) - sys.exit(1) - if port <= 0 or port > 65535: - print(USAGE) - sys.exit(1) -except Exception, e: - print('Error: ' + str(e)) - print(USAGE) - sys.exit(1) + try: + port = int(sys.argv[n]) + except: + t = urlparse.urlparse(sys.argv[n], allow_fragments = False) + scheme = t.scheme or scheme + host = t.hostname or host + port = t.port or port + if scheme != 'http' and scheme != 'https': + raise Exception(USAGE) + if port <= 0 or port > 65535: + raise Exception(USAGE) + except Exception, e: + print('Error: ' + str(e)) + raise Exception(USAGE) -# check for open port -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -s.settimeout(1) -if s.connect_ex((host, port)) != 0: - print('No wallet or daemon RPC on port ' + str(port)) - sys.exit(1) -s.close() + # check for open port + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(1) + if s.connect_ex((host, port)) != 0: + raise Exception('No wallet or daemon RPC on port ' + str(port)) + s.close() -# both wallet and daemon have a get_version JSON RPC -rpc = rpc.JSONRPC('{protocol}://{host}:{port}'.format(protocol=scheme, host=host, port=port)) -get_version = { - 'method': 'get_version', - 'jsonrpc': '2.0', - 'id': '0' -} -try: - res = rpc.send_json_rpc_request(get_version) -except Exception, e: - print('Failed to call version RPC: ' + str(e)) - sys.exit(1) + # both wallet and daemon have a get_version JSON RPC + rpc = framework.rpc.JSONRPC('{protocol}://{host}:{port}'.format(protocol=scheme, host=host, port=port)) + get_version = { + 'method': 'get_version', + 'jsonrpc': '2.0', + 'id': '0' + } + try: + res = rpc.send_json_rpc_request(get_version) + except Exception, e: + raise Exception('Failed to call version RPC: ' + str(e)) -if 'version' not in res: - print('Server is not a monero process') - sys.exit(1) + if 'version' not in res: + raise Exception('Server is not a Monero process') -if 'status' in res: - rpc = daemon.Daemon(port=port) -else: - rpc = wallet.Wallet(port=port) + if 'status' in res: + daemons.append(framework.daemon.Daemon(port=port)) + rpcs.append(daemons[-1]) + else: + wallets.append(framework.wallet.Wallet(port=port)) + rpcs.append(wallets[-1]) # add tab completion if we can: https://stackoverflow.com/questions/246725 try: @@ -72,5 +71,18 @@ else: import rlcompleter readline.parse_and_bind('tab: complete') -print('Connected to %s RPC on port %u' % ('daemon' if 'status' in res else 'wallet', port)) -print('The \'rpc\' object may now be used to use the API') +if len(daemons) == 1: + daemon = daemons[0] +if len(wallets) == 1: + wallet = wallets[0] + +didx = 0 +widx = 0 +for rpc in rpcs: + if type(rpc) == framework.daemon.Daemon: + var = "daemon" if len(daemons) == 1 else "daemons[" + str(didx) + "]" + didx += 1 + else: + var = "wallet" if len(wallets) == 1 else "wallets[" + str(widx) + "]" + widx += 1 + print('Variable \'%s\' connected to %s RPC on %s:%u' % (var, 'daemon' if type(rpc) == framework.daemon.Daemon else 'wallet', rpc.host ,rpc.port)) diff --git a/utils/python-rpc/framework/daemon.py b/utils/python-rpc/framework/daemon.py index 7968ef7fd..f4d5e90f0 100644 --- a/utils/python-rpc/framework/daemon.py +++ b/utils/python-rpc/framework/daemon.py @@ -33,6 +33,8 @@ from .rpc import JSONRPC class Daemon(object): def __init__(self, protocol='http', host='127.0.0.1', port=0, idx=0): + self.host = host + self.port = port self.rpc = JSONRPC('{protocol}://{host}:{port}'.format(protocol=protocol, host=host, port=port if port else 18180+idx)) def getblocktemplate(self, address, prev_block = ""): diff --git a/utils/python-rpc/framework/wallet.py b/utils/python-rpc/framework/wallet.py index fd104da5f..a80aaefec 100644 --- a/utils/python-rpc/framework/wallet.py +++ b/utils/python-rpc/framework/wallet.py @@ -33,6 +33,8 @@ from .rpc import JSONRPC class Wallet(object): def __init__(self, protocol='http', host='127.0.0.1', port=0, idx=0): + self.host = host + self.port = port self.rpc = JSONRPC('{protocol}://{host}:{port}'.format(protocol=protocol, host=host, port=port if port else 18090+idx)) def make_uniform_destinations(self, address, transfer_amount, transfer_number_of_destinations=1):