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 * 56 * @param[in] bus - sdbusplus bus object 57 */ 58 explicit JsonConfig(sdbusplus::bus::bus& bus); 59 60 /** 61 * @brief Get the json config based fan presence policies 62 * 63 * @return - The fan presence policies 64 */ 65 static const policies& get(); 66 67 /** 68 * @brief Callback function to handle receiving a HUP signal to 69 * reload the json configuration. 70 * 71 * @param[in] sigSrc - sd_event_source signal wrapper 72 * @param[in] sigInfo - signal info on signal fd 73 */ 74 void sighupHandler(sdeventplus::source::Signal& sigSrc, 75 const struct signalfd_siginfo* sigInfo); 76 77 /** 78 * @brief Parses and populates the fan presence policies from 79 * the json file and then starts the actual presence 80 * detecting. 81 * 82 * @param[in] confFile - The conf file name to use 83 */ 84 void start(const std::string& confFile); 85 86 private: 87 /* Fan presence policies */ 88 static policies _policies; 89 90 /* The sdbusplus bus object */ 91 sdbusplus::bus::bus& _bus; 92 93 /* List of Fan objects to have presence policies */ 94 std::vector<fanPolicy> _fans; 95 96 /* Presence methods mapping to their associated handler function */ 97 static const std::map<std::string, methodHandler> _methods; 98 99 /** 100 * Presence redundancy policy mapping to their associated handler 101 * function 102 */ 103 static const std::map<std::string, rpolicyHandler> _rpolicies; 104 105 /** 106 * Class that handles reporting errors for missing fans. 107 */ 108 std::unique_ptr<ErrorReporter> _reporter; 109 110 /** 111 * @brief Process the json config to extract the defined fan presence 112 * policies. 113 * 114 * @param[in] jsonConf - parsed json configuration data 115 */ 116 void process(const json& jsonConf); 117 118 /** 119 * @brief Get the redundancy policy of presence detection for a fan 120 * 121 * @param[in] rpolicy - policy type to construct 122 * @param[in] fpolicy - fan policy object 123 * 124 * @return - The constructed redundancy policy type for the fan 125 */ 126 std::unique_ptr<RedundancyPolicy> getPolicy(const json& rpolicy, 127 const fanPolicy& fpolicy); 128 }; 129 130 /** 131 * Methods of fan presence detection function declarations 132 */ 133 namespace method 134 { 135 /** 136 * @brief Fan presence detection method by tach feedback 137 * 138 * @param[in] fanIndex - fan object index to add tach method 139 * @param[in] method - json properties for a tach method 140 * 141 * @return - A presence sensor to detect fan presence by tach feedback 142 */ 143 std::unique_ptr<PresenceSensor> getTach(size_t fanIndex, const json& method); 144 145 /** 146 * @brief Fan presence detection method by gpio 147 * 148 * @param[in] fanIndex - fan object index to add gpio method 149 * @param[in] method - json properties for a gpio method 150 * 151 * @return - A presence sensor to detect fan presence by gpio 152 */ 153 std::unique_ptr<PresenceSensor> getGpio(size_t fanIndex, const json& method); 154 155 } // namespace method 156 157 /** 158 * Redundancy policies for fan presence detection function declarations 159 */ 160 namespace rpolicy 161 { 162 /** 163 * @brief Create an `Anyof` redundancy policy on the created presence 164 * sensors for a fan 165 * 166 * @param[in] fan - fan policy object with the presence sensors for the fan 167 * 168 * @return - An `Anyof` redundancy policy 169 */ 170 std::unique_ptr<RedundancyPolicy> getAnyof(const fanPolicy& fan); 171 172 /** 173 * @brief Create a `Fallback` redundancy policy on the created presence 174 * sensors for a fan 175 * 176 * @param[in] fan - fan policy object with the presence sensors for the fan 177 * 178 * @return - A `Fallback` redundancy policy 179 */ 180 std::unique_ptr<RedundancyPolicy> getFallback(const fanPolicy& fan); 181 182 } // namespace rpolicy 183 184 } // namespace presence 185 } // namespace fan 186 } // namespace phosphor 187