xref: /openbmc/ibm-logging/manager.hpp (revision b96fa321)
1 #pragma once
2 
3 #include <experimental/any>
4 #include <experimental/filesystem>
5 #include <map>
6 #include <sdbusplus/bus.hpp>
7 #include "dbus.hpp"
8 #include "interfaces.hpp"
9 
10 namespace ibm
11 {
12 namespace logging
13 {
14 
15 
16 /**
17  * @class Manager
18  *
19  * This class hosts IBM specific interfaces for the error logging
20  * entry objects.  It watches for interfaces added and removed
21  * signals to know when to create and delete objects.  Handling the
22  * xyz.openbmc_project.Logging service going away is done at the
23  * systemd service level where this app will be stopped too.
24  */
25 class Manager
26 {
27     public:
28 
29         Manager() = delete;
30         ~Manager() = default;
31         Manager(const Manager&) = delete;
32         Manager& operator=(const Manager&) = delete;
33         Manager(Manager&&) = delete;
34         Manager& operator=(Manager&&) = delete;
35 
36         /**
37          * Constructor
38          *
39          * @param[in] bus - the D-Bus bus object
40          */
41         explicit Manager(sdbusplus::bus::bus& bus);
42 
43     private:
44 
45         /**
46          * The callback for an interfaces added signal
47          *
48          * Creates the IBM interfaces for the log entry
49          * that was just created.
50          *
51          * @param[in] msg - the sdbusplus message
52          */
53         void interfaceAdded(sdbusplus::message::message& msg);
54 
55         /**
56          * The callback for an interfaces removed signal
57          *
58          * Removes the IBM interfaces for the log entry
59          * that was just removed.
60          *
61          * @param[in] msg - the sdbusplus message
62          */
63         void interfaceRemoved(sdbusplus::message::message& msg);
64 
65         /**
66          * Creates the IBM interfaces for all existing error log
67          * entries.
68          */
69         void createAll();
70 
71         /**
72          * Creates the IBM interface(s) for a single error log.
73          *
74          * @param[in] objectPath - object path of the error log
75          * @param[in] properties - the xyz.openbmc_project.Logging.Entry
76          *                         properties
77          */
78         void create(
79                 const std::string& objectPath,
80                 const DbusPropertyMap& properties);
81 
82         /**
83          * Returns the entry ID for a log
84          *
85          * @param[in] objectPath - the object path of the log
86          *
87          * @return uint32_t - the ID
88          */
89         inline uint32_t getEntryID(const std::string& objectPath)
90         {
91             std::experimental::filesystem::path path(objectPath);
92             return std::stoul(path.filename());
93         }
94 
95         /**
96          * The sdbusplus bus object
97          */
98         sdbusplus::bus::bus& bus;
99 
100         /**
101          * The match object for interfacesAdded
102          */
103         sdbusplus::bus::match_t addMatch;
104 
105         /**
106          * The match object for interfacesRemoved
107          */
108         sdbusplus::bus::match_t removeMatch;
109 
110         using EntryID = uint32_t;
111         using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
112         using EntryMap = std::map<EntryID, InterfaceMap>;
113 
114         /**
115          * A map of the error log IDs to their IBM interface objects.
116          * There may be multiple interfaces per ID.
117          */
118         EntryMap entries;
119 };
120 
121 }
122 }
123