blob: a2c262d97e60b08ac5ef51794c414317ee7e1de8 [file] [log] [blame]
Matt Spinlere0017eb2018-03-27 11:17:38 -05001/**
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"
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050018#include "policy_find.hpp"
Matt Spinlere0017eb2018-03-27 11:17:38 -050019
20namespace ibm
21{
22namespace logging
23{
24
25Manager::Manager(sdbusplus::bus::bus& bus) :
Matt Spinler259e7272018-03-29 10:57:17 -050026 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,
Matt Spinler055da3b2018-05-09 15:51:20 -050031 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))
Matt Spinler743e5822018-03-27 13:44:50 -050037#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -050038 ,
39 policies(POLICY_JSON_PATH)
Matt Spinler743e5822018-03-27 13:44:50 -050040#endif
Matt Spinlere0017eb2018-03-27 11:17:38 -050041{
Matt Spinler54bfa7e2018-03-27 11:28:59 -050042 createAll();
43}
44
45void Manager::createAll()
46{
Matt Spinler259e7272018-03-29 10:57:17 -050047 auto objects = getManagedObjects(bus, LOGGING_BUSNAME, LOGGING_PATH);
Matt Spinler54bfa7e2018-03-27 11:28:59 -050048
49 for (const auto& object : objects)
50 {
51 const auto& interfaces = object.second;
52
Matt Spinlere6a51592018-05-23 12:47:10 -050053 auto propertyMap = interfaces.find(LOGGING_IFACE);
Matt Spinler54bfa7e2018-03-27 11:28:59 -050054
55 if (propertyMap != interfaces.end())
56 {
Matt Spinlere6a51592018-05-23 12:47:10 -050057 createWithRestore(object.first, interfaces);
Matt Spinler54bfa7e2018-03-27 11:28:59 -050058 }
59 }
60}
61
Matt Spinlere6a51592018-05-23 12:47:10 -050062void Manager::createWithRestore(const std::string& objectPath,
63 const DbusInterfaceMap& interfaces)
Matt Spinler54bfa7e2018-03-27 11:28:59 -050064{
Matt Spinlere6a51592018-05-23 12:47:10 -050065 createObject(objectPath, interfaces);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050066
Matt Spinlere6a51592018-05-23 12:47:10 -050067 // TODO
68 // restoreCalloutObjects(objectPath, interfaces);
69}
70
71void Manager::create(const std::string& objectPath,
72 const DbusInterfaceMap& interfaces)
73{
74 createObject(objectPath, interfaces);
75
76 // TODO
77 // createCalloutObjects(objectPath, interfaces);
78}
79
80void Manager::createObject(const std::string& objectPath,
81 const DbusInterfaceMap& interfaces)
82{
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050083#ifdef USE_POLICY_INTERFACE
Matt Spinlere6a51592018-05-23 12:47:10 -050084 auto logInterface = interfaces.find(LOGGING_IFACE);
85 createPolicyInterface(objectPath, logInterface->second);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050086#endif
Matt Spinlere0017eb2018-03-27 11:17:38 -050087}
88
Matt Spinlera1390352018-05-23 10:48:19 -050089void Manager::erase(EntryID id)
90{
Matt Spinler677143b2018-05-23 10:53:27 -050091 childEntries.erase(id);
Matt Spinlera1390352018-05-23 10:48:19 -050092 entries.erase(id);
93}
94
Matt Spinler491fc6f2018-04-23 11:00:52 -050095void Manager::addInterface(const std::string& objectPath, InterfaceType type,
96 std::experimental::any& object)
97{
98 auto id = getEntryID(objectPath);
99 auto entry = entries.find(id);
100
101 if (entry == entries.end())
102 {
103 InterfaceMap interfaces;
104 interfaces.emplace(type, object);
105 entries.emplace(id, std::move(interfaces));
106 }
107 else
108 {
109 entry->second.emplace(type, object);
110 }
111}
112
Matt Spinler677143b2018-05-23 10:53:27 -0500113void Manager::addChildInterface(const std::string& objectPath,
114 InterfaceType type,
115 std::experimental::any& object)
116{
117 auto id = getEntryID(objectPath);
118 auto entry = childEntries.find(id);
119
120 // childEntries is:
121 // A map of error log entry IDs to:
122 // a map of interface types to:
123 // a vector of interface objects
124
125 if (entry == childEntries.end())
126 {
127 ObjectList objects{object};
128 InterfaceMapMulti interfaces;
129 interfaces.emplace(type, std::move(objects));
130 childEntries.emplace(id, std::move(interfaces));
131 }
132 else
133 {
134 auto i = entry->second.find(type);
135 if (i == entry->second.end())
136 {
137 ObjectList objects{objects};
138 entry->second.emplace(type, objects);
139 }
140 else
141 {
142 i->second.emplace_back(object);
143 }
144 }
145}
146
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500147#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -0500148void Manager::createPolicyInterface(const std::string& objectPath,
149 const DbusPropertyMap& properties)
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500150{
151 auto values = policy::find(policies, properties);
152
Matt Spinler259e7272018-03-29 10:57:17 -0500153 auto object = std::make_shared<PolicyObject>(bus, objectPath.c_str(), true);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500154
155 object->eventID(std::get<policy::EIDField>(values));
156 object->description(std::get<policy::MsgField>(values));
157
Matt Spinler9bea4ea2018-05-09 15:53:04 -0500158 object->emit_object_added();
159
Matt Spinler491fc6f2018-04-23 11:00:52 -0500160 std::experimental::any anyObject = object;
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500161
Matt Spinler491fc6f2018-04-23 11:00:52 -0500162 addInterface(objectPath, InterfaceType::POLICY, anyObject);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500163}
164#endif
165
Matt Spinlere0017eb2018-03-27 11:17:38 -0500166void Manager::interfaceAdded(sdbusplus::message::message& msg)
167{
168 sdbusplus::message::object_path path;
169 DbusInterfaceMap interfaces;
170
171 msg.read(path, interfaces);
172
Matt Spinler259e7272018-03-29 10:57:17 -0500173 // Find the Logging.Entry interface with all of its properties
174 // to pass to create().
Matt Spinlere6a51592018-05-23 12:47:10 -0500175 if (interfaces.find(LOGGING_IFACE) != interfaces.end())
Matt Spinlere0017eb2018-03-27 11:17:38 -0500176 {
Matt Spinlere6a51592018-05-23 12:47:10 -0500177 create(path, interfaces);
Matt Spinlere0017eb2018-03-27 11:17:38 -0500178 }
179}
Matt Spinler055da3b2018-05-09 15:51:20 -0500180
181void Manager::interfaceRemoved(sdbusplus::message::message& msg)
182{
183 sdbusplus::message::object_path path;
184 DbusInterfaceList interfaces;
185
186 msg.read(path, interfaces);
187
188 // If the Logging.Entry interface was removed, then remove
189 // our object
190
191 auto i = std::find(interfaces.begin(), interfaces.end(), LOGGING_IFACE);
192
193 if (i != interfaces.end())
194 {
Matt Spinlera1390352018-05-23 10:48:19 -0500195 erase(getEntryID(path));
Matt Spinler055da3b2018-05-09 15:51:20 -0500196 }
197}
Matt Spinlere0017eb2018-03-27 11:17:38 -0500198}
199}