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