mmgen-wallet/mmgen/Opts.py

186 lines
5.5 KiB
Python
Executable file

#!/usr/bin/env python
#
# mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
# Copyright (C) 2013 by philemon <mmgen-py@yandex.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys, getopt
import mmgen.config as g
from mmgen.utils import msg
def usage(hd):
print "USAGE: %s %s" % (hd['prog_name'], hd['usage'])
sys.exit(2)
def print_help(progname,help_data):
pn_len = str(len(progname)+2)
print (" %-"+pn_len+"s %s") % (progname.upper()+":", help_data['desc'])
print (" %-"+pn_len+"s %s %s") % ("USAGE:", progname, help_data['usage'])
sep = "\n "
print " OPTIONS:"+sep+"%s" % sep.join(help_data['options'].strip().split("\n"))
def process_opts(argv,help_data,short_opts,long_opts):
progname = argv[0].split("/")[-1]
if g.debug:
print "Short opts: %s" % repr(short_opts)
print "Long opts: %s" % repr(long_opts)
long_opts = [i.replace("_","-") for i in long_opts]
try: cl_opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
except getopt.GetoptError as err:
print str(err); sys.exit(2)
opts,short_opts_l = {},[]
for i in short_opts:
if i == ":": short_opts_l[-1] += i
else: short_opts_l += i
for opt, arg in cl_opts:
if opt in ("-h","--help"): print_help(progname,help_data); sys.exit()
elif opt[:2] == "--" and opt[2:] in long_opts:
opts[opt[2:].replace("-","_")] = True
elif opt[:2] == "--" and opt[2:]+"=" in long_opts:
opts[opt[2:].replace("-","_")] = arg
elif opt[0] == "-" and opt[1] in short_opts_l:
opts[long_opts[short_opts_l.index(opt[1:])].replace("-","_")] = True
elif opt[0] == "-" and opt[1:]+":" in short_opts_l:
opts[long_opts[short_opts_l.index(opt[1:]+":")][:-1].replace("-","_")] = arg
else: assert False, "Invalid option"
if g.debug: print "User-selected options: %s" % repr(opts)
return opts,args
def check_opts(opts,long_opts):
# These must be set to the default values in mmgen.config:
for i in g.cl_override_vars:
if i+"=" in long_opts:
set_if_unset_and_typeconvert(opts,i)
for opt in opts.keys():
val = opts[opt]
what = "parameter for '--%s' option" % opt.replace("_","-")
# Check for file existence and readability
for i in 'keys_from_file','addrlist','passwd_file','keysforaddrs':
if opt == i:
check_infile(val)
return
if opt == 'outdir':
what = "output directory"
import re, os, stat
d = re.sub(r'/*$','', val)
opts[opt] = d
try: mode = os.stat(d).st_mode
except:
msg("Unable to stat requested %s '%s'" % (what,d))
sys.exit(1)
if not stat.S_ISDIR(mode):
msg("Requested %s '%s' is not a directory" % (what,d))
sys.exit(1)
if not os.access(d, os.W_OK|os.X_OK):
msg("Requested %s '%s' is unwritable by you" % (what,d))
sys.exit(1)
elif opt == 'label':
label = val.strip()
opts[opt] = label
if len(label) > g.max_wallet_label_len:
msg("Label must be %s characters or less" %
g.max_wallet_label_len)
sys.exit(1)
for ch in list(label):
if ch not in g.wallet_label_symbols:
msg("'%s': illegal character in label" % ch)
sys.exit(1)
elif opt == 'from_brain':
try:
l,p = val.split(",")
except:
msg("'%s': invalid %s" % (val,what))
sys.exit(1)
try:
int(l)
except:
msg("'%s': invalid 'l' %s (not an integer)" % (l,what))
sys.exit(1)
if int(l) not in g.seed_lens:
msg("'%s': invalid 'l' %s. Options: %s" %
(l, what, ", ".join([str(i) for i in g.seed_lens])))
sys.exit(1)
if p not in g.hash_presets:
hps = ", ".join([i for i in sorted(g.hash_presets.keys())])
msg("'%s': invalid 'p' %s. Options: %s" % (p, what, hps))
sys.exit(1)
elif opt == 'seed_len':
if val not in g.seed_lens:
msg("'%s': invalid %s. Options: %s"
% (val,what,", ".join([str(i) for i in g.seed_lens])))
sys.exit(2)
elif opt == 'hash_preset':
if val not in g.hash_presets:
msg("'%s': invalid %s. Options: %s"
% (val,what,", ".join(sorted(g.hash_presets.keys()))))
sys.exit(2)
elif opt == 'usr_randlen':
if val > g.max_randlen or val < g.min_randlen:
msg("'%s': invalid %s (must be >= %s and <= %s)"
% (val,what,g.min_randlen,g.max_randlen))
sys.exit(2)
else:
if g.debug: print "check_opts(): No test for opt '%s'" % opt
def show_opts_and_cmd_args(opts,cmd_args):
print "Processed options: %s" % repr(opts)
print "Cmd args: %s" % repr(cmd_args)
def set_if_unset_and_typeconvert(opts,opt):
if opt in g.cl_override_vars:
if opt not in opts:
# Set to similarly named default value in mmgen.config
opts[opt] = eval("g."+opt)
else:
vtype = type(eval("g."+opt))
if g.debug: print "Opt: %s, Type: %s" % (opt,vtype)
if vtype == int: f,t = int,"an integer"
elif vtype == str: f,t = str,"a string"
elif vtype == float: f,t = float,"a float"
try:
opts[opt] = f(opts[opt])
except:
msg("'%s': invalid parameter for '--%s' option (not %s)" %
(opts[opt],opt.replace("_","-"),t))
sys.exit(1)