|
13 | 13 | import pdb
|
14 | 14 | import random
|
15 | 15 | import re
|
| 16 | +import shlex |
16 | 17 | import shutil
|
17 | 18 | import subprocess
|
18 | 19 | import sys
|
@@ -72,33 +73,37 @@ def __init__(self, paths, bin_dir):
|
72 | 73 | self.paths = paths
|
73 | 74 | self.bin_dir = bin_dir
|
74 | 75 |
|
75 |
| - def daemon_argv(self): |
| 76 | + def node_argv(self): |
76 | 77 | "Return argv array that should be used to invoke bitcoind"
|
77 |
| - return self._argv(self.paths.bitcoind) |
| 78 | + return self._argv("node", self.paths.bitcoind) |
78 | 79 |
|
79 | 80 | def rpc_argv(self):
|
80 | 81 | "Return argv array that should be used to invoke bitcoin-cli"
|
81 |
| - return self._argv(self.paths.bitcoincli) |
| 82 | + # Add -nonamed because "bitcoin rpc" enables -named by default, but bitcoin-cli doesn't |
| 83 | + return self._argv("rpc", self.paths.bitcoincli) + ["-nonamed"] |
82 | 84 |
|
83 | 85 | def util_argv(self):
|
84 | 86 | "Return argv array that should be used to invoke bitcoin-util"
|
85 |
| - return self._argv(self.paths.bitcoinutil) |
| 87 | + return self._argv("util", self.paths.bitcoinutil) |
86 | 88 |
|
87 | 89 | def wallet_argv(self):
|
88 | 90 | "Return argv array that should be used to invoke bitcoin-wallet"
|
89 |
| - return self._argv(self.paths.bitcoinwallet) |
| 91 | + return self._argv("wallet", self.paths.bitcoinwallet) |
90 | 92 |
|
91 | 93 | def chainstate_argv(self):
|
92 | 94 | "Return argv array that should be used to invoke bitcoin-chainstate"
|
93 |
| - return self._argv(self.paths.bitcoinchainstate) |
94 |
| - |
95 |
| - def _argv(self, bin_path): |
96 |
| - """Return argv array that should be used to invoke the command. |
97 |
| - Normally this will return binary paths directly from the paths object, |
98 |
| - but when bin_dir is set (by tests calling binaries from previous |
99 |
| - releases) it will return paths relative to bin_dir instead.""" |
| 95 | + return self._argv("chainstate", self.paths.bitcoinchainstate) |
| 96 | + |
| 97 | + def _argv(self, command, bin_path): |
| 98 | + """Return argv array that should be used to invoke the command. It |
| 99 | + either uses the bitcoin wrapper executable (if BITCOIN_CMD is set), or |
| 100 | + the direct binary path (bitcoind, etc). When bin_dir is set (by tests |
| 101 | + calling binaries from previous releases) it always uses the direct |
| 102 | + path.""" |
100 | 103 | if self.bin_dir is not None:
|
101 | 104 | return [os.path.join(self.bin_dir, os.path.basename(bin_path))]
|
| 105 | + elif self.paths.bitcoin_cmd is not None: |
| 106 | + return self.paths.bitcoin_cmd + [command] |
102 | 107 | else:
|
103 | 108 | return [bin_path]
|
104 | 109 |
|
@@ -292,6 +297,9 @@ def get_binary_paths(self):
|
292 | 297 | binary + self.config["environment"]["EXEEXT"],
|
293 | 298 | )
|
294 | 299 | setattr(paths, attribute_name, os.getenv(env_variable_name, default=default_filename))
|
| 300 | + # BITCOIN_CMD environment variable can be specified to invoke bitcoin |
| 301 | + # wrapper binary instead of other executables. |
| 302 | + paths.bitcoin_cmd = shlex.split(os.getenv("BITCOIN_CMD", "")) or None |
295 | 303 | return paths
|
296 | 304 |
|
297 | 305 | def get_binaries(self, bin_dir=None):
|
@@ -537,7 +545,7 @@ def bin_dir_from_version(version):
|
537 | 545 | bins_missing = False
|
538 | 546 | for bin_path in (argv[0] for bin_dir in bin_dirs
|
539 | 547 | for binaries in (self.get_binaries(bin_dir),)
|
540 |
| - for argv in (binaries.daemon_argv(), binaries.rpc_argv())): |
| 548 | + for argv in (binaries.node_argv(), binaries.rpc_argv())): |
541 | 549 | if shutil.which(bin_path) is None:
|
542 | 550 | self.log.error(f"Binary not found: {bin_path}")
|
543 | 551 | bins_missing = True
|
|
0 commit comments