1 #pragma once
2 
3 #include <sdbusplus/bus.hpp>
4 #include <phosphor-logging/log.hpp>
5 #include "elog_entry.hpp"
6 #include "xyz/openbmc_project/Logging/Internal/Manager/server.hpp"
7 
8 namespace phosphor
9 {
10 namespace logging
11 {
12 
13 extern const std::map<std::string,std::vector<std::string>> g_errMetaMap;
14 extern const std::map<std::string,level> g_errLevelMap;
15 
16 namespace details
17 {
18 
19 template <typename T>
20 using ServerObject = typename sdbusplus::server::object::object<T>;
21 
22 using ManagerIface =
23     sdbusplus::xyz::openbmc_project::Logging::Internal::server::Manager;
24 
25 } // namespace details
26 
27 /** @class Manager
28  *  @brief OpenBMC logging manager implementation.
29  *  @details A concrete implementation for the
30  *  xyz.openbmc_project.Logging.Internal.Manager DBus API.
31  */
32 class Manager : public details::ServerObject<details::ManagerIface>
33 {
34     public:
35         Manager() = delete;
36         Manager(const Manager&) = delete;
37         Manager& operator=(const Manager&) = delete;
38         Manager(Manager&&) = delete;
39         Manager& operator=(Manager&&) = delete;
40         virtual ~Manager() = default;
41 
42         /** @brief Constructor to put object onto bus at a dbus path.
43          *  @param[in] bus - Bus to attach to.
44          *  @param[in] path - Path to attach at.
45          */
46         Manager(sdbusplus::bus::bus& bus, const char* objPath) :
47                 details::ServerObject<details::ManagerIface>(bus, objPath),
48                 busLog(bus),
49                 entryId(0) {};
50 
51         /*
52          * @fn commit()
53          * @brief sd_bus Commit method implementation callback.
54          * @details Create an error/event log based on transaction id and
55          *          error message.
56          * @param[in] transactionId - Unique identifier of the journal entries
57          *                            to be committed.
58          * @param[in] errMsg - The error exception message associated with the
59          *                     error log to be committed.
60          */
61         void commit(uint64_t transactionId, std::string errMsg) override;
62 
63 
64         /** @brief Erase specified entry d-bus object
65          *
66          * @param[in] entryId - unique identifier of the entry
67          */
68         void erase(uint32_t entryId);
69 
70     private:
71         /** @brief Call metadata handler(s), if any. Handlers may create
72          *         associations.
73          *  @param[in] errorName - name of the error
74          *  @param[in] additionalData - list of metadata (in key=value format)
75          *  @param[out] objects - list of error's association objects
76          */
77         void processMetadata(const std::string& errorName,
78                              const std::vector<std::string>& additionalData,
79                              AssociationList& objects) const;
80 
81         /** @brief Persistent sdbusplus DBus bus connection. */
82         sdbusplus::bus::bus& busLog;
83 
84         /** @brief Persistent map of Entry dbus objects and their ID */
85         std::map<uint32_t, std::unique_ptr<Entry>> entries;
86 
87         /** @brief Id of last error log entry */
88         uint32_t entryId;
89 };
90 
91 } // namespace logging
92 } // namespace phosphor
93