1 #pragma once 2 3 #include "error_reporter.hpp" 4 #include "fan.hpp" 5 #include "psensor.hpp" 6 #include "rpolicy.hpp" 7 8 #include <nlohmann/json.hpp> 9 #include <sdbusplus/bus.hpp> 10 #include <sdeventplus/source/signal.hpp> 11 12 #include <filesystem> 13 #include <memory> 14 #include <string> 15 #include <vector> 16 17 namespace phosphor 18 { 19 namespace fan 20 { 21 namespace presence 22 { 23 24 namespace fs = std::filesystem; 25 using json = nlohmann::json; 26 27 constexpr auto confFileName = "config.json"; 28 constexpr auto confAppName = "presence"; 29 30 using policies = std::vector<std::unique_ptr<RedundancyPolicy>>; 31 32 constexpr auto fanPolicyFanPos = 0; 33 constexpr auto fanPolicySensorListPos = 1; 34 using fanPolicy = std::tuple<Fan, std::vector<std::unique_ptr<PresenceSensor>>>; 35 36 // Presence method handler function 37 using methodHandler = 38 std::function<std::unique_ptr<PresenceSensor>(size_t, const json&)>; 39 // Presence redundancy policy handler function 40 using rpolicyHandler = 41 std::function<std::unique_ptr<RedundancyPolicy>(const fanPolicy&)>; 42 43 class JsonConfig 44 { 45 public: 46 JsonConfig() = delete; 47 JsonConfig(const JsonConfig&) = delete; 48 JsonConfig(JsonConfig&&) = delete; 49 JsonConfig& operator=(const JsonConfig&) = delete; 50 JsonConfig& operator=(JsonConfig&&) = delete; 51 ~JsonConfig() = default; 52 53 /** 54 * Constructor 55 * Parses and populates the fan presence policies from a json file 56 * 57 * @param[in] bus - sdbusplus bus object 58 */ 59 explicit JsonConfig(sdbusplus::bus::bus& bus); 60 61 /** 62 * @brief Get the json config based fan presence policies 63 * 64 * @return - The fan presence policies 65 */ 66 static const policies& get(); 67 68 /** 69 * @brief Callback function to handle receiving a HUP signal to 70 * reload the json configuration. 71 * 72 * @param[in] sigSrc - sd_event_source signal wrapper 73 * @param[in] sigInfo - signal info on signal fd 74 */ 75 void sighupHandler(sdeventplus::source::Signal& sigSrc, 76 const struct signalfd_siginfo* sigInfo); 77 78 private: 79 /* Fan presence policies */ 80 static policies _policies; 81 82 /* The sdbusplus bus object */ 83 sdbusplus::bus::bus& _bus; 84 85 /* List of Fan objects to have presence policies */ 86 std::vector<fanPolicy> _fans; 87 88 /* Presence methods mapping to their associated handler function */ 89 static const std::map<std::string, methodHandler> _methods; 90 91 /** 92 * Presence redundancy policy mapping to their associated handler 93 * function 94 */ 95 static const std::map<std::string, rpolicyHandler> _rpolicies; 96 97 /** 98 * Class that handles reporting errors for missing fans. 99 */ 100 std::unique_ptr<ErrorReporter> _reporter; 101 102 /** 103 * @brief Process the json config to extract the defined fan presence 104 * policies. 105 * 106 * @param[in] jsonConf - parsed json configuration data 107 */ 108 void process(const json& jsonConf); 109 110 /** 111 * @brief Get the redundancy policy of presence detection for a fan 112 * 113 * @param[in] rpolicy - policy type to construct 114 * @param[in] fpolicy - fan policy object 115 * 116 * @return - The constructed redundancy policy type for the fan 117 */ 118 std::unique_ptr<RedundancyPolicy> getPolicy(const json& rpolicy, 119 const fanPolicy& fpolicy); 120 }; 121 122 /** 123 * Methods of fan presence detection function declarations 124 */ 125 namespace method 126 { 127 /** 128 * @brief Fan presence detection method by tach feedback 129 * 130 * @param[in] fanIndex - fan object index to add tach method 131 * @param[in] method - json properties for a tach method 132 * 133 * @return - A presence sensor to detect fan presence by tach feedback 134 */ 135 std::unique_ptr<PresenceSensor> getTach(size_t fanIndex, const json& method); 136 137 /** 138 * @brief Fan presence detection method by gpio 139 * 140 * @param[in] fanIndex - fan object index to add gpio method 141 * @param[in] method - json properties for a gpio method 142 * 143 * @return - A presence sensor to detect fan presence by gpio 144 */ 145 std::unique_ptr<PresenceSensor> getGpio(size_t fanIndex, const json& method); 146 147 } // namespace method 148 149 /** 150 * Redundancy policies for fan presence detection function declarations 151 */ 152 namespace rpolicy 153 { 154 /** 155 * @brief Create an `Anyof` redundancy policy on the created presence 156 * sensors for a fan 157 * 158 * @param[in] fan - fan policy object with the presence sensors for the fan 159 * 160 * @return - An `Anyof` redundancy policy 161 */ 162 std::unique_ptr<RedundancyPolicy> getAnyof(const fanPolicy& fan); 163 164 /** 165 * @brief Create a `Fallback` redundancy policy on the created presence 166 * sensors for a fan 167 * 168 * @param[in] fan - fan policy object with the presence sensors for the fan 169 * 170 * @return - A `Fallback` redundancy policy 171 */ 172 std::unique_ptr<RedundancyPolicy> getFallback(const fanPolicy& fan); 173 174 } // namespace rpolicy 175 176 } // namespace presence 177 } // namespace fan 178 } // namespace phosphor 179