blob: bb853f4ee563762bfb7e94d5dd9930ff8378dbad [file] [log] [blame]
kasunath37bc0df2022-06-07 12:40:26 -07001#pragma once
2
3#include "external_storer_interface.hpp"
4#include "nlohmann/json.hpp"
kasunatha3b64fb2022-06-15 18:47:18 -07005#include "notifier_dbus_handler.hpp"
kasunath37bc0df2022-06-07 12:40:26 -07006
7#include <boost/uuid/uuid_generators.hpp>
8
9#include <filesystem>
10#include <string>
11
12namespace bios_bmc_smm_error_logger
13{
14namespace rde
15{
16
17/**
18 * @brief Simple Base class for writing JSON data to files.
19 *
20 * This class allows us to unit test the ExternalStorerFileInterface
21 * functionality.
22 */
23class FileHandlerInterface
24{
25 public:
26 virtual ~FileHandlerInterface() = default;
27
28 /**
29 * @brief Create a folder at the provided path.
30 *
31 * @param[in] folderPath - folder path.
32 * @return true if successful.
33 */
34 virtual bool createFolder(const std::string& folderPath) const = 0;
35
36 /**
37 * @brief Create an index.json and write the JSON content to it.
38 *
39 * If the file already exists, this will overwrite it.
40 *
41 * @param[in] folderPath - path of the file without including the file name.
42 * @param[in] jsonPdr - PDR in nlohmann::json format.
43 * @return true if successful.
44 */
45 virtual bool createFile(const std::string& folderPath,
46 const nlohmann::json& jsonPdr) const = 0;
47};
48
49/**
50 * @brief Class for handling folder and file creation for ExternalStorer.
51 */
52class ExternalStorerFileWriter : public FileHandlerInterface
53{
54 public:
55 bool createFolder(const std::string& folderPath) const override;
56 bool createFile(const std::string& folderPath,
57 const nlohmann::json& jsonPdr) const override;
58};
59
60/**
61 * @brief Categories for different redfish JSON strings.
62 */
63enum class JsonPdrType
64{
65 logEntry,
66 logService,
67 other
68};
69
70/**
71 * @brief Class for handling ExternalStorer file operations.
72 */
73class ExternalStorerFileInterface : public ExternalStorerInterface
74{
75 public:
76 /**
77 * @brief Constructor for the ExternalStorerFileInterface.
78 *
kasunatha3b64fb2022-06-15 18:47:18 -070079 * @param[in] bus - bus to attach to.
kasunath37bc0df2022-06-07 12:40:26 -070080 * @param[in] rootPath - root path for creating redfish folders.
81 * Eg: "/run/bmcweb"
82 * @param[in] fileHandler - an ExternalStorerFileWriter object. This class
83 * will take the ownership of this object.
84 */
85 ExternalStorerFileInterface(
Patrick Williamsbea36e22022-07-22 19:26:57 -050086 sdbusplus::bus_t& bus, std::string_view rootPath,
kasunath37bc0df2022-06-07 12:40:26 -070087 std::unique_ptr<FileHandlerInterface> fileHandler);
88
89 bool publishJson(std::string_view jsonStr) override;
90
91 private:
Patrick Williamsbea36e22022-07-22 19:26:57 -050092 sdbusplus::bus_t& bus;
kasunath37bc0df2022-06-07 12:40:26 -070093 std::string rootPath;
94 std::unique_ptr<FileHandlerInterface> fileHandler;
95 std::string logServiceId;
kasunatha3b64fb2022-06-15 18:47:18 -070096 std::unique_ptr<CperFileNotifierHandler> cperNotifier;
kasunath37bc0df2022-06-07 12:40:26 -070097 boost::uuids::random_generator randomGen;
98
99 /**
100 * @brief Get the type of the received PDR.
101 *
102 * @param[in] jsonSchema - PDR in nlohmann::json format.
103 * @return JsonPdrType of the PDR.
104 */
105 JsonPdrType getSchemaType(const nlohmann::json& jsonSchema) const;
106
107 /**
108 * @brief Process a LogEntry type PDR.
109 *
110 * @param[in] logEntry - PDR in nlohmann::json format.
111 * @return true if successful.
112 */
113 bool processLogEntry(nlohmann::json& logEntry);
114
115 /**
116 * @brief Process a LogService type PDR.
117 *
118 * @param[in] logService - PDR in nlohmann::json format.
119 * @return true if successful.
120 */
121 bool processLogService(const nlohmann::json& logService);
122
123 /**
124 * @brief Process PDRs that doesn't have a specific category.
125 *
126 * @param[in] jsonPdr - PDR in nlohmann::json format.
127 * @return true if successful.
128 */
129 bool processOtherTypes(const nlohmann::json& jsonPdr) const;
130
131 /**
132 * @brief Create the needed folders and the index.json.
133 *
134 * @param subPath - path within the root folder.
135 * @param jsonPdr - PDR in nlohmann::json format.
136 * @return true if successful.
137 */
138 bool createFile(const std::string& subPath,
139 const nlohmann::json& jsonPdr) const;
140};
141
142} // namespace rde
143} // namespace bios_bmc_smm_error_logger