|
22 | 22 | #include <httpserver.h> |
23 | 23 | #include <index/blockfilterindex.h> |
24 | 24 | #include <index/txindex.h> |
| 25 | +#include <init/common.h> |
25 | 26 | #include <interfaces/chain.h> |
26 | 27 | #include <interfaces/node.h> |
27 | | -#include <key.h> |
28 | 28 | #include <mapport.h> |
29 | 29 | #include <miner.h> |
30 | 30 | #include <net.h> |
@@ -151,8 +151,6 @@ static fs::path GetPidFile(const ArgsManager& args) |
151 | 151 | // shutdown thing. |
152 | 152 | // |
153 | 153 |
|
154 | | -static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle; |
155 | | - |
156 | 154 | void Interrupt(NodeContext& node) |
157 | 155 | { |
158 | 156 | InterruptHTTPServer(); |
@@ -286,8 +284,7 @@ void Shutdown(NodeContext& node) |
286 | 284 | node.chain_clients.clear(); |
287 | 285 | UnregisterAllValidationInterfaces(); |
288 | 286 | GetMainSignals().UnregisterBackgroundSignalScheduler(); |
289 | | - globalVerifyHandle.reset(); |
290 | | - ECC_Stop(); |
| 287 | + init::UnsetGlobals(); |
291 | 288 | node.mempool.reset(); |
292 | 289 | node.fee_estimator.reset(); |
293 | 290 | node.chainman = nullptr; |
@@ -363,6 +360,8 @@ void SetupServerArgs(NodeContext& node) |
363 | 360 | SetupHelpOptions(argsman); |
364 | 361 | argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); // server-only for now |
365 | 362 |
|
| 363 | + init::AddLoggingArgs(argsman); |
| 364 | + |
366 | 365 | const auto defaultBaseParams = CreateBaseChainParams(CBaseChainParams::MAIN); |
367 | 366 | const auto testnetBaseParams = CreateBaseChainParams(CBaseChainParams::TESTNET); |
368 | 367 | const auto signetBaseParams = CreateBaseChainParams(CBaseChainParams::SIGNET); |
@@ -394,7 +393,6 @@ void SetupServerArgs(NodeContext& node) |
394 | 393 | argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); |
395 | 394 | argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS); |
396 | 395 | argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (%d to %d, default: %d). In addition, unused mempool memory is shared for this cache (see -maxmempool).", nMinDbCache, nMaxDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); |
397 | | - argsman.AddArg("-debuglogfile=<file>", strprintf("Specify location of debug log file. Relative paths will be prefixed by a net-specific datadir location. (-nodebuglogfile to disable; default: %s)", DEFAULT_DEBUGLOGFILE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); |
398 | 396 | argsman.AddArg("-feefilter", strprintf("Tell other nodes to filter invs to us by our mempool min fee (default: %u)", DEFAULT_FEEFILTER), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS); |
399 | 397 | argsman.AddArg("-includeconf=<file>", "Specify additional configuration file, relative to the -datadir path (only useable from configuration file, not command line)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); |
400 | 398 | argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); |
@@ -522,25 +520,10 @@ void SetupServerArgs(NodeContext& node) |
522 | 520 | argsman.AddArg("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
523 | 521 | argsman.AddArg("-addrmantest", "Allows to test address relay on localhost", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
524 | 522 | argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_BOOL | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
525 | | - argsman.AddArg("-debug=<category>", "Output debugging information (default: -nodebug, supplying <category> is optional). " |
526 | | - "If <category> is not supplied or if <category> = 1, output all debugging information. <category> can be: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.", |
527 | | - ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
528 | | - argsman.AddArg("-debugexclude=<category>", strprintf("Exclude debugging information for a category. Can be used in conjunction with -debug=1 to output debug logs for all categories except the specified category. This option can be specified multiple times to exclude multiple categories."), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
529 | | - argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
530 | | - argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
531 | | -#ifdef HAVE_THREAD_LOCAL |
532 | | - argsman.AddArg("-logthreadnames", strprintf("Prepend debug output with name of the originating thread (only available on platforms supporting thread_local) (default: %u)", DEFAULT_LOGTHREADNAMES), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
533 | | -#else |
534 | | - hidden_args.emplace_back("-logthreadnames"); |
535 | | -#endif |
536 | | - argsman.AddArg("-logsourcelocations", strprintf("Prepend debug output with name of the originating source location (source file, line number and function name) (default: %u)", DEFAULT_LOGSOURCELOCATIONS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
537 | | - argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
538 | 523 | argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
539 | 524 | argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
540 | 525 | argsman.AddArg("-maxtipage=<n>", strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)", DEFAULT_MAX_TIP_AGE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
541 | 526 | argsman.AddArg("-printpriority", strprintf("Log transaction fee per kB when mining blocks (default: %u)", DEFAULT_PRINTPRIORITY), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
542 | | - argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -daemon. To disable logging to file, set -nodebuglogfile)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
543 | | - argsman.AddArg("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
544 | 527 | argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
545 | 528 |
|
546 | 529 | SetupChainParamsBaseOptions(argsman); |
@@ -675,30 +658,6 @@ static void StartupNotify(const ArgsManager& args) |
675 | 658 | } |
676 | 659 | #endif |
677 | 660 |
|
678 | | -/** Sanity checks |
679 | | - * Ensure that Bitcoin is running in a usable environment with all |
680 | | - * necessary library support. |
681 | | - */ |
682 | | -static bool InitSanityCheck() |
683 | | -{ |
684 | | - if (!ECC_InitSanityCheck()) { |
685 | | - return InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting.")); |
686 | | - } |
687 | | - |
688 | | - if (!glibcxx_sanity_test()) |
689 | | - return false; |
690 | | - |
691 | | - if (!Random_SanityCheck()) { |
692 | | - return InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting.")); |
693 | | - } |
694 | | - |
695 | | - if (!ChronoSanityCheck()) { |
696 | | - return InitError(Untranslated("Clock epoch mismatch. Aborting.")); |
697 | | - } |
698 | | - |
699 | | - return true; |
700 | | -} |
701 | | - |
702 | 661 | static bool AppInitServers(NodeContext& node) |
703 | 662 | { |
704 | 663 | const ArgsManager& args = *Assert(node.args); |
@@ -796,25 +755,8 @@ void InitParameterInteraction(ArgsManager& args) |
796 | 755 | */ |
797 | 756 | void InitLogging(const ArgsManager& args) |
798 | 757 | { |
799 | | - LogInstance().m_print_to_file = !args.IsArgNegated("-debuglogfile"); |
800 | | - LogInstance().m_file_path = AbsPathForConfigVal(args.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE)); |
801 | | - LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", !args.GetBoolArg("-daemon", false)); |
802 | | - LogInstance().m_log_timestamps = args.GetBoolArg("-logtimestamps", DEFAULT_LOGTIMESTAMPS); |
803 | | - LogInstance().m_log_time_micros = args.GetBoolArg("-logtimemicros", DEFAULT_LOGTIMEMICROS); |
804 | | -#ifdef HAVE_THREAD_LOCAL |
805 | | - LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES); |
806 | | -#endif |
807 | | - LogInstance().m_log_sourcelocations = args.GetBoolArg("-logsourcelocations", DEFAULT_LOGSOURCELOCATIONS); |
808 | | - |
809 | | - fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS); |
810 | | - |
811 | | - std::string version_string = FormatFullVersion(); |
812 | | -#ifdef DEBUG |
813 | | - version_string += " (debug build)"; |
814 | | -#else |
815 | | - version_string += " (release build)"; |
816 | | -#endif |
817 | | - LogPrintf(PACKAGE_NAME " version %s\n", version_string); |
| 758 | + init::SetLoggingOptions(args); |
| 759 | + init::LogPackageVersion(); |
818 | 760 | } |
819 | 761 |
|
820 | 762 | namespace { // Variables internal to initialization process only |
@@ -982,26 +924,7 @@ bool AppInitParameterInteraction(const ArgsManager& args) |
982 | 924 | InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections)); |
983 | 925 |
|
984 | 926 | // ********************************************************* Step 3: parameter-to-internal-flags |
985 | | - if (args.IsArgSet("-debug")) { |
986 | | - // Special-case: if -debug=0/-nodebug is set, turn off debugging messages |
987 | | - const std::vector<std::string> categories = args.GetArgs("-debug"); |
988 | | - |
989 | | - if (std::none_of(categories.begin(), categories.end(), |
990 | | - [](std::string cat){return cat == "0" || cat == "none";})) { |
991 | | - for (const auto& cat : categories) { |
992 | | - if (!LogInstance().EnableCategory(cat)) { |
993 | | - InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debug", cat)); |
994 | | - } |
995 | | - } |
996 | | - } |
997 | | - } |
998 | | - |
999 | | - // Now remove the logging categories which were explicitly excluded |
1000 | | - for (const std::string& cat : args.GetArgs("-debugexclude")) { |
1001 | | - if (!LogInstance().DisableCategory(cat)) { |
1002 | | - InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debugexclude", cat)); |
1003 | | - } |
1004 | | - } |
| 927 | + init::SetLoggingCategories(args); |
1005 | 928 |
|
1006 | 929 | fCheckBlockIndex = args.GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks()); |
1007 | 930 | fCheckpointsEnabled = args.GetBoolArg("-checkpoints", DEFAULT_CHECKPOINTS_ENABLED); |
@@ -1148,16 +1071,11 @@ bool AppInitSanityChecks() |
1148 | 1071 | { |
1149 | 1072 | // ********************************************************* Step 4: sanity checks |
1150 | 1073 |
|
1151 | | - // Initialize elliptic curve code |
1152 | | - std::string sha256_algo = SHA256AutoDetect(); |
1153 | | - LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo); |
1154 | | - RandomInit(); |
1155 | | - ECC_Start(); |
1156 | | - globalVerifyHandle.reset(new ECCVerifyHandle()); |
| 1074 | + init::SetGlobals(); |
1157 | 1075 |
|
1158 | | - // Sanity check |
1159 | | - if (!InitSanityCheck()) |
| 1076 | + if (!init::SanityChecks()) { |
1160 | 1077 | return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME)); |
| 1078 | + } |
1161 | 1079 |
|
1162 | 1080 | // Probe the data directory lock to give an early error message, if possible |
1163 | 1081 | // We cannot hold the data directory lock here, as the forking for daemon() hasn't yet happened, |
@@ -1197,38 +1115,11 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) |
1197 | 1115 | // Detailed error printed inside CreatePidFile(). |
1198 | 1116 | return false; |
1199 | 1117 | } |
1200 | | - if (LogInstance().m_print_to_file) { |
1201 | | - if (args.GetBoolArg("-shrinkdebugfile", LogInstance().DefaultShrinkDebugFile())) { |
1202 | | - // Do this first since it both loads a bunch of debug.log into memory, |
1203 | | - // and because this needs to happen before any other debug.log printing |
1204 | | - LogInstance().ShrinkDebugFile(); |
1205 | | - } |
1206 | | - } |
1207 | | - if (!LogInstance().StartLogging()) { |
1208 | | - return InitError(strprintf(Untranslated("Could not open debug log file %s"), |
1209 | | - LogInstance().m_file_path.string())); |
1210 | | - } |
1211 | | - |
1212 | | - if (!LogInstance().m_log_timestamps) |
1213 | | - LogPrintf("Startup time: %s\n", FormatISO8601DateTime(GetTime())); |
1214 | | - LogPrintf("Default data directory %s\n", GetDefaultDataDir().string()); |
1215 | | - LogPrintf("Using data directory %s\n", GetDataDir().string()); |
1216 | | - |
1217 | | - // Only log conf file usage message if conf file actually exists. |
1218 | | - fs::path config_file_path = GetConfigFile(args.GetArg("-conf", BITCOIN_CONF_FILENAME)); |
1219 | | - if (fs::exists(config_file_path)) { |
1220 | | - LogPrintf("Config file: %s\n", config_file_path.string()); |
1221 | | - } else if (args.IsArgSet("-conf")) { |
1222 | | - // Warn if no conf file exists at path provided by user |
1223 | | - InitWarning(strprintf(_("The specified config file %s does not exist"), config_file_path.string())); |
1224 | | - } else { |
1225 | | - // Not categorizing as "Warning" because it's the default behavior |
1226 | | - LogPrintf("Config file: %s (not found, skipping)\n", config_file_path.string()); |
| 1118 | + if (!init::StartLogging(args)) { |
| 1119 | + // Detailed error printed inside StartLogging(). |
| 1120 | + return false; |
1227 | 1121 | } |
1228 | 1122 |
|
1229 | | - // Log the config arguments to debug.log |
1230 | | - args.LogArgs(); |
1231 | | - |
1232 | 1123 | LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD); |
1233 | 1124 |
|
1234 | 1125 | // Warn about relative -datadir path. |
|
0 commit comments