1 #include "log_device_inventory.hpp" 2 3 #include "../utils.hpp" 4 5 #include <systemd/sd-journal.h> 6 7 #include <nlohmann/json.hpp> 8 #include <xyz/openbmc_project/Inventory/Decorator/Asset/common.hpp> 9 10 #include <flat_map> 11 #include <string> 12 13 static void setStringIfFound(std::string& value, const std::string& key, 14 const nlohmann::json& record, bool dump = false) 15 { 16 const nlohmann::json::const_iterator find = record.find(key); 17 18 if (find == record.end()) 19 { 20 return; 21 } 22 23 const std::string* foundValue = find->get_ptr<const std::string*>(); 24 if (foundValue != nullptr) 25 { 26 value = *foundValue; 27 } 28 else if (dump) 29 { 30 value = find->dump(); 31 } 32 } 33 34 InvAddRemoveInfo queryInvInfo(const nlohmann::json& record) 35 { 36 InvAddRemoveInfo ret; 37 38 setStringIfFound(ret.type, "Type", record); 39 setStringIfFound(ret.name, "Name", record); 40 41 const nlohmann::json::const_iterator findAsset = record.find( 42 sdbusplus::common::xyz::openbmc_project::inventory::decorator::Asset:: 43 interface); 44 45 if (findAsset != record.end()) 46 { 47 setStringIfFound(ret.model, "Model", *findAsset); 48 setStringIfFound(ret.sn, "SerialNumber", *findAsset, true); 49 } 50 51 return ret; 52 } 53 54 void logDeviceAdded(const nlohmann::json& record) 55 { 56 if (!EM_CACHE_CONFIGURATION) 57 { 58 return; 59 } 60 if (!deviceHasLogging(record)) 61 { 62 return; 63 } 64 65 const InvAddRemoveInfo info = queryInvInfo(record); 66 67 sd_journal_send( 68 "MESSAGE=Inventory Added: %s", info.name.c_str(), "PRIORITY=%i", 69 LOG_INFO, "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryAdded", 70 "REDFISH_MESSAGE_ARGS=%s,%s,%s", info.model.c_str(), info.type.c_str(), 71 info.sn.c_str(), "NAME=%s", info.name.c_str(), NULL); 72 } 73 74 void logDeviceRemoved(const nlohmann::json& record) 75 { 76 if (!deviceHasLogging(record)) 77 { 78 return; 79 } 80 81 const InvAddRemoveInfo info = queryInvInfo(record); 82 83 sd_journal_send( 84 "MESSAGE=Inventory Removed: %s", info.name.c_str(), "PRIORITY=%i", 85 LOG_INFO, "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryRemoved", 86 "REDFISH_MESSAGE_ARGS=%s,%s,%s", info.model.c_str(), info.type.c_str(), 87 info.sn.c_str(), "NAME=%s", info.name.c_str(), NULL); 88 } 89