/** * Copyright © 2017 IBM Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "monitor.hpp" namespace phosphor { namespace dbus { namespace monitoring { Monitor::Monitor(sdbusplus::bus::bus& bus) : bus(bus) { // Process thru given events that are type 'signal' for (auto& event : events) { for (auto& pEvent : std::get>>(event)) { if (pEvent->trigger != Event::Trigger::SIGNAL) { continue; } auto signalEvent = static_cast(pEvent.get()); eventArgs.emplace_back(std::make_unique(this, signalEvent, &event)); matches.emplace_back(bus, signalEvent->signature, handleSignal, eventArgs.back().get()); } } } void Monitor::processStart() noexcept { sdbusplus::message::message nullMsg{nullptr}; // Process thru given events that are type 'start' for (auto& event : events) { for (auto& pEvent : std::get>>(event)) { if (pEvent->trigger == Event::Trigger::START) { handleEvent(nullMsg, *pEvent, event); } } } } int Monitor::handleSignal(sd_bus_message* msg, void* data, sd_bus_error* err) { auto sdbpMsg = sdbusplus::message::message(msg); auto& eventArg = *static_cast(data); std::get<0>(eventArg)->handleEvent( sdbpMsg, static_cast(*std::get<1>(eventArg)), *std::get<2>(eventArg)); return 0; } void Monitor::handleEvent(sdbusplus::message::message& msg, const Event& event, const std::tuple>, std::vector>& eventDef) { // Iterate over conditions for (auto& cond : event) { if (!cond(bus, msg, *this)) { continue; } // Perform defined actions for (auto& act : std::get<1>(eventDef)) { act(bus, *this); } return; } } const std::vector< std::tuple< std::vector>, std::vector>> Monitor::events; } // namespace monitoring } // namespace dbus } // namespace phosphor