xref: /openbmc/phosphor-logging/lib/lg2_commit.cpp (revision 4e8c034395144fdf38f4d3c40675661e8c7342f5)
16eb96bf7SPatrick Williams #include "config.h"
26eb96bf7SPatrick Williams 
39ca4d137SPatrick Williams #include "lg2_commit.hpp"
49ca4d137SPatrick Williams 
5f0af358fSPatrick Williams #include <sys/syslog.h>
6f0af358fSPatrick Williams 
7f0af358fSPatrick Williams #include <nlohmann/json.hpp>
8fc14867bSPatrick Williams #include <phosphor-logging/commit.hpp>
96eb96bf7SPatrick Williams #include <phosphor-logging/lg2.hpp>
10e001cd79SPatrick Williams #include <sdbusplus/async.hpp>
11e001cd79SPatrick Williams #include <sdbusplus/exception.hpp>
12f0af358fSPatrick Williams #include <xyz/openbmc_project/Logging/Create/client.hpp>
13f0af358fSPatrick Williams #include <xyz/openbmc_project/Logging/Entry/client.hpp>
14e001cd79SPatrick Williams 
15fc14867bSPatrick Williams namespace lg2
16fc14867bSPatrick Williams {
17fc14867bSPatrick Williams namespace details
18e001cd79SPatrick Williams {
19e001cd79SPatrick Williams 
20f0af358fSPatrick Williams using Create = sdbusplus::client::xyz::openbmc_project::logging::Create<>;
21f0af358fSPatrick Williams using Entry = sdbusplus::client::xyz::openbmc_project::logging::Entry<>;
22f0af358fSPatrick Williams 
23f0af358fSPatrick Williams /* Convert syslog severity to Entry::Level */
severity_from_syslog(int s)24f0af358fSPatrick Williams static auto severity_from_syslog(int s) -> Entry::Level
25e001cd79SPatrick Williams {
26f0af358fSPatrick Williams     switch (s)
27f0af358fSPatrick Williams     {
28f0af358fSPatrick Williams         case LOG_DEBUG:
29f0af358fSPatrick Williams             return Entry::Level::Debug;
30f0af358fSPatrick Williams 
31f0af358fSPatrick Williams         case LOG_INFO:
32f0af358fSPatrick Williams             return Entry::Level::Informational;
33f0af358fSPatrick Williams 
34f0af358fSPatrick Williams         case LOG_NOTICE:
35f0af358fSPatrick Williams             return Entry::Level::Notice;
36f0af358fSPatrick Williams 
37f0af358fSPatrick Williams         case LOG_WARNING:
38f0af358fSPatrick Williams             return Entry::Level::Warning;
39f0af358fSPatrick Williams 
40f0af358fSPatrick Williams         case LOG_ERR:
41f0af358fSPatrick Williams             return Entry::Level::Error;
42f0af358fSPatrick Williams 
43f0af358fSPatrick Williams         case LOG_CRIT:
44f0af358fSPatrick Williams             return Entry::Level::Critical;
45f0af358fSPatrick Williams 
46f0af358fSPatrick Williams         case LOG_ALERT:
47f0af358fSPatrick Williams             return Entry::Level::Alert;
48f0af358fSPatrick Williams 
49f0af358fSPatrick Williams         case LOG_EMERG:
50f0af358fSPatrick Williams             return Entry::Level::Emergency;
51f0af358fSPatrick Williams     }
52f0af358fSPatrick Williams     return Entry::Level::Emergency;
53e001cd79SPatrick Williams }
54e001cd79SPatrick Williams 
55f0af358fSPatrick Williams using AdditionalData_t = std::map<std::string, std::string>;
56f0af358fSPatrick Williams 
57f0af358fSPatrick Williams /* Create AdditionalData from the sdbusplus event json. */
data_from_json(sdbusplus::exception::generated_event_base & t)58f0af358fSPatrick Williams static auto data_from_json(sdbusplus::exception::generated_event_base& t)
59f0af358fSPatrick Williams     -> AdditionalData_t
60f0af358fSPatrick Williams {
61f0af358fSPatrick Williams     AdditionalData_t result{};
62f0af358fSPatrick Williams 
63f0af358fSPatrick Williams     auto j = t.to_json()[t.name()];
64f0af358fSPatrick Williams     for (const auto& item : j.items())
65f0af358fSPatrick Williams     {
66247fed60SPatrick Williams         // Special cases for the "_SOURCE" fields, which contain debug
67247fed60SPatrick Williams         // information about the origin of the event.
68247fed60SPatrick Williams         if (item.key() == "_SOURCE")
69247fed60SPatrick Williams         {
70247fed60SPatrick Williams             for (const auto& source_item : item.value().items())
71247fed60SPatrick Williams             {
72247fed60SPatrick Williams                 if (source_item.key() == "PID")
73247fed60SPatrick Williams                 {
74247fed60SPatrick Williams                     result.emplace("_PID", source_item.value().dump());
75247fed60SPatrick Williams                     continue;
76247fed60SPatrick Williams                 }
77247fed60SPatrick Williams                 if (source_item.key() == "FILE")
78247fed60SPatrick Williams                 {
79247fed60SPatrick Williams                     result.emplace("_CODE_FILE", source_item.value());
80247fed60SPatrick Williams                     continue;
81247fed60SPatrick Williams                 }
82247fed60SPatrick Williams                 if (source_item.key() == "FUNCTION")
83247fed60SPatrick Williams                 {
84247fed60SPatrick Williams                     result.emplace("_CODE_FUNC", source_item.value());
85247fed60SPatrick Williams                     continue;
86247fed60SPatrick Williams                 }
87247fed60SPatrick Williams                 if (source_item.key() == "LINE")
88247fed60SPatrick Williams                 {
89247fed60SPatrick Williams                     result.emplace("_CODE_LINE", source_item.value().dump());
90247fed60SPatrick Williams                     continue;
91247fed60SPatrick Williams                 }
92247fed60SPatrick Williams             }
93247fed60SPatrick Williams             continue;
94247fed60SPatrick Williams         }
95247fed60SPatrick Williams 
96dd9694aeSPatrick Williams         if (item.value().type() == nlohmann::json::value_t::string)
97dd9694aeSPatrick Williams         {
98dd9694aeSPatrick Williams             result.emplace(item.key(), item.value());
99dd9694aeSPatrick Williams         }
100dd9694aeSPatrick Williams         else
101dd9694aeSPatrick Williams         {
102f0af358fSPatrick Williams             result.emplace(item.key(), item.value().dump());
103f0af358fSPatrick Williams         }
104dd9694aeSPatrick Williams     }
105f0af358fSPatrick Williams 
106f0af358fSPatrick Williams     return result;
107f0af358fSPatrick Williams }
108f0af358fSPatrick Williams 
extractEvent(sdbusplus::exception::generated_event_base && t)1099ca4d137SPatrick Williams auto extractEvent(sdbusplus::exception::generated_event_base&& t)
110ea21d995SPatrick Williams     -> std::tuple<std::string, Entry::Level, std::map<std::string, std::string>>
1119ca4d137SPatrick Williams {
112ea21d995SPatrick Williams     return {t.name(), severity_from_syslog(t.severity()), data_from_json(t)};
1139ca4d137SPatrick Williams }
1149ca4d137SPatrick Williams 
115fc14867bSPatrick Williams } // namespace details
116fc14867bSPatrick Williams 
commit(sdbusplus::exception::generated_event_base && t)117fc14867bSPatrick Williams auto commit(sdbusplus::exception::generated_event_base&& t)
118fc14867bSPatrick Williams     -> sdbusplus::message::object_path
119fc14867bSPatrick Williams {
120fc14867bSPatrick Williams     if constexpr (LG2_COMMIT_JOURNAL)
121fc14867bSPatrick Williams     {
122fc14867bSPatrick Williams         lg2::error("OPENBMC_MESSAGE_ID={DATA}", "DATA", t.to_json().dump());
123fc14867bSPatrick Williams     }
124fc14867bSPatrick Williams 
125fc14867bSPatrick Williams     if constexpr (LG2_COMMIT_DBUS)
126fc14867bSPatrick Williams     {
127fc14867bSPatrick Williams         using details::Create;
128fc14867bSPatrick Williams 
129fc14867bSPatrick Williams         auto b = sdbusplus::bus::new_default();
130fc14867bSPatrick Williams         auto m =
131fc14867bSPatrick Williams             b.new_method_call(Create::default_service, Create::instance_path,
132fc14867bSPatrick Williams                               Create::interface, "Create");
133fc14867bSPatrick Williams 
134fc14867bSPatrick Williams         m.append(t.name(), details::severity_from_syslog(t.severity()),
135fc14867bSPatrick Williams                  details::data_from_json(t));
136fc14867bSPatrick Williams 
137fc14867bSPatrick Williams         auto reply = b.call(m);
138fc14867bSPatrick Williams 
139fc14867bSPatrick Williams         return reply.unpack<sdbusplus::message::object_path>();
140fc14867bSPatrick Williams     }
141fc14867bSPatrick Williams 
142fc14867bSPatrick Williams     return {};
143fc14867bSPatrick Williams }
144fc14867bSPatrick Williams 
resolve(const sdbusplus::message::object_path & logPath)145*4e8c0343SAmithash Prasasd void resolve(const sdbusplus::message::object_path& logPath)
146*4e8c0343SAmithash Prasasd {
147*4e8c0343SAmithash Prasasd     if constexpr (LG2_COMMIT_DBUS)
148*4e8c0343SAmithash Prasasd     {
149*4e8c0343SAmithash Prasasd         using details::Entry;
150*4e8c0343SAmithash Prasasd 
151*4e8c0343SAmithash Prasasd         auto b = sdbusplus::bus::new_default();
152*4e8c0343SAmithash Prasasd         auto m = b.new_method_call(Entry::default_service, logPath.str.c_str(),
153*4e8c0343SAmithash Prasasd                                    "org.freedesktop.DBus.Properties", "Set");
154*4e8c0343SAmithash Prasasd         m.append(Entry::interface, "Resolved", std::variant<bool>(true));
155*4e8c0343SAmithash Prasasd         auto reply = b.call(m);
156*4e8c0343SAmithash Prasasd     }
157*4e8c0343SAmithash Prasasd }
158*4e8c0343SAmithash Prasasd 
commit(sdbusplus::async::context & ctx,sdbusplus::exception::generated_event_base && t)159fc14867bSPatrick Williams auto commit(sdbusplus::async::context& ctx,
160fc14867bSPatrick Williams             sdbusplus::exception::generated_event_base&& t)
161fc14867bSPatrick Williams     -> sdbusplus::async::task<sdbusplus::message::object_path>
162fc14867bSPatrick Williams {
163fc14867bSPatrick Williams     using details::Create;
164fc14867bSPatrick Williams 
165fc14867bSPatrick Williams     if constexpr (LG2_COMMIT_JOURNAL)
166fc14867bSPatrick Williams     {
167fc14867bSPatrick Williams         lg2::error("OPENBMC_MESSAGE_ID={DATA}", "DATA", t.to_json().dump());
168fc14867bSPatrick Williams     }
169fc14867bSPatrick Williams 
170fc14867bSPatrick Williams     if constexpr (LG2_COMMIT_DBUS)
171fc14867bSPatrick Williams     {
172fc14867bSPatrick Williams         co_return co_await Create(ctx)
173fc14867bSPatrick Williams             .service(Create::default_service)
174fc14867bSPatrick Williams             .path(Create::instance_path)
175fc14867bSPatrick Williams             .create(t.name(), details::severity_from_syslog(t.severity()),
176fc14867bSPatrick Williams                     details::data_from_json(t));
177fc14867bSPatrick Williams     }
178fc14867bSPatrick Williams     co_return {};
179fc14867bSPatrick Williams }
180fc14867bSPatrick Williams 
resolve(sdbusplus::async::context & ctx,const sdbusplus::message::object_path & logPath)181*4e8c0343SAmithash Prasasd auto resolve(sdbusplus::async::context& ctx,
182*4e8c0343SAmithash Prasasd              const sdbusplus::message::object_path& logPath)
183*4e8c0343SAmithash Prasasd     -> sdbusplus::async::task<>
184*4e8c0343SAmithash Prasasd {
185*4e8c0343SAmithash Prasasd     using details::Entry;
186*4e8c0343SAmithash Prasasd 
187*4e8c0343SAmithash Prasasd     if constexpr (LG2_COMMIT_DBUS)
188*4e8c0343SAmithash Prasasd     {
189*4e8c0343SAmithash Prasasd         std::string path = logPath.str;
190*4e8c0343SAmithash Prasasd         co_await Entry(ctx)
191*4e8c0343SAmithash Prasasd             .service(Entry::default_service)
192*4e8c0343SAmithash Prasasd             .path(path)
193*4e8c0343SAmithash Prasasd             .resolved(true);
194*4e8c0343SAmithash Prasasd     }
195*4e8c0343SAmithash Prasasd     co_return;
196*4e8c0343SAmithash Prasasd }
197*4e8c0343SAmithash Prasasd 
198fc14867bSPatrick Williams } // namespace lg2
199