Add support to enable dump collection for core dump

Implemented d-bus internal create function.

Change-Id: I34088d4c084a5a086189f4bc9e84e53a39193501
Signed-off-by: Jayanth Othayoth <ojayanth@in.ibm.com>
diff --git a/core_manager.cpp b/core_manager.cpp
index 8a91a27..f48e8dc 100644
--- a/core_manager.cpp
+++ b/core_manager.cpp
@@ -1,7 +1,7 @@
-#include <unistd.h>
-#include <sys/inotify.h>
+#include <phosphor-logging/log.hpp>
 
 #include "core_manager.hpp"
+#include "config.h"
 
 namespace phosphor
 {
@@ -12,16 +12,67 @@
 namespace manager
 {
 
+using namespace phosphor::logging;
+using namespace std;
+
 void watchCallback(const UserMap& fileInfo)
 {
+    vector<string> files;
+
     for (const auto& i : fileInfo)
     {
-        // For any new dump file create dump entry object.
+        // Get list of debug files.
         if (IN_CLOSE_WRITE == i.second)
         {
-            //TODO openbmc/openbmc#1795 Enable Dump collection function here
+            files.push_back(i.first.string());
         }
     }
+    if(!files.empty())
+    {
+        createHelper(files);
+    }
+}
+
+void createHelper(const vector<string>& files)
+{
+    constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
+    constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
+    constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
+    constexpr auto IFACE_INTERNAL("xyz.openbmc_project.Dump.Internal.Create");
+    constexpr auto APPLICATION_CORED =
+              "xyz.openbmc_project.Dump.Internal.Create.Type.ApplicationCored";
+
+    auto b = sdbusplus::bus::new_default();
+    auto mapper = b.new_method_call(
+                      MAPPER_BUSNAME,
+                      MAPPER_PATH,
+                      MAPPER_INTERFACE,
+                      "GetObject");
+    mapper.append(OBJ_INTERNAL, vector<string>({IFACE_INTERNAL}));
+
+    auto mapperResponseMsg = b.call(mapper);
+    if (mapperResponseMsg.is_method_error())
+    {
+        log<level::ERR>("Error in mapper call");
+        return;
+    }
+
+    map<string, vector<string>> mapperResponse;
+    mapperResponseMsg.read(mapperResponse);
+    if (mapperResponse.empty())
+    {
+        log<level::ERR>("Error reading mapper response");
+        return;
+    }
+
+    const auto& host = mapperResponse.cbegin()->first;
+    auto m = b.new_method_call(
+                 host.c_str(),
+                 OBJ_INTERNAL,
+                 IFACE_INTERNAL,
+                 "Create");
+    m.append(APPLICATION_CORED, files);
+    b.call_noreply(m);
 }
 
 } // namespace manager
diff --git a/core_manager.hpp b/core_manager.hpp
index 19658a5..84818e5 100644
--- a/core_manager.hpp
+++ b/core_manager.hpp
@@ -21,6 +21,12 @@
   */
 void watchCallback(const UserMap& fileInfo);
 
+/** @brief Helper function for initiating dump request using
+ *         D-bus internal create interface.
+ *  @param [in] files - Core files list
+ */
+void createHelper(const std::vector<std::string>& files);
+
 } // namespace manager
 } // namepsace core
 } // namespace dump
diff --git a/dump_internal.hpp b/dump_internal.hpp
index 0688b78..d13ae24 100644
--- a/dump_internal.hpp
+++ b/dump_internal.hpp
@@ -14,6 +14,7 @@
 
 using CreateIface = sdbusplus::server::object::object<
           sdbusplus::xyz::openbmc_project::Dump::Internal::server::Create>;
+using Mgr = phosphor::dump::Manager;
 
 /** @class Manager
  *  @brief Implementation for the
@@ -31,10 +32,12 @@
 
         /** @brief Constructor to put object onto bus at a dbus path.
          *  @param[in] bus - Bus to attach to.
+         *  @param[in] dumpMgr - Dump Manager object
          *  @param[in] path - Path to attach at.
          */
-        Manager(sdbusplus::bus::bus& bus, const char* path) :
-            CreateIface(bus, path) {};
+        Manager(sdbusplus::bus::bus& bus, Mgr& dumpMgr, const char* path):
+            CreateIface(bus, path),
+            dumpMgr(dumpMgr) {};
 
         /**  @brief Implementation for Create
           *  Create BMC Dump based on the Dump type.
@@ -46,7 +49,9 @@
         void create(
             Type type,
             std::vector<std::string> fullPaths) override;
-
+    private:
+        /**  @brief Dump Manager object. */
+        Mgr& dumpMgr;
 };
 
 } // namespace internal
diff --git a/dump_manager.cpp b/dump_manager.cpp
index d5150d3..571ced5 100644
--- a/dump_manager.cpp
+++ b/dump_manager.cpp
@@ -23,8 +23,7 @@
     Type type,
     std::vector<std::string> fullPaths)
 {
-    // TODO openbmc/openbmc#1795
-    // Add implementaion of internal create function.
+    dumpMgr.phosphor::dump::Manager::captureDump(type, fullPaths);
 }
 
 } //namepsace internal
diff --git a/dump_manager_main.cpp b/dump_manager_main.cpp
index 2cb6d2b..89aa6d4 100644
--- a/dump_manager_main.cpp
+++ b/dump_manager_main.cpp
@@ -33,7 +33,7 @@
     try
     {
         phosphor::dump::Manager manager(bus, eventP, DUMP_OBJPATH);
-        phosphor::dump::internal::Manager mgr(bus, OBJ_INTERNAL);
+        phosphor::dump::internal::Manager mgr(bus, manager, OBJ_INTERNAL);
         bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL);
 
         auto rc = sd_event_loop(eventP.get());