blob: 5dd97d1f767e08c67508a1944de3e872fce70b3d [file] [log] [blame]
Alexander Hansenf57a2592025-06-27 15:07:07 +02001#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
Alexander Hansen71fbff72025-10-09 18:06:12 +020010struct InvAddRemoveInfo
11{
12 std::string model = "Unknown";
13 std::string type = "Unknown";
14 std::string sn = "Unknown";
15 std::string name = "Unknown";
16};
17
18static 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
Alexander Hansenf57a2592025-06-27 15:07:07 +020064void logDeviceAdded(const nlohmann::json& record)
65{
Alexander Hansene6651852025-01-21 16:22:05 +010066 if (!EM_CACHE_CONFIGURATION)
67 {
68 return;
69 }
Alexander Hansenf57a2592025-06-27 15:07:07 +020070 if (!deviceHasLogging(record))
71 {
72 return;
73 }
Alexander Hansenf57a2592025-06-27 15:07:07 +020074
Alexander Hansen71fbff72025-10-09 18:06:12 +020075 const auto info = queryInvInfo(record);
Alexander Hansenf57a2592025-06-27 15:07:07 +020076
Alexander Hansen71fbff72025-10-09 18:06:12 +020077 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);
Alexander Hansenf57a2592025-06-27 15:07:07 +020082}
83
84void logDeviceRemoved(const nlohmann::json& record)
85{
86 if (!deviceHasLogging(record))
87 {
88 return;
89 }
Alexander Hansenf57a2592025-06-27 15:07:07 +020090
Alexander Hansen71fbff72025-10-09 18:06:12 +020091 const auto info = queryInvInfo(record);
Alexander Hansenf57a2592025-06-27 15:07:07 +020092
Alexander Hansen71fbff72025-10-09 18:06:12 +020093 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);
Alexander Hansenf57a2592025-06-27 15:07:07 +020098}