xref: /openbmc/ibm-logging/manager.hpp (revision a3c33e77)
1 #pragma once
2 
3 #include <experimental/any>
4 #include <experimental/filesystem>
5 #include <map>
6 #include <sdbusplus/bus.hpp>
7 #include "config.h"
8 #include "dbus.hpp"
9 #include "interfaces.hpp"
10 #ifdef USE_POLICY_INTERFACE
11 #include "policy_table.hpp"
12 #endif
13 
14 namespace ibm
15 {
16 namespace logging
17 {
18 
19 /**
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  */
28 class Manager
29 {
30   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;
37 
38     /**
39      * Constructor
40      *
41      * @param[in] bus - the D-Bus bus object
42      */
43     explicit Manager(sdbusplus::bus::bus& bus);
44 
45   private:
46     using EntryID = uint32_t;
47     using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
48     using EntryMap = std::map<EntryID, InterfaceMap>;
49 
50     using ObjectList = std::vector<std::experimental::any>;
51     using InterfaceMapMulti = std::map<InterfaceType, ObjectList>;
52     using EntryMapMulti = std::map<EntryID, InterfaceMapMulti>;
53 
54     /**
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 
62     /**
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);
71 
72     /**
73      * 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     /**
83      * Creates the IBM interfaces for all existing error log
84      * entries.
85      */
86     void createAll();
87 
88     /**
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,
96                 const DbusPropertyMap& properties);
97 
98     /**
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      */
106 #ifdef USE_POLICY_INTERFACE
107     void createPolicyInterface(const std::string& objectPath,
108                                const DbusPropertyMap& properties);
109 #endif
110 
111     /**
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     }
123 
124     /**
125      * 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     /**
135      * 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     /**
150      * The sdbusplus bus object
151      */
152     sdbusplus::bus::bus& bus;
153 
154     /**
155      * The match object for interfacesAdded
156      */
157     sdbusplus::bus::match_t addMatch;
158 
159     /**
160      * The match object for interfacesRemoved
161      */
162     sdbusplus::bus::match_t removeMatch;
163 
164     /**
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;
169 
170     /**
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 
181 #ifdef USE_POLICY_INTERFACE
182     /**
183      * The class the wraps the IBM error logging policy table.
184      */
185     policy::Table policies;
186 #endif
187 };
188 }
189 }
190