Esempio n. 1
0
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']
Esempio n. 2
0
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']
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
File: opts.py Progetto: mmgen/mmgen
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
Esempio n. 10
0
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