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