blob: c7cc88372d38257713024118e3a6967889603f76 [file] [log] [blame]
Shantappa Teekappanavarb64983f2022-02-01 09:28:10 -06001#pragma once
2
3#include "file_descriptor.hpp"
4#include "utils.hpp"
5#include "xyz/openbmc_project/Logging/Create/server.hpp"
6
7#include <nlohmann/json.hpp>
8
9#include <cstdint>
10#include <filesystem>
11
12namespace watchdog
13{
14namespace dump
15{
16
17namespace fs = std::filesystem;
18using FFDCFormat =
19 sdbusplus::xyz::openbmc_project::Logging::server::Create::FFDCFormat;
20using FFDCTuple =
21 std::tuple<FFDCFormat, uint8_t, uint8_t, sdbusplus::message::unix_fd>;
22
23using ::nlohmann::json;
24/**
25 * @class FFDCFile
26 *
27 * File that contains FFDC (first failure data capture) data in json format.
28 *
29 * This class is used to store FFDC json callout data in an error log.
30 */
31class FFDCFile
32{
33 public:
34 // Specify which compiler-generated methods we want
35 FFDCFile() = delete;
36 FFDCFile(const FFDCFile&) = delete;
37 FFDCFile(FFDCFile&&) = default;
38 FFDCFile& operator=(const FFDCFile&) = delete;
39 FFDCFile& operator=(FFDCFile&&) = default;
40 ~FFDCFile();
41
42 /**
43 * @brief Constructor
44 *
45 * @details Creates the FFDC file by using passed json data.
46 *
47 * Throws an exception if an error occurs.
48 */
49 explicit FFDCFile(const json& calloutData);
50
51 /**
52 * @brief Returns the file descriptor for the file.
53 *
54 * @details The file is open for both reading and writing.
55 *
56 * @return file descriptor
57 */
58 int getFileDescriptor() const
59 {
60 // Return the integer file descriptor within the FileDescriptor object
61 return descriptor();
62 }
63
64 /**
65 * @brief Returns the absolute path to the file.
66 *
67 * @return absolute path
68 */
69 const fs::path& getPath() const
70 {
71 return tempFile.getPath();
72 }
73
74 private:
75 /**
76 * @brief Temporary file where FFDC data is stored.
77 *
78 * @details The TemporaryFile destructor will automatically delete the file
79 * if it was not explicitly deleted using remove().
80 */
81 TemporaryFile tempFile{};
82
83 /**
84 * @brief File descriptor for reading from/writing to the file.
85 *
86 * @details The FileDescriptor destructor will automatically close the file
87 * if it was not explicitly closed using remove().
88 */
89 FileDescriptor descriptor{};
90
91 /**
92 * @brief Used to store callout ffdc data from passed json object
93 */
94 std::string calloutData;
95
96 /**
97 * @brief Creates FFDC file for creating PEL records.
98 */
99 void prepareFFDCFile();
100};
101
102} // namespace dump
103} // namespace watchdog