*RPCConnection(): define RPC methods at instance creation time

This commit is contained in:
The MMGen Project 2018-05-26 10:01:31 +00:00
commit 82cd194ed3
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
2 changed files with 20 additions and 20 deletions

View file

@ -32,11 +32,13 @@ class RPCFailure(Exception): pass
class CoinDaemonRPCConnection(object):
def __init__(self,host=None,port=None,user=None,passwd=None,auth_cookie=None,auth=True):
auth = True
db_fs = ' host [{h}] port [{p}] user [{u}] passwd [{pw}] auth_cookie [{c}]\n'
def __init__(self,host=None,port=None,user=None,passwd=None,auth_cookie=None):
dmsg_rpc('=== {}.__init__() debug ==='.format(type(self).__name__))
dmsg_rpc(' host [{}] port [{}] user [{}] passwd [{}] auth_cookie [{}]\n'.format(
host,port,user,passwd,auth_cookie))
dmsg_rpc(self.db_fs.format(h=host,p=port,u=user,pw=passwd,c=auth_cookie))
import socket
try:
@ -44,8 +46,8 @@ class CoinDaemonRPCConnection(object):
except:
die(1,'Unable to connect to {}:{}'.format(host,port))
if not auth:
self.auth_str = ''
if not self.auth:
pass
elif user and passwd:
self.auth_str = '{}:{}'.format(user,passwd)
elif auth_cookie:
@ -67,6 +69,10 @@ class CoinDaemonRPCConnection(object):
self.host = host
self.port = port
for method in self.rpcmethods:
exec '{c}.{m} = lambda self,*args,**kwargs: self.request("{m}",*args,**kwargs)'.format(
c=type(self).__name__,m=method)
# Normal mode: call with arg list unrolled, exactly as with cli
# Batch mode: call with list of arg lists as first argument
# kwargs are for local use and are not passed to server
@ -113,12 +119,11 @@ class CoinDaemonRPCConnection(object):
return json.JSONEncoder.default(self,obj)
http_hdr = { 'Content-Type': 'application/json' }
if self.auth_str:
dmsg_rpc(' RPC AUTHORIZATION data ==> raw: [{}]\n{}enc: [Basic {}]\n'.format(
self.auth_str,' '*31,base64.b64encode(self.auth_str)))
http_hdr.update({
'Host': self.host,
'Authorization': 'Basic {}'.format(base64.b64encode(self.auth_str)) })
if self.auth:
fs = ' RPC AUTHORIZATION data ==> raw: [{}]\n{:>31}enc: [Basic {}]\n'
as_enc = base64.b64encode(self.auth_str)
dmsg_rpc(fs.format(self.auth_str,'',as_enc))
http_hdr.update({ 'Host':self.host, 'Authorization':'Basic {}'.format(as_enc) })
try:
hc.request('POST','/',json.dumps(p,cls=MyJSONEncoder),http_hdr)
@ -198,11 +203,11 @@ class CoinDaemonRPCConnection(object):
'walletpassphrase',
)
for name in rpcmethods:
exec "def {n}(self,*a,**k):return self.request('{n}',*a,**k)\n".format(n=name)
class EthereumRPCConnection(CoinDaemonRPCConnection):
auth = False
db_fs = ' host [{h}] port [{p}]\n'
rpcmethods = (
'eth_accounts',
'eth_blockNumber',
@ -234,10 +239,6 @@ class EthereumRPCConnection(CoinDaemonRPCConnection):
'parity_versionInfo',
)
for name in rpcmethods:
exec "def {n}(self,*a,**k):return self.request('{n}',*a,**k)\n".format(n=name)
def rpc_error(ret):
return type(ret) is tuple and ret and ret[0] == 'rpcfail'

View file

@ -842,8 +842,7 @@ def rpc_init(reinit=False):
if g.coin == 'ETH':
conn = mmgen.rpc.EthereumRPCConnection(
g.rpc_host or 'localhost',
g.rpc_port or g.proto.rpc_port,
auth=False)
g.rpc_port or g.proto.rpc_port)
if not g.daemon_version: # First call
g.daemon_version = conn.parity_versionInfo()['version'] # fail immediately if daemon is geth
g.chain = conn.parity_chain()