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 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 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 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