blob: 69d947908d7fbd273f175be9d4fea90bc48088b4 [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 Spinler433bead2018-04-23 11:08:03 -050045 /**
46 * Deletes the entry with the specified path
47 *
48 * @param[in] objectPath - the entry object path
49 */
50 void erase(const std::string& objectPath);
51
Matt Spinler259e7272018-03-29 10:57:17 -050052 private:
53 /**
54 * The callback for an interfaces added signal
55 *
56 * Creates the IBM interfaces for the log entry
57 * that was just created.
58 *
59 * @param[in] msg - the sdbusplus message
60 */
61 void interfaceAdded(sdbusplus::message::message& msg);
Matt Spinlere0017eb2018-03-27 11:17:38 -050062
Matt Spinler259e7272018-03-29 10:57:17 -050063 /**
64 * The callback for an interfaces removed signal
65 *
66 * Removes the IBM interfaces for the log entry
67 * that was just removed.
68 *
69 * @param[in] msg - the sdbusplus message
70 */
71 void interfaceRemoved(sdbusplus::message::message& msg);
Matt Spinlere0017eb2018-03-27 11:17:38 -050072
Matt Spinler259e7272018-03-29 10:57:17 -050073 /**
74 * Creates the IBM interfaces for all existing error log
75 * entries.
76 */
77 void createAll();
Matt Spinlere0017eb2018-03-27 11:17:38 -050078
Matt Spinler259e7272018-03-29 10:57:17 -050079 /**
80 * Creates the IBM interface(s) for a single error log.
81 *
82 * @param[in] objectPath - object path of the error log
83 * @param[in] properties - the xyz.openbmc_project.Logging.Entry
84 * properties
85 */
86 void create(const std::string& objectPath,
Matt Spinler54bfa7e2018-03-27 11:28:59 -050087 const DbusPropertyMap& properties);
88
Matt Spinler259e7272018-03-29 10:57:17 -050089 /**
90 * Creates the IBM policy interface for a single error log
91 * and saves it in the list of interfaces.
92 *
93 * @param[in] objectPath - object path of the error log
94 * @param[in] properties - the xyz.openbmc_project.Logging.Entry
95 * properties
96 */
Matt Spinler4a6ea6a2018-03-27 14:25:12 -050097#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -050098 void createPolicyInterface(const std::string& objectPath,
99 const DbusPropertyMap& properties);
Matt Spinler4a6ea6a2018-03-27 14:25:12 -0500100#endif
101
Matt Spinler259e7272018-03-29 10:57:17 -0500102 /**
Matt Spinler433bead2018-04-23 11:08:03 -0500103 * Creates the Delete interface for a single error log
104 * and saves it in the list of interfaces.
105 *
106 * @param[in] objectPath - object path of the error log
107 */
108 void createDeleteInterface(const std::string& objectPath);
109
110 /**
Matt Spinler259e7272018-03-29 10:57:17 -0500111 * Returns the entry ID for a log
112 *
113 * @param[in] objectPath - the object path of the log
114 *
115 * @return uint32_t - the ID
116 */
117 inline uint32_t getEntryID(const std::string& objectPath)
118 {
119 std::experimental::filesystem::path path(objectPath);
120 return std::stoul(path.filename());
121 }
Matt Spinlere0017eb2018-03-27 11:17:38 -0500122
Matt Spinler259e7272018-03-29 10:57:17 -0500123 /**
Matt Spinler491fc6f2018-04-23 11:00:52 -0500124 * Adds an interface object to the entries map
125 *
126 * @param[in] objectPath - the object path of the log
127 * @param[in] type - the interface type being added
128 * @param[in] object - the interface object
129 */
130 void addInterface(const std::string& objectPath, InterfaceType type,
131 std::experimental::any& object);
132
133 /**
Matt Spinler259e7272018-03-29 10:57:17 -0500134 * The sdbusplus bus object
135 */
136 sdbusplus::bus::bus& bus;
Matt Spinlere0017eb2018-03-27 11:17:38 -0500137
Matt Spinler259e7272018-03-29 10:57:17 -0500138 /**
139 * The match object for interfacesAdded
140 */
141 sdbusplus::bus::match_t addMatch;
Matt Spinlere0017eb2018-03-27 11:17:38 -0500142
Matt Spinler259e7272018-03-29 10:57:17 -0500143 /**
144 * The match object for interfacesRemoved
145 */
146 sdbusplus::bus::match_t removeMatch;
Matt Spinlere0017eb2018-03-27 11:17:38 -0500147
Matt Spinler259e7272018-03-29 10:57:17 -0500148 using EntryID = uint32_t;
149 using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
150 using EntryMap = std::map<EntryID, InterfaceMap>;
Matt Spinlere0017eb2018-03-27 11:17:38 -0500151
Matt Spinler259e7272018-03-29 10:57:17 -0500152 /**
153 * A map of the error log IDs to their IBM interface objects.
154 * There may be multiple interfaces per ID.
155 */
156 EntryMap entries;
Matt Spinler743e5822018-03-27 13:44:50 -0500157
158#ifdef USE_POLICY_INTERFACE
Matt Spinler259e7272018-03-29 10:57:17 -0500159 /**
160 * The class the wraps the IBM error logging policy table.
161 */
162 policy::Table policies;
Matt Spinler743e5822018-03-27 13:44:50 -0500163#endif
Matt Spinlere0017eb2018-03-27 11:17:38 -0500164};
Matt Spinlere0017eb2018-03-27 11:17:38 -0500165}
166}