#include "conditions.hpp" #include "sdbusplus.hpp" #include "types.hpp" #include <nlohmann/json.hpp> #include <phosphor-logging/log.hpp> #include <algorithm> namespace phosphor { namespace fan { namespace monitor { namespace condition { using json = nlohmann::json; using namespace phosphor::logging; Condition propertiesMatch(std::vector<PropertyState>&& propStates) { return [pStates = std::move(propStates)](sdbusplus::bus_t& bus) { return std::all_of( pStates.begin(), pStates.end(), [&bus](const auto& p) { return util::SDBusPlus::getPropertyVariant<PropertyValue>( bus, std::get<propObj>(p.first), std::get<propIface>(p.first), std::get<propName>(p.first)) == p.second; }); }; } Condition getPropertiesMatch(const json& condParams) { if (!condParams.contains("properties")) { // Log error on missing required parameter log<level::ERR>( "Missing fan monitor condition properties", entry("NAME=%s", condParams["name"].get<std::string>().c_str())); throw std::runtime_error("Missing fan monitor condition properties"); } std::vector<PropertyState> propStates; for (auto& param : condParams["properties"]) { if (!param.contains("object") || !param.contains("interface") || !param.contains("property")) { // Log error on missing required parameters log<level::ERR>("Missing propertiesMatch condition parameters", entry("REQUIRED_PARAMETERS=%s", "{object, interface, property}")); throw std::runtime_error( "Missing propertiesMatch condition parameters"); } auto propAttrs = param["property"]; if (!propAttrs.contains("name") || !propAttrs.contains("value")) { // Log error on missing required parameters log<level::ERR>( "Missing propertiesMatch condition property attributes", entry("REQUIRED_ATTRIBUTES=%s", "{name, value}")); throw std::runtime_error( "Missing propertiesMatch condition property attributes"); } std::string type = ""; if (propAttrs.contains("type")) { type = propAttrs["type"].get<std::string>(); } // Add property for propertiesMatch condition propStates.emplace_back(PropertyState( {param["object"].get<std::string>(), param["interface"].get<std::string>(), propAttrs["name"].get<std::string>()}, JsonTypeHandler::getPropValue(propAttrs["value"], type))); } return make_condition(condition::propertiesMatch(std::move(propStates))); } } // namespace condition } // namespace monitor } // namespace fan } // namespace phosphor