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