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