1 #include "snmp_trap.hpp" 2 3 #include <phosphor-logging/elog-errors.hpp> 4 #include <phosphor-logging/elog.hpp> 5 #include <phosphor-logging/log.hpp> 6 #include <snmp.hpp> 7 #include <snmp_notification.hpp> 8 #include <xyz/openbmc_project/Common/error.hpp> 9 #include <xyz/openbmc_project/Logging/Entry/server.hpp> 10 namespace phosphor 11 { 12 namespace dbus 13 { 14 namespace monitoring 15 { 16 using namespace phosphor::logging; 17 using namespace sdbusplus::xyz::openbmc_project::Logging::server; 18 using namespace phosphor::network::snmp; 19 using InternalFailure = 20 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 21 22 static constexpr auto entry = "xyz.openbmc_project.Logging.Entry"; 23 24 void ErrorTrap::trap(sdbusplus::message::message& msg) const 25 { 26 sdbusplus::message::object_path path; 27 msg.read(path); 28 PathInterfacesAdded intfs; 29 msg.read(intfs); 30 auto it = intfs.find(entry); 31 if (it == intfs.end()) 32 { 33 return; 34 } 35 auto& propMap = it->second; 36 auto errorID = 37 sdbusplus::message::variant_ns::get<uint32_t>(propMap.at("Id")); 38 auto timestamp = 39 sdbusplus::message::variant_ns::get<uint64_t>(propMap.at("Timestamp")); 40 auto sev = sdbusplus::message::variant_ns::get<std::string>( 41 propMap.at("Severity")); 42 auto isev = static_cast<uint8_t>(Entry::convertLevelFromString(sev)); 43 auto message = 44 sdbusplus::message::variant_ns::get<std::string>(propMap.at("Message")); 45 try 46 { 47 sendTrap<OBMCErrorNotification>(errorID, timestamp, isev, message); 48 } 49 catch (const InternalFailure& e) 50 { 51 log<level::INFO>( 52 "Failed to send SNMP trap", 53 phosphor::logging::entry("ERROR_ID=%d", errorID), 54 phosphor::logging::entry("TIMESTAMP=%llu", timestamp), 55 phosphor::logging::entry("SEVERITY=%s", sev.c_str()), 56 phosphor::logging::entry("MESSAGE=%s", message.c_str())); 57 } 58 } 59 } // namespace monitoring 60 } // namespace dbus 61 } // namespace phosphor 62