mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-07-25 08:52:57 +02:00
init: Error if ignored bitcoin.conf file is found
Show an error on startup if a bitcoin datadir that is being used contains a `bitcoin.conf` file that is ignored. There are two cases where this could happen: - One case reported in https://github.com/bitcoin/bitcoin/issues/27246#issuecomment-1470006043 happens when a bitcoin.conf file in the default datadir (e.g. $HOME/.bitcoin/bitcoin.conf) has a "datadir=/path" line that sets different datadir containing a second bitcoin.conf file. Currently the second bitcoin.conf file is ignored with no warning. - Another way this could happen is if a -conf= command line argument points to a configuration file with a "datadir=/path" line and that specified path contains a bitcoin.conf file, which is currently ignored. This change only adds an error message and doesn't change anything about way settings are applied. It also doesn't trigger errors if there are redundant -datadir or -conf settings pointing at the same configuration file, only if they are pointing at different files and one file is being ignored.
This commit is contained in:
@@ -5,9 +5,14 @@
|
||||
"""Test various command line arguments and configuration file parameters."""
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
import re
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.test_node import ErrorMatch
|
||||
from test_framework import util
|
||||
|
||||
|
||||
@@ -74,7 +79,7 @@ class ConfArgsTest(BitcoinTestFramework):
|
||||
util.write_config(main_conf_file_path, n=0, chain='', extra_config=f'includeconf={inc_conf_file_path}\n')
|
||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf:
|
||||
conf.write('acceptnonstdtxn=1\n')
|
||||
self.nodes[0].assert_start_raises_init_error(extra_args=[f"-conf={main_conf_file_path}"], expected_msg='Error: acceptnonstdtxn is not currently supported for main chain')
|
||||
self.nodes[0].assert_start_raises_init_error(extra_args=[f"-conf={main_conf_file_path}", "-allowignoredconf"], expected_msg='Error: acceptnonstdtxn is not currently supported for main chain')
|
||||
|
||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf:
|
||||
conf.write('nono\n')
|
||||
@@ -282,6 +287,55 @@ class ConfArgsTest(BitcoinTestFramework):
|
||||
unexpected_msgs=seednode_ignored):
|
||||
self.restart_node(0, extra_args=[connect_arg, '-seednode=fakeaddress2'])
|
||||
|
||||
def test_ignored_conf(self):
|
||||
self.log.info('Test error is triggered when the datadir in use contains a bitcoin.conf file that would be ignored '
|
||||
'because a conflicting -conf file argument is passed.')
|
||||
node = self.nodes[0]
|
||||
with tempfile.NamedTemporaryFile(dir=self.options.tmpdir, mode="wt", delete=False) as temp_conf:
|
||||
temp_conf.write(f"datadir={node.datadir}\n")
|
||||
node.assert_start_raises_init_error([f"-conf={temp_conf.name}"], re.escape(
|
||||
f'Error: Data directory "{node.datadir}" contains a "bitcoin.conf" file which is ignored, because a '
|
||||
f'different configuration file "{temp_conf.name}" from command line argument "-conf={temp_conf.name}" '
|
||||
f'is being used instead.') + r"[\s\S]*", match=ErrorMatch.FULL_REGEX)
|
||||
|
||||
# Test that passing a redundant -conf command line argument pointing to
|
||||
# the same bitcoin.conf that would be loaded anyway does not trigger an
|
||||
# error.
|
||||
self.start_node(0, [f'-conf={node.datadir}/bitcoin.conf'])
|
||||
self.stop_node(0)
|
||||
|
||||
def test_ignored_default_conf(self):
|
||||
# Disable this test for windows currently because trying to override
|
||||
# the default datadir through the environment does not seem to work.
|
||||
if sys.platform == "win32":
|
||||
return
|
||||
|
||||
self.log.info('Test error is triggered when bitcoin.conf in the default data directory sets another datadir '
|
||||
'and it contains a different bitcoin.conf file that would be ignored')
|
||||
|
||||
# Create a temporary directory that will be treated as the default data
|
||||
# directory by bitcoind.
|
||||
env, default_datadir = util.get_temp_default_datadir(pathlib.Path(self.options.tmpdir, "home"))
|
||||
default_datadir.mkdir(parents=True)
|
||||
|
||||
# Write a bitcoin.conf file in the default data directory containing a
|
||||
# datadir= line pointing at the node datadir. This will trigger a
|
||||
# startup error because the node datadir contains a different
|
||||
# bitcoin.conf that would be ignored.
|
||||
node = self.nodes[0]
|
||||
(default_datadir / "bitcoin.conf").write_text(f"datadir={node.datadir}\n")
|
||||
|
||||
# Drop the node -datadir= argument during this test, because if it is
|
||||
# specified it would take precedence over the datadir setting in the
|
||||
# config file.
|
||||
node_args = node.args
|
||||
node.args = [arg for arg in node.args if not arg.startswith("-datadir=")]
|
||||
node.assert_start_raises_init_error([], re.escape(
|
||||
f'Error: Data directory "{node.datadir}" contains a "bitcoin.conf" file which is ignored, because a '
|
||||
f'different configuration file "{default_datadir}/bitcoin.conf" from data directory "{default_datadir}" '
|
||||
f'is being used instead.') + r"[\s\S]*", env=env, match=ErrorMatch.FULL_REGEX)
|
||||
node.args = node_args
|
||||
|
||||
def run_test(self):
|
||||
self.test_log_buffer()
|
||||
self.test_args_log()
|
||||
@@ -291,6 +345,8 @@ class ConfArgsTest(BitcoinTestFramework):
|
||||
|
||||
self.test_config_file_parser()
|
||||
self.test_invalid_command_line_options()
|
||||
self.test_ignored_conf()
|
||||
self.test_ignored_default_conf()
|
||||
|
||||
# Remove the -datadir argument so it doesn't override the config file
|
||||
self.nodes[0].args = [arg for arg in self.nodes[0].args if not arg.startswith("-datadir")]
|
||||
|
Reference in New Issue
Block a user