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