mmgen-wallet/examples/coin-daemon-info.py

94 lines
2.6 KiB
Python
Executable file

#!/usr/bin/env python3
#
# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
# Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
# Licensed under the GNU General Public License, Version 3:
# https://www.gnu.org/licenses
# Public project repositories:
# https://github.com/mmgen/mmgen-wallet
# https://gitlab.com/mmgen/mmgen-wallet
"""
examples/coin-daemon-info.py:
Get info about multiple running coin daemons.
Demonstrates use of the MMGen Config API.
"""
# Instructions
#
# Testing mode:
#
# 1) From the MMGen repository root, start the mainnet test suite daemons as follows
# (note that Geth is the default testing daemon for ETH):
#
# test/start-coin-daemons.py btc ltc eth
#
# 2) Then run the script as follows:
#
# PYTHONPATH=. MMGEN_TEST_SUITE=1 examples/coin-daemon-info.py btc ltc eth
#
# Live mode:
#
# 1) Start up one or more of bitcoind, litecoind or geth with the standard mainnet ports
# and datadirs. For geth, the options ‘--http --http.api=eth,web3’ are required.
#
# 2) Then run the script as follows:
#
# PYTHONPATH=. examples/coin-daemon-info.py btc ltc eth
import sys,os,asyncio
from mmgen.exception import SocketError
from mmgen.cfg import Config
from mmgen.rpc import rpc_init
from mmgen.util import make_timestr
async def get_rpc(cfg):
try:
return await rpc_init( cfg, ignore_wallet=True )
except SocketError:
return False
async def main(coins):
rpcs = {}
cfgs = {}
test_suite = os.getenv('MMGEN_TEST_SUITE')
base_cfg = Config({'pager':True})
for coin in coins:
cfg_in = {
'coin': coin,
'test_suite': test_suite,
}
if coin == 'eth' and not test_suite:
cfg_in.update({'daemon_id': 'geth'})
cfgs[coin] = Config(cfg_in)
rpcs[coin] = await get_rpc(cfgs[coin])
def gen_output():
fs = '{:4} {:7} {:6} {:<5} {:<8} {:30} {:13} {:23} {}'
yield fs.format('Coin','Network','Status','Port','Chain','Latest Block','Daemon','Version','Datadir')
for coin,rpc in rpcs.items():
info = ('Down','-','-','-','-','-','-') if rpc is False else (
'Up',
rpc.port,
rpc.chain,
f'{rpc.blockcount:<8} [{make_timestr(rpc.cur_date)}]',
rpc.daemon.coind_name,
rpc.daemon_version_str,
rpc.daemon.datadir
)
yield fs.format( coin.upper(), cfgs[coin].network, *info )
base_cfg._util.stdout_or_pager('\n'.join(gen_output()))
all_coins = ('btc', 'ltc', 'eth')
coins = sys.argv[1:]
if coins and all(coin in all_coins for coin in coins):
asyncio.run(main(coins))
else:
print(f'You must supply one or more of the following coins on the command line:\n {all_coins}')
sys.exit(1)