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, 31055da3bdSMatt Spinler std::placeholders::_1)), 32055da3bdSMatt Spinler removeMatch(bus, 33055da3bdSMatt Spinler sdbusplus::bus::match::rules::interfacesRemoved() + 34055da3bdSMatt Spinler sdbusplus::bus::match::rules::path_namespace(LOGGING_PATH), 35055da3bdSMatt 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*a1390353SMatt Spinler void Manager::erase(EntryID id) 74*a1390353SMatt Spinler { 75*a1390353SMatt Spinler entries.erase(id); 76*a1390353SMatt Spinler } 77*a1390353SMatt Spinler 78491fc6f1SMatt Spinler void Manager::addInterface(const std::string& objectPath, InterfaceType type, 79491fc6f1SMatt Spinler std::experimental::any& object) 80491fc6f1SMatt Spinler { 81491fc6f1SMatt Spinler auto id = getEntryID(objectPath); 82491fc6f1SMatt Spinler auto entry = entries.find(id); 83491fc6f1SMatt Spinler 84491fc6f1SMatt Spinler if (entry == entries.end()) 85491fc6f1SMatt Spinler { 86491fc6f1SMatt Spinler InterfaceMap interfaces; 87491fc6f1SMatt Spinler interfaces.emplace(type, object); 88491fc6f1SMatt Spinler entries.emplace(id, std::move(interfaces)); 89491fc6f1SMatt Spinler } 90491fc6f1SMatt Spinler else 91491fc6f1SMatt Spinler { 92491fc6f1SMatt Spinler entry->second.emplace(type, object); 93491fc6f1SMatt Spinler } 94491fc6f1SMatt Spinler } 95491fc6f1SMatt Spinler 964a6ea6afSMatt Spinler #ifdef USE_POLICY_INTERFACE 97259e7277SMatt Spinler void Manager::createPolicyInterface(const std::string& objectPath, 984a6ea6afSMatt Spinler const DbusPropertyMap& properties) 994a6ea6afSMatt Spinler { 1004a6ea6afSMatt Spinler auto values = policy::find(policies, properties); 1014a6ea6afSMatt Spinler 102259e7277SMatt Spinler auto object = std::make_shared<PolicyObject>(bus, objectPath.c_str(), true); 1034a6ea6afSMatt Spinler 1044a6ea6afSMatt Spinler object->eventID(std::get<policy::EIDField>(values)); 1054a6ea6afSMatt Spinler object->description(std::get<policy::MsgField>(values)); 1064a6ea6afSMatt Spinler 1079bea4eafSMatt Spinler object->emit_object_added(); 1089bea4eafSMatt Spinler 109491fc6f1SMatt Spinler std::experimental::any anyObject = object; 1104a6ea6afSMatt Spinler 111491fc6f1SMatt Spinler addInterface(objectPath, InterfaceType::POLICY, anyObject); 1124a6ea6afSMatt Spinler } 1134a6ea6afSMatt Spinler #endif 1144a6ea6afSMatt Spinler 115e0017ebbSMatt Spinler void Manager::interfaceAdded(sdbusplus::message::message& msg) 116e0017ebbSMatt Spinler { 117e0017ebbSMatt Spinler sdbusplus::message::object_path path; 118e0017ebbSMatt Spinler DbusInterfaceMap interfaces; 119e0017ebbSMatt Spinler 120e0017ebbSMatt Spinler msg.read(path, interfaces); 121e0017ebbSMatt Spinler 122e0017ebbSMatt Spinler // Find the Logging.Entry interface with all of its properties 123e0017ebbSMatt Spinler // to pass to create(). 124259e7277SMatt Spinler auto propertyMap = 125259e7277SMatt Spinler std::find_if(interfaces.begin(), interfaces.end(), 126259e7277SMatt Spinler [](const auto& i) { return i.first == LOGGING_IFACE; }); 127e0017ebbSMatt Spinler 128e0017ebbSMatt Spinler if (propertyMap != interfaces.end()) 129e0017ebbSMatt Spinler { 13054bfa7e7SMatt Spinler create(path, propertyMap->second); 131e0017ebbSMatt Spinler } 132e0017ebbSMatt Spinler } 133055da3bdSMatt Spinler 134055da3bdSMatt Spinler void Manager::interfaceRemoved(sdbusplus::message::message& msg) 135055da3bdSMatt Spinler { 136055da3bdSMatt Spinler sdbusplus::message::object_path path; 137055da3bdSMatt Spinler DbusInterfaceList interfaces; 138055da3bdSMatt Spinler 139055da3bdSMatt Spinler msg.read(path, interfaces); 140055da3bdSMatt Spinler 141055da3bdSMatt Spinler // If the Logging.Entry interface was removed, then remove 142055da3bdSMatt Spinler // our object 143055da3bdSMatt Spinler 144055da3bdSMatt Spinler auto i = std::find(interfaces.begin(), interfaces.end(), LOGGING_IFACE); 145055da3bdSMatt Spinler 146055da3bdSMatt Spinler if (i != interfaces.end()) 147055da3bdSMatt Spinler { 148*a1390353SMatt Spinler erase(getEntryID(path)); 149055da3bdSMatt Spinler } 150055da3bdSMatt Spinler } 151e0017ebbSMatt Spinler } 152e0017ebbSMatt Spinler } 153