xref: /openbmc/phosphor-ipmi-flash/bmc/buildjson.hpp (revision cc7f385bea161647777a55e187c5e40bab4f841c)
1c893f43dSJason Ling #pragma once
2c893f43dSJason Ling 
3e82d7395SJason Ling #include "fs.hpp"
4*cc7f385bSWilliam A. Kennington III #include "handler_config.hpp"
5bec23189SWilliam A. Kennington III #include "status.hpp"
6c893f43dSJason Ling 
7c893f43dSJason Ling #include <nlohmann/json.hpp>
8c893f43dSJason Ling 
9c893f43dSJason Ling #include <memory>
10c893f43dSJason Ling #include <string>
11c893f43dSJason Ling #include <vector>
12c893f43dSJason Ling 
13c893f43dSJason Ling namespace ipmi_flash
14c893f43dSJason Ling {
15e82d7395SJason Ling /**
16e82d7395SJason Ling  * build a systemd file triggerable action from json data
17e82d7395SJason Ling  */
18c893f43dSJason Ling std::unique_ptr<TriggerableActionInterface>
19c893f43dSJason Ling     buildFileSystemd(const nlohmann::json& data);
20c893f43dSJason Ling 
21e82d7395SJason Ling /**
22e82d7395SJason Ling  * build a systemd triggerable action from json data
23e82d7395SJason Ling  */
24c893f43dSJason Ling std::unique_ptr<TriggerableActionInterface>
25c893f43dSJason Ling     buildSystemd(const nlohmann::json& data);
26c893f43dSJason Ling 
27c893f43dSJason Ling /* HandlersBuilderIfc is a helper class that builds Handlers from the json files
28c893f43dSJason Ling  * found within a specified directory.
29c893f43dSJason Ling  * The child class that inherits from HandlersBuilderIfc should implement
30c893f43dSJason Ling  * buildHandlersConfigs to perform json validation and parsing.
31c893f43dSJason Ling  *
32c893f43dSJason Ling  */
33c893f43dSJason Ling template <typename T>
3463fd9321SWilliam A. Kennington III struct HandlersBuilderIfc
35c893f43dSJason Ling {
3663fd9321SWilliam A. Kennington III     virtual ~HandlersBuilderIfc() = default;
3763fd9321SWilliam A. Kennington III 
38c893f43dSJason Ling     /**
39c893f43dSJason Ling      * Given a folder of json configs, build the configurations.
40c893f43dSJason Ling      *
41c893f43dSJason Ling      * @param[in] directory - the directory to search (recurisvely).
42c893f43dSJason Ling      * @return list of HandlerConfig objects.
43c893f43dSJason Ling      */
44c893f43dSJason Ling     std::vector<HandlerConfig<T>>
45e82d7395SJason Ling         buildHandlerConfigs(const std::string& directory)
46e82d7395SJason Ling     {
47e82d7395SJason Ling 
48e82d7395SJason Ling         std::vector<HandlerConfig<T>> output;
49e82d7395SJason Ling 
50e82d7395SJason Ling         std::vector<std::string> jsonPaths = GetJsonList(directory);
51e82d7395SJason Ling         for (const auto& path : jsonPaths)
52e82d7395SJason Ling         {
53e82d7395SJason Ling             std::ifstream jsonFile(path);
54e82d7395SJason Ling             if (!jsonFile.is_open())
55e82d7395SJason Ling             {
56e82d7395SJason Ling                 std::fprintf(stderr, "Unable to open json file: %s\n",
57e82d7395SJason Ling                              path.c_str());
58e82d7395SJason Ling                 continue;
59e82d7395SJason Ling             }
60e82d7395SJason Ling 
61e82d7395SJason Ling             auto data = nlohmann::json::parse(jsonFile, nullptr, false);
62e82d7395SJason Ling             if (data.is_discarded())
63e82d7395SJason Ling             {
64e82d7395SJason Ling                 std::fprintf(stderr, "Parsing json failed: %s\n", path.c_str());
65e82d7395SJason Ling                 continue;
66e82d7395SJason Ling             }
67e82d7395SJason Ling 
68e82d7395SJason Ling             std::vector<HandlerConfig<T>> configs = buildHandlerFromJson(data);
69e82d7395SJason Ling             std::move(configs.begin(), configs.end(),
70e82d7395SJason Ling                       std::back_inserter(output));
71e82d7395SJason Ling         }
72e82d7395SJason Ling         return output;
73e82d7395SJason Ling     };
7463fd9321SWilliam A. Kennington III 
75c893f43dSJason Ling     /**
76c893f43dSJason Ling      * Given a list of handlers as json data, construct the appropriate
77c893f43dSJason Ling      * HandlerConfig objects.  This method is meant to be called per json
78c893f43dSJason Ling      * configuration file found.
79c893f43dSJason Ling      *
80c893f43dSJason Ling      * The list will only contain validly build HandlerConfig objects.  Any
81c893f43dSJason Ling      * invalid configuration is skipped. The hope is that the BMC firmware
82c893f43dSJason Ling      * update configuration will never be invalid, but if another aspect is
83c893f43dSJason Ling      * invalid, it can be fixed with a BMC firmware update once the bug is
84c893f43dSJason Ling      * identified.
85c893f43dSJason Ling      *
86c893f43dSJason Ling      * This code does not validate that the blob specified is unique, that
87c893f43dSJason Ling      * should be handled at a higher layer.
88c893f43dSJason Ling      *
89c893f43dSJason Ling      * @param[in] data - json data from a json file.
90c893f43dSJason Ling      * @return list of HandlerConfig objects.
91c893f43dSJason Ling      */
92c893f43dSJason Ling     virtual std::vector<HandlerConfig<T>>
93c893f43dSJason Ling         buildHandlerFromJson(const nlohmann::json& data) = 0;
94c893f43dSJason Ling };
95c893f43dSJason Ling } // namespace ipmi_flash
96