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>
10*d1f670feSDhruvaraj 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 
32919f71c6SClaire Weinan sdbusplus::message::object_path
createDump(phosphor::dump::DumpCreateParams params)33919f71c6SClaire Weinan     Manager::createDump(phosphor::dump::DumpCreateParams params)
34919f71c6SClaire Weinan {
35*d1f670feSDhruvaraj 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     {
42*d1f670feSDhruvaraj Subhashchandran         lg2::info("No additional parameters received");
43919f71c6SClaire Weinan     }
44919f71c6SClaire Weinan     else
45919f71c6SClaire Weinan     {
46*d1f670feSDhruvaraj 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 
61919f71c6SClaire Weinan     std::filesystem::path faultLogFilePath(std::string(FAULTLOG_DUMP_PATH) +
62919f71c6SClaire Weinan                                            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     {
72*d1f670feSDhruvaraj 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     {
81*d1f670feSDhruvaraj Subhashchandran         lg2::error(
82*d1f670feSDhruvaraj Subhashchandran             "Failed to open fault log file at {FILE_PATH}, errno: {ERRNO}, "
83*d1f670feSDhruvaraj Subhashchandran             "strerror: {STRERROR}, OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
84*d1f670feSDhruvaraj Subhashchandran             "FILE_PATH", faultLogFilePath, "ERRNO", errno, "STRERROR",
85*d1f670feSDhruvaraj 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     {
91*d1f670feSDhruvaraj 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 
9874a1f39cSAsmitha Karunanithi         entries.insert(
9974a1f39cSAsmitha Karunanithi             std::make_pair(id, std::make_unique<faultlog::Entry>(
100919f71c6SClaire Weinan                                    bus, objPath.c_str(), id, timestamp,
10174a1f39cSAsmitha Karunanithi                                    std::filesystem::file_size(faultLogFilePath),
10274a1f39cSAsmitha Karunanithi                                    faultLogFilePath,
10374a1f39cSAsmitha Karunanithi                                    phosphor::dump::OperationStatus::Completed,
10474a1f39cSAsmitha Karunanithi                                    originatorId, originatorType, *this)));
105919f71c6SClaire Weinan     }
106919f71c6SClaire Weinan     catch (const std::invalid_argument& e)
107919f71c6SClaire Weinan     {
108*d1f670feSDhruvaraj Subhashchandran         lg2::error("Error in creating dump entry, errormsg: {ERROR}, "
109*d1f670feSDhruvaraj Subhashchandran                    "OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
110*d1f670feSDhruvaraj Subhashchandran                    "ERROR", e, "OBJECT_PATH", objPath, "ID", id);
111919f71c6SClaire Weinan         elog<InternalFailure>();
112919f71c6SClaire Weinan     }
113919f71c6SClaire Weinan 
114919f71c6SClaire Weinan     lastEntryId++;
115919f71c6SClaire Weinan 
116*d1f670feSDhruvaraj 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