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 */ 51 template<class Archive> 52 void serialize(Archive& a) 53 { 54 a(elogList); 55 } 56 57 /** @brief Callback function for error log add. 58 * @details InternalError type error message initiates 59 * Internal error type dump request. 60 * @param[in] msg - Data associated with subscribed signal 61 */ 62 void addCallback(sdbusplus::message::message& msg); 63 64 /** @brief Callback function for error log delete. 65 * @param[in] msg - Data associated with subscribed signal 66 */ 67 void delCallback(sdbusplus::message::message& msg); 68 69 /** @brief get elog ID from elog entry object string. 70 * @param[in] objectPath - elog entry object path. 71 * @return - elog id. 72 */ 73 inline EId getEid(const std::string& objectPath) 74 { 75 fs::path path(objectPath); 76 return std::stoul(path.filename()); 77 } 78 79 /** @brief Dump internal Manager object. */ 80 IMgr& iMgr; 81 82 /** @brief sdbusplus signal match for elog add */ 83 sdbusplus::bus::match_t addMatch; 84 85 /** @brief sdbusplus signal match for elog delete */ 86 sdbusplus::bus::match_t delMatch; 87 88 /** @brief List of elog ids, which have associated dumps created */ 89 ElogList elogList; 90 }; 91 92 }//namespace elog 93 }//namespace dump 94 }//namespace phosphor 95