mirror of
				https://git.wownero.com/wownero/wownero.git
				synced 2024-08-15 01:03:23 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									9f9571aa3d
								
							
						
					
					
						commit
						047af5c343
					
				
					 3 changed files with 69 additions and 53 deletions
				
			
		| 
						 | 
				
			
			@ -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]<host>:]<port>'
 | 
			
		||||
try:
 | 
			
		||||
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:
 | 
			
		||||
    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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 = ""):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue