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