def get_data_from_cfg_file(): from mmgen.util import msg, die, check_or_create_dir check_or_create_dir(g.data_dir_root) # dies on error template_data = get_cfg_template_data() data = {} def copy_template_data(fn): try: with open(fn, 'wb') as f: f.write(template_data) os.chmod(fn, 0600) except: die(2, u"ERROR: unable to write to datadir '{}'".format(g.data_dir)) for k, suf in (('cfg', ''), ('sample', '.sample')): try: with open(g.cfg_file + suf, 'rb') as f: data[k] = f.read().decode('utf8') except: if template_data: copy_template_data(g.cfg_file + suf) data[k] = template_data else: data[k] = u'' if template_data and data['sample'] != template_data: g.cfg_options_changed = True copy_template_data(g.cfg_file + '.sample') return data['cfg']
def get_data_from_cfg_file(): from mmgen.util import msg,die,check_or_create_dir check_or_create_dir(g.data_dir_root) # dies on error template_data = get_cfg_template_data() data = {} def copy_template_data(fn): try: with open(fn,'wb') as f: f.write(template_data) os.chmod(fn,0600) except: die(2,"ERROR: unable to write to datadir '{}'".format(g.data_dir)) for k,suf in (('cfg',''),('sample','.sample')): try: with open(g.cfg_file+suf,'rb') as f: data[k] = f.read().decode('utf8') except: if template_data: copy_template_data(g.cfg_file+suf) data[k] = template_data else: data[k] = u'' if template_data and data['sample'] != template_data: g.cfg_options_changed = True copy_template_data(g.cfg_file+'.sample') return data['cfg']
def get_data_from_config_file(): from mmgen.util import msg, die, check_or_create_dir check_or_create_dir(g.data_dir_root) # dies on error # https://wiki.debian.org/Python: # Debian (Ubuntu) sys.prefix is '/usr' rather than '/usr/local, so add 'local' # TODO - test for Windows # This must match the configuration in setup.py data = u'' try: with open(g.cfg_file, 'rb') as f: data = f.read().decode('utf8') except: cfg_template = os.path.join( *([sys.prefix] + (['share'], ['local', 'share'])[g.platform == 'linux'] + [g.proj_name.lower(), os.path.basename(g.cfg_file)])) try: with open(cfg_template, 'rb') as f: template_data = f.read() except: msg("WARNING: configuration template not found at '{}'".format( cfg_template)) else: try: with open(g.cfg_file, 'wb') as f: f.write(template_data) os.chmod(g.cfg_file, 0600) except: die( 2, "ERROR: unable to write to datadir '{}'".format( g.data_dir)) return data
def opt_postproc_initializations(): from mmgen.term import set_terminal_vars set_terminal_vars() # testnet data_dir differs from data_dir_root, so check or create from mmgen.util import msg,die,check_or_create_dir check_or_create_dir(g.data_dir) # dies on error from mmgen.color import init_color init_color(enable_color=g.color,num_colors=('auto',256)[bool(g.force_256_color)]) if g.platform == 'win': start_mscolor() g.coin = g.coin.upper() # allow user to use lowercase
def opt_postproc_initializations(): from mmgen.term import set_terminal_vars set_terminal_vars() # testnet data_dir differs from data_dir_root, so check or create from mmgen.util import msg, die, check_or_create_dir check_or_create_dir(g.data_dir) # dies on error from mmgen.color import init_color init_color(enable_color=g.color, num_colors=('auto', 256)[bool(g.force_256_color)]) if g.platform == 'win': start_mscolor() g.coin = g.coin.upper() # allow user to use lowercase
def init(opts_f, add_opts=[], opt_filter=None): from mmgen.protocol import CoinProtocol, BitcoinProtocol, init_genonly_altcoins g.proto = BitcoinProtocol # this must be initialized to something before opts_f is called # most, but not all, of these set the corresponding global var common_opts_data = """ --, --accept-defaults Accept defaults at all prompts --, --coin=c Choose coin unit. Default: {cu_dfl}. Options: {cu_all} --, --color=0|1 Disable or enable color output --, --force-256-color Force 256-color output when color is enabled --, --daemon-data-dir=d Specify coin daemon data directory location 'd' --, --data-dir=d Specify {pnm} data directory location 'd' --, --no-license Suppress the GPL license prompt --, --rpc-host=h Communicate with {dn} running on host 'h' --, --rpc-port=p Communicate with {dn} listening on port 'p' --, --rpc-user=user Override 'rpcuser' in {pn}.conf --, --rpc-password=pass Override 'rpcpassword' in {pn}.conf --, --regtest=0|1 Disable or enable regtest mode --, --testnet=0|1 Disable or enable testnet --, --skip-cfg-file Skip reading the configuration file --, --version Print version information and exit --, --bob Switch to user "Bob" in MMGen regtest setup --, --alice Switch to user "Alice" in MMGen regtest setup """.format(pnm=g.proj_name, pn=g.proto.name, dn=g.proto.daemon_name, cu_dfl=g.coin, cu_all=' '.join(CoinProtocol.coins)) opts_data = opts_f() opts_data['long_options'] = common_opts_data version_info = """ {pgnm_uc} version {g.version} Part of the {pnm} suite, an online/offline cryptocoin wallet for the command line. Copyright (C) {g.Cdates} {g.author} {g.email} """.format(pnm=g.proj_name, g=g, pgnm_uc=g.prog_name.upper()).strip() uopts,args,short_opts,long_opts,skipped_opts,do_help = \ mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter,skip_help=True) if g.debug_opts: opt_preproc_debug(short_opts, long_opts, skipped_opts, uopts, args) # Save this for usage() global usage_txt usage_txt = opts_data['usage'] # Transfer uopts into opt, setting program's opts + required opts to None if not set by user for o in tuple([s.rstrip('=') for s in long_opts] + add_opts + skipped_opts) + \ g.required_opts + g.common_opts: setattr(opt, o, uopts[o] if o in uopts else None) if opt.version: Die(0, version_info) from mmgen.common import set_debug_all set_debug_all() # === Interaction with global vars begins here === # NB: user opt --data-dir is actually g.data_dir_root # cfg file is in g.data_dir_root, wallet and other data are in g.data_dir # We must set g.data_dir_root and g.cfg_file from cmdline before processing cfg file set_data_dir_root() if not opt.skip_cfg_file: override_from_cfg_file(get_data_from_cfg_file()) override_from_env() # User opt sets global var - do these here, before opt is set from g.global_sets_opt for k in g.common_opts: val = getattr(opt, k) if val != None: setattr(g, k, set_for_type(val, getattr(g, k), '--' + k)) if g.regtest: g.testnet = True # These are equivalent for now altcoin_trust_level = init_genonly_altcoins(opt.coin) # g.testnet is set, so we can set g.proto g.proto = CoinProtocol(g.coin, g.testnet) # global sets proto if g.daemon_data_dir: g.proto.daemon_data_dir = g.daemon_data_dir # g.proto is set, so we can set g.data_dir g.data_dir = os.path.normpath( os.path.join(g.data_dir_root, g.proto.data_subdir)) # If user opt is set, convert its type based on value in mmgen.globalvars (g) # If unset, set it to default value in mmgen.globalvars (g) setattr(opt, 'set_by_user', []) for k in g.global_sets_opt: if k in opt.__dict__ and getattr(opt, k) != None: setattr(opt, k, set_for_type(getattr(opt, k), getattr(g, k), '--' + k)) opt.set_by_user.append(k) else: setattr(opt, k, g.__dict__[k]) if opt.show_hash_presets: _show_hash_presets() sys.exit(0) if opt.verbose: opt.quiet = None die_on_incompatible_opts(g.incompatible_opts) opt_postproc_initializations() if do_help: # print help screen only after global vars are initialized opts_data = opts_f() opts_data['long_options'] = common_opts_data if g.debug_utf8: for k in opts_data: if type(opts_data[k]) in (str, unicode): opts_data[k] += u'-α' mmgen.share.Opts.parse_opts(sys.argv, opts_data, opt_filter=opt_filter) if g.bob or g.alice: g.testnet = True g.regtest = True g.proto = CoinProtocol(g.coin, g.testnet) g.data_dir = os.path.join(g.data_dir_root, 'regtest', g.coin.lower(), ('alice', 'bob')[g.bob]) check_or_create_dir(g.data_dir) import regtest as rt g.rpc_host = 'localhost' g.rpc_port = rt.rpc_port g.rpc_user = rt.rpc_user g.rpc_password = rt.rpc_password if g.regtest and hasattr(g.proto, 'bech32_hrp_rt'): g.proto.bech32_hrp = g.proto.bech32_hrp_rt # Check user-set opts without modifying them if not check_opts(uopts): sys.exit(1) if hasattr(g, 'cfg_options_changed'): ymsg("Warning: config file options have changed! See '{}' for details". format(g.cfg_file + '.sample')) my_raw_input('Hit ENTER to continue: ') if g.debug and g.prog_name != 'test.py': opt.verbose, opt.quiet = True, None if g.debug_opts: opt_postproc_debug() # We don't need this data anymore del mmgen.share.Opts del opts_f for k in ('prog_name', 'desc', 'usage', 'options', 'notes'): if k in opts_data: del opts_data[k] g.altcoin_data_dir = os.path.join(g.data_dir, 'altcoins') warn_altcoins(altcoin_trust_level) return args
def init(opts_f,add_opts=[],opt_filter=None): from mmgen.protocol import CoinProtocol,BitcoinProtocol,init_genonly_altcoins g.proto = BitcoinProtocol # this must be initialized to something before opts_f is called # most, but not all, of these set the corresponding global var common_opts_data = """ --, --accept-defaults Accept defaults at all prompts --, --coin=c Choose coin unit. Default: {cu_dfl}. Options: {cu_all} --, --color=0|1 Disable or enable color output --, --force-256-color Force 256-color output when color is enabled --, --daemon-data-dir=d Specify coin daemon data directory location 'd' --, --data-dir=d Specify {pnm} data directory location 'd' --, --no-license Suppress the GPL license prompt --, --rpc-host=h Communicate with {dn} running on host 'h' --, --rpc-port=p Communicate with {dn} listening on port 'p' --, --rpc-user=user Override 'rpcuser' in {pn}.conf --, --rpc-password=pass Override 'rpcpassword' in {pn}.conf --, --regtest=0|1 Disable or enable regtest mode --, --testnet=0|1 Disable or enable testnet --, --skip-cfg-file Skip reading the configuration file --, --version Print version information and exit --, --bob Switch to user "Bob" in MMGen regtest setup --, --alice Switch to user "Alice" in MMGen regtest setup """.format( pnm=g.proj_name,pn=g.proto.name,dn=g.proto.daemon_name, cu_dfl=g.coin, cu_all=' '.join(CoinProtocol.coins)) opts_data = opts_f() opts_data['long_options'] = common_opts_data version_info = """ {pgnm_uc} version {g.version} Part of the {pnm} suite, an online/offline cryptocoin wallet for the command line. Copyright (C) {g.Cdates} {g.author} {g.email} """.format(pnm=g.proj_name, g=g, pgnm_uc=g.prog_name.upper()).strip() uopts,args,short_opts,long_opts,skipped_opts,do_help = \ mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter,defer_help=True) if g.debug: opt_preproc_debug(short_opts,long_opts,skipped_opts,uopts,args) # Save this for usage() global usage_txt usage_txt = opts_data['usage'] # Transfer uopts into opt, setting program's opts + required opts to None if not set by user for o in tuple([s.rstrip('=') for s in long_opts] + add_opts + skipped_opts) + \ g.required_opts + g.common_opts: setattr(opt,o,uopts[o] if o in uopts else None) if opt.version: Die(0,version_info) # === Interaction with global vars begins here === # NB: user opt --data-dir is actually g.data_dir_root # cfg file is in g.data_dir_root, wallet and other data are in g.data_dir # We must set g.data_dir_root and g.cfg_file from cmdline before processing cfg file set_data_dir_root() if not opt.skip_cfg_file: override_from_cfg_file(get_data_from_cfg_file()) override_from_env() # User opt sets global var - do these here, before opt is set from g.global_sets_opt for k in g.common_opts: val = getattr(opt,k) if val != None: setattr(g,k,set_for_type(val,getattr(g,k),'--'+k)) if g.regtest: g.testnet = True # These are equivalent for now altcoin_trust_level = init_genonly_altcoins(opt.coin) # g.testnet is set, so we can set g.proto g.proto = CoinProtocol(g.coin,g.testnet) # global sets proto if g.daemon_data_dir: g.proto.daemon_data_dir = g.daemon_data_dir # g.proto is set, so we can set g.data_dir g.data_dir = os.path.normpath(os.path.join(g.data_dir_root,g.proto.data_subdir)) # If user opt is set, convert its type based on value in mmgen.globalvars (g) # If unset, set it to default value in mmgen.globalvars (g) setattr(opt,'set_by_user',[]) for k in g.global_sets_opt: if k in opt.__dict__ and getattr(opt,k) != None: setattr(opt,k,set_for_type(getattr(opt,k),getattr(g,k),'--'+k)) opt.set_by_user.append(k) else: setattr(opt,k,g.__dict__[k]) if opt.show_hash_presets: _show_hash_presets() sys.exit(0) if opt.verbose: opt.quiet = None die_on_incompatible_opts(g.incompatible_opts) opt_postproc_initializations() if do_help: # print help screen only after global vars are initialized opts_data = opts_f() opts_data['long_options'] = common_opts_data mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter) if g.bob or g.alice: g.testnet = True g.proto = CoinProtocol(g.coin,g.testnet) g.data_dir = os.path.join(g.data_dir_root,'regtest',g.coin.lower(),('alice','bob')[g.bob]) check_or_create_dir(g.data_dir) import regtest as rt g.rpc_host = 'localhost' g.rpc_port = rt.rpc_port g.rpc_user = rt.rpc_user g.rpc_password = rt.rpc_password # Check user-set opts without modifying them if not check_opts(uopts): sys.exit(1) if hasattr(g,'cfg_options_changed'): ymsg("Warning: config file options have changed! See '{}' for details".format(g.cfg_file+'.sample')) my_raw_input('Hit ENTER to continue: ') if g.debug: opt_postproc_debug() # We don't need this data anymore del mmgen.share.Opts del opts_f for k in ('prog_name','desc','usage','options','notes'): if k in opts_data: del opts_data[k] warn_altcoins(altcoin_trust_level) return args
def init(opts_data, add_opts=[], opt_filter=None, parse_only=False): opts_data['text']['long_options'] = common_opts_data['text'] uopts,args,short_opts,long_opts,skipped_opts = \ mmgen.share.Opts.parse_opts(opts_data,opt_filter=opt_filter,parse_only=parse_only) if parse_only: return uopts, args, short_opts, long_opts, skipped_opts if g.debug_opts: opt_preproc_debug(short_opts, long_opts, skipped_opts, uopts, args) # Save this for usage() global usage_txt usage_txt = opts_data['text']['usage'] # Transfer uopts into opt, setting program's opts + required opts to None if not set by user for o in (tuple([s.rstrip('=') for s in long_opts] + add_opts + skipped_opts) + g.required_opts + g.common_opts): setattr(opt, o, uopts[o] if o in uopts else None) if opt.version: Die( 0, """ {pn} version {g.version} Part of the {g.proj_name} suite, an online/offline cryptocoin wallet for the command line. Copyright (C) {g.Cdates} {g.author} {g.email} """.format(g=g, pn=g.prog_name.upper()).lstrip('\n').rstrip()) if os.getenv('MMGEN_DEBUG_ALL'): for name in g.env_opts: if name[:11] == 'MMGEN_DEBUG': os.environ[name] = '1' # === Interaction with global vars begins here === # NB: user opt --data-dir is actually g.data_dir_root # cfg file is in g.data_dir_root, wallet and other data are in g.data_dir # We must set g.data_dir_root and g.cfg_file from cmdline before processing cfg file set_data_dir_root() if not opt.skip_cfg_file: override_from_cfg_file(get_data_from_cfg_file()) override_from_env() # User opt sets global var - do these here, before opt is set from g.global_sets_opt for k in (g.common_opts + g.opt_sets_global): if hasattr(opt, k): val = getattr(opt, k) if val != None: setattr(g, k, set_for_type(val, getattr(g, k), '--' + k)) if g.regtest: g.testnet = True # These are equivalent for now from mmgen.protocol import init_genonly_altcoins, CoinProtocol altcoin_trust_level = init_genonly_altcoins(opt.coin) # g.testnet is set, so we can set g.proto g.proto = CoinProtocol(g.coin, g.testnet) # global sets proto if g.daemon_data_dir: g.proto.daemon_data_dir = g.daemon_data_dir # g.proto is set, so we can set g.data_dir g.data_dir = os.path.normpath( os.path.join(g.data_dir_root, g.proto.data_subdir)) # If user opt is set, convert its type based on value in mmgen.globalvars (g) # If unset, set it to default value in mmgen.globalvars (g) setattr(opt, 'set_by_user', []) for k in g.global_sets_opt: if k in opt.__dict__ and getattr(opt, k) != None: setattr(opt, k, set_for_type(getattr(opt, k), getattr(g, k), '--' + k)) opt.set_by_user.append(k) else: setattr(opt, k, g.__dict__[k]) if opt.show_hash_presets: _show_hash_presets() sys.exit(0) if opt.verbose: opt.quiet = None die_on_incompatible_opts(g.incompatible_opts) opt_postproc_initializations() if opts_data[ 'do_help']: # print help screen only after global vars are initialized if not 'code' in opts_data: opts_data['code'] = {} opts_data['code']['long_options'] = common_opts_data['code'] if g.debug_utf8: for k in opts_data: if type(opts_data[k]) == str: opts_data[k] += '-α' mmgen.share.Opts.print_help(opts_data, opt_filter) # exits if g.bob or g.alice: g.testnet = True g.regtest = True g.proto = CoinProtocol(g.coin, g.testnet) g.data_dir = os.path.join(g.data_dir_root, 'regtest', g.coin.lower(), ('alice', 'bob')[g.bob]) from . import regtest as rt g.rpc_host = 'localhost' g.rpc_port = rt.rpc_port g.rpc_user = rt.rpc_user g.rpc_password = rt.rpc_password check_or_create_dir( g.data_dir) # g.data_dir is finalized, so now we can do this if g.regtest and hasattr(g.proto, 'bech32_hrp_rt'): g.proto.bech32_hrp = g.proto.bech32_hrp_rt # Check user-set opts without modifying them if not check_opts(uopts): die(1, 'Options checking failed') if hasattr(g, 'cfg_options_changed'): ymsg("Warning: config file options have changed! See '{}' for details". format(g.cfg_file + '.sample')) from mmgen.util import my_raw_input my_raw_input('Hit ENTER to continue: ') if g.debug and g.prog_name != 'test.py': opt.verbose, opt.quiet = (True, None) if g.debug_opts: opt_postproc_debug() g.altcoin_data_dir = os.path.join(g.data_dir_root, 'altcoins') warn_altcoins(altcoin_trust_level) # We don't need this data anymore del mmgen.share.Opts, opts_data return args
def init(opts_data,add_opts=[],opt_filter=None,parse_only=False): opts_data['text']['long_options'] = common_opts_data['text'] uopts,args,short_opts,long_opts,skipped_opts = \ mmgen.share.Opts.parse_opts(opts_data,opt_filter=opt_filter,parse_only=parse_only) if parse_only: return uopts,args,short_opts,long_opts,skipped_opts if g.debug_opts: opt_preproc_debug(short_opts,long_opts,skipped_opts,uopts,args) # Save this for usage() global usage_txt usage_txt = opts_data['text']['usage'] # Transfer uopts into opt, setting program's opts + required opts to None if not set by user for o in ( tuple([s.rstrip('=') for s in long_opts] + add_opts + skipped_opts) + g.required_opts + g.common_opts ): setattr(opt,o,uopts[o] if o in uopts else None) if opt.version: Die(0,""" {pn} version {g.version} Part of the {g.proj_name} suite, an online/offline cryptocoin wallet for the command line. Copyright (C) {g.Cdates} {g.author} {g.email} """.format(g=g,pn=g.prog_name.upper()).lstrip('\n').rstrip()) if os.getenv('MMGEN_DEBUG_ALL'): for name in g.env_opts: if name[:11] == 'MMGEN_DEBUG': os.environ[name] = '1' # === Interaction with global vars begins here === # NB: user opt --data-dir is actually g.data_dir_root # cfg file is in g.data_dir_root, wallet and other data are in g.data_dir # We must set g.data_dir_root and g.cfg_file from cmdline before processing cfg file set_data_dir_root() if not opt.skip_cfg_file: override_from_cfg_file(get_data_from_cfg_file()) override_from_env() # User opt sets global var - do these here, before opt is set from g.global_sets_opt for k in (g.common_opts + g.opt_sets_global): if hasattr(opt,k): val = getattr(opt,k) if val != None: setattr(g,k,set_for_type(val,getattr(g,k),'--'+k)) if g.regtest: g.testnet = True # These are equivalent for now from mmgen.protocol import init_genonly_altcoins,CoinProtocol altcoin_trust_level = init_genonly_altcoins(opt.coin) # g.testnet is set, so we can set g.proto g.proto = CoinProtocol(g.coin,g.testnet) # global sets proto if g.daemon_data_dir: g.proto.daemon_data_dir = g.daemon_data_dir # g.proto is set, so we can set g.data_dir g.data_dir = os.path.normpath(os.path.join(g.data_dir_root,g.proto.data_subdir)) # If user opt is set, convert its type based on value in mmgen.globalvars (g) # If unset, set it to default value in mmgen.globalvars (g) setattr(opt,'set_by_user',[]) for k in g.global_sets_opt: if k in opt.__dict__ and getattr(opt,k) != None: setattr(opt,k,set_for_type(getattr(opt,k),getattr(g,k),'--'+k)) opt.set_by_user.append(k) else: setattr(opt,k,g.__dict__[k]) if opt.show_hash_presets: _show_hash_presets() sys.exit(0) if opt.verbose: opt.quiet = None die_on_incompatible_opts(g.incompatible_opts) opt_postproc_initializations() if opts_data['do_help']: # print help screen only after global vars are initialized if not 'code' in opts_data: opts_data['code'] = {} opts_data['code']['long_options'] = common_opts_data['code'] if g.debug_utf8: for k in opts_data: if type(opts_data[k]) == str: opts_data[k] += '-α' mmgen.share.Opts.print_help(opts_data,opt_filter) # exits if g.bob or g.alice: g.testnet = True g.regtest = True g.proto = CoinProtocol(g.coin,g.testnet) g.data_dir = os.path.join(g.data_dir_root,'regtest',g.coin.lower(),('alice','bob')[g.bob]) from . import regtest as rt g.rpc_host = 'localhost' g.rpc_port = rt.rpc_port g.rpc_user = rt.rpc_user g.rpc_password = rt.rpc_password check_or_create_dir(g.data_dir) # g.data_dir is finalized, so now we can do this if g.regtest and hasattr(g.proto,'bech32_hrp_rt'): g.proto.bech32_hrp = g.proto.bech32_hrp_rt # Check user-set opts without modifying them if not check_opts(uopts): die(1,'Options checking failed') if hasattr(g,'cfg_options_changed'): ymsg("Warning: config file options have changed! See '{}' for details".format(g.cfg_file+'.sample')) from mmgen.util import my_raw_input my_raw_input('Hit ENTER to continue: ') if g.debug and g.prog_name != 'test.py': opt.verbose,opt.quiet = (True,None) if g.debug_opts: opt_postproc_debug() g.altcoin_data_dir = os.path.join(g.data_dir_root,'altcoins') warn_altcoins(altcoin_trust_level) # We don't need this data anymore del mmgen.share.Opts, opts_data return args
def init(opts_f, add_opts=[], opt_filter=None): opts_data = opts_f() opts_data['long_options'] = common_opts_data version_info = """ {pgnm_uc} version {g.version} Part of the {pnm} suite, a Bitcoin cold-storage solution for the command line. Copyright (C) {g.Cdates} {g.author} {g.email} """.format(pnm=g.proj_name, g=g, pgnm_uc=g.prog_name.upper()).strip() uopts,args,short_opts,long_opts,skipped_opts,do_help = \ mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter,defer_help=True) if g.debug: opt_preproc_debug(short_opts, long_opts, skipped_opts, uopts, args) # Save this for usage() global usage_txt usage_txt = opts_data['usage'] # Transfer uopts into opt, setting program's opts + required opts to None if not set by user for o in tuple([s.rstrip('=') for s in long_opts] + add_opts + skipped_opts) + \ g.required_opts + g.common_opts: setattr(opt, o, uopts[o] if o in uopts else None) if opt.version: Die(0, version_info) # === Interaction with global vars begins here === # NB: user opt --data-dir is actually g.data_dir_root # cfg file is in g.data_dir_root, wallet and other data are in g.data_dir # Must set g.data_dir_root and g.cfg_file from cmdline before processing cfg file set_data_dir_root() if not opt.skip_cfg_file: cfg_data = get_data_from_config_file() override_from_cfg_file(cfg_data) override_from_env() # User opt sets global var - do these here, before opt is set from g.global_sets_opt for k in g.common_opts: val = getattr(opt, k) if val != None: setattr(g, k, set_for_type(val, getattr(g, k), '--' + k)) if g.regtest: g.testnet = True # These are equivalent for now # Global vars are now final, including g.testnet, so we can set g.data_dir g.data_dir = os.path.normpath( os.path.join(g.data_dir_root, ('', g.testnet_name)[g.testnet])) # If user opt is set, convert its type based on value in mmgen.globalvars (g) # If unset, set it to default value in mmgen.globalvars (g) setattr(opt, 'set_by_user', []) for k in g.global_sets_opt: if k in opt.__dict__ and getattr(opt, k) != None: # _typeconvert_from_dfl(k) setattr(opt, k, set_for_type(getattr(opt, k), getattr(g, k), '--' + k)) opt.set_by_user.append(k) else: setattr(opt, k, g.__dict__[k]) if opt.show_hash_presets: _show_hash_presets() sys.exit(0) if opt.verbose: opt.quiet = None die_on_incompatible_opts(g.incompatible_opts) opt_postproc_initializations() if do_help: # print help screen only after global vars are initialized opts_data = opts_f() opts_data['long_options'] = common_opts_data mmgen.share.Opts.parse_opts(sys.argv, opts_data, opt_filter=opt_filter) if g.bob or g.alice: g.data_dir = os.path.join(g.data_dir_root, 'regtest', ('alice', 'bob')[g.bob]) check_or_create_dir(g.data_dir) import regtest as rt g.testnet = True g.rpc_host = 'localhost' g.rpc_port = rt.rpc_port g.rpc_user = rt.rpc_user g.rpc_password = rt.rpc_password # Check user-set opts without modifying them if not check_opts(uopts): sys.exit(1) if g.debug: opt_postproc_debug() # We don't need this data anymore del mmgen.share.Opts del opts_f for k in ('prog_name', 'desc', 'usage', 'options', 'notes'): if k in opts_data: del opts_data[k] return args