1 /** 2 * Copyright © 2018 IBM Corporation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #include "config.h" 17 #include "manager.hpp" 18 #include "policy_find.hpp" 19 20 namespace ibm 21 { 22 namespace logging 23 { 24 25 Manager::Manager(sdbusplus::bus::bus& bus) : 26 bus(bus), 27 addMatch(bus, 28 sdbusplus::bus::match::rules::interfacesAdded() + 29 sdbusplus::bus::match::rules::path_namespace(LOGGING_PATH), 30 std::bind(std::mem_fn(&Manager::interfaceAdded), this, 31 std::placeholders::_1)), 32 removeMatch(bus, 33 sdbusplus::bus::match::rules::interfacesRemoved() + 34 sdbusplus::bus::match::rules::path_namespace(LOGGING_PATH), 35 std::bind(std::mem_fn(&Manager::interfaceRemoved), this, 36 std::placeholders::_1)) 37 #ifdef USE_POLICY_INTERFACE 38 , 39 policies(POLICY_JSON_PATH) 40 #endif 41 { 42 createAll(); 43 } 44 45 void Manager::createAll() 46 { 47 auto objects = getManagedObjects(bus, LOGGING_BUSNAME, LOGGING_PATH); 48 49 for (const auto& object : objects) 50 { 51 const auto& interfaces = object.second; 52 53 auto propertyMap = std::find_if( 54 interfaces.begin(), interfaces.end(), 55 [](const auto& i) { return i.first == LOGGING_IFACE; }); 56 57 if (propertyMap != interfaces.end()) 58 { 59 create(object.first, propertyMap->second); 60 } 61 } 62 } 63 64 void Manager::create(const std::string& objectPath, 65 const DbusPropertyMap& properties) 66 { 67 68 #ifdef USE_POLICY_INTERFACE 69 createPolicyInterface(objectPath, properties); 70 #endif 71 } 72 73 #ifdef USE_POLICY_INTERFACE 74 void Manager::createPolicyInterface(const std::string& objectPath, 75 const DbusPropertyMap& properties) 76 { 77 auto values = policy::find(policies, properties); 78 79 auto object = std::make_shared<PolicyObject>(bus, objectPath.c_str(), true); 80 81 object->eventID(std::get<policy::EIDField>(values)); 82 object->description(std::get<policy::MsgField>(values)); 83 84 object->emit_object_added(); 85 86 auto id = getEntryID(objectPath); 87 auto entry = entries.find(id); 88 89 if (entry == entries.end()) 90 { 91 InterfaceMap interfaces; 92 interfaces.emplace(InterfaceType::POLICY, object); 93 entries.emplace(id, interfaces); 94 } 95 else 96 { 97 entry->second.emplace(InterfaceType::POLICY, object); 98 } 99 } 100 #endif 101 102 void Manager::interfaceAdded(sdbusplus::message::message& msg) 103 { 104 sdbusplus::message::object_path path; 105 DbusInterfaceMap interfaces; 106 107 msg.read(path, interfaces); 108 109 // Find the Logging.Entry interface with all of its properties 110 // to pass to create(). 111 auto propertyMap = 112 std::find_if(interfaces.begin(), interfaces.end(), 113 [](const auto& i) { return i.first == LOGGING_IFACE; }); 114 115 if (propertyMap != interfaces.end()) 116 { 117 create(path, propertyMap->second); 118 } 119 } 120 121 void Manager::interfaceRemoved(sdbusplus::message::message& msg) 122 { 123 sdbusplus::message::object_path path; 124 DbusInterfaceList interfaces; 125 126 msg.read(path, interfaces); 127 128 // If the Logging.Entry interface was removed, then remove 129 // our object 130 131 auto i = std::find(interfaces.begin(), interfaces.end(), LOGGING_IFACE); 132 133 if (i != interfaces.end()) 134 { 135 auto id = getEntryID(path); 136 137 auto entry = entries.find(id); 138 if (entry != entries.end()) 139 { 140 entries.erase(entry); 141 } 142 } 143 } 144 } 145 } 146