1 #pragma once 2 3 #include "xyz/openbmc_project/Logging/Entry/server.hpp" 4 #include "xyz/openbmc_project/Object/Delete/server.hpp" 5 #include "xyz/openbmc_project/Software/Version/server.hpp" 6 7 #include <sdbusplus/bus.hpp> 8 #include <sdbusplus/server/object.hpp> 9 #include <sdeventplus/event.hpp> 10 #include <sdeventplus/source/event.hpp> 11 #include <xyz/openbmc_project/Association/Definitions/server.hpp> 12 #include <xyz/openbmc_project/Common/FilePath/server.hpp> 13 14 namespace phosphor 15 { 16 namespace logging 17 { 18 19 using EntryIfaces = sdbusplus::server::object_t< 20 sdbusplus::xyz::openbmc_project::Logging::server::Entry, 21 sdbusplus::xyz::openbmc_project::Object::server::Delete, 22 sdbusplus::xyz::openbmc_project::Association::server::Definitions, 23 sdbusplus::xyz::openbmc_project::Software::server::Version, 24 sdbusplus::xyz::openbmc_project::Common::server::FilePath>; 25 26 using AssociationList = 27 std::vector<std::tuple<std::string, std::string, std::string>>; 28 29 namespace internal 30 { 31 class Manager; 32 } 33 34 /** @class Entry 35 * @brief OpenBMC logging entry implementation. 36 * @details A concrete implementation for the 37 * xyz.openbmc_project.Logging.Entry and 38 * xyz.openbmc_project.Associations.Definitions DBus APIs. 39 */ 40 class Entry : public EntryIfaces 41 { 42 public: 43 Entry() = delete; 44 Entry(const Entry&) = delete; 45 Entry& operator=(const Entry&) = delete; 46 Entry(Entry&&) = delete; 47 Entry& operator=(Entry&&) = delete; 48 virtual ~Entry() = default; 49 50 /** @brief Constructor to put object onto bus at a dbus path. 51 * Defer signal registration (pass true for deferSignal to the 52 * base class) until after the properties are set. 53 * @param[in] bus - Bus to attach to. 54 * @param[in] objectPath - Path to attach at. 55 * @param[in] idErr - The error entry id. 56 * @param[in] timestampErr - The commit timestamp. 57 * @param[in] severityErr - The severity of the error. 58 * @param[in] msgErr - The message of the error. 59 * @param[in] additionalDataErr - The error metadata. 60 * @param[in] objects - The list of associations. 61 * @param[in] fwVersion - The BMC code version. 62 * @param[in] filePath - Serialization path 63 * @param[in] parent - The error's parent. 64 */ 65 Entry(sdbusplus::bus_t& bus, const std::string& objectPath, uint32_t idErr, 66 uint64_t timestampErr, Level severityErr, std::string&& msgErr, 67 std::vector<std::string>&& additionalDataErr, 68 AssociationList&& objects, const std::string& fwVersion, 69 const std::string& filePath, internal::Manager& parent) : 70 EntryIfaces(bus, objectPath.c_str(), EntryIfaces::action::defer_emit), 71 parent(parent) 72 { 73 id(idErr, true); 74 severity(severityErr, true); 75 timestamp(timestampErr, true); 76 updateTimestamp(timestampErr, true); 77 message(std::move(msgErr), true); 78 additionalData(std::move(additionalDataErr), true); 79 associations(std::move(objects), true); 80 // Store a copy of associations in case we need to recreate 81 assocs = associations(); 82 sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved(false, 83 true); 84 85 version(fwVersion, true); 86 purpose(VersionPurpose::BMC, true); 87 path(filePath, true); 88 89 // Emit deferred signal. 90 this->emit_object_added(); 91 }; 92 93 /** @brief Constructor that puts an "empty" error object on the bus, 94 * with only the id property populated. Rest of the properties 95 * to be set by the caller. Caller should emit the added signal. 96 * @param[in] bus - Bus to attach to. 97 * @param[in] path - Path to attach at. 98 * @param[in] id - The error entry id. 99 * @param[in] parent - The error's parent. 100 */ 101 Entry(sdbusplus::bus_t& bus, const std::string& path, uint32_t entryId, 102 internal::Manager& parent) : 103 EntryIfaces(bus, path.c_str(), EntryIfaces::action::defer_emit), 104 parent(parent) 105 { 106 id(entryId, true); 107 }; 108 109 /** @brief Set resolution status of the error. 110 * @param[in] value - boolean indicating resolution 111 * status (true = resolved) 112 * @returns value of 'Resolved' property 113 */ 114 bool resolved(bool value) override; 115 116 using sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved; 117 118 /** @brief Update eventId string of the error. 119 * @param[in] value - The eventID 120 * @returns New property value 121 */ 122 std::string eventId(std::string value) override; 123 124 using sdbusplus::xyz::openbmc_project::Logging::server::Entry::eventId; 125 126 /** @brief Update resolution string of the error. 127 * @param[in] value - The resolution 128 * @returns New property value 129 */ 130 std::string resolution(std::string value) override; 131 132 using sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolution; 133 134 /** @brief Delete this d-bus object. 135 */ 136 void delete_() override; 137 138 /** @brief Severity level to check in cap. 139 * @details Errors with severity lesser than this will be 140 * considered as low priority and maximum ERROR_INFO_CAP 141 * number errors of this category will be captured. 142 */ 143 static constexpr auto sevLowerLimit = Entry::Level::Informational; 144 145 /** 146 * @brief Returns the file descriptor to the Entry file. 147 * @return unix_fd - File descriptor to the Entry file. 148 */ 149 sdbusplus::message::unix_fd getEntry() override; 150 151 private: 152 /** @brief This entry's associations */ 153 AssociationList assocs = {}; 154 155 /** @brief This entry's parent */ 156 internal::Manager& parent; 157 158 /** 159 * @brief The event source for closing the Entry file descriptor after it 160 * has been returned from the getEntry D-Bus method. 161 */ 162 std::unique_ptr<sdeventplus::source::Defer> fdCloseEventSource; 163 164 /** 165 * @brief Closes the file descriptor passed in. 166 * @details This is called from the event loop to close FDs returned from 167 * getEntry(). 168 * @param[in] fd - The file descriptor to close 169 * @param[in] source - The event source object used 170 */ 171 void closeFD(int fd, sdeventplus::source::EventBase& source); 172 }; 173 174 } // namespace logging 175 } // namespace phosphor 176