047af5c343
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.
89 lines
2.4 KiB
Python
Executable File
89 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
from __future__ import print_function
|
|
import sys
|
|
import subprocess
|
|
import socket
|
|
import urlparse
|
|
import framework.rpc
|
|
import framework.daemon
|
|
import framework.wallet
|
|
|
|
USAGE = 'usage: python -i console.py [[[scheme]<host>:]<port> [[[scheme]<host>:]<port>...]]'
|
|
daemons = []
|
|
wallets = []
|
|
rpcs = []
|
|
for n in range(1, len(sys.argv)):
|
|
scheme='http'
|
|
host='127.0.0.1'
|
|
port=None
|
|
try:
|
|
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:
|
|
raise Exception('No wallet or daemon RPC on port ' + str(port))
|
|
s.close()
|
|
|
|
# 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:
|
|
raise Exception('Server is not a Monero process')
|
|
|
|
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:
|
|
import readline
|
|
except:
|
|
pass
|
|
else:
|
|
import rlcompleter
|
|
readline.parse_and_bind('tab: complete')
|
|
|
|
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))
|