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