1 #include "config.h"
2 
3 #include "ramoops_manager.hpp"
4 
5 #include "dump_manager.hpp"
6 
7 #include <phosphor-logging/lg2.hpp>
8 #include <sdbusplus/bus.hpp>
9 #include <sdbusplus/exception.hpp>
10 #include <xyz/openbmc_project/Dump/Create/common.hpp>
11 #include <xyz/openbmc_project/Dump/Create/server.hpp>
12 
13 #include <filesystem>
14 #include <set>
15 
16 namespace phosphor
17 {
18 namespace dump
19 {
20 namespace ramoops
21 {
22 
23 Manager::Manager(const std::string& filePath)
24 {
25     namespace fs = std::filesystem;
26 
27     fs::path dir(filePath);
28     if (!fs::exists(dir) || fs::is_empty(dir))
29     {
30         return;
31     }
32 
33     std::vector<std::string> files;
34     files.push_back(filePath);
35 
36     createHelper(files);
37 }
38 
39 void Manager::createHelper(const std::vector<std::string>& files)
40 {
41     constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
42     constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
43     constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
44     constexpr auto DUMP_CREATE_IFACE = "xyz.openbmc_project.Dump.Create";
45 
46     auto b = sdbusplus::bus::new_default();
47     auto mapper = b.new_method_call(MAPPER_BUSNAME, MAPPER_PATH,
48                                     MAPPER_INTERFACE, "GetObject");
49     mapper.append(BMC_DUMP_OBJPATH, std::set<std::string>({DUMP_CREATE_IFACE}));
50 
51     std::map<std::string, std::set<std::string>> mapperResponse;
52     try
53     {
54         auto mapperResponseMsg = b.call(mapper);
55         mapperResponseMsg.read(mapperResponse);
56     }
57     catch (const sdbusplus::exception_t& e)
58     {
59         lg2::error("Failed to parse dump create message, error: {ERROR}",
60                    "ERROR", e);
61         return;
62     }
63     if (mapperResponse.empty())
64     {
65         lg2::error("Error reading mapper response");
66         return;
67     }
68 
69     const auto& host = mapperResponse.cbegin()->first;
70     auto m = b.new_method_call(host.c_str(), BMC_DUMP_OBJPATH,
71                                DUMP_CREATE_IFACE, "CreateDump");
72     phosphor::dump::DumpCreateParams params;
73     using CreateParameters =
74         sdbusplus::common::xyz::openbmc_project::dump::Create::CreateParameters;
75     using DumpType =
76         sdbusplus::common::xyz::openbmc_project::dump::Create::DumpType;
77     using DumpIntr = sdbusplus::common::xyz::openbmc_project::dump::Create;
78     params[DumpIntr::convertCreateParametersToString(
79         CreateParameters::DumpType)] =
80         DumpIntr::convertDumpTypeToString(DumpType::Ramoops);
81     params[DumpIntr::convertCreateParametersToString(
82         CreateParameters::FilePath)] = files.front();
83     m.append(params);
84     try
85     {
86         b.call_noreply(m);
87     }
88     catch (const sdbusplus::exception_t& e)
89     {
90         lg2::error("Failed to create ramoops dump, errormsg: {ERROR}", "ERROR",
91                    e);
92     }
93 }
94 
95 } // namespace ramoops
96 } // namespace dump
97 } // namespace phosphor
98