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