blob: a9f15c365f5dda6887e7a11fa60338912800c67a [file] [log] [blame]
George Liuff92ffe2021-02-09 15:01:53 +08001#include "config.h"
2
3#include "ramoops_manager.hpp"
4
5#include <sdbusplus/exception.hpp>
6
7namespace phosphor
8{
9namespace dump
10{
11namespace ramoops
12{
13
14Manager::Manager(const std::string& filePath)
15{
16 std::vector<std::string> files;
17 files.push_back(filePath);
18
19 createHelper(files);
20}
21
22void Manager::createHelper(const std::vector<std::string>& files)
23{
24 if (files.empty())
25 {
26 return;
27 }
28
29 constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
30 constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
31 constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
32 constexpr auto IFACE_INTERNAL("xyz.openbmc_project.Dump.Internal.Create");
33 constexpr auto RAMOOPS =
34 "xyz.openbmc_project.Dump.Internal.Create.Type.Ramoops";
35
36 auto b = sdbusplus::bus::new_default();
37 auto mapper = b.new_method_call(MAPPER_BUSNAME, MAPPER_PATH,
38 MAPPER_INTERFACE, "GetObject");
39 mapper.append(OBJ_INTERNAL, std::set<std::string>({IFACE_INTERNAL}));
40
41 auto mapperResponseMsg = b.call(mapper);
42 if (mapperResponseMsg.is_method_error())
43 {
44 log<level::ERR>("Error in mapper call");
45 return;
46 }
47
48 std::map<std::string, std::set<std::string>> mapperResponse;
49 try
50 {
51 mapperResponseMsg.read(mapperResponse);
52 }
53 catch (const sdbusplus::exception::SdBusError& e)
54 {
55 log<level::ERR>(
56 "Failed to parse dump create message", entry("ERROR=%s", e.what()),
57 entry("REPLY_SIG=%s", mapperResponseMsg.get_signature()));
58 return;
59 }
60 if (mapperResponse.empty())
61 {
62 log<level::ERR>("Error reading mapper response");
63 return;
64 }
65
66 const auto& host = mapperResponse.cbegin()->first;
67 auto m =
68 b.new_method_call(host.c_str(), OBJ_INTERNAL, IFACE_INTERNAL, "Create");
69 m.append(RAMOOPS, files);
70 b.call_noreply(m);
71}
72
73} // namespace ramoops
74} // namespace dump
75} // namespace phosphor