blob: a7184725f630b14e44bf6bf57083c6d87e10efa5 [file] [log] [blame]
Claire Weinan919f71c2022-03-01 19:02:07 -08001#include "config.h"
2
3#include "dump_manager_faultlog.hpp"
4
5#include "faultlog_dump_entry.hpp"
6
7#include <fmt/core.h>
8
9#include <phosphor-logging/elog-errors.hpp>
10#include <phosphor-logging/elog.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
19namespace phosphor
20{
21namespace dump
22{
23namespace faultlog
24{
25
26using namespace phosphor::logging;
27using namespace sdbusplus::xyz::openbmc_project::Common::Error;
28using namespace sdbusplus::xyz::openbmc_project::Common::File::Error;
29using ErrnoOpen = xyz::openbmc_project::Common::File::Open::ERRNO;
30using PathOpen = xyz::openbmc_project::Common::File::Open::PATH;
31
32sdbusplus::message::object_path
33 Manager::createDump(phosphor::dump::DumpCreateParams params)
34{
35 log<level::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 log<level::INFO>("No additional parameters received");
43 }
44 else
45 {
46 log<level::INFO>("Got additional parameters");
47 }
48
49 // Get the id
50 auto id = lastEntryId + 1;
51 auto idString = std::to_string(id);
52 auto objPath = std::filesystem::path(baseEntryPath) / idString;
53
54 std::filesystem::path faultLogFilePath(std::string(FAULTLOG_DUMP_PATH) +
55 idString);
56 std::ofstream faultLogFile;
57
58 errno = 0;
59
60 faultLogFile.open(faultLogFilePath,
61 std::ofstream::out | std::fstream::trunc);
62
63 if (faultLogFile.is_open())
64 {
65 log<level::INFO>("faultLogFile is open");
66
67 faultLogFile << "This is faultlog file #" << idString << " at "
68 << std::string(FAULTLOG_DUMP_PATH) + idString << std::endl;
69
70 faultLogFile.close();
71 }
72 else
73 {
74 log<level::ERR>(fmt::format("Failed to open fault log file at {}, "
75 "errno({}), strerror(\"{}\"), "
76 "OBJECTPATH({}), ID({})",
77 faultLogFilePath.c_str(), errno,
78 strerror(errno), objPath.c_str(), id)
79 .c_str());
80 elog<Open>(ErrnoOpen(errno), PathOpen(objPath.c_str()));
81 }
82
83 try
84 {
85 log<level::INFO>("dump_manager_faultlog.cpp: add faultlog entry");
86
87 uint64_t timestamp =
88 std::chrono::duration_cast<std::chrono::microseconds>(
89 std::chrono::system_clock::now().time_since_epoch())
90 .count();
91
92 entries.insert(std::make_pair(
93 id,
94 std::make_unique<faultlog::Entry>(
95 bus, objPath.c_str(), id, timestamp,
96 std::filesystem::file_size(faultLogFilePath), faultLogFilePath,
97 phosphor::dump::OperationStatus::Completed, *this)));
98 }
99 catch (const std::invalid_argument& e)
100 {
101 log<level::ERR>(fmt::format("Error in creating dump entry, "
102 "errormsg({}), OBJECTPATH({}), ID({})",
103 e.what(), objPath.c_str(), id)
104 .c_str());
105 elog<InternalFailure>();
106 }
107
108 lastEntryId++;
109
110 log<level::INFO>("End of dump_manager_faultlog.cpp createDump");
111 return objPath.string();
112}
113
114} // namespace faultlog
115} // namespace dump
116} // namespace phosphor