xmrwallet.py: relocate code for base.rpc class

This commit is contained in:
The MMGen Project 2021-06-27 20:57:59 +00:00
commit 03a457a870
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2

View file

@ -45,6 +45,126 @@ class MoneroWalletOps:
class base:
wallet_exists = True
tx_relay = False
def check_uargs(self):
def check_host_arg(name):
val = getattr(uarg,name)
if not re.fullmatch(uarg_info[name].pat,val,re.ASCII):
die(1,'{!r}: invalid {!r} parameter: it must have format {!r}'.format(
val, name, uarg_info[name].annot ))
if uarg.op != 'create' and uarg.restore_height != 0:
die(1,"'restore_height' arg is supported only for create operation")
if uarg.restore_height < 0:
die(1,f"{uarg.restore_height}: invalid 'restore_height' arg (<0)")
if uarg.daemon:
check_host_arg('daemon')
if uarg.tx_relay_daemon:
if not self.tx_relay:
die(1,f"'tx_relay_daemon' arg is not recognized for operation {uarg.op!r}")
check_host_arg('tx_relay_daemon')
def __init__(self,uarg_tuple):
def wallet_exists(fn):
try: os.stat(fn)
except: return False
else: return True
def check_wallets():
for d in self.addr_data:
fn = self.get_wallet_fn(d)
exists = wallet_exists(fn)
if exists and not self.wallet_exists:
die(1,f'Wallet {fn!r} already exists!')
elif not exists and self.wallet_exists:
die(1,f'Wallet {fn!r} not found!')
global uarg, uarg_info, fmt_amt, hl_amt
uarg = uarg_tuple
uarg_info = xmrwallet_uarg_info
def fmt_amt(amt):
return self.proto.coin_amt(amt,from_unit='min_coin_unit').fmt(fs='5.12',color=True)
def hl_amt(amt):
return self.proto.coin_amt(amt,from_unit='min_coin_unit').hl()
self.check_uargs()
from .protocol import init_proto
self.proto = init_proto('xmr',testnet=g.testnet)
self.kal = KeyAddrList(self.proto,uarg.xmr_keyaddrfile)
self.create_addr_data()
check_wallets()
self.wd = MoneroWalletDaemon(
wallet_dir = opt.outdir or '.',
test_suite = g.test_suite,
daemon_addr = uarg.daemon or None,
testnet = g.testnet,
)
if uarg.start_wallet_daemon:
self.wd.restart()
self.c = MoneroWalletRPCClient(
host = self.wd.host,
port = self.wd.rpc_port,
user = self.wd.user,
passwd = self.wd.passwd
)
self.post_init()
def create_addr_data(self):
if uarg.wallets:
idxs = AddrIdxList(uarg.wallets)
self.addr_data = [d for d in self.kal.data if d.idx in idxs]
if len(self.addr_data) != len(idxs):
die(1,f'List {uarg.wallets!r} contains addresses not present in supplied key-address file')
else:
self.addr_data = self.kal.data
def stop_daemons(self):
if uarg.stop_wallet_daemon:
self.wd.stop()
if uarg.tx_relay_daemon:
self.wd2.stop()
def post_init(self): pass
def post_process(self): pass
def get_wallet_fn(self,d):
return os.path.join(
opt.outdir or '.','{}-{}-MoneroWallet{}{}'.format(
self.kal.al_id.sid,
d.idx,
'.testnet' if g.testnet else '',
'' if g.debug_utf8 else '' ))
async def process_wallets(self):
gmsg('\n{}ing {} wallet{}'.format(self.desc,len(self.addr_data),suf(self.addr_data)))
processed = 0
for n,d in enumerate(self.addr_data): # [d.sec,d.addr,d.wallet_passwd,d.viewkey]
fn = self.get_wallet_fn(d)
gmsg('\n{}ing wallet {}/{} ({})'.format(
self.desc,
n+1,
len(self.addr_data),
os.path.basename(fn),
))
processed += await self.run(d,fn)
gmsg('\n{} wallet{} {}'.format(processed,suf(processed),self.past))
return processed
class rpc:
def __init__(self,parent,d):
@ -197,126 +317,6 @@ class MoneroWalletOps:
except:
msg('\n'+str(ret))
wallet_exists = True
tx_relay = False
def check_uargs(self):
def check_host_arg(name):
val = getattr(uarg,name)
if not re.fullmatch(uarg_info[name].pat,val,re.ASCII):
die(1,'{!r}: invalid {!r} parameter: it must have format {!r}'.format(
val, name, uarg_info[name].annot ))
if uarg.op != 'create' and uarg.restore_height != 0:
die(1,"'restore_height' arg is supported only for create operation")
if uarg.restore_height < 0:
die(1,f"{uarg.restore_height}: invalid 'restore_height' arg (<0)")
if uarg.daemon:
check_host_arg('daemon')
if uarg.tx_relay_daemon:
if not self.tx_relay:
die(1,f"'tx_relay_daemon' arg is not recognized for operation {uarg.op!r}")
check_host_arg('tx_relay_daemon')
def __init__(self,uarg_tuple):
def wallet_exists(fn):
try: os.stat(fn)
except: return False
else: return True
def check_wallets():
for d in self.addr_data:
fn = self.get_wallet_fn(d)
exists = wallet_exists(fn)
if exists and not self.wallet_exists:
die(1,f'Wallet {fn!r} already exists!')
elif not exists and self.wallet_exists:
die(1,f'Wallet {fn!r} not found!')
global uarg, uarg_info, fmt_amt, hl_amt
uarg = uarg_tuple
uarg_info = xmrwallet_uarg_info
def fmt_amt(amt):
return self.proto.coin_amt(amt,from_unit='min_coin_unit').fmt(fs='5.12',color=True)
def hl_amt(amt):
return self.proto.coin_amt(amt,from_unit='min_coin_unit').hl()
self.check_uargs()
from .protocol import init_proto
self.proto = init_proto('xmr',testnet=g.testnet)
self.kal = KeyAddrList(self.proto,uarg.xmr_keyaddrfile)
self.create_addr_data()
check_wallets()
self.wd = MoneroWalletDaemon(
wallet_dir = opt.outdir or '.',
test_suite = g.test_suite,
daemon_addr = uarg.daemon or None,
testnet = g.testnet,
)
if uarg.start_wallet_daemon:
self.wd.restart()
self.c = MoneroWalletRPCClient(
host = self.wd.host,
port = self.wd.rpc_port,
user = self.wd.user,
passwd = self.wd.passwd
)
self.post_init()
def create_addr_data(self):
if uarg.wallets:
idxs = AddrIdxList(uarg.wallets)
self.addr_data = [d for d in self.kal.data if d.idx in idxs]
if len(self.addr_data) != len(idxs):
die(1,f'List {uarg.wallets!r} contains addresses not present in supplied key-address file')
else:
self.addr_data = self.kal.data
def stop_daemons(self):
if uarg.stop_wallet_daemon:
self.wd.stop()
if uarg.tx_relay_daemon:
self.wd2.stop()
def post_init(self): pass
def post_process(self): pass
def get_wallet_fn(self,d):
return os.path.join(
opt.outdir or '.','{}-{}-MoneroWallet{}{}'.format(
self.kal.al_id.sid,
d.idx,
'.testnet' if g.testnet else '',
'' if g.debug_utf8 else '' ))
async def process_wallets(self):
gmsg('\n{}ing {} wallet{}'.format(self.desc,len(self.addr_data),suf(self.addr_data)))
processed = 0
for n,d in enumerate(self.addr_data): # [d.sec,d.addr,d.wallet_passwd,d.viewkey]
fn = self.get_wallet_fn(d)
gmsg('\n{}ing wallet {}/{} ({})'.format(
self.desc,
n+1,
len(self.addr_data),
os.path.basename(fn),
))
processed += await self.run(d,fn)
gmsg('\n{} wallet{} {}'.format(processed,suf(processed),self.past))
return processed
class create(base):
name = 'create'
desc = 'Creat'