xref: /openbmc/phosphor-debug-collector/elog_watch.hpp (revision fef66a951fe6fe283515480b2c493dfdc2275a95)
1 #pragma once
2 
3 #include "config.h"
4 
5 #include "dump_manager_bmc.hpp"
6 
7 #include <cereal/access.hpp>
8 #include <sdbusplus/bus.hpp>
9 #include <sdbusplus/server.hpp>
10 #include <set>
11 
12 namespace phosphor
13 {
14 namespace dump
15 {
16 namespace elog
17 {
18 
19 using IMgr = phosphor::dump::bmc::internal::Manager;
20 using EId = uint32_t;
21 using ElogList = std::set<EId>;
22 
23 /** @class Watch
24  *  @brief Adds d-bus signal based watch for elog add and delete.
25  *  @details This implements methods for watching for InternalFailure
26  *  type error message and call appropriate function to initiate dump
27  */
28 class Watch
29 {
30   public:
31     Watch() = delete;
32     ~Watch() = default;
33     Watch(const Watch&) = delete;
34     Watch& operator=(const Watch&) = delete;
35     Watch(Watch&&) = default;
36     Watch& operator=(Watch&&) = default;
37 
38     /** @brief constructs watch for elog add and delete signals.
39      *  @param[in] bus -  The Dbus bus object
40      *  @param[in] intMgr - Dump internal Manager object
41      */
42     Watch(sdbusplus::bus::bus& bus, IMgr& iMgr);
43 
44   private:
45     friend class cereal::access;
46 
47     /** @brief Function required by Cereal to perform serialization.
48      *  @tparam Archive - Cereal archive type (binary in our case).
49      *  @param[in] a - reference to Cereal archive.
50      *  @param[in] version - Class version that enables handling
51      *                       a serialized data across code levels
52      */
53     template <class Archive>
54     void serialize(Archive& a, const std::uint32_t version)
55     {
56         a(elogList);
57 
58         // TODO: openbmc/phosphor-debug-collector#1
59         //      Split into load/save so that it enables
60         //      version compare during serialization
61     }
62 
63     /** @brief Callback function for error log add.
64      *  @details InternalError type error message initiates
65      *           Internal error type dump request.
66      *  @param[in] msg  - Data associated with subscribed signal
67      */
68     void addCallback(sdbusplus::message::message& msg);
69 
70     /** @brief Callback function for error log delete.
71      *  @param[in] msg  - Data associated with subscribed signal
72      */
73     void delCallback(sdbusplus::message::message& msg);
74 
75     /** @brief get elog ID from elog entry object string.
76      *  @param[in] objectPath  - elog entry object path.
77      *  @return - elog id.
78      */
79     inline EId getEid(const std::string& objectPath)
80     {
81         fs::path path(objectPath);
82         return std::stoul(path.filename());
83     }
84 
85     /**  @brief Dump internal Manager object. */
86     IMgr& iMgr;
87 
88     /** @brief sdbusplus signal match for elog add */
89     sdbusplus::bus::match_t addMatch;
90 
91     /** @brief sdbusplus signal match for elog delete */
92     sdbusplus::bus::match_t delMatch;
93 
94     /** @brief List of elog ids, which have associated dumps created */
95     ElogList elogList;
96 };
97 
98 } // namespace elog
99 } // namespace dump
100 } // namespace phosphor
101