1 #include "conditions.hpp"
2
3 #include "sdbusplus.hpp"
4 #include "types.hpp"
5
6 #include <nlohmann/json.hpp>
7 #include <phosphor-logging/log.hpp>
8
9 #include <algorithm>
10
11 namespace phosphor
12 {
13 namespace fan
14 {
15 namespace monitor
16 {
17 namespace condition
18 {
19
20 using json = nlohmann::json;
21 using namespace phosphor::logging;
22
propertiesMatch(std::vector<PropertyState> && propStates)23 Condition propertiesMatch(std::vector<PropertyState>&& propStates)
24 {
25 return [pStates = std::move(propStates)](sdbusplus::bus_t& bus) {
26 return std::all_of(
27 pStates.begin(), pStates.end(), [&bus](const auto& p) {
28 return util::SDBusPlus::getPropertyVariant<PropertyValue>(
29 bus, std::get<propObj>(p.first),
30 std::get<propIface>(p.first),
31 std::get<propName>(p.first)) == p.second;
32 });
33 };
34 }
35
getPropertiesMatch(const json & condParams)36 Condition getPropertiesMatch(const json& condParams)
37 {
38 if (!condParams.contains("properties"))
39 {
40 // Log error on missing required parameter
41 log<level::ERR>(
42 "Missing fan monitor condition properties",
43 entry("NAME=%s", condParams["name"].get<std::string>().c_str()));
44 throw std::runtime_error("Missing fan monitor condition properties");
45 }
46 std::vector<PropertyState> propStates;
47 for (auto& param : condParams["properties"])
48 {
49 if (!param.contains("object") || !param.contains("interface") ||
50 !param.contains("property"))
51 {
52 // Log error on missing required parameters
53 log<level::ERR>("Missing propertiesMatch condition parameters",
54 entry("REQUIRED_PARAMETERS=%s",
55 "{object, interface, property}"));
56 throw std::runtime_error(
57 "Missing propertiesMatch condition parameters");
58 }
59
60 auto propAttrs = param["property"];
61 if (!propAttrs.contains("name") || !propAttrs.contains("value"))
62 {
63 // Log error on missing required parameters
64 log<level::ERR>(
65 "Missing propertiesMatch condition property attributes",
66 entry("REQUIRED_ATTRIBUTES=%s", "{name, value}"));
67 throw std::runtime_error(
68 "Missing propertiesMatch condition property attributes");
69 }
70
71 std::string type = "";
72 if (propAttrs.contains("type"))
73 {
74 type = propAttrs["type"].get<std::string>();
75 }
76
77 // Add property for propertiesMatch condition
78 propStates.emplace_back(PropertyState(
79 {param["object"].get<std::string>(),
80 param["interface"].get<std::string>(),
81 propAttrs["name"].get<std::string>()},
82 JsonTypeHandler::getPropValue(propAttrs["value"], type)));
83 }
84
85 return make_condition(condition::propertiesMatch(std::move(propStates)));
86 }
87
88 } // namespace condition
89 } // namespace monitor
90 } // namespace fan
91 } // namespace phosphor
92