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