1ce148700SSaqib Khan #pragma once 2ce148700SSaqib Khan 3f6ed5897SGunnar Mills #include "config.h" 4f6ed5897SGunnar Mills 5ce148700SSaqib Khan #include "xyz/openbmc_project/Common/FilePath/server.hpp" 67f80e0b5SSaqib Khan #include "xyz/openbmc_project/Object/Delete/server.hpp" 7f6ed5897SGunnar Mills #include "xyz/openbmc_project/Software/Version/server.hpp" 8f6ed5897SGunnar Mills 9f6ed5897SGunnar Mills #include <sdbusplus/bus.hpp> 108facccfaSBrad Bishop 11ab139ce9SAndrew Geissler #include <string> 12ce148700SSaqib Khan 13ce148700SSaqib Khan namespace openpower 14ce148700SSaqib Khan { 15ce148700SSaqib Khan namespace software 16ce148700SSaqib Khan { 17ce148700SSaqib Khan namespace updater 18ce148700SSaqib Khan { 19ce148700SSaqib Khan 209c8adfa3SLeonel Gonzalez class ItemUpdater; 219c8adfa3SLeonel Gonzalez 227f80e0b5SSaqib Khan typedef std::function<void(std::string)> eraseFunc; 237f80e0b5SSaqib Khan 240dea1992SPatrick Williams using VersionInherit = sdbusplus::server::object_t< 25ce148700SSaqib Khan sdbusplus::xyz::openbmc_project::Software::server::Version, 26ce148700SSaqib Khan sdbusplus::xyz::openbmc_project::Common::server::FilePath>; 270dea1992SPatrick Williams using DeleteInherit = sdbusplus::server::object_t< 287f80e0b5SSaqib Khan sdbusplus::xyz::openbmc_project::Object::server::Delete>; 297f80e0b5SSaqib Khan 307f80e0b5SSaqib Khan namespace sdbusRule = sdbusplus::bus::match::rules; 317f80e0b5SSaqib Khan 327f80e0b5SSaqib Khan class Delete; 337f80e0b5SSaqib Khan class Version; 347f80e0b5SSaqib Khan 357f80e0b5SSaqib Khan /** @class Delete 367f80e0b5SSaqib Khan * @brief OpenBMC Delete implementation. 377f80e0b5SSaqib Khan * @details A concrete implementation for xyz.openbmc_project.Object.Delete 387f80e0b5SSaqib Khan * D-Bus API. 397f80e0b5SSaqib Khan */ 407f80e0b5SSaqib Khan class Delete : public DeleteInherit 417f80e0b5SSaqib Khan { 427f80e0b5SSaqib Khan public: 437f80e0b5SSaqib Khan /** @brief Constructs Delete. 447f80e0b5SSaqib Khan * 457f80e0b5SSaqib Khan * @param[in] bus - The D-Bus bus object 467f80e0b5SSaqib Khan * @param[in] path - The D-Bus object path 477f80e0b5SSaqib Khan * @param[in] parent - Parent object. 487f80e0b5SSaqib Khan */ Delete(sdbusplus::bus_t & bus,const std::string & path,Version & parent)490dea1992SPatrick Williams Delete(sdbusplus::bus_t& bus, const std::string& path, Version& parent) : 507f1967d5SAlbert Zhang DeleteInherit(bus, path.c_str(), action::emit_interface_added), 517f1967d5SAlbert Zhang parent(parent) 528facccfaSBrad Bishop {} 537f80e0b5SSaqib Khan 547f80e0b5SSaqib Khan /** 557f80e0b5SSaqib Khan * @brief Delete the D-Bus object. 567f80e0b5SSaqib Khan * Overrides the default delete function by calling 577f80e0b5SSaqib Khan * Version class erase Method. 587f80e0b5SSaqib Khan **/ 597f80e0b5SSaqib Khan void delete_() override; 607f80e0b5SSaqib Khan 617f80e0b5SSaqib Khan private: 627f80e0b5SSaqib Khan /** @brief Parent Object. */ 637f80e0b5SSaqib Khan Version& parent; 647f80e0b5SSaqib Khan }; 65ce148700SSaqib Khan 66ce148700SSaqib Khan /** @class Version 67ce148700SSaqib Khan * @brief OpenBMC version software management implementation. 68ce148700SSaqib Khan * @details A concrete implementation for xyz.openbmc_project.Software.Version 69b78dfa59SGunnar Mills * D-Bus API. 70ce148700SSaqib Khan */ 71ce148700SSaqib Khan class Version : public VersionInherit 72ce148700SSaqib Khan { 73ce148700SSaqib Khan public: 74ce148700SSaqib Khan /** @brief Constructs Version Software Manager. 75ce148700SSaqib Khan * 76b78dfa59SGunnar Mills * @param[in] bus - The D-Bus bus object 77b78dfa59SGunnar Mills * @param[in] objPath - The D-Bus object path 787f80e0b5SSaqib Khan * @param[in] parent - Parent object. 797f80e0b5SSaqib Khan * @param[in] versionId - The version Id 80b78dfa59SGunnar Mills * @param[in] versionString - The version string 81ce148700SSaqib Khan * @param[in] versionPurpose - The version purpose 82ce148700SSaqib Khan * @param[in] filePath - The image filesystem path 837f80e0b5SSaqib Khan * @param[in] callback - The eraseFunc callback 84ce148700SSaqib Khan */ Version(sdbusplus::bus_t & bus,const std::string & objPath,ItemUpdater & parent,const std::string & versionId,const std::string & versionString,VersionPurpose versionPurpose,const std::string & filePath,eraseFunc callback)850dea1992SPatrick Williams Version(sdbusplus::bus_t& bus, const std::string& objPath, 8670dcb63aSAdriana Kobylak ItemUpdater& parent, const std::string& versionId, 8770dcb63aSAdriana Kobylak const std::string& versionString, VersionPurpose versionPurpose, 887f80e0b5SSaqib Khan const std::string& filePath, eraseFunc callback) : 899c887d14SPatrick Williams VersionInherit(bus, (objPath).c_str(), 909c887d14SPatrick Williams VersionInherit::action::defer_emit), 911db9adf3SLei YU eraseCallback(callback), bus(bus), objPath(objPath), parent(parent), 921db9adf3SLei YU versionId(versionId), versionStr(versionString), 937f80e0b5SSaqib Khan chassisStateSignals( 947f80e0b5SSaqib Khan bus, 9570dcb63aSAdriana Kobylak sdbusRule::type::signal() + sdbusRule::member("PropertiesChanged") + 967f80e0b5SSaqib Khan sdbusRule::path(CHASSIS_STATE_PATH) + 977f80e0b5SSaqib Khan sdbusRule::argN(0, CHASSIS_STATE_OBJ) + 987f80e0b5SSaqib Khan sdbusRule::interface(SYSTEMD_PROPERTY_INTERFACE), 9970dcb63aSAdriana Kobylak std::bind(std::mem_fn(&Version::updateDeleteInterface), this, 1007f80e0b5SSaqib Khan std::placeholders::_1)) 101ce148700SSaqib Khan { 102ce148700SSaqib Khan // Set properties. 103ce148700SSaqib Khan purpose(versionPurpose); 104b78dfa59SGunnar Mills version(versionString); 105ce148700SSaqib Khan path(filePath); 106ce148700SSaqib Khan 107ce148700SSaqib Khan // Emit deferred signal. 108ce148700SSaqib Khan emit_object_added(); 109ce148700SSaqib Khan } 110167601b5SSaqib Khan 111167601b5SSaqib Khan /** 1127f80e0b5SSaqib Khan * @brief Update the Object.Delete interface for this activation 1137f80e0b5SSaqib Khan * 1147f80e0b5SSaqib Khan * Update the delete interface based on whether or not this 1157f80e0b5SSaqib Khan * activation is currently functional. A functional activation 1167f80e0b5SSaqib Khan * will have no Object.Delete, while a non-functional activation 1177f80e0b5SSaqib Khan * will have one. 1187f80e0b5SSaqib Khan * 1197f80e0b5SSaqib Khan * @param[in] msg - Data associated with subscribed signal 1207f80e0b5SSaqib Khan */ 1210dea1992SPatrick Williams void updateDeleteInterface(sdbusplus::message_t& msg); 1227f80e0b5SSaqib Khan 1237f80e0b5SSaqib Khan /** 124167601b5SSaqib Khan * @brief Read the manifest file to get the value of the key. 125167601b5SSaqib Khan * 126b78dfa59SGunnar Mills * @param[in] filePath - The path to the file which contains the value 127167601b5SSaqib Khan * of keys. 128167601b5SSaqib Khan * @param[in] keys - A map of keys with empty values. 129167601b5SSaqib Khan * 130167601b5SSaqib Khan * @return The map of keys with filled values. 131167601b5SSaqib Khan **/ 132f8e02429SPatrick Williams static std::map<std::string, std::string> getValue( 133f8e02429SPatrick Williams const std::string& filePath, std::map<std::string, std::string> keys); 134167601b5SSaqib Khan 135167601b5SSaqib Khan /** 136dec8cf9cSLei YU * @brief Get version and extended version from VERSION partition string. 137dec8cf9cSLei YU * 138dec8cf9cSLei YU * @param[in] versionPart - The string containing the VERSION partition. 139dec8cf9cSLei YU * 140dec8cf9cSLei YU * @return The pair contains the version and extended version. 141dec8cf9cSLei YU **/ 142*cbf707b6SPatrick Williams static std::pair<std::string, std::string> getVersions( 143*cbf707b6SPatrick Williams const std::string& versionPart); 144dec8cf9cSLei YU 145dec8cf9cSLei YU /** 146b78dfa59SGunnar Mills * @brief Calculate the version id from the version string. 147167601b5SSaqib Khan * 148b78dfa59SGunnar Mills * @details The version id is a unique 8 hexadecimal digit id 149b78dfa59SGunnar Mills * calculated from the version string. 150b78dfa59SGunnar Mills * 151b78dfa59SGunnar Mills * @param[in] version - The image version string (e.g. v1.99.10-19). 152167601b5SSaqib Khan * 153167601b5SSaqib Khan * @return The id. 154167601b5SSaqib Khan */ 155167601b5SSaqib Khan static std::string getId(const std::string& version); 1567f80e0b5SSaqib Khan 1577f80e0b5SSaqib Khan /** @brief Persistent Delete D-Bus object */ 1587f80e0b5SSaqib Khan std::unique_ptr<Delete> deleteObject; 1597f80e0b5SSaqib Khan 1607f80e0b5SSaqib Khan /** @brief The parent's erase callback. */ 1617f80e0b5SSaqib Khan eraseFunc eraseCallback; 1627f80e0b5SSaqib Khan 1637f80e0b5SSaqib Khan private: 1647f80e0b5SSaqib Khan /** @brief Persistent sdbusplus DBus bus connection */ 1650dea1992SPatrick Williams sdbusplus::bus_t& bus; 1667f80e0b5SSaqib Khan 1677f80e0b5SSaqib Khan /** @brief Persistent DBus object path */ 1687f80e0b5SSaqib Khan std::string objPath; 1697f80e0b5SSaqib Khan 1707f80e0b5SSaqib Khan /** @brief Parent Object. */ 1717f80e0b5SSaqib Khan ItemUpdater& parent; 1727f80e0b5SSaqib Khan 1737f80e0b5SSaqib Khan /** @brief This Version's version Id */ 1747f80e0b5SSaqib Khan const std::string versionId; 1757f80e0b5SSaqib Khan 1767f80e0b5SSaqib Khan /** @brief This Version's version string */ 1777f80e0b5SSaqib Khan const std::string versionStr; 1787f80e0b5SSaqib Khan 1797f80e0b5SSaqib Khan /** @brief Used to subscribe to chassis power state changes **/ 1807f80e0b5SSaqib Khan sdbusplus::bus::match_t chassisStateSignals; 181ce148700SSaqib Khan }; 182ce148700SSaqib Khan 183ce148700SSaqib Khan } // namespace updater 184ce148700SSaqib Khan } // namespace software 185ce148700SSaqib Khan } // namespace openpower 186