Merge #13799: Ignore unknown config file options; warn instead of error

247d5740d2 Ignore unknown config file options for now (Pieter Wuille)
04ce0d88ca Report when unknown config file options are ignored (Pieter Wuille)

Pull request description:

  As reported by @satwo on IRC a few days ago, the current mechanism of treating unknown config file options as errors is problematic for options like `-rpcclienttimeout` which aren't defined for `bitcoind`.

  A full solution would be to either make all binaries be aware of each other's options, or to permit config file options that only apply to specific binaries (`bitcoind`, `bitcoin-qt`, `bitcoin-cli`). Both of these seem too invasive to introduce for 0.17.

  As a compromise, this PR makes it ignores those options, but still warn about it in the log file.

Tree-SHA512: dfddc771b91df3031a9c98d9f3292f8f4fcd1b97ebb7317b2f457e12d9f205dc63f42721302e7258dbb53f273d7cc041a65a0a9120972769555784e1f1cc9aef
This commit is contained in:
MarcoFalke 2018-07-31 12:17:43 -04:00 committed by UdjinM6
parent fa6b9d2d46
commit 8f745e57b7
No known key found for this signature in database
GPG Key ID: 83592BD1400D58D9
4 changed files with 14 additions and 8 deletions

View File

@ -107,7 +107,7 @@ static bool AppInit(int argc, char* argv[])
fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", gArgs.GetArg("-datadir", "").c_str()); fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", gArgs.GetArg("-datadir", "").c_str());
return false; return false;
} }
if (!gArgs.ReadConfigFiles(error)) { if (!gArgs.ReadConfigFiles(error, true)) {
fprintf(stderr, "Error reading configuration file: %s\n", error.c_str()); fprintf(stderr, "Error reading configuration file: %s\n", error.c_str());
return false; return false;
} }

View File

@ -165,7 +165,7 @@ class NodeImpl : public Node
{ {
return gArgs.ParseParameters(argc, argv, error); return gArgs.ParseParameters(argc, argv, error);
} }
bool readConfigFiles(std::string& error) override { return gArgs.ReadConfigFiles(error); } bool readConfigFiles(std::string& error) override { return gArgs.ReadConfigFiles(error, true); }
bool softSetArg(const std::string& arg, const std::string& value) override { return gArgs.SoftSetArg(arg, value); } bool softSetArg(const std::string& arg, const std::string& value) override { return gArgs.SoftSetArg(arg, value); }
bool softSetBoolArg(const std::string& arg, bool value) override { return gArgs.SoftSetBoolArg(arg, value); } bool softSetBoolArg(const std::string& arg, bool value) override { return gArgs.SoftSetBoolArg(arg, value); }
void selectParams(const std::string& network) override { SelectParams(network); } void selectParams(const std::string& network) override { SelectParams(network); }

View File

@ -895,9 +895,13 @@ bool ArgsManager::ReadConfigStream(std::istream& stream, std::string& error, boo
} }
// Check that the arg is known // Check that the arg is known
if (!IsArgKnown(strKey) && !ignore_invalid_keys) { if (!IsArgKnown(strKey)) {
if (!ignore_invalid_keys) {
error = strprintf("Invalid configuration value %s", option.first.c_str()); error = strprintf("Invalid configuration value %s", option.first.c_str());
return false; return false;
} else {
LogPrintf("Ignoring unknown configuration value %s\n", option.first);
}
} }
} }
return true; return true;

View File

@ -55,9 +55,11 @@ class IncludeConfTest(BitcoinTestFramework):
self.stop_node(0, expected_stderr="warning: -includeconf cannot be used from included files; ignoring -includeconf=relative2.conf") self.stop_node(0, expected_stderr="warning: -includeconf cannot be used from included files; ignoring -includeconf=relative2.conf")
self.log.info("-includeconf cannot contain invalid arg") self.log.info("-includeconf cannot contain invalid arg")
with open(os.path.join(self.options.tmpdir, "node0", "relative.conf"), "w", encoding="utf8") as f:
f.write("foo=bar\n") # Commented out as long as we ignore invalid arguments in configuration files
self.nodes[0].assert_start_raises_init_error(expected_msg="Error reading configuration file: Invalid configuration value foo") #with open(os.path.join(self.options.tmpdir, "node0", "relative.conf"), "w", encoding="utf8") as f:
# f.write("foo=bar\n")
#self.nodes[0].assert_start_raises_init_error(expected_msg="Error reading configuration file: Invalid configuration value foo")
self.log.info("-includeconf cannot be invalid path") self.log.info("-includeconf cannot be invalid path")
os.remove(os.path.join(self.options.tmpdir, "node0", "relative.conf")) os.remove(os.path.join(self.options.tmpdir, "node0", "relative.conf"))