1919f71c6SClaire Weinan #include "config.h"
2919f71c6SClaire Weinan
3919f71c6SClaire Weinan #include "dump_manager_faultlog.hpp"
4919f71c6SClaire Weinan
574a1f39cSAsmitha Karunanithi #include "dump_utils.hpp"
6919f71c6SClaire Weinan #include "faultlog_dump_entry.hpp"
7919f71c6SClaire Weinan
8919f71c6SClaire Weinan #include <phosphor-logging/elog-errors.hpp>
9919f71c6SClaire Weinan #include <phosphor-logging/elog.hpp>
10d1f670feSDhruvaraj Subhashchandran #include <phosphor-logging/lg2.hpp>
11919f71c6SClaire Weinan #include <xyz/openbmc_project/Common/File/error.hpp>
12919f71c6SClaire Weinan #include <xyz/openbmc_project/Common/error.hpp>
13919f71c6SClaire Weinan
14919f71c6SClaire Weinan #include <filesystem>
15919f71c6SClaire Weinan #include <fstream>
16919f71c6SClaire Weinan #include <iostream>
17919f71c6SClaire Weinan #include <string>
18919f71c6SClaire Weinan
19919f71c6SClaire Weinan namespace phosphor
20919f71c6SClaire Weinan {
21919f71c6SClaire Weinan namespace dump
22919f71c6SClaire Weinan {
23919f71c6SClaire Weinan namespace faultlog
24919f71c6SClaire Weinan {
25919f71c6SClaire Weinan
26919f71c6SClaire Weinan using namespace phosphor::logging;
27919f71c6SClaire Weinan using namespace sdbusplus::xyz::openbmc_project::Common::Error;
28919f71c6SClaire Weinan using namespace sdbusplus::xyz::openbmc_project::Common::File::Error;
29919f71c6SClaire Weinan using ErrnoOpen = xyz::openbmc_project::Common::File::Open::ERRNO;
30919f71c6SClaire Weinan using PathOpen = xyz::openbmc_project::Common::File::Open::PATH;
31919f71c6SClaire Weinan
createDump(phosphor::dump::DumpCreateParams params)32*4207adcdSPatrick Williams sdbusplus::message::object_path Manager::createDump(
33*4207adcdSPatrick Williams phosphor::dump::DumpCreateParams params)
34919f71c6SClaire Weinan {
35d1f670feSDhruvaraj Subhashchandran lg2::info("In dump_manager_fault.cpp createDump");
36919f71c6SClaire Weinan
37919f71c6SClaire Weinan // Currently we ignore the parameters.
38919f71c6SClaire Weinan // TODO phosphor-debug-collector/issues/22: Check parameter values and
39919f71c6SClaire Weinan // exit early if we don't receive the expected parameters
40919f71c6SClaire Weinan if (params.empty())
41919f71c6SClaire Weinan {
42d1f670feSDhruvaraj Subhashchandran lg2::info("No additional parameters received");
43919f71c6SClaire Weinan }
44919f71c6SClaire Weinan else
45919f71c6SClaire Weinan {
46d1f670feSDhruvaraj Subhashchandran lg2::info("Got additional parameters");
47919f71c6SClaire Weinan }
48919f71c6SClaire Weinan
4974a1f39cSAsmitha Karunanithi // Get the originator id and type from params
5074a1f39cSAsmitha Karunanithi std::string originatorId;
5174a1f39cSAsmitha Karunanithi originatorTypes originatorType;
5274a1f39cSAsmitha Karunanithi
5374a1f39cSAsmitha Karunanithi phosphor::dump::extractOriginatorProperties(params, originatorId,
5474a1f39cSAsmitha Karunanithi originatorType);
5574a1f39cSAsmitha Karunanithi
56919f71c6SClaire Weinan // Get the id
57919f71c6SClaire Weinan auto id = lastEntryId + 1;
58919f71c6SClaire Weinan auto idString = std::to_string(id);
59919f71c6SClaire Weinan auto objPath = std::filesystem::path(baseEntryPath) / idString;
60919f71c6SClaire Weinan
61973b291eSPatrick Williams std::filesystem::path faultLogFilePath(
62973b291eSPatrick Williams std::string(FAULTLOG_DUMP_PATH) + idString);
63919f71c6SClaire Weinan std::ofstream faultLogFile;
64919f71c6SClaire Weinan
65919f71c6SClaire Weinan errno = 0;
66919f71c6SClaire Weinan
67919f71c6SClaire Weinan faultLogFile.open(faultLogFilePath,
68919f71c6SClaire Weinan std::ofstream::out | std::fstream::trunc);
69919f71c6SClaire Weinan
70919f71c6SClaire Weinan if (faultLogFile.is_open())
71919f71c6SClaire Weinan {
72d1f670feSDhruvaraj Subhashchandran lg2::info("faultLogFile is open");
73919f71c6SClaire Weinan
74919f71c6SClaire Weinan faultLogFile << "This is faultlog file #" << idString << " at "
75919f71c6SClaire Weinan << std::string(FAULTLOG_DUMP_PATH) + idString << std::endl;
76919f71c6SClaire Weinan
77919f71c6SClaire Weinan faultLogFile.close();
78919f71c6SClaire Weinan }
79919f71c6SClaire Weinan else
80919f71c6SClaire Weinan {
81d1f670feSDhruvaraj Subhashchandran lg2::error(
82d1f670feSDhruvaraj Subhashchandran "Failed to open fault log file at {FILE_PATH}, errno: {ERRNO}, "
83d1f670feSDhruvaraj Subhashchandran "strerror: {STRERROR}, OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
84d1f670feSDhruvaraj Subhashchandran "FILE_PATH", faultLogFilePath, "ERRNO", errno, "STRERROR",
85d1f670feSDhruvaraj Subhashchandran strerror(errno), "OBJECT_PATH", objPath, "ID", id);
86919f71c6SClaire Weinan elog<Open>(ErrnoOpen(errno), PathOpen(objPath.c_str()));
87919f71c6SClaire Weinan }
88919f71c6SClaire Weinan
89919f71c6SClaire Weinan try
90919f71c6SClaire Weinan {
91d1f670feSDhruvaraj Subhashchandran lg2::info("dump_manager_faultlog.cpp: add faultlog entry");
92919f71c6SClaire Weinan
93919f71c6SClaire Weinan uint64_t timestamp =
94919f71c6SClaire Weinan std::chrono::duration_cast<std::chrono::microseconds>(
95919f71c6SClaire Weinan std::chrono::system_clock::now().time_since_epoch())
96919f71c6SClaire Weinan .count();
97919f71c6SClaire Weinan
98973b291eSPatrick Williams entries.insert(std::make_pair(
99973b291eSPatrick Williams id,
100973b291eSPatrick Williams std::make_unique<faultlog::Entry>(
101919f71c6SClaire Weinan bus, objPath.c_str(), id, timestamp,
102973b291eSPatrick Williams std::filesystem::file_size(faultLogFilePath), faultLogFilePath,
103973b291eSPatrick Williams phosphor::dump::OperationStatus::Completed, originatorId,
104973b291eSPatrick Williams originatorType, *this)));
105919f71c6SClaire Weinan }
106919f71c6SClaire Weinan catch (const std::invalid_argument& e)
107919f71c6SClaire Weinan {
108d1f670feSDhruvaraj Subhashchandran lg2::error("Error in creating dump entry, errormsg: {ERROR}, "
109d1f670feSDhruvaraj Subhashchandran "OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
110d1f670feSDhruvaraj Subhashchandran "ERROR", e, "OBJECT_PATH", objPath, "ID", id);
111919f71c6SClaire Weinan elog<InternalFailure>();
112919f71c6SClaire Weinan }
113919f71c6SClaire Weinan
114919f71c6SClaire Weinan lastEntryId++;
115919f71c6SClaire Weinan
116d1f670feSDhruvaraj Subhashchandran lg2::info("End of dump_manager_faultlog.cpp createDump");
117919f71c6SClaire Weinan return objPath.string();
118919f71c6SClaire Weinan }
119919f71c6SClaire Weinan
120919f71c6SClaire Weinan } // namespace faultlog
121919f71c6SClaire Weinan } // namespace dump
122919f71c6SClaire Weinan } // namespace phosphor
123