From cbdd9db75e99a1592c527149f1da751f805af492 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Fri, 24 Mar 2023 20:31:11 +0000 Subject: [PATCH] add Monero daemon version checking --- mmgen/data/version | 2 +- mmgen/proto/xmr/daemon.py | 2 +- mmgen/proto/xmr/rpc.py | 17 ++++++++++++++++- mmgen/tool/rpc.py | 20 +++++++++++++++++--- mmgen/xmrwallet.py | 5 +++++ test/test_py_d/ts_xmrwallet.py | 5 +++++ test/unit_tests_d/ut_rpc.py | 11 +++++++++-- 7 files changed, 54 insertions(+), 8 deletions(-) diff --git a/mmgen/data/version b/mmgen/data/version index 57da977a..97179a09 100644 --- a/mmgen/data/version +++ b/mmgen/data/version @@ -1 +1 @@ -13.3.dev37 +13.3.dev38 diff --git a/mmgen/proto/xmr/daemon.py b/mmgen/proto/xmr/daemon.py index 74bcbb14..2b704361 100755 --- a/mmgen/proto/xmr/daemon.py +++ b/mmgen/proto/xmr/daemon.py @@ -20,7 +20,7 @@ from ...util import list_gen,die from ...daemon import CoinDaemon,RPCDaemon,_nw,_dd class monero_daemon(CoinDaemon): - daemon_data = _dd('Monero', 'N/A', 'N/A') + daemon_data = _dd('Monero', 18002000, '0.18.2.0-release') networks = ('mainnet','testnet') exec_fn = 'monerod' testnet_dir = 'stagenet' diff --git a/mmgen/proto/xmr/rpc.py b/mmgen/proto/xmr/rpc.py index 941c7fc6..5c99f349 100755 --- a/mmgen/proto/xmr/rpc.py +++ b/mmgen/proto/xmr/rpc.py @@ -12,6 +12,8 @@ proto.xmr.rpc: Monero base protocol RPC client class """ +import re +from ...globalvars import g from ...rpc import RPCClient,IPPort,auth_data class MoneroRPCClient(RPCClient): @@ -29,7 +31,8 @@ class MoneroRPCClient(RPCClient): passwd, test_connection = True, proxy = None, - daemon = None ): + daemon = None, + ignore_daemon_version = False ): self.proto = proto @@ -54,6 +57,18 @@ class MoneroRPCClient(RPCClient): self.daemon = daemon + if test_connection: + # https://github.com/monero-project/monero src/rpc/rpc_version_str.cpp + self.daemon_version_str = self.call_raw('getinfo')['version'] + self.daemon_version = sum( + int(m) * (1000 ** n) for n,m in + enumerate(reversed(re.match(r'(\d+)\.(\d+)\.(\d+)\.(\d+)',self.daemon_version_str).groups())) + ) + if self.daemon and self.daemon_version > self.daemon.coind_version: + self.handle_unsupported_daemon_version( + proto.name, + ignore_daemon_version or g.ignore_daemon_version ) + def call(self,method,*params,**kwargs): assert params == (), f'{type(self).__name__}.call() accepts keyword arguments only' return self.process_http_resp(self.backend.run_noasync( diff --git a/mmgen/tool/rpc.py b/mmgen/tool/rpc.py index 9686d956..c32547ee 100755 --- a/mmgen/tool/rpc.py +++ b/mmgen/tool/rpc.py @@ -32,9 +32,23 @@ class tool_cmd(tool_cmd_base): async def daemon_version(self): "print coin daemon version" - from ..rpc import rpc_init - r = await rpc_init( self.proto, ignore_daemon_version=True ) - return f'{r.daemon.coind_name} version {r.daemon_version} ({r.daemon_version_str})' + from ..daemon import CoinDaemon + from ..globalvars import g + d = CoinDaemon( proto=self.proto, test_suite=g.test_suite ) + if self.proto.base_proto == 'Monero': + from ..proto.xmr.rpc import MoneroRPCClient + r = MoneroRPCClient( + proto = self.proto, + daemon = d, + host = d.host, + port = d.rpc_port, + user = None, + passwd = None, + ignore_daemon_version = True ) + else: + from ..rpc import rpc_init + r = await rpc_init( self.proto, ignore_daemon_version=True ) + return f'{d.coind_name} version {r.daemon_version} ({r.daemon_version_str})' async def getbalance(self, minconf: 'minimum number of confirmations' = 1, diff --git a/mmgen/xmrwallet.py b/mmgen/xmrwallet.py index a9e323b6..da268ff9 100755 --- a/mmgen/xmrwallet.py +++ b/mmgen/xmrwallet.py @@ -628,8 +628,11 @@ class MoneroWalletOps: super().__init__(uarg_tuple,uopt_tuple) host,port = uopt.daemon.split(':') if uopt.daemon else ('localhost',self.wd.daemon_port) + + from .daemon import CoinDaemon self.dc = MoneroRPCClient( proto = self.proto, + daemon = CoinDaemon('xmr'), host = host, port = int(port), user = None, @@ -930,6 +933,7 @@ class MoneroWalletOps: m = re.fullmatch(uarg_info['tx_relay_daemon'].pat,uopt.tx_relay_daemon,re.ASCII) host,port = m[1].split(':') proxy = m[2] + md = None else: from .daemon import CoinDaemon md = CoinDaemon('xmr',test_suite=g.test_suite) @@ -938,6 +942,7 @@ class MoneroWalletOps: self.dc = MoneroRPCClient( proto = self.proto, + daemon = md, host = host, port = int(port), user = None, diff --git a/test/test_py_d/ts_xmrwallet.py b/test/test_py_d/ts_xmrwallet.py index f0641ab2..15adbe18 100755 --- a/test/test_py_d/ts_xmrwallet.py +++ b/test/test_py_d/ts_xmrwallet.py @@ -46,6 +46,7 @@ class TestSuiteXMRWallet(TestSuiteBase): socks_port = 49237 cmd_group = ( + ('daemon_version', 'checking daemon version'), ('gen_kafiles', 'generating key-address files'), ('create_wallets_miner', 'creating Monero wallets (Miner)'), ('mine_initial_coins', 'mining initial coins'), @@ -266,6 +267,10 @@ class TestSuiteXMRWallet(TestSuiteBase): # cmd_group methods + def daemon_version(self): + rpc_port = self.users['miner'].md.rpc_port + return self.spawn( 'mmgen-tool', ['--coin=xmr', f'--rpc-port={rpc_port}', 'daemon_version'] ) + def gen_kafiles(self): for user,data in self.users.items(): if not data.kal_range: diff --git a/test/unit_tests_d/ut_rpc.py b/test/unit_tests_d/ut_rpc.py index dfb8756f..02265ef5 100755 --- a/test/unit_tests_d/ut_rpc.py +++ b/test/unit_tests_d/ut_rpc.py @@ -44,14 +44,20 @@ def cfg_file_auth_test(proto,d,bad_auth=False): def print_daemon_info(rpc): - msg(f""" + if rpc.proto.base_proto == 'Monero': + msg(f""" + DAEMON VERSION: {rpc.daemon_version} [{rpc.daemon_version_str}] + NETWORK: {rpc.proto.coin} {rpc.proto.network.upper()} + """.rstrip()) + else: + msg(f""" DAEMON VERSION: {rpc.daemon_version} [{rpc.daemon_version_str}] CAPS: {rpc.caps} NETWORK: {rpc.proto.coin} {rpc.proto.network.upper()} CHAIN: {rpc.chain} BLOCKCOUNT: {rpc.blockcount} CUR_DATE: {rpc.cur_date} [{make_timestr(rpc.cur_date)}] - """.rstrip()) + """.rstrip()) if rpc.proto.base_proto == 'Bitcoin': def fmt_dict(d): @@ -168,6 +174,7 @@ class unit_tests: passwd = None, daemon = md, ) + print_daemon_info(rpc) rpc.call_raw('get_height') rpc.call('get_last_block_header')