1 #pragma once 2 3 #include "config.h" 4 5 #include "xyz/openbmc_project/Common/FilePath/server.hpp" 6 #include "xyz/openbmc_project/Object/Delete/server.hpp" 7 #include "xyz/openbmc_project/Software/Version/server.hpp" 8 9 #include <sdbusplus/bus.hpp> 10 11 #include <string> 12 13 namespace openpower 14 { 15 namespace software 16 { 17 namespace updater 18 { 19 20 class ItemUpdater; 21 22 typedef std::function<void(std::string)> eraseFunc; 23 24 using VersionInherit = sdbusplus::server::object_t< 25 sdbusplus::xyz::openbmc_project::Software::server::Version, 26 sdbusplus::xyz::openbmc_project::Common::server::FilePath>; 27 using DeleteInherit = sdbusplus::server::object_t< 28 sdbusplus::xyz::openbmc_project::Object::server::Delete>; 29 30 namespace sdbusRule = sdbusplus::bus::match::rules; 31 32 class Delete; 33 class Version; 34 35 /** @class Delete 36 * @brief OpenBMC Delete implementation. 37 * @details A concrete implementation for xyz.openbmc_project.Object.Delete 38 * D-Bus API. 39 */ 40 class Delete : public DeleteInherit 41 { 42 public: 43 /** @brief Constructs Delete. 44 * 45 * @param[in] bus - The D-Bus bus object 46 * @param[in] path - The D-Bus object path 47 * @param[in] parent - Parent object. 48 */ 49 Delete(sdbusplus::bus_t& bus, const std::string& path, Version& parent) : 50 DeleteInherit(bus, path.c_str(), action::emit_interface_added), 51 parent(parent) 52 {} 53 54 /** 55 * @brief Delete the D-Bus object. 56 * Overrides the default delete function by calling 57 * Version class erase Method. 58 **/ 59 void delete_() override; 60 61 private: 62 /** @brief Parent Object. */ 63 Version& parent; 64 }; 65 66 /** @class Version 67 * @brief OpenBMC version software management implementation. 68 * @details A concrete implementation for xyz.openbmc_project.Software.Version 69 * D-Bus API. 70 */ 71 class Version : public VersionInherit 72 { 73 public: 74 /** @brief Constructs Version Software Manager. 75 * 76 * @param[in] bus - The D-Bus bus object 77 * @param[in] objPath - The D-Bus object path 78 * @param[in] parent - Parent object. 79 * @param[in] versionId - The version Id 80 * @param[in] versionString - The version string 81 * @param[in] versionPurpose - The version purpose 82 * @param[in] filePath - The image filesystem path 83 * @param[in] callback - The eraseFunc callback 84 */ 85 Version(sdbusplus::bus_t& bus, const std::string& objPath, 86 ItemUpdater& parent, const std::string& versionId, 87 const std::string& versionString, VersionPurpose versionPurpose, 88 const std::string& filePath, eraseFunc callback) : 89 VersionInherit(bus, (objPath).c_str(), 90 VersionInherit::action::defer_emit), 91 eraseCallback(callback), bus(bus), objPath(objPath), parent(parent), 92 versionId(versionId), versionStr(versionString), 93 chassisStateSignals( 94 bus, 95 sdbusRule::type::signal() + sdbusRule::member("PropertiesChanged") + 96 sdbusRule::path(CHASSIS_STATE_PATH) + 97 sdbusRule::argN(0, CHASSIS_STATE_OBJ) + 98 sdbusRule::interface(SYSTEMD_PROPERTY_INTERFACE), 99 std::bind(std::mem_fn(&Version::updateDeleteInterface), this, 100 std::placeholders::_1)) 101 { 102 // Set properties. 103 purpose(versionPurpose); 104 version(versionString); 105 path(filePath); 106 107 // Emit deferred signal. 108 emit_object_added(); 109 } 110 111 /** 112 * @brief Update the Object.Delete interface for this activation 113 * 114 * Update the delete interface based on whether or not this 115 * activation is currently functional. A functional activation 116 * will have no Object.Delete, while a non-functional activation 117 * will have one. 118 * 119 * @param[in] msg - Data associated with subscribed signal 120 */ 121 void updateDeleteInterface(sdbusplus::message_t& msg); 122 123 /** 124 * @brief Read the manifest file to get the value of the key. 125 * 126 * @param[in] filePath - The path to the file which contains the value 127 * of keys. 128 * @param[in] keys - A map of keys with empty values. 129 * 130 * @return The map of keys with filled values. 131 **/ 132 static std::map<std::string, std::string> 133 getValue(const std::string& filePath, 134 std::map<std::string, std::string> keys); 135 136 /** 137 * @brief Get version and extended version from VERSION partition string. 138 * 139 * @param[in] versionPart - The string containing the VERSION partition. 140 * 141 * @return The pair contains the version and extended version. 142 **/ 143 static std::pair<std::string, std::string> 144 getVersions(const std::string& versionPart); 145 146 /** 147 * @brief Calculate the version id from the version string. 148 * 149 * @details The version id is a unique 8 hexadecimal digit id 150 * calculated from the version string. 151 * 152 * @param[in] version - The image version string (e.g. v1.99.10-19). 153 * 154 * @return The id. 155 */ 156 static std::string getId(const std::string& version); 157 158 /** @brief Persistent Delete D-Bus object */ 159 std::unique_ptr<Delete> deleteObject; 160 161 /** @brief The parent's erase callback. */ 162 eraseFunc eraseCallback; 163 164 private: 165 /** @brief Persistent sdbusplus DBus bus connection */ 166 sdbusplus::bus_t& bus; 167 168 /** @brief Persistent DBus object path */ 169 std::string objPath; 170 171 /** @brief Parent Object. */ 172 ItemUpdater& parent; 173 174 /** @brief This Version's version Id */ 175 const std::string versionId; 176 177 /** @brief This Version's version string */ 178 const std::string versionStr; 179 180 /** @brief Used to subscribe to chassis power state changes **/ 181 sdbusplus::bus::match_t chassisStateSignals; 182 }; 183 184 } // namespace updater 185 } // namespace software 186 } // namespace openpower 187