1 /**
2  * Copyright © 2020 IBM Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include "json_config.hpp"
19 #include "power_off_action.hpp"
20 #include "trust_group.hpp"
21 #include "types.hpp"
22 
23 #include <nlohmann/json.hpp>
24 #include <sdbusplus/bus.hpp>
25 
26 namespace phosphor::fan::monitor
27 {
28 
29 using json = nlohmann::json;
30 class PowerOffRule;
31 class PowerInterfaceBase;
32 class System;
33 
34 constexpr auto confAppName = "monitor";
35 constexpr auto confFileName = "config.json";
36 
37 // Trust group class handler function
38 using trustHandler = std::function<CreateGroupFunction(
39     const std::vector<trust::GroupDefinition>&)>;
40 // Fan monitoring condition handler function
41 using condHandler = std::function<Condition(const json&)>;
42 
43 /**
44  * @brief Get the JSON object
45  *
46  * @param[in] bus - The dbus bus object
47  *
48  * @return JSON object
49  *     A JSON object created after loading the JSON configuration file
50  */
51 inline const json getJsonObj(sdbusplus::bus::bus& bus)
52 {
53     return fan::JsonConfig::load(
54         fan::JsonConfig::getConfFile(bus, confAppName, confFileName));
55 }
56 
57 /**
58  * @brief Get any configured trust groups
59  *
60  * @param[in] obj - JSON object to parse from
61  *
62  * @return List of functions applied on trust groups
63  */
64 const std::vector<CreateGroupFunction> getTrustGrps(const json& obj);
65 
66 /**
67  * @brief Get the configured sensor definitions that make up a fan
68  *
69  * @param[in] sensor - JSON object containing a list of sensors
70  *
71  * @return List of sensor definition data that make up a fan being monitored
72  */
73 const std::vector<SensorDefinition> getSensorDefs(const json& sensors);
74 
75 /**
76  * @brief Get the configured fan definitions to be monitored
77  *
78  * @param[in] obj - JSON object to parse from
79  *
80  * @return List of fan definition data on the fans to be monitored
81  */
82 const std::vector<FanDefinition> getFanDefs(const json& obj);
83 
84 /**
85  * @brief Get the configured power off rules
86  *
87  * @param[in] obj - JSON object to parse from
88  *
89  * @param[in] powerInterface - The power interface object to use
90  *
91  * @param[in] func - Optional user defined function that gets called
92  *                   right before a power off occurs.
93  *
94  * @return std::vector<std::unique_ptr<PowerOffRule>> -
95  *     The PowerOffRule objects
96  */
97 std::vector<std::unique_ptr<PowerOffRule>>
98     getPowerOffRules(const json& obj,
99                      std::shared_ptr<PowerInterfaceBase>& powerInterface,
100                      PowerOffAction::PrePowerOffFunc& func);
101 
102 /**
103  * @brief Returns the 'num_nonfunc_rotors_before_error field
104  *
105  * @param[in] obj - JSON object to parse from
106  *
107  * @return optional<size_t> - The value, or std::nullopt if not present
108  */
109 std::optional<size_t> getNumNonfuncRotorsBeforeError(const json& obj);
110 
111 } // namespace phosphor::fan::monitor
112