diff options
Diffstat (limited to 'src/functor.cpp')
-rw-r--r-- | src/functor.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/functor.cpp b/src/functor.cpp new file mode 100644 index 0000000..f4d2574 --- /dev/null +++ b/src/functor.cpp @@ -0,0 +1,63 @@ +#include "functor.hpp" +#include <sdbusplus/bus.hpp> +#include <sdbusplus/message.hpp> + +namespace phosphor +{ +namespace dbus +{ +namespace monitoring +{ + +bool PropertyConditionBase::operator()(sdbusplus::bus::bus& bus, + sdbusplus::message::message&, + Monitor& mon) const +{ + std::string host; + + if (_service) + { + host.assign(_service); + } + else + { + auto mapperCall = bus.new_method_call( + "xyz.openbmc_project.ObjectMapper", + "/xyz/openbmc_project/object_mapper", + "xyz.openbmc_project.ObjectMapper", + "GetObject"); + mapperCall.append(_path); + mapperCall.append(std::vector<std::string>({_iface})); + auto mapperResponseMsg = bus.call(mapperCall); + if (mapperResponseMsg.is_method_error()) + { + return false; + } + + std::map<std::string, std::vector<std::string>> mapperResponse; + mapperResponseMsg.read(mapperResponse); + if (mapperResponse.empty()) + { + return false; + } + + host = mapperResponse.begin()->first; + } + auto hostCall = bus.new_method_call(host.c_str(), + _path.c_str(), + "org.freedesktop.DBus.Properties", + "Get"); + hostCall.append(_iface); + hostCall.append(_property); + auto hostResponseMsg = bus.call(hostCall); + if (hostResponseMsg.is_method_error()) + { + return false; + } + + return eval(hostResponseMsg); +} + +} // namespace monitoring +} // namespace dbus +} // namespace phosphor |