From 27355e0b27a87f5c1496cdc3e938bc1498f67f2f Mon Sep 17 00:00:00 2001 From: MMGen Date: Sun, 17 Mar 2019 15:07:11 +0000 Subject: [PATCH] handle environmental vars consistently --- mmgen/altcoins/eth/tx.py | 10 ++++------ mmgen/globalvars.py | 21 ++++++++++++++++----- mmgen/obj.py | 3 ++- mmgen/opts.py | 10 +++++----- mmgen/rpc.py | 2 +- mmgen/term.py | 4 ++-- mmgen/tx.py | 12 +++++------- 7 files changed, 35 insertions(+), 27 deletions(-) diff --git a/mmgen/altcoins/eth/tx.py b/mmgen/altcoins/eth/tx.py index 80b698b7..131ce19e 100755 --- a/mmgen/altcoins/eth/tx.py +++ b/mmgen/altcoins/eth/tx.py @@ -311,7 +311,7 @@ class EthereumMMGenTX(MMGenTX): msg('OK') return True except Exception as e: - if os.getenv('MMGEN_TRACEBACK'): + if g.traceback: import traceback ymsg('\n'+''.join(traceback.format_exception(*sys.exc_info()))) m = "{!r}: transaction signing failed!" @@ -352,8 +352,6 @@ class EthereumMMGenTX(MMGenTX): self.check_correct_chain(on_fail='die') - bogus_send = os.getenv('MMGEN_BOGUS_SEND') - fee = self.fee_rel2abs(self.txobj['gasPrice'].toWei()) if not self.disable_fee_check and fee > g.proto.max_tx_fee: @@ -364,7 +362,7 @@ class EthereumMMGenTX(MMGenTX): if prompt_user: self.confirm_send() - ret = None if bogus_send else g.rpch.eth_sendRawTransaction('0x'+self.hex,on_fail='return') + ret = None if g.bogus_send else g.rpch.eth_sendRawTransaction('0x'+self.hex,on_fail='return') from mmgen.rpc import rpc_error,rpc_errmsg if rpc_error(ret): @@ -373,8 +371,8 @@ class EthereumMMGenTX(MMGenTX): if exit_on_fail: sys.exit(1) return False else: - m = 'BOGUS transaction NOT sent: {}' if bogus_send else 'Transaction sent: {}' - if not bogus_send: + m = 'BOGUS transaction NOT sent: {}' if g.bogus_send else 'Transaction sent: {}' + if not g.bogus_send: assert ret == '0x'+self.coin_txid,'txid mismatch (after sending)' self.desc = 'sent transaction' msg(m.format(self.coin_txid.hl())) diff --git a/mmgen/globalvars.py b/mmgen/globalvars.py index bcc27358..ac805701 100755 --- a/mmgen/globalvars.py +++ b/mmgen/globalvars.py @@ -30,8 +30,6 @@ import sys,os class g(object): - skip_segwit_active_check = bool(os.getenv('MMGEN_TEST_SUITE')) - def die(ev=0,s=''): if s: sys.stderr.write(s+'\n') sys.exit(ev) @@ -88,6 +86,7 @@ class g(object): rpc_port = 0 rpc_user = '' rpc_password = '' + rpc_fail_on_command = '' rpch = None # global RPC handle bob = False @@ -95,7 +94,10 @@ class g(object): # test suite: bogus_wallet_data = '' + bogus_send = False debug_utf8 = False + traceback = False + test_suite = False for k in ('win','linux'): if sys.platform[:len(k)] == k: @@ -142,22 +144,31 @@ class g(object): 'eth_mainnet_chain_name','eth_testnet_chain_name', 'max_tx_file_size','max_input_size' ) + # Supported environmental vars + # The corresponding vars (lowercase, minus 'mmgen_') must be initialized in g + # 'DISABLE_' env vars disable the corresponding var in g env_opts = ( + 'MMGEN_DEBUG_ALL', # special: there is no g.debug_all var + + 'MMGEN_TEST_SUITE', 'MMGEN_BOGUS_WALLET_DATA', - 'MMGEN_DEBUG_ALL', + 'MMGEN_BOGUS_SEND', 'MMGEN_DEBUG', 'MMGEN_DEBUG_OPTS', 'MMGEN_DEBUG_RPC', 'MMGEN_DEBUG_ADDRLIST', 'MMGEN_DEBUG_UTF8', 'MMGEN_QUIET', - 'MMGEN_DISABLE_COLOR', 'MMGEN_FORCE_256_COLOR', 'MMGEN_MIN_URANDCHARS', 'MMGEN_NO_LICENSE', 'MMGEN_RPC_HOST', + 'MMGEN_RPC_FAIL_ON_COMMAND', 'MMGEN_TESTNET', - 'MMGEN_REGTEST' + 'MMGEN_REGTEST', + 'MMGEN_TRACEBACK', + + 'MMGEN_DISABLE_COLOR', ) min_screen_width = 80 diff --git a/mmgen/obj.py b/mmgen/obj.py index 1a92ef4b..462add19 100755 --- a/mmgen/obj.py +++ b/mmgen/obj.py @@ -122,7 +122,8 @@ class InitErrors(object): @staticmethod def init_fail(m,on_fail): - if os.getenv('MMGEN_TRACEBACK'): on_fail == 'raise' + from mmgen.globalvars import g + if g.traceback: on_fail == 'raise' from mmgen.util import die,msg if on_fail == 'silent': return None # TODO: return False instead? elif on_fail == 'raise': raise ValueError(m) diff --git a/mmgen/opts.py b/mmgen/opts.py index f2e2ddd1..22b7bf86 100755 --- a/mmgen/opts.py +++ b/mmgen/opts.py @@ -161,11 +161,11 @@ def override_from_env(): from mmgen.util import set_for_type for name in g.env_opts: if name == 'MMGEN_DEBUG_ALL': continue - idx,invert_bool = ((6,False),(14,True))[name[:14]=='MMGEN_DISABLE_'] + disable = name[:14] == 'MMGEN_DISABLE_' val = os.getenv(name) # os.getenv() returns None if env var is unset - if val: # exclude empty string values too - gname = name[idx:].lower() - setattr(g,gname,set_for_type(val,getattr(g,gname),name,invert_bool)) + if val: # exclude empty string values; string value of '0' or 'false' sets variable to False + gname = name[(6,14)[disable]:].lower() + setattr(g,gname,set_for_type(val,getattr(g,gname),name,disable)) def warn_altcoins(trust_level): if trust_level == None: return @@ -176,7 +176,7 @@ responsibility for any loss of funds you may incur. This coin's {pn} testing status: {} Are you sure you want to continue? """.strip().format(g.coin,tl[trust_level],pn=g.proj_name) - if os.getenv('MMGEN_TEST_SUITE'): + if g.test_suite: msg(m); return if not keypress_confirm(m,default_yes=True): sys.exit(0) diff --git a/mmgen/rpc.py b/mmgen/rpc.py index f30e9813..dfd0174c 100755 --- a/mmgen/rpc.py +++ b/mmgen/rpc.py @@ -80,7 +80,7 @@ class CoinDaemonRPCConnection(object): # With on_fail='return', returns 'rpcfail',(resp_object,(die_args)) def request(self,cmd,*args,**kwargs): - if os.getenv('MMGEN_RPC_FAIL_ON_COMMAND') == cmd: + if g.rpc_fail_on_command == cmd: cmd = 'badcommand_' + cmd cf = { 'timeout':g.http_timeout, 'batch':False, 'on_fail':'raise' } diff --git a/mmgen/term.py b/mmgen/term.py index 6efc21a2..b16e4a4c 100755 --- a/mmgen/term.py +++ b/mmgen/term.py @@ -38,7 +38,7 @@ except: def _kb_hold_protect_unix(): - if os.getenv('MMGEN_TEST_SUITE'): return + if g.test_suite: return fd = sys.stdin.fileno() old = termios.tcgetattr(fd) @@ -64,7 +64,7 @@ def _get_keypress_unix(prompt='',immed_chars='',prehold_protect=True,num_chars=5 old = termios.tcgetattr(fd) tty.setcbreak(fd) immed_chars = immed_chars.encode() - if os.getenv('MMGEN_TEST_SUITE'): prehold_protect = False + if g.test_suite: prehold_protect = False while True: # Protect against held-down key before read() key = select([sys.stdin], [], [], timeout)[0] diff --git a/mmgen/tx.py b/mmgen/tx.py index 00fad275..b008aeff 100755 --- a/mmgen/tx.py +++ b/mmgen/tx.py @@ -89,7 +89,7 @@ def segwit_is_active(exit_on_error=False): and 'segwit' in d['bip9_softforks'] and d['bip9_softforks']['segwit']['status'] == 'active'): return True - if g.skip_segwit_active_check: + if g.test_suite: return True if exit_on_error: die(2,'Segwit not active on this chain. Exiting') @@ -731,7 +731,7 @@ Selected non-{pnm} inputs: {{}}""".strip().format(pnm=g.proj_name,pnl=g.proj_nam msg('OK') return True except Exception as e: - if os.getenv('MMGEN_TRACEBACK'): + if g.traceback: import traceback ymsg('\n'+''.join(traceback.format_exception(*sys.exc_info()))) try: m = '{}'.format(e.args[0]) @@ -897,9 +897,7 @@ Selected non-{pnm} inputs: {{}}""".strip().format(pnm=g.proj_name,pnl=g.proj_nam self.check_hex_tx_matches_mmgen_tx(DeserializedTX(self.hex)) - bogus_send = os.getenv('MMGEN_BOGUS_SEND') - - if self.has_segwit_outputs() and not segwit_is_active() and not bogus_send: + if self.has_segwit_outputs() and not segwit_is_active() and not g.bogus_send: m = 'Transaction has MMGen Segwit outputs, but this blockchain does not support Segwit' die(2,m+' at the current height') @@ -911,7 +909,7 @@ Selected non-{pnm} inputs: {{}}""".strip().format(pnm=g.proj_name,pnl=g.proj_nam if prompt_user: self.confirm_send() - ret = None if bogus_send else g.rpch.sendrawtransaction(self.hex,on_fail='return') + ret = None if g.bogus_send else g.rpch.sendrawtransaction(self.hex,on_fail='return') from mmgen.rpc import rpc_error,rpc_errmsg if rpc_error(ret): @@ -932,7 +930,7 @@ Selected non-{pnm} inputs: {{}}""".strip().format(pnm=g.proj_name,pnl=g.proj_nam if exit_on_fail: sys.exit(1) return False else: - if bogus_send: + if g.bogus_send: m = 'BOGUS transaction NOT sent: {}' else: assert ret == self.coin_txid, 'txid mismatch (after sending)'