Raise SNMP trap by reading error entry properties

dbus-monitor is notified for any new error entry
created. dbus-monitor parses the error entry and
constructs ErrorNotification object and sends
SNMP trap.

Change-Id: I25916b087c5513916c90266278ccafc5db3c41a0
Signed-off-by: Marri Devender Rao <devenrao@in.ibm.com>
diff --git a/src/snmp_trap.cpp b/src/snmp_trap.cpp
index 06e8b18..27b8133 100644
--- a/src/snmp_trap.cpp
+++ b/src/snmp_trap.cpp
@@ -1,14 +1,55 @@
 #include "snmp_trap.hpp"
+#include <snmp.hpp>
+#include <snmp_notification.hpp>
+#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/elog.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <xyz/openbmc_project/Logging/Entry/server.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
 namespace phosphor
 {
 namespace dbus
 {
 namespace monitoring
 {
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Logging::server;
+using namespace phosphor::network::snmp;
+using InternalFailure =
+    sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
+
+static constexpr auto entry = "xyz.openbmc_project.Logging.Entry";
+
 void ErrorTrap::trap(sdbusplus::message::message& msg) const
 {
-    // TODO openbmc/openbmc#3059
-    // TODO: Send trap to SNMP to be added after phoshpor-snmp is merged
+    sdbusplus::message::object_path path;
+    msg.read(path);
+    PathInterfacesAdded intfs;
+    msg.read(intfs);
+    auto it = intfs.find(entry);
+    if (it == intfs.end())
+    {
+        return;
+    }
+    auto& propMap = it->second;
+    auto errorID = propMap.at("Id").get<uint32_t>();
+    auto timestamp = propMap.at("Timestamp").get<uint64_t>();
+    auto sev = propMap.at("Severity").get<std::string>();
+    auto isev = static_cast<uint8_t>(Entry::convertLevelFromString(sev));
+    auto message = propMap.at("Message").get<std::string>();
+    try
+    {
+        sendTrap<OBMCErrorNotification>(errorID, timestamp, isev, message);
+    }
+    catch (const InternalFailure& e)
+    {
+        log<level::INFO>(
+            "Failed to send SNMP trap",
+            phosphor::logging::entry("ERROR_ID=%d", errorID),
+            phosphor::logging::entry("TIMESTAMP=%llu", timestamp),
+            phosphor::logging::entry("SEVERITY=%s", sev.c_str()),
+            phosphor::logging::entry("MESSAGE=%s", message.c_str()));
+    }
 }
 } // namespace monitoring
 } // namespace dbus