daemon.py, opts.py, globalvars.py, tool/wallet.py: minor cleanups

This commit is contained in:
The MMGen Project 2023-03-27 10:48:20 +00:00
commit 563b0ca7d0
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
8 changed files with 44 additions and 42 deletions

View file

@ -285,8 +285,8 @@ class CoinDaemon(Daemon):
ret = cls.coins[coin].daemon_ids
if 'erigon' in ret and not g.enable_erigon:
ret.remove('erigon')
if g.blacklist_daemons:
blacklist = g.blacklist_daemons.split()
if g.blacklisted_daemons:
blacklist = g.blacklisted_daemons.split()
def gen():
for daemon_id in ret:
if daemon_id in blacklist:

View file

@ -20,7 +20,7 @@
# Uncomment to force 256-color output when 'color' is true:
# force_256_color true
# Uncomment to use regtest mode (this also sets testnet to true):
# Uncomment to use regtest mode:
# regtest true
# Uncomment to use testnet instead of mainnet:

View file

@ -29,7 +29,7 @@ def die(exit_val,s=''):
sys.stderr.write(s+'\n')
sys.exit(exit_val)
class GlobalContext(Lockable):
class GlobalConfig(Lockable):
"""
Set global vars to default values
Globals are overridden in this order:
@ -117,6 +117,7 @@ class GlobalContext(Lockable):
debug_utf8 = False
exec_wrapper = False
test_suite = False
test_suite_autosign_led_simulate = False
test_suite_cfgtest = False
test_suite_deterministic = False
test_suite_pexpect = False
@ -147,10 +148,10 @@ class GlobalContext(Lockable):
else:
die(2,'$HOME is not set! Unable to determine home directory')
data_dir_root,data_dir,cfg_file = (None,None,None)
data_dir_root,data_dir = (None,None)
daemon_data_dir = '' # set by user
daemon_id = ''
blacklist_daemons = ''
blacklisted_daemons = ''
# must match CoinProtocol.coins
core_coins = ('btc','bch','ltc','eth','etc','zec','xmr')
@ -250,6 +251,7 @@ class GlobalContext(Lockable):
'MMGEN_COLUMNS',
'MMGEN_TEST_SUITE',
'MMGEN_TEST_SUITE_AUTOSIGN_LED_SIMULATE',
'MMGEN_TEST_SUITE_CFGTEST',
'MMGEN_TEST_SUITE_DETERMINISTIC',
'MMGEN_TEST_SUITE_PEXPECT',
@ -279,9 +281,7 @@ class GlobalContext(Lockable):
'MMGEN_IGNORE_DAEMON_VERSION',
'MMGEN_USE_STANDALONE_SCRYPT_MODULE',
'MMGEN_ENABLE_ERIGON',
'MMGEN_DISABLE_COLOR',
'MMGEN_DISABLE_MSWIN_PW_WARNING',
)
infile_opts = (
'keys_from_file',
@ -360,4 +360,4 @@ class GlobalContext(Lockable):
def release_date(self):
return self.get_mmgen_data_file(filename='release_date').strip()
g = GlobalContext()
g = GlobalConfig()

View file

@ -19,7 +19,7 @@
"""
opts: MMGen-specific options processing after generic processing by share.Opts
"""
import sys,os,stat
import sys,os
from .globalvars import g
from .base_obj import Lockable
@ -193,7 +193,7 @@ def override_globals_from_cfg_file(ucfg,autoset_opts,env_globals,need_proto):
from .util import die
die( 'CfgFileParseError', f'{d.name!r}: unrecognized option in {ucfg.fn!r}, line {d.lineno}' )
def override_globals_and_set_opts_from_env(opt):
def override_globals_from_env():
for name,val in ((k,v) for k,v in os.environ.items() if k.startswith('MMGEN_')):
if name == 'MMGEN_DEBUG_ALL':
continue
@ -204,11 +204,8 @@ def override_globals_and_set_opts_from_env(opt):
if hasattr(g,gname):
setattr(g,gname,set_for_type(val,getattr(g,gname),name,disable))
yield gname
elif hasattr(opt,gname):
if getattr(opt,gname) is None: # env must not override cmdline!
setattr(opt,gname,val)
else:
raise ValueError(f'Name {gname!r} not present in globals or opts')
raise ValueError(f'Name {gname!r} not present in globals')
else:
raise ValueError(f'{name!r} is not a valid MMGen environment variable')
@ -333,9 +330,18 @@ def init(
if opt.version:
version() # exits
if opt.show_hash_presets:
_show_hash_presets() # exits
from .term import init_term
init_term()
from .util import wrap_ripemd160
wrap_ripemd160() # ripemd160 used by mmgen_cfg_file()
# === begin global var initialization === #
env_globals = tuple(override_globals_and_set_opts_from_env(opt))
env_globals = tuple(override_globals_from_env())
"""
NB: user opt --data-dir is actually data_dir_root
@ -359,12 +365,6 @@ def init(
from .fileutil import check_or_create_dir
check_or_create_dir(g.data_dir_root)
from .term import init_term
init_term()
from .util import wrap_ripemd160
wrap_ripemd160() # ripemd160 used by mmgen_cfg_file()
cfgfile_autoset_opts = {}
if not (opt.skip_cfg_file or opt.bob or opt.alice or g.prog_name == 'mmgen-regtest'):
@ -408,9 +408,6 @@ def init(
else:
setattr(opt,k,getattr(g,k))
if opt.show_hash_presets: # exits
_show_hash_presets()
g.coin = g.coin.upper() or 'BTC'
g.token = g.token.upper() or None
@ -431,7 +428,7 @@ def init(
die_on_incompatible_opts(g.incompatible_opts)
check_or_create_dir(g.data_dir) # g.data_dir is finalized, so we can create it
check_or_create_dir(g.data_dir)
# Check user-set opts without modifying them
check_usr_opts(po.user_opts)

View file

@ -23,7 +23,6 @@ tool.wallet: Wallet routines for the 'mmgen-tool' utility
from .common import tool_cmd_base
from ..opts import opt
from ..fileutil import get_seed_file
from ..subseed import SubSeedList
from ..seedsplit import MasterShareIdx
from ..wallet import Wallet
@ -36,25 +35,26 @@ class tool_cmd(tool_cmd_base):
self.need_proto = True
super().__init__(cmdname=cmdname,proto=proto,mmtype=mmtype)
def _get_seed_file(self,wallet):
from ..fileutil import get_seed_file
return get_seed_file([wallet] if wallet else [],1)
def get_subseed(self,subseed_idx:str,wallet=''):
"get the Seed ID of a single subseed by Subseed Index for default or specified wallet"
opt.quiet = True
sf = get_seed_file([wallet] if wallet else [],1)
return Wallet(sf).seed.subseed(subseed_idx).sid
return Wallet(self._get_seed_file(wallet)).seed.subseed(subseed_idx).sid
def get_subseed_by_seed_id(self,seed_id:str,wallet='',last_idx=SubSeedList.dfl_len):
"get the Subseed Index of a single subseed by Seed ID for default or specified wallet"
opt.quiet = True
sf = get_seed_file([wallet] if wallet else [],1)
ret = Wallet(sf).seed.subseed_by_seed_id( seed_id, last_idx )
ret = Wallet(self._get_seed_file(wallet)).seed.subseed_by_seed_id( seed_id, last_idx )
return ret.ss_idx if ret else None
def list_subseeds(self,subseed_idx_range:str,wallet=''):
"list a range of subseed Seed IDs for default or specified wallet"
opt.quiet = True
sf = get_seed_file([wallet] if wallet else [],1)
from ..subseed import SubSeedIdxRange
return Wallet(sf).seed.subseeds.format( *SubSeedIdxRange(subseed_idx_range) )
return Wallet(self._get_seed_file(wallet)).seed.subseeds.format( *SubSeedIdxRange(subseed_idx_range) )
def list_shares(self,
share_count: int,
@ -63,8 +63,7 @@ class tool_cmd(tool_cmd_base):
wallet = '' ):
"list the Seed IDs of the shares resulting from a split of default or specified wallet"
opt.quiet = True
sf = get_seed_file([wallet] if wallet else [],1)
return Wallet(sf).seed.split( share_count, id_str, master_share ).format()
return Wallet(self._get_seed_file(wallet)).seed.split( share_count, id_str, master_share ).format()
def gen_key(self,mmgen_addr:str,wallet=''):
"generate a single WIF key for specified MMGen address from default or specified wallet"
@ -80,8 +79,7 @@ class tool_cmd(tool_cmd_base):
addr = MMGenID( self.proto, mmgen_addr )
opt.quiet = True
sf = get_seed_file([wallet] if wallet else [],1)
ss = Wallet(sf)
ss = Wallet(self._get_seed_file(wallet))
if ss.seed.sid != addr.sid:
from ..util import die

View file

@ -198,7 +198,7 @@ usr_args = parsed_opts.cmd_args
if opt.pexpect_spawn and g.platform == 'win':
die(1,'--pexpect-spawn option not supported on Windows platform, exiting')
if opt.daemon_id and opt.daemon_id in g.blacklist_daemons.split():
if opt.daemon_id and opt.daemon_id in g.blacklisted_daemons.split():
die(1,f'test.py: daemon {opt.daemon_id!r} blacklisted, exiting')
network_id = g.coin.lower() + ('_tn' if opt.testnet else '')
@ -907,6 +907,8 @@ class TestSuiteRunner(object):
elif ret == 'ok':
ok()
self.cmd_total += 1
elif ret == 'error':
die(2,red(f'\nTest {self.ts.test_name!r} failed'))
elif ret in ('skip','silent'):
pass
elif type(ret) == tuple and ret[0] == 'skip_warn':

View file

@ -98,13 +98,18 @@ class TestSuiteInput(TestSuiteBase):
cmd = ['python3','cmds/mmgen-walletconv','--in-fmt=words','--out-fmt=bip39','--outdir=test/trash']
mn = sample_mn['mmgen']['mn']
os.environ['MMGEN_TEST_SUITE'] = ''
cp = run( cmd, input=mn.encode(), stdout=PIPE, stderr=PIPE )
# the test can fail the first time if cfg file has changed, so run it twice if necessary:
for i in range(2):
cp = run( cmd, input=mn.encode(), stdout=PIPE, stderr=PIPE )
if b'written to file' in cp.stderr:
break
from mmgen.color import set_vt100
set_vt100()
os.environ['MMGEN_TEST_SUITE'] = '1'
assert b'written to file' in cp.stderr, "test 'get_seed_from_stdin' failed"
imsg(cp.stderr.decode().strip())
return 'ok'
return 'ok' if b'written to file' in cp.stderr else 'error'
def get_passphrase_ui(self):
t = self.spawn('test/misc/get_passphrase.py',['--usr-randchars=0','seed'],cmd_dir='.')

View file

@ -81,7 +81,7 @@ class unit_test(object):
lc.epsilon = [0]
class MyLockableClsCheck(Lockable): # class has attrs, like GlobalContext
class MyLockableClsCheck(Lockable): # class has attrs, like GlobalConfig
_autolock = False
_use_class_attr = True
_set_ok = ('foo','baz')