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