1*c893f43dSJason Ling #pragma once 2*c893f43dSJason Ling 3*c893f43dSJason Ling #include "general_systemd.hpp" 4*c893f43dSJason Ling #include "image_handler.hpp" 5*c893f43dSJason Ling 6*c893f43dSJason Ling #include <nlohmann/json.hpp> 7*c893f43dSJason Ling 8*c893f43dSJason Ling #include <memory> 9*c893f43dSJason Ling #include <string> 10*c893f43dSJason Ling #include <vector> 11*c893f43dSJason Ling 12*c893f43dSJason Ling namespace ipmi_flash 13*c893f43dSJason Ling { 14*c893f43dSJason Ling std::unique_ptr<TriggerableActionInterface> 15*c893f43dSJason Ling buildFileSystemd(const nlohmann::json& data); 16*c893f43dSJason Ling 17*c893f43dSJason Ling std::unique_ptr<TriggerableActionInterface> 18*c893f43dSJason Ling buildSystemd(const nlohmann::json& data); 19*c893f43dSJason Ling 20*c893f43dSJason Ling /** 21*c893f43dSJason Ling * HandlerConfig associates a blobID with an ImageHandler and a set of 22*c893f43dSJason Ling * supported actions of type T. 23*c893f43dSJason Ling */ 24*c893f43dSJason Ling template <typename T> 25*c893f43dSJason Ling class HandlerConfig 26*c893f43dSJason Ling { 27*c893f43dSJason Ling public: 28*c893f43dSJason Ling HandlerConfig() = default; 29*c893f43dSJason Ling ~HandlerConfig() = default; 30*c893f43dSJason Ling HandlerConfig(const HandlerConfig&) = delete; 31*c893f43dSJason Ling HandlerConfig& operator=(const HandlerConfig&) = delete; 32*c893f43dSJason Ling HandlerConfig(HandlerConfig&&) = default; 33*c893f43dSJason Ling HandlerConfig& operator=(HandlerConfig&&) = default; 34*c893f43dSJason Ling 35*c893f43dSJason Ling /* A string in the form: /flash/{unique}, s.t. unique is something like, 36*c893f43dSJason Ling * flash, ubitar, statictar, or bios 37*c893f43dSJason Ling */ 38*c893f43dSJason Ling std::string blobId; 39*c893f43dSJason Ling 40*c893f43dSJason Ling /* This owns a handler interface, this is typically going to be a file 41*c893f43dSJason Ling * writer object. 42*c893f43dSJason Ling */ 43*c893f43dSJason Ling std::unique_ptr<ImageHandlerInterface> handler; 44*c893f43dSJason Ling 45*c893f43dSJason Ling /* specifies actions to be taken in response to certain operations on a 46*c893f43dSJason Ling * blob. 47*c893f43dSJason Ling * Usually required but there are exceptions; the hashBlobId doesn't have 48*c893f43dSJason Ling * an action pack. 49*c893f43dSJason Ling */ 50*c893f43dSJason Ling std::unique_ptr<T> actions; 51*c893f43dSJason Ling }; 52*c893f43dSJason Ling 53*c893f43dSJason Ling /* HandlersBuilderIfc is a helper class that builds Handlers from the json files 54*c893f43dSJason Ling * found within a specified directory. 55*c893f43dSJason Ling * The child class that inherits from HandlersBuilderIfc should implement 56*c893f43dSJason Ling * buildHandlersConfigs to perform json validation and parsing. 57*c893f43dSJason Ling * 58*c893f43dSJason Ling */ 59*c893f43dSJason Ling template <typename T> 60*c893f43dSJason Ling class HandlersBuilderIfc 61*c893f43dSJason Ling { 62*c893f43dSJason Ling public: 63*c893f43dSJason Ling HandlersBuilderIfc() = default; 64*c893f43dSJason Ling ~HandlersBuilderIfc() = default; 65*c893f43dSJason Ling HandlersBuilderIfc(const HandlersBuilderIfc&) = delete; 66*c893f43dSJason Ling HandlersBuilderIfc& operator=(const HandlersBuilderIfc&) = delete; 67*c893f43dSJason Ling HandlersBuilderIfc(HandlersBuilderIfc&&) = default; 68*c893f43dSJason Ling HandlersBuilderIfc& operator=(HandlersBuilderIfc&&) = default; 69*c893f43dSJason Ling /** 70*c893f43dSJason Ling * Given a folder of json configs, build the configurations. 71*c893f43dSJason Ling * 72*c893f43dSJason Ling * @param[in] directory - the directory to search (recurisvely). 73*c893f43dSJason Ling * @return list of HandlerConfig objects. 74*c893f43dSJason Ling */ 75*c893f43dSJason Ling std::vector<HandlerConfig<T>> 76*c893f43dSJason Ling buildHandlerConfigs(const std::string& directory); 77*c893f43dSJason Ling /** 78*c893f43dSJason Ling * Given a list of handlers as json data, construct the appropriate 79*c893f43dSJason Ling * HandlerConfig objects. This method is meant to be called per json 80*c893f43dSJason Ling * configuration file found. 81*c893f43dSJason Ling * 82*c893f43dSJason Ling * The list will only contain validly build HandlerConfig objects. Any 83*c893f43dSJason Ling * invalid configuration is skipped. The hope is that the BMC firmware 84*c893f43dSJason Ling * update configuration will never be invalid, but if another aspect is 85*c893f43dSJason Ling * invalid, it can be fixed with a BMC firmware update once the bug is 86*c893f43dSJason Ling * identified. 87*c893f43dSJason Ling * 88*c893f43dSJason Ling * This code does not validate that the blob specified is unique, that 89*c893f43dSJason Ling * should be handled at a higher layer. 90*c893f43dSJason Ling * 91*c893f43dSJason Ling * @param[in] data - json data from a json file. 92*c893f43dSJason Ling * @return list of HandlerConfig objects. 93*c893f43dSJason Ling */ 94*c893f43dSJason Ling virtual std::vector<HandlerConfig<T>> 95*c893f43dSJason Ling buildHandlerFromJson(const nlohmann::json& data) = 0; 96*c893f43dSJason Ling }; 97*c893f43dSJason Ling } // namespace ipmi_flash 98