xref: /openbmc/phosphor-debug-collector/elog_watch.hpp (revision 3108597441bf178bca34c9bf93fb061c56e26068)
1 #pragma once
2 
3 #include <set>
4 #include <cereal/access.hpp>
5 
6 #include <sdbusplus/bus.hpp>
7 #include <sdbusplus/server.hpp>
8 
9 #include "config.h"
10 #include "dump_manager.hpp"
11 
12 namespace phosphor
13 {
14 namespace dump
15 {
16 namespace elog
17 {
18 
19 using IMgr = phosphor::dump::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     private:
44 
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