blob: 8e0967ed942c9109406d85d12f14f7225a7bf165 [file] [log] [blame]
#include "config.h"
#include "dump_manager_faultlog.hpp"
#include "dump_utils.hpp"
#include "faultlog_dump_entry.hpp"
#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/elog.hpp>
#include <phosphor-logging/lg2.hpp>
#include <xyz/openbmc_project/Common/File/error.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <string>
namespace phosphor
{
namespace dump
{
namespace faultlog
{
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;
using namespace sdbusplus::xyz::openbmc_project::Common::File::Error;
using ErrnoOpen = xyz::openbmc_project::Common::File::Open::ERRNO;
using PathOpen = xyz::openbmc_project::Common::File::Open::PATH;
sdbusplus::message::object_path
Manager::createDump(phosphor::dump::DumpCreateParams params)
{
lg2::info("In dump_manager_fault.cpp createDump");
// Currently we ignore the parameters.
// TODO phosphor-debug-collector/issues/22: Check parameter values and
// exit early if we don't receive the expected parameters
if (params.empty())
{
lg2::info("No additional parameters received");
}
else
{
lg2::info("Got additional parameters");
}
// Get the originator id and type from params
std::string originatorId;
originatorTypes originatorType;
phosphor::dump::extractOriginatorProperties(params, originatorId,
originatorType);
// Get the id
auto id = lastEntryId + 1;
auto idString = std::to_string(id);
auto objPath = std::filesystem::path(baseEntryPath) / idString;
std::filesystem::path faultLogFilePath(std::string(FAULTLOG_DUMP_PATH) +
idString);
std::ofstream faultLogFile;
errno = 0;
faultLogFile.open(faultLogFilePath,
std::ofstream::out | std::fstream::trunc);
if (faultLogFile.is_open())
{
lg2::info("faultLogFile is open");
faultLogFile << "This is faultlog file #" << idString << " at "
<< std::string(FAULTLOG_DUMP_PATH) + idString << std::endl;
faultLogFile.close();
}
else
{
lg2::error(
"Failed to open fault log file at {FILE_PATH}, errno: {ERRNO}, "
"strerror: {STRERROR}, OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
"FILE_PATH", faultLogFilePath, "ERRNO", errno, "STRERROR",
strerror(errno), "OBJECT_PATH", objPath, "ID", id);
elog<Open>(ErrnoOpen(errno), PathOpen(objPath.c_str()));
}
try
{
lg2::info("dump_manager_faultlog.cpp: add faultlog entry");
uint64_t timestamp =
std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch())
.count();
entries.insert(
std::make_pair(id, std::make_unique<faultlog::Entry>(
bus, objPath.c_str(), id, timestamp,
std::filesystem::file_size(faultLogFilePath),
faultLogFilePath,
phosphor::dump::OperationStatus::Completed,
originatorId, originatorType, *this)));
}
catch (const std::invalid_argument& e)
{
lg2::error("Error in creating dump entry, errormsg: {ERROR}, "
"OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
"ERROR", e, "OBJECT_PATH", objPath, "ID", id);
elog<InternalFailure>();
}
lastEntryId++;
lg2::info("End of dump_manager_faultlog.cpp createDump");
return objPath.string();
}
} // namespace faultlog
} // namespace dump
} // namespace phosphor