1 #include "config.h"
2
3 #include "dump_manager_faultlog.hpp"
4
5 #include "dump_utils.hpp"
6 #include "faultlog_dump_entry.hpp"
7
8 #include <phosphor-logging/elog-errors.hpp>
9 #include <phosphor-logging/elog.hpp>
10 #include <phosphor-logging/lg2.hpp>
11 #include <xyz/openbmc_project/Common/File/error.hpp>
12 #include <xyz/openbmc_project/Common/error.hpp>
13
14 #include <filesystem>
15 #include <fstream>
16 #include <iostream>
17 #include <string>
18
19 namespace phosphor
20 {
21 namespace dump
22 {
23 namespace faultlog
24 {
25
26 using namespace phosphor::logging;
27 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
28 using namespace sdbusplus::xyz::openbmc_project::Common::File::Error;
29 using ErrnoOpen = xyz::openbmc_project::Common::File::Open::ERRNO;
30 using PathOpen = xyz::openbmc_project::Common::File::Open::PATH;
31
createDump(phosphor::dump::DumpCreateParams params)32 sdbusplus::message::object_path Manager::createDump(
33 phosphor::dump::DumpCreateParams params)
34 {
35 lg2::info("In dump_manager_fault.cpp createDump");
36
37 // Currently we ignore the parameters.
38 // TODO phosphor-debug-collector/issues/22: Check parameter values and
39 // exit early if we don't receive the expected parameters
40 if (params.empty())
41 {
42 lg2::info("No additional parameters received");
43 }
44 else
45 {
46 lg2::info("Got additional parameters");
47 }
48
49 // Get the originator id and type from params
50 std::string originatorId;
51 originatorTypes originatorType;
52
53 phosphor::dump::extractOriginatorProperties(params, originatorId,
54 originatorType);
55
56 // Get the id
57 auto id = lastEntryId + 1;
58 auto idString = std::to_string(id);
59 auto objPath = std::filesystem::path(baseEntryPath) / idString;
60
61 std::filesystem::path faultLogFilePath(
62 std::string(FAULTLOG_DUMP_PATH) + idString);
63 std::ofstream faultLogFile;
64
65 errno = 0;
66
67 faultLogFile.open(faultLogFilePath,
68 std::ofstream::out | std::fstream::trunc);
69
70 if (faultLogFile.is_open())
71 {
72 lg2::info("faultLogFile is open");
73
74 faultLogFile << "This is faultlog file #" << idString << " at "
75 << std::string(FAULTLOG_DUMP_PATH) + idString << std::endl;
76
77 faultLogFile.close();
78 }
79 else
80 {
81 lg2::error(
82 "Failed to open fault log file at {FILE_PATH}, errno: {ERRNO}, "
83 "strerror: {STRERROR}, OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
84 "FILE_PATH", faultLogFilePath, "ERRNO", errno, "STRERROR",
85 strerror(errno), "OBJECT_PATH", objPath, "ID", id);
86 elog<Open>(ErrnoOpen(errno), PathOpen(objPath.c_str()));
87 }
88
89 try
90 {
91 lg2::info("dump_manager_faultlog.cpp: add faultlog entry");
92
93 uint64_t timestamp =
94 std::chrono::duration_cast<std::chrono::microseconds>(
95 std::chrono::system_clock::now().time_since_epoch())
96 .count();
97
98 entries.insert(std::make_pair(
99 id,
100 std::make_unique<faultlog::Entry>(
101 bus, objPath.c_str(), id, timestamp,
102 std::filesystem::file_size(faultLogFilePath), faultLogFilePath,
103 phosphor::dump::OperationStatus::Completed, originatorId,
104 originatorType, *this)));
105 }
106 catch (const std::invalid_argument& e)
107 {
108 lg2::error("Error in creating dump entry, errormsg: {ERROR}, "
109 "OBJECTPATH: {OBJECT_PATH}, ID: {ID}",
110 "ERROR", e, "OBJECT_PATH", objPath, "ID", id);
111 elog<InternalFailure>();
112 }
113
114 lastEntryId++;
115
116 lg2::info("End of dump_manager_faultlog.cpp createDump");
117 return objPath.string();
118 }
119
120 } // namespace faultlog
121 } // namespace dump
122 } // namespace phosphor
123