blob: 04121303f7a9dd48b8a5eb963a51420d13ec6fbc [file] [log] [blame]
Matt Spinlere0017eb2018-03-27 11:17:38 -05001#pragma once
2
3#include <experimental/any>
4#include <experimental/filesystem>
5#include <map>
6#include <sdbusplus/bus.hpp>
Matt Spinler743e5822018-03-27 13:44:50 -05007#include "config.h"
Matt Spinlere0017eb2018-03-27 11:17:38 -05008#include "dbus.hpp"
9#include "interfaces.hpp"
Matt Spinler743e5822018-03-27 13:44:50 -050010#ifdef USE_POLICY_INTERFACE
11#include "policy_table.hpp"
12#endif
Matt Spinlere0017eb2018-03-27 11:17:38 -050013
14namespace ibm
15{
16namespace logging
17{
18
Matt Spinlere0017eb2018-03-27 11:17:38 -050019/**
20 * @class Manager
21 *
22 * This class hosts IBM specific interfaces for the error logging
23 * entry objects. It watches for interfaces added and removed
24 * signals to know when to create and delete objects. Handling the
25 * xyz.openbmc_project.Logging service going away is done at the
26 * systemd service level where this app will be stopped too.
27 */
28class Manager
29{
Matt Spinler259e7272018-03-29 10:57:17 -050030 public:
31 Manager() = delete;
32 ~Manager() = default;
33 Manager(const Manager&) = delete;
34 Manager& operator=(const Manager&) = delete;
35 Manager(Manager&&) = delete;
36 Manager& operator=(Manager&&) = delete;
Matt Spinlere0017eb2018-03-27 11:17:38 -050037
Matt Spinler259e7272018-03-29 10:57:17 -050038 /**
39 * Constructor
40 *
41 * @param[in] bus - the D-Bus bus object
42 */
43 explicit Manager(sdbusplus::bus::bus& bus);
Matt Spinlere0017eb2018-03-27 11:17:38 -050044
Matt Spinler259e7272018-03-29 10:57:17 -050045 private:
Matt Spinlera1390352018-05-23 10:48:19 -050046 using EntryID = uint32_t;
47 using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
48 using EntryMap = std::map<EntryID, InterfaceMap>;
49
Matt Spinler677143b2018-05-23 10:53:27 -050050 using ObjectList = std::vector<std::experimental::any>;
51 using InterfaceMapMulti = std::map<InterfaceType, ObjectList>;
52 using EntryMapMulti = std::map<EntryID, InterfaceMapMulti>;
53
Matt Spinlera1390352018-05-23 10:48:19 -050054 /**
55 * Deletes the entry and any child entries with
56 * the specified ID.
57 *
58 * @param[in] id - the entry ID
59 */
60 void erase(EntryID id);
61
Matt Spinler259e7272018-03-29 10:57:17 -050062 /**
63 * The callback for an interfaces added signal
64 *
65 * Creates the IBM interfaces for the log entry
66 * that was just created.
67 *
68 * @param[in] msg - the sdbusplus message
69 */
70 void interfaceAdded(sdbusplus::message::message& msg);
Matt Spinlere0017eb2018-03-27 11:17:38 -050071
Matt Spinler259e7272018-03-29 10:57:17 -050072 /**
Matt Spinler055da3b2018-05-09 15:51:20 -050073 * The callback for an interfaces removed signal
74 *
75 * Removes the IBM interfaces for the log entry
76 * that was just removed.
77 *
78 * @param[in] msg - the sdbusplus message
79 */
80 void interfaceRemoved(sdbusplus::message::message& msg);
81
82 /**
Matt Spinler259e7272018-03-29 10:57:17 -050083 * Creates the IBM interfaces for all existing error log
84 * entries.
85 */
86 void createAll();
Matt Spinlere0017eb2018-03-27 11:17:38 -050087
Matt Spinler259e7272018-03-29 10:57:17 -050088 /**
89 * Creates the IBM interface(s) for a single error log.
90 *
91 * @param[in] objectPath - object path of the error log
92 * @param[in] properties - the xyz.openbmc_project.Logging.Entry
93 * properties
94 */
95 void create(const std::string& objectPath,
Matt Spinler54bfa7e2018-03-27 11:28:59 -050096 const DbusPropertyMap& properties);
97
Matt Spinler259e7272018-03-29 10:57:17 -050098 /**
99 * Creates the IBM policy interface for a single error log
100 * and saves it in the list of interfaces.
101 *
102 * @param[in] objectPath - object path of the error log
103 * @param[in] properties - the xyz.openbmc_project.Logging.Entry
104 * properties
105 */
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500106#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -0500107 void createPolicyInterface(const std::string& objectPath,
108 const DbusPropertyMap& properties);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500109#endif
110
Matt Spinler259e7272018-03-29 10:57:17 -0500111 /**
112 * Returns the entry ID for a log
113 *
114 * @param[in] objectPath - the object path of the log
115 *
116 * @return uint32_t - the ID
117 */
118 inline uint32_t getEntryID(const std::string& objectPath)
119 {
120 std::experimental::filesystem::path path(objectPath);
121 return std::stoul(path.filename());
122 }
Matt Spinlere0017eb2018-03-27 11:17:38 -0500123
Matt Spinler259e7272018-03-29 10:57:17 -0500124 /**
Matt Spinler491fc6f2018-04-23 11:00:52 -0500125 * Adds an interface object to the entries map
126 *
127 * @param[in] objectPath - the object path of the log
128 * @param[in] type - the interface type being added
129 * @param[in] object - the interface object
130 */
131 void addInterface(const std::string& objectPath, InterfaceType type,
132 std::experimental::any& object);
133
134 /**
Matt Spinler677143b2018-05-23 10:53:27 -0500135 * Adds an interface to a child object, which is an object that
136 * relates to the main ...logging/entry/X object but has a different path.
137 * The object is stored in the childEntries map.
138 *
139 * There can be multiple instances of a child object per type per
140 * logging object.
141 *
142 * @param[in] objectPath - the object path of the log
143 * @param[in] type - the interface type being added.
144 * @param[in] object - the interface object
145 */
146 void addChildInterface(const std::string& objectPath, InterfaceType type,
147 std::experimental::any& object);
148
149 /**
Matt Spinler259e7272018-03-29 10:57:17 -0500150 * The sdbusplus bus object
151 */
152 sdbusplus::bus::bus& bus;
Matt Spinlere0017eb2018-03-27 11:17:38 -0500153
Matt Spinler259e7272018-03-29 10:57:17 -0500154 /**
155 * The match object for interfacesAdded
156 */
157 sdbusplus::bus::match_t addMatch;
Matt Spinlere0017eb2018-03-27 11:17:38 -0500158
Matt Spinler055da3b2018-05-09 15:51:20 -0500159 /**
160 * The match object for interfacesRemoved
161 */
162 sdbusplus::bus::match_t removeMatch;
163
Matt Spinler259e7272018-03-29 10:57:17 -0500164 /**
165 * A map of the error log IDs to their IBM interface objects.
166 * There may be multiple interfaces per ID.
167 */
168 EntryMap entries;
Matt Spinler743e5822018-03-27 13:44:50 -0500169
Matt Spinler677143b2018-05-23 10:53:27 -0500170 /**
171 * A map of the error log IDs to their interface objects which
172 * are children of the logging objects.
173 *
174 * These objects have the same lifespan as their parent objects.
175 *
176 * There may be multiple interfaces per ID, and also multiple
177 * interface instances per interface type.
178 */
179 EntryMapMulti childEntries;
180
Matt Spinler743e5822018-03-27 13:44:50 -0500181#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -0500182 /**
183 * The class the wraps the IBM error logging policy table.
184 */
185 policy::Table policies;
Matt Spinler743e5822018-03-27 13:44:50 -0500186#endif
Matt Spinlere0017eb2018-03-27 11:17:38 -0500187};
Matt Spinlere0017eb2018-03-27 11:17:38 -0500188}
189}