[opt/cfg]: add --rpc-port, --rpc-user, --rpc-password

[mswin]:   remove non-MSYS Windows support (except for bitcoin datadir)
           MS users must launch scripts from an MSYS environment
This commit is contained in:
The MMGen Project 2016-11-27 10:49:29 +03:00
commit 38ebf35f77
Signed by: mmgen
GPG key ID: 62DBE9E5212F05BE
5 changed files with 56 additions and 50 deletions

View file

@ -20,6 +20,15 @@
# Set the RPC host (the host bitcoind is running on):
# rpc_host localhost
# Set the RPC host's port number
# rpc_port 8332
# Uncomment to override 'rpcuser' in bitcoin.conf
# rpc_user myusername
# Uncomment to override 'rpcpassword' in bitcoin.conf
# rpc_password mypassword
# Set the default hash preset:
# hash_preset 3

View file

@ -54,6 +54,7 @@ class g(object):
tx_confs = 3
seed_len = 256
http_timeout = 60
# Constants - some of these might be overriden, but they don't change thereafter
@ -64,7 +65,10 @@ class g(object):
hold_protect = True
color = (False,True)[sys.stdout.isatty()]
testnet = False
rpc_host = 'localhost'
rpc_host = ''
rpc_port = 0
rpc_user = ''
rpc_password = ''
testnet_name = 'testnet3'
bogus_wallet_data = '' # for debugging, used by test suite
@ -76,18 +80,18 @@ class g(object):
if os.getenv('HOME'): # Linux or MSYS
home_dir = os.getenv('HOME')
elif platform == 'win' and os.getenv('HOMEPATH'): # Windows native:
elif platform == 'win': # Windows native:
die(1,'$HOME not set! {} for Windows must be run in MSYS environment'.format(proj_name))
else:
die(2,'$HOME is not set! Unable to determine home directory')
data_dir_root = None
data_dir = None
cfg_file = None
bitcoin_data_dir = (os.path.join(home_dir,'Application Data','Bitcoin'),
os.path.join(home_dir,'.bitcoin'))[bool(os.getenv('HOME'))]
data_dir_root,data_dir,cfg_file = None,None,None
bitcoin_data_dir = os.path.join(os.getenv('APPDATA'),'Bitcoin') if platform == 'win' \
else os.path.join(home_dir,'.bitcoin')
# User opt sets global var:
common_opts = ('color','no_license','rpc_host','rpc_port','testnet','rpc_user','rpc_password')
common_opts = ('color','no_license','rpc_host','testnet')
required_opts = (
'quiet','verbose','debug','outdir','echo_passphrase','passwd_file','stdout',
'show_hash_presets','label','keep_passphrase','keep_hash_preset',
@ -101,8 +105,8 @@ class g(object):
('batch','rescan'),
)
cfg_file_opts = (
'color','debug','hash_preset','http_timeout','no_license','rpc_host',
'quiet','tx_fee','tx_fee_adj','usr_randchars','testnet'
'color','debug','hash_preset','http_timeout','no_license','rpc_host','rpc_port',
'quiet','tx_fee','tx_fee_adj','usr_randchars','testnet','rpc_user','rpc_password'
)
env_opts = (
'MMGEN_BOGUS_WALLET_DATA',

View file

@ -65,14 +65,18 @@ def _show_hash_presets():
msg(fs.format("'%s'" % i, *g.hash_presets[i]))
msg('N = memory usage (power of two), p = iterations (rounds)')
# most, but not all, of these set the corresponding global var
common_opts_data = """
--, --color=c Set to '0' to disable color output, '1' to enable
--, --data-dir=d Specify the location of {pnm}'s data directory
--, --no-license Suppress the GPL license prompt
--, --rpc-host=h Communicate with bitcoind running on host 'h'
--, --testnet=1 Set to '1' use testnet, '0' to force mainnet
--, --skip-cfg-file Skip reading the configuration file
--, --version Print version information and exit
--, --color=c Set to '0' to disable color output, '1' to enable
--, --data-dir=d Specify the location of {pnm}'s data directory
--, --no-license Suppress the GPL license prompt
--, --rpc-host=h Communicate with bitcoind running on host 'h'
--, --rpc-port=p Communicate with bitcoind listening on port 'p'
--, --rpc-user=u Override 'rpcuser' in bitcoin.conf
--, --rpc-password=p Override 'rpcpassword' in bitcoin.conf
--, --testnet=1 Set to '1' enable testnet, '0' to disable
--, --skip-cfg-file Skip reading the configuration file
--, --version Print version information and exit
""".format(pnm=g.proj_name)
def opt_preproc_debug(short_opts,long_opts,skipped_opts,uopts,args):
@ -100,7 +104,7 @@ def opt_postproc_debug():
Msg(' Global vars:')
for e in [d for d in dir(g) if d[:2] != '__']:
Msg(' {:<20}: {}'.format(e, getattr(g,e)))
Msg('\n=== end opts.py debug ===')
Msg('\n=== end opts.py debug ===\n')
def opt_postproc_actions():
from mmgen.term import set_terminal_vars
@ -110,10 +114,8 @@ def opt_postproc_actions():
check_or_create_dir(g.data_dir) # dies on error
def set_data_dir_root():
g.data_dir_root = os.path.normpath(os.path.expanduser(opt.data_dir)) if opt.data_dir else \
(os.path.join(g.home_dir,'Application Data',g.proj_name),
os.path.join(g.home_dir,'.'+g.proj_name.lower()))[bool(os.getenv('HOME'))]
os.path.join(g.home_dir,'.'+g.proj_name.lower())
# mainnet and testnet share cfg file, as with Core
g.cfg_file = os.path.join(g.data_dir_root,'{}.cfg'.format(g.proj_name.lower()))
@ -194,6 +196,7 @@ def init(opts_data,add_opts=[],opt_filter=None):
# === 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()

View file

@ -36,16 +36,20 @@ class BitcoinRPCConnection(object):
user=None,passwd=None,auth_cookie=None,
):
dmsg('=== BitcoinRPCConnection.__init__() debug ===')
dmsg(' host [{}] port [{}] user [{}] passwd [{}] auth_cookie [{}]\n'.format(
host,port,user,passwd,auth_cookie))
if user and passwd:
self.auth_str = '{}:{}'.format(user,passwd)
elif auth_cookie:
self.auth_str = auth_cookie
else:
msg('Error: no Bitcoin RPC authentication method found')
if passwd: die(1,"'rpcuser' entry missing in bitcoin.conf")
elif user: die(1,"'rpcpassword' entry missing in bitcoin.conf")
if passwd: die(1,"'rpcuser' entry not found in bitcoin.conf or mmgen.cfg")
elif user: die(1,"'rpcpassword' entry not found in bitcoin.conf or mmgen.cfg")
else:
m1 = 'Either provide rpcuser/rpcpassword in bitcoin.conf'
m1 = 'Either provide rpcuser/rpcpassword in bitcoin.conf or mmgen.cfg'
m2 = '(or, alternatively, copy the authentication cookie to Bitcoin data dir'
m3 = 'if {} and Bitcoin are running as different users)'.format(g.proj_name)
die(1,'\n'.join((m1,m2,m3)))
@ -79,7 +83,7 @@ class BitcoinRPCConnection(object):
else:
die(*args[1:])
dmsg('=== rpc.py debug ===')
dmsg('=== request() debug ===')
dmsg(' RPC POST data ==> %s\n' % p)
caller = self
class MyJSONEncoder(json.JSONEncoder):

View file

@ -648,24 +648,10 @@ def prompt_and_get_char(prompt,chars,enter_ok=False,verbose=False):
def do_pager(text):
pagers = ['less','more']
shell = False
# Hack for MS Windows command line (i.e. non CygWin) environment
# When 'shell' is true, Windows aborts the calling program if executable
# not found.
# When 'shell' is false, an exception is raised, invoking the fallback
# 'print' instead of the pager.
# We risk assuming that 'more' will always be available on a stock
# Windows installation.
if g.platform == 'win':
if 'HOME' not in os.environ: # native Windows terminal
shell = True
pagers = ['more']
else: # MSYS
os.environ['LESS'] = '-cR -#1' # disable buggy line chopping
else:
os.environ['LESS'] = '-RS -#1' # raw, chop, scroll right 1 char
pagers,shell = ['less','more'],False
# --- Non-MSYS Windows code deleted ---
# raw, chop, scroll right 1 char, disable buggy line chopping for Windows
os.environ['LESS'] = (('-RS -#1'),('-cR -#1'))[g.platform=='win']
if 'PAGER' in os.environ and os.environ['PAGER'] != pagers[0]:
pagers = [os.environ['PAGER']] + pagers
@ -727,14 +713,14 @@ def get_bitcoind_auth_cookie():
return ''
def bitcoin_connection():
port = (8332,18332)[g.testnet]
host,user,passwd = g.rpc_host,'rpcuser','rpcpassword'
cfg = get_bitcoind_cfg_options((user,passwd))
auth_cookie = get_bitcoind_auth_cookie()
cfg = get_bitcoind_cfg_options(('rpcuser','rpcpassword'))
import mmgen.rpc
c = mmgen.rpc.BitcoinRPCConnection(
host,port,cfg[user],cfg[passwd],auth_cookie=auth_cookie)
g.rpc_host or 'localhost',
g.rpc_port or (8332,18332)[g.testnet],
g.rpc_user or cfg['rpcuser'], # MMGen's rpcuser,rpcpassword override bitcoind's
g.rpc_password or cfg['rpcpassword'],
auth_cookie=get_bitcoind_auth_cookie())
# do an RPC call to make the function fail if we can't connect
c.client_version = int(c.getinfo()['version'])
return c