aboutsummaryrefslogtreecommitdiff
path: root/utils/python-rpc/console.py
blob: 1d831c711a01f118bac9fb43c7368a54ef2c4062 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python

from __future__ import print_function
import sys
import subprocess
import socket
import urlparse
from framework import rpc
from framework import wallet
from framework import daemon

scheme='http'
host='127.0.0.1'
port=None

USAGE = 'usage: python -i console.py [[scheme]<host>:]<port>'
try:
  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)

# 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()

# 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)

if 'version' not in res:
  print('Server is not a monero process')
  sys.exit(1)

if 'status' in res:
  rpc = daemon.Daemon(port=port)
else:
  rpc = wallet.Wallet(port=port)

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

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