xref: /openbmc/ibm-logging/manager.hpp (revision 259e7277e6af53d2c4862cd48c14131c0b22bb81)
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     /**
47      * The callback for an interfaces added signal
48      *
49      * Creates the IBM interfaces for the log entry
50      * that was just created.
51      *
52      * @param[in] msg - the sdbusplus message
53      */
54     void interfaceAdded(sdbusplus::message::message& msg);
55 
56     /**
57      * The callback for an interfaces removed signal
58      *
59      * Removes the IBM interfaces for the log entry
60      * that was just removed.
61      *
62      * @param[in] msg - the sdbusplus message
63      */
64     void interfaceRemoved(sdbusplus::message::message& msg);
65 
66     /**
67      * Creates the IBM interfaces for all existing error log
68      * entries.
69      */
70     void createAll();
71 
72     /**
73      * Creates the IBM interface(s) for a single error log.
74      *
75      * @param[in] objectPath - object path of the error log
76      * @param[in] properties - the xyz.openbmc_project.Logging.Entry
77      *                         properties
78      */
79     void create(const std::string& objectPath,
80                 const DbusPropertyMap& properties);
81 
82     /**
83      * Creates the IBM policy interface for a single error log
84      * and saves it in the list of interfaces.
85      *
86      * @param[in] objectPath - object path of the error log
87      * @param[in] properties - the xyz.openbmc_project.Logging.Entry
88      *                         properties
89      */
90 #ifdef USE_POLICY_INTERFACE
91     void createPolicyInterface(const std::string& objectPath,
92                                const DbusPropertyMap& properties);
93 #endif
94 
95     /**
96      * Returns the entry ID for a log
97      *
98      * @param[in] objectPath - the object path of the log
99      *
100      * @return uint32_t - the ID
101      */
102     inline uint32_t getEntryID(const std::string& objectPath)
103     {
104         std::experimental::filesystem::path path(objectPath);
105         return std::stoul(path.filename());
106     }
107 
108     /**
109      * The sdbusplus bus object
110      */
111     sdbusplus::bus::bus& bus;
112 
113     /**
114      * The match object for interfacesAdded
115      */
116     sdbusplus::bus::match_t addMatch;
117 
118     /**
119      * The match object for interfacesRemoved
120      */
121     sdbusplus::bus::match_t removeMatch;
122 
123     using EntryID = uint32_t;
124     using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
125     using EntryMap = std::map<EntryID, InterfaceMap>;
126 
127     /**
128      * A map of the error log IDs to their IBM interface objects.
129      * There may be multiple interfaces per ID.
130      */
131     EntryMap entries;
132 
133 #ifdef USE_POLICY_INTERFACE
134     /**
135      * The class the wraps the IBM error logging policy table.
136      */
137     policy::Table policies;
138 #endif
139 };
140 }
141 }
142