xref: /openbmc/ibm-logging/manager.cpp (revision 491fc6f1)
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