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