blob: 276a5a55eed5a0ddd82022b2bd3906e9a4c57b0a [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
53 auto propertyMap = std::find_if(
Matt Spinler259e7272018-03-29 10:57:17 -050054 interfaces.begin(), interfaces.end(),
55 [](const auto& i) { return i.first == LOGGING_IFACE; });
Matt Spinler54bfa7e2018-03-27 11:28:59 -050056
57 if (propertyMap != interfaces.end())
58 {
59 create(object.first, propertyMap->second);
60 }
61 }
62}
63
Matt Spinler259e7272018-03-29 10:57:17 -050064void Manager::create(const std::string& objectPath,
65 const DbusPropertyMap& properties)
Matt Spinler54bfa7e2018-03-27 11:28:59 -050066{
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050067
68#ifdef USE_POLICY_INTERFACE
69 createPolicyInterface(objectPath, properties);
70#endif
Matt Spinlere0017eb2018-03-27 11:17:38 -050071}
72
Matt Spinler491fc6f2018-04-23 11:00:52 -050073void Manager::addInterface(const std::string& objectPath, InterfaceType type,
74 std::experimental::any& object)
75{
76 auto id = getEntryID(objectPath);
77 auto entry = entries.find(id);
78
79 if (entry == entries.end())
80 {
81 InterfaceMap interfaces;
82 interfaces.emplace(type, object);
83 entries.emplace(id, std::move(interfaces));
84 }
85 else
86 {
87 entry->second.emplace(type, object);
88 }
89}
90
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050091#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -050092void Manager::createPolicyInterface(const std::string& objectPath,
93 const DbusPropertyMap& properties)
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050094{
95 auto values = policy::find(policies, properties);
96
Matt Spinler259e7272018-03-29 10:57:17 -050097 auto object = std::make_shared<PolicyObject>(bus, objectPath.c_str(), true);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050098
99 object->eventID(std::get<policy::EIDField>(values));
100 object->description(std::get<policy::MsgField>(values));
101
Matt Spinler9bea4ea2018-05-09 15:53:04 -0500102 object->emit_object_added();
103
Matt Spinler491fc6f2018-04-23 11:00:52 -0500104 std::experimental::any anyObject = object;
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500105
Matt Spinler491fc6f2018-04-23 11:00:52 -0500106 addInterface(objectPath, InterfaceType::POLICY, anyObject);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500107}
108#endif
109
Matt Spinlere0017eb2018-03-27 11:17:38 -0500110void Manager::interfaceAdded(sdbusplus::message::message& msg)
111{
112 sdbusplus::message::object_path path;
113 DbusInterfaceMap interfaces;
114
115 msg.read(path, interfaces);
116
Matt Spinler259e7272018-03-29 10:57:17 -0500117 // Find the Logging.Entry interface with all of its properties
118 // to pass to create().
119 auto propertyMap =
120 std::find_if(interfaces.begin(), interfaces.end(),
121 [](const auto& i) { return i.first == LOGGING_IFACE; });
Matt Spinlere0017eb2018-03-27 11:17:38 -0500122
123 if (propertyMap != interfaces.end())
124 {
Matt Spinler54bfa7e2018-03-27 11:28:59 -0500125 create(path, propertyMap->second);
Matt Spinlere0017eb2018-03-27 11:17:38 -0500126 }
127}
Matt Spinler055da3b2018-05-09 15:51:20 -0500128
129void Manager::interfaceRemoved(sdbusplus::message::message& msg)
130{
131 sdbusplus::message::object_path path;
132 DbusInterfaceList interfaces;
133
134 msg.read(path, interfaces);
135
136 // If the Logging.Entry interface was removed, then remove
137 // our object
138
139 auto i = std::find(interfaces.begin(), interfaces.end(), LOGGING_IFACE);
140
141 if (i != interfaces.end())
142 {
143 auto id = getEntryID(path);
144
145 auto entry = entries.find(id);
146 if (entry != entries.end())
147 {
148 entries.erase(entry);
149 }
150 }
151}
Matt Spinlere0017eb2018-03-27 11:17:38 -0500152}
153}