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