Branch data Line data Source code
1 : : // Copyright (c) 2023 The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <node/kernel_notifications.h>
6 : :
7 : : #include <bitcoin-build-config.h> // IWYU pragma: keep
8 : :
9 : : #include <chain.h>
10 : : #include <common/args.h>
11 : : #include <common/system.h>
12 : : #include <kernel/context.h>
13 : : #include <kernel/warning.h>
14 : : #include <logging.h>
15 : : #include <node/abort.h>
16 : : #include <node/interface_ui.h>
17 : : #include <node/warnings.h>
18 : : #include <util/check.h>
19 : : #include <util/signalinterrupt.h>
20 : : #include <util/strencodings.h>
21 : : #include <util/string.h>
22 : : #include <util/translation.h>
23 : :
24 : : #include <cstdint>
25 : : #include <string>
26 : : #include <thread>
27 : :
28 : : using util::ReplaceAll;
29 : :
30 : 1 : static void AlertNotify(const std::string& strMessage)
31 : : {
32 : : #if HAVE_SYSTEM
33 [ + - + - ]: 2 : std::string strCmd = gArgs.GetArg("-alertnotify", "");
34 [ + - ]: 1 : if (strCmd.empty()) return;
35 : :
36 : : // Alert text should be plain ascii coming from a trusted source, but to
37 : : // be safe we first strip anything not in safeChars, then add single quotes around
38 : : // the whole string before passing it to the shell:
39 [ # # ]: 0 : std::string singleQuote("'");
40 [ # # ]: 0 : std::string safeStatus = SanitizeString(strMessage);
41 [ # # # # ]: 0 : safeStatus = singleQuote+safeStatus+singleQuote;
42 [ # # # # ]: 0 : ReplaceAll(strCmd, "%s", safeStatus);
43 : :
44 [ # # ]: 0 : std::thread t(runCommand, strCmd);
45 [ # # ]: 0 : t.detach(); // thread runs free
46 : : #endif
47 : 1 : }
48 : :
49 : : namespace node {
50 : :
51 : 7010 : kernel::InterruptResult KernelNotifications::blockTip(SynchronizationState state, CBlockIndex& index)
52 : : {
53 : 7010 : {
54 : 7010 : LOCK(m_tip_block_mutex);
55 : 7010 : m_tip_block = index.GetBlockHash();
56 [ + - ]: 7010 : m_tip_block_cv.notify_all();
57 : 7010 : }
58 : :
59 : 7010 : uiInterface.NotifyBlockTip(state, &index);
60 [ - + - - ]: 7010 : if (m_stop_at_height && index.nHeight >= m_stop_at_height) {
61 [ # # ]: 0 : if (!m_shutdown_request()) {
62 : 0 : LogError("Failed to send shutdown signal after reaching stop height\n");
63 : : }
64 : 0 : return kernel::Interrupted{};
65 : : }
66 : 7010 : return {};
67 : : }
68 : :
69 : 6745 : void KernelNotifications::headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync)
70 : : {
71 : 6745 : uiInterface.NotifyHeaderTip(state, height, timestamp, presync);
72 : 6745 : }
73 : :
74 : 36 : void KernelNotifications::progress(const bilingual_str& title, int progress_percent, bool resume_possible)
75 : : {
76 : 36 : uiInterface.ShowProgress(title.translated, progress_percent, resume_possible);
77 : 36 : }
78 : :
79 : 7 : void KernelNotifications::warningSet(kernel::Warning id, const bilingual_str& message)
80 : : {
81 [ + - + + ]: 14 : if (m_warnings.Set(id, message)) {
82 : 1 : AlertNotify(message.original);
83 : : }
84 : 7 : }
85 : :
86 : 6316 : void KernelNotifications::warningUnset(kernel::Warning id)
87 : : {
88 : 6316 : m_warnings.Unset(id);
89 : 6316 : }
90 : :
91 : 0 : void KernelNotifications::flushError(const bilingual_str& message)
92 : : {
93 : 0 : AbortNode(m_shutdown_request, m_exit_status, message, &m_warnings);
94 : 0 : }
95 : :
96 : 1 : void KernelNotifications::fatalError(const bilingual_str& message)
97 : : {
98 [ + - ]: 1 : node::AbortNode(m_shutdown_on_fatal_error ? m_shutdown_request : nullptr,
99 [ - + ]: 1 : m_exit_status, message, &m_warnings);
100 : 1 : }
101 : :
102 : 0 : void ReadNotificationArgs(const ArgsManager& args, KernelNotifications& notifications)
103 : : {
104 [ # # # # ]: 0 : if (auto value{args.GetIntArg("-stopatheight")}) notifications.m_stop_at_height = *value;
105 : 0 : }
106 : :
107 : : } // namespace node
|