blob: 3a047d3adc844bbac54705a4af98ba9f42ec0473 [file] [log] [blame]
#include "create_pel.hpp"
#include <libekb.H>
#include <unistd.h>
#include <map>
#include <phosphor-logging/elog.hpp>
#include <xyz/openbmc_project/Logging/Entry/server.hpp>
namespace openpower
{
using namespace phosphor::logging;
namespace util
{
std::string getService(sdbusplus::bus::bus& bus, const std::string& objectPath,
const std::string& interface)
{
constexpr auto mapperBusBame = "xyz.openbmc_project.ObjectMapper";
constexpr auto mapperObjectPath = "/xyz/openbmc_project/object_mapper";
constexpr auto mapperInterface = "xyz.openbmc_project.ObjectMapper";
std::vector<std::pair<std::string, std::vector<std::string>>> response;
auto method = bus.new_method_call(mapperBusBame, mapperObjectPath,
mapperInterface, "GetObject");
method.append(objectPath, std::vector<std::string>({interface}));
try
{
auto reply = bus.call(method);
reply.read(response);
}
catch (const sdbusplus::exception::SdBusError& e)
{
log<level::ERR>("D-Bus call exception",
entry("OBJPATH=%s", mapperObjectPath),
entry("INTERFACE=%s", mapperInterface),
entry("EXCEPTION=%s", e.what()));
throw std::runtime_error("Service name is not found");
}
if (response.empty())
{
throw std::runtime_error("Service name response is empty");
}
return response.begin()->first;
}
} // namespace util
namespace pel
{
void createBootErrorPEL(const FFDCData& ffdcData)
{
constexpr auto loggingObjectPath = "/xyz/openbmc_project/logging";
constexpr auto loggingInterface = "xyz.openbmc_project.Logging.Create";
std::map<std::string, std::string> additionalData;
auto bus = sdbusplus::bus::new_default();
additionalData.emplace("_PID", std::to_string(getpid()));
for (auto& data : ffdcData)
{
additionalData.emplace(data);
}
try
{
static constexpr auto bootErrorMessage =
"org.open_power.PHAL.Error.Boot";
std::string service =
util::getService(bus, loggingObjectPath, loggingInterface);
auto method = bus.new_method_call(service.c_str(), loggingObjectPath,
loggingInterface, "Create");
auto level =
sdbusplus::xyz::openbmc_project::Logging::server::convertForMessage(
sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level::
Error);
method.append(bootErrorMessage, level, additionalData);
auto resp = bus.call(method);
}
catch (const sdbusplus::exception::SdBusError& e)
{
log<level::ERR>("D-Bus call exception",
entry("OBJPATH=%s", loggingObjectPath),
entry("INTERFACE=%s", loggingInterface),
entry("EXCEPTION=%s", e.what()));
throw std::runtime_error(
"Error in invoking D-Bus logging create interface");
}
}
} // namespace pel
} // namespace openpower