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