1e0017ebbSMatt Spinler /** 2e0017ebbSMatt Spinler * Copyright © 2018 IBM Corporation 3e0017ebbSMatt Spinler * 4e0017ebbSMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License"); 5e0017ebbSMatt Spinler * you may not use this file except in compliance with the License. 6e0017ebbSMatt Spinler * You may obtain a copy of the License at 7e0017ebbSMatt Spinler * 8e0017ebbSMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0 9e0017ebbSMatt Spinler * 10e0017ebbSMatt Spinler * Unless required by applicable law or agreed to in writing, software 11e0017ebbSMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS, 12e0017ebbSMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e0017ebbSMatt Spinler * See the License for the specific language governing permissions and 14e0017ebbSMatt Spinler * limitations under the License. 15e0017ebbSMatt Spinler */ 16e0017ebbSMatt Spinler #include "config.h" 17e0017ebbSMatt Spinler #include "manager.hpp" 184a6ea6afSMatt Spinler #include "policy_find.hpp" 19e0017ebbSMatt Spinler 20e0017ebbSMatt Spinler namespace ibm 21e0017ebbSMatt Spinler { 22e0017ebbSMatt Spinler namespace logging 23e0017ebbSMatt Spinler { 24e0017ebbSMatt Spinler 25e0017ebbSMatt Spinler Manager::Manager(sdbusplus::bus::bus& bus) : 26e0017ebbSMatt Spinler bus(bus), 27259e7277SMatt Spinler addMatch(bus, 28e0017ebbSMatt Spinler sdbusplus::bus::match::rules::interfacesAdded() + 29e0017ebbSMatt Spinler sdbusplus::bus::match::rules::path_namespace(LOGGING_PATH), 30259e7277SMatt Spinler std::bind(std::mem_fn(&Manager::interfaceAdded), this, 31259e7277SMatt Spinler std::placeholders::_1)), 32259e7277SMatt Spinler removeMatch(bus, 33e0017ebbSMatt Spinler sdbusplus::bus::match::rules::interfacesRemoved() + 34e0017ebbSMatt Spinler sdbusplus::bus::match::rules::path_namespace(LOGGING_PATH), 35259e7277SMatt Spinler std::bind(std::mem_fn(&Manager::interfaceRemoved), this, 36259e7277SMatt Spinler std::placeholders::_1)) 37743e5822SMatt Spinler #ifdef USE_POLICY_INTERFACE 38259e7277SMatt Spinler , 39259e7277SMatt Spinler policies(POLICY_JSON_PATH) 40743e5822SMatt Spinler #endif 41e0017ebbSMatt Spinler { 4254bfa7e7SMatt Spinler createAll(); 4354bfa7e7SMatt Spinler } 4454bfa7e7SMatt Spinler 4554bfa7e7SMatt Spinler void Manager::createAll() 4654bfa7e7SMatt Spinler { 47259e7277SMatt Spinler auto objects = getManagedObjects(bus, LOGGING_BUSNAME, LOGGING_PATH); 4854bfa7e7SMatt Spinler 4954bfa7e7SMatt Spinler for (const auto& object : objects) 5054bfa7e7SMatt Spinler { 5154bfa7e7SMatt Spinler const auto& interfaces = object.second; 5254bfa7e7SMatt Spinler 5354bfa7e7SMatt Spinler auto propertyMap = std::find_if( 54259e7277SMatt Spinler interfaces.begin(), interfaces.end(), 55259e7277SMatt Spinler [](const auto& i) { return i.first == LOGGING_IFACE; }); 5654bfa7e7SMatt Spinler 5754bfa7e7SMatt Spinler if (propertyMap != interfaces.end()) 5854bfa7e7SMatt Spinler { 5954bfa7e7SMatt Spinler create(object.first, propertyMap->second); 6054bfa7e7SMatt Spinler } 6154bfa7e7SMatt Spinler } 6254bfa7e7SMatt Spinler } 6354bfa7e7SMatt Spinler 64259e7277SMatt Spinler void Manager::create(const std::string& objectPath, 6554bfa7e7SMatt Spinler const DbusPropertyMap& properties) 6654bfa7e7SMatt Spinler { 674a6ea6afSMatt Spinler 684a6ea6afSMatt Spinler #ifdef USE_POLICY_INTERFACE 694a6ea6afSMatt Spinler createPolicyInterface(objectPath, properties); 704a6ea6afSMatt Spinler #endif 71e0017ebbSMatt Spinler } 72e0017ebbSMatt Spinler 73*491fc6f1SMatt Spinler void Manager::addInterface(const std::string& objectPath, InterfaceType type, 74*491fc6f1SMatt Spinler std::experimental::any& object) 75*491fc6f1SMatt Spinler { 76*491fc6f1SMatt Spinler auto id = getEntryID(objectPath); 77*491fc6f1SMatt Spinler auto entry = entries.find(id); 78*491fc6f1SMatt Spinler 79*491fc6f1SMatt Spinler if (entry == entries.end()) 80*491fc6f1SMatt Spinler { 81*491fc6f1SMatt Spinler InterfaceMap interfaces; 82*491fc6f1SMatt Spinler interfaces.emplace(type, object); 83*491fc6f1SMatt Spinler entries.emplace(id, std::move(interfaces)); 84*491fc6f1SMatt Spinler } 85*491fc6f1SMatt Spinler else 86*491fc6f1SMatt Spinler { 87*491fc6f1SMatt Spinler entry->second.emplace(type, object); 88*491fc6f1SMatt Spinler } 89*491fc6f1SMatt Spinler } 90*491fc6f1SMatt Spinler 914a6ea6afSMatt Spinler #ifdef USE_POLICY_INTERFACE 92259e7277SMatt Spinler void Manager::createPolicyInterface(const std::string& objectPath, 934a6ea6afSMatt Spinler const DbusPropertyMap& properties) 944a6ea6afSMatt Spinler { 954a6ea6afSMatt Spinler auto values = policy::find(policies, properties); 964a6ea6afSMatt Spinler 97259e7277SMatt Spinler auto object = std::make_shared<PolicyObject>(bus, objectPath.c_str(), true); 984a6ea6afSMatt Spinler 994a6ea6afSMatt Spinler object->eventID(std::get<policy::EIDField>(values)); 1004a6ea6afSMatt Spinler object->description(std::get<policy::MsgField>(values)); 1014a6ea6afSMatt Spinler 1024a6ea6afSMatt Spinler object->emit_object_added(); 1034a6ea6afSMatt Spinler 104*491fc6f1SMatt Spinler std::experimental::any anyObject = object; 1054a6ea6afSMatt Spinler 106*491fc6f1SMatt Spinler addInterface(objectPath, InterfaceType::POLICY, anyObject); 1074a6ea6afSMatt Spinler } 1084a6ea6afSMatt Spinler #endif 1094a6ea6afSMatt Spinler 110e0017ebbSMatt Spinler void Manager::interfaceAdded(sdbusplus::message::message& msg) 111e0017ebbSMatt Spinler { 112e0017ebbSMatt Spinler sdbusplus::message::object_path path; 113e0017ebbSMatt Spinler DbusInterfaceMap interfaces; 114e0017ebbSMatt Spinler 115e0017ebbSMatt Spinler msg.read(path, interfaces); 116e0017ebbSMatt Spinler 117e0017ebbSMatt Spinler // Find the Logging.Entry interface with all of its properties 118e0017ebbSMatt Spinler // to pass to create(). 119259e7277SMatt Spinler auto propertyMap = 120259e7277SMatt Spinler std::find_if(interfaces.begin(), interfaces.end(), 121259e7277SMatt Spinler [](const auto& i) { return i.first == LOGGING_IFACE; }); 122e0017ebbSMatt Spinler 123e0017ebbSMatt Spinler if (propertyMap != interfaces.end()) 124e0017ebbSMatt Spinler { 12554bfa7e7SMatt Spinler create(path, propertyMap->second); 126e0017ebbSMatt Spinler } 127e0017ebbSMatt Spinler } 128e0017ebbSMatt Spinler 129e0017ebbSMatt Spinler void Manager::interfaceRemoved(sdbusplus::message::message& msg) 130e0017ebbSMatt Spinler { 131e0017ebbSMatt Spinler sdbusplus::message::object_path path; 132e0017ebbSMatt Spinler DbusInterfaceList interfaces; 133e0017ebbSMatt Spinler 134e0017ebbSMatt Spinler msg.read(path, interfaces); 135e0017ebbSMatt Spinler 136e0017ebbSMatt Spinler // If the Logging.Entry interface was removed, then remove 137e0017ebbSMatt Spinler // our object 138e0017ebbSMatt Spinler 139259e7277SMatt Spinler auto i = std::find(interfaces.begin(), interfaces.end(), LOGGING_IFACE); 140e0017ebbSMatt Spinler 141e0017ebbSMatt Spinler if (i != interfaces.end()) 142e0017ebbSMatt Spinler { 143e0017ebbSMatt Spinler auto id = getEntryID(path); 144e0017ebbSMatt Spinler 145e0017ebbSMatt Spinler auto entry = entries.find(id); 146e0017ebbSMatt Spinler if (entry != entries.end()) 147e0017ebbSMatt Spinler { 148e0017ebbSMatt Spinler entries.erase(entry); 149e0017ebbSMatt Spinler } 150e0017ebbSMatt Spinler } 151e0017ebbSMatt Spinler } 152e0017ebbSMatt Spinler } 153e0017ebbSMatt Spinler } 154