1 #pragma once 2 3 #include "dump_entry.hpp" 4 #include "xyz/openbmc_project/Dump/Entry/BMC/server.hpp" 5 #include "xyz/openbmc_project/Dump/Entry/server.hpp" 6 #include "xyz/openbmc_project/Object/Delete/server.hpp" 7 #include "xyz/openbmc_project/Time/EpochTime/server.hpp" 8 9 #include <sdbusplus/bus.hpp> 10 #include <sdbusplus/server/object.hpp> 11 12 #include <filesystem> 13 14 namespace phosphor 15 { 16 namespace dump 17 { 18 namespace bmc 19 { 20 template <typename T> 21 using ServerObject = typename sdbusplus::server::object_t<T>; 22 23 using EntryIfaces = sdbusplus::server::object_t< 24 sdbusplus::xyz::openbmc_project::Dump::Entry::server::BMC>; 25 26 using originatorTypes = sdbusplus::xyz::openbmc_project::Common::server:: 27 OriginatedBy::OriginatorTypes; 28 29 /** @class Entry 30 * @brief OpenBMC Dump Entry implementation. 31 * @details A concrete implementation for the 32 * xyz.openbmc_project.Dump.Entry DBus API 33 */ 34 class Entry : virtual public phosphor::dump::Entry, virtual public EntryIfaces 35 { 36 public: 37 Entry() = delete; 38 Entry(const Entry&) = delete; 39 Entry& operator=(const Entry&) = delete; 40 Entry(Entry&&) = delete; 41 Entry& operator=(Entry&&) = delete; 42 ~Entry() = default; 43 44 /** @brief Constructor for the Dump Entry Object 45 * @param[in] bus - Bus to attach to. 46 * @param[in] objPath - Object path to attach to 47 * @param[in] dumpId - Dump id. 48 * @param[in] timeStamp - Dump creation timestamp 49 * since the epoch. 50 * @param[in] fileSize - Dump file size in bytes. 51 * @param[in] file - Absolute path to the dump file. 52 * @param[in] status - status of the dump. 53 * @param[in] originatorId - Id of the originator of the dump 54 * @param[in] originatorType - Originator type 55 * @param[in] parent - The dump entry's parent. 56 */ Entry(sdbusplus::bus_t & bus,const std::string & objPath,uint32_t dumpId,uint64_t timeStamp,uint64_t fileSize,const std::filesystem::path & file,phosphor::dump::OperationStatus status,std::string originatorId,originatorTypes originatorType,phosphor::dump::Manager & parent)57 Entry(sdbusplus::bus_t& bus, const std::string& objPath, uint32_t dumpId, 58 uint64_t timeStamp, uint64_t fileSize, 59 const std::filesystem::path& file, 60 phosphor::dump::OperationStatus status, std::string originatorId, 61 originatorTypes originatorType, phosphor::dump::Manager& parent) : 62 phosphor::dump::Entry(bus, objPath.c_str(), dumpId, timeStamp, fileSize, 63 file, status, originatorId, originatorType, 64 parent), 65 EntryIfaces(bus, objPath.c_str(), EntryIfaces::action::defer_emit) 66 { 67 // Emit deferred signal. 68 this->phosphor::dump::bmc::EntryIfaces::emit_object_added(); 69 } 70 71 /** @brief Delete this d-bus object. 72 */ 73 void delete_() override; 74 75 /** @brief Method to initiate the offload of dump 76 * @param[in] uri - URI to offload dump 77 */ 78 void initiateOffload(std::string uri) override; 79 80 /** @brief Method to update an existing dump entry, once the dump creation 81 * is completed this function will be used to update the entry which got 82 * created during the dump request. 83 * @param[in] timeStamp - Dump creation timestamp 84 * @param[in] fileSize - Dump file size in bytes. 85 * @param[in] file - Name of dump file. 86 */ update(uint64_t timeStamp,uint64_t fileSize,const std::filesystem::path & filePath)87 void update(uint64_t timeStamp, uint64_t fileSize, 88 const std::filesystem::path& filePath) 89 { 90 elapsed(timeStamp); 91 size(fileSize); 92 // TODO: Handled dump failed case with #ibm-openbmc/2808 93 status(OperationStatus::Completed); 94 file = filePath; 95 // TODO: serialization of this property will be handled with 96 // #ibm-openbmc/2597 97 completedTime(timeStamp); 98 serialize(); 99 } 100 101 /** 102 * @brief Update dump entry attributes from the file name. 103 * 104 * @param[in] dumpPath - The path to the dump directory. 105 */ 106 void updateFromFile(const std::filesystem::path& dumpPath); 107 108 /** 109 * @brief Deserialize and create an entry 110 * @param[in] bus - Bus to attach to. 111 * @param[in] id - Dump id. 112 * @param[in] objPath - Object path to attach to. 113 * @param[in] filePath - Path to the dump file. 114 * @param[in] parent - The dump entry's parent. 115 * @return A unique pointer to the created entry. 116 */ deserializeEntry(sdbusplus::bus_t & bus,uint32_t id,const std::string & objPath,const std::filesystem::path & filePath,phosphor::dump::Manager & parent)117 static std::unique_ptr<Entry> deserializeEntry( 118 sdbusplus::bus_t& bus, uint32_t id, const std::string& objPath, 119 const std::filesystem::path& filePath, phosphor::dump::Manager& parent) 120 { 121 try 122 { 123 auto entry = std::unique_ptr<Entry>( 124 new Entry(bus, objPath, id, filePath, parent)); 125 entry->updateFromFile(filePath); 126 entry->deserialize(filePath.parent_path()); 127 entry->emitSignal(); 128 return entry; 129 } 130 catch (const std::exception& e) 131 { 132 lg2::error( 133 "Dump deserialization failed for path: {PATH}, error: {ERROR}", 134 "PATH", filePath, "ERROR", e.what()); 135 return nullptr; 136 } 137 } 138 139 private: 140 /** 141 * @brief A minimal private constructor for the Dump Entry Object 142 * @param[in] bus - Bus to attach to. 143 * @param[in] objPath - Object path to attach to 144 * @param[in] dumpId - Dump id. 145 * @param[in] file - Absolute path to the dump file. 146 * @param[in] parent - The dump entry's parent. 147 */ Entry(sdbusplus::bus_t & bus,const std::string & objPath,uint32_t dumpId,const std::filesystem::path & file,phosphor::dump::Manager & parent)148 Entry(sdbusplus::bus_t& bus, const std::string& objPath, uint32_t dumpId, 149 const std::filesystem::path& file, phosphor::dump::Manager& parent) : 150 phosphor::dump::Entry(bus, objPath.c_str(), dumpId, 0, 0, file, 151 OperationStatus::InProgress, "", 152 originatorTypes::Internal, parent), 153 EntryIfaces(bus, objPath.c_str(), EntryIfaces::action::defer_emit) 154 {} 155 156 /** 157 * @brief Emit object added signal 158 */ emitSignal()159 void emitSignal() 160 { 161 this->phosphor::dump::bmc::EntryIfaces::emit_object_added(); 162 } 163 }; 164 165 } // namespace bmc 166 } // namespace dump 167 } // namespace phosphor 168