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