1 #include "../utils.hpp"
2
3 #include <systemd/sd-journal.h>
4
5 #include <boost/container/flat_map.hpp>
6 #include <nlohmann/json.hpp>
7 #include <xyz/openbmc_project/Inventory/Decorator/Asset/common.hpp>
8
9 #include <string>
10
11 struct InvAddRemoveInfo
12 {
13 std::string model = "Unknown";
14 std::string type = "Unknown";
15 std::string sn = "Unknown";
16 std::string name = "Unknown";
17 };
18
queryInvInfo(const nlohmann::json & record)19 static InvAddRemoveInfo queryInvInfo(const nlohmann::json& record)
20 {
21 auto findType = record.find("Type");
22 auto findAsset = record.find(sdbusplus::common::xyz::openbmc_project::
23 inventory::decorator::Asset::interface);
24
25 std::string model = "Unknown";
26 std::string type = "Unknown";
27 std::string sn = "Unknown";
28 std::string name = "Unknown";
29
30 if (findType != record.end())
31 {
32 type = findType->get<std::string>();
33 }
34 if (findAsset != record.end())
35 {
36 auto findModel = findAsset->find("Model");
37 auto findSn = findAsset->find("SerialNumber");
38 if (findModel != findAsset->end())
39 {
40 model = findModel->get<std::string>();
41 }
42 if (findSn != findAsset->end())
43 {
44 const std::string* getSn = findSn->get_ptr<const std::string*>();
45 if (getSn != nullptr)
46 {
47 sn = *getSn;
48 }
49 else
50 {
51 sn = findSn->dump();
52 }
53 }
54 }
55
56 auto findName = record.find("Name");
57 if (findName != record.end())
58 {
59 name = findName->get<std::string>();
60 }
61
62 return {model, type, sn, name};
63 }
64
logDeviceAdded(const nlohmann::json & record)65 void logDeviceAdded(const nlohmann::json& record)
66 {
67 if (!EM_CACHE_CONFIGURATION)
68 {
69 return;
70 }
71 if (!deviceHasLogging(record))
72 {
73 return;
74 }
75
76 const auto info = queryInvInfo(record);
77
78 sd_journal_send(
79 "MESSAGE=Inventory Added: %s", info.name.c_str(), "PRIORITY=%i",
80 LOG_INFO, "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryAdded",
81 "REDFISH_MESSAGE_ARGS=%s,%s,%s", info.model.c_str(), info.type.c_str(),
82 info.sn.c_str(), "NAME=%s", info.name.c_str(), NULL);
83 }
84
logDeviceRemoved(const nlohmann::json & record)85 void logDeviceRemoved(const nlohmann::json& record)
86 {
87 if (!deviceHasLogging(record))
88 {
89 return;
90 }
91
92 const auto info = queryInvInfo(record);
93
94 sd_journal_send(
95 "MESSAGE=Inventory Removed: %s", info.name.c_str(), "PRIORITY=%i",
96 LOG_INFO, "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryRemoved",
97 "REDFISH_MESSAGE_ARGS=%s,%s,%s", info.model.c_str(), info.type.c_str(),
98 info.sn.c_str(), "NAME=%s", info.name.c_str(), NULL);
99 }
100