xref: /openbmc/entity-manager/src/entity_manager/log_device_inventory.cpp (revision c58af0b60c2be3e64fd81366fefbe9ece8d190a5)
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