1cab87e9cSJagpal Singh Gill #pragma once 2cab87e9cSJagpal Singh Gill 3cab87e9cSJagpal Singh Gill #include "xyz/openbmc_project/Common/FilePath/server.hpp" 4cab87e9cSJagpal Singh Gill #include "xyz/openbmc_project/Inventory/Decorator/Compatible/server.hpp" 5cab87e9cSJagpal Singh Gill #include "xyz/openbmc_project/Object/Delete/server.hpp" 6cab87e9cSJagpal Singh Gill #include "xyz/openbmc_project/Software/ExtendedVersion/server.hpp" 7cab87e9cSJagpal Singh Gill #include "xyz/openbmc_project/Software/Version/server.hpp" 8cab87e9cSJagpal Singh Gill 9cab87e9cSJagpal Singh Gill #include <sdbusplus/bus.hpp> 10cab87e9cSJagpal Singh Gill 11cab87e9cSJagpal Singh Gill #include <functional> 12cab87e9cSJagpal Singh Gill #include <string> 13cab87e9cSJagpal Singh Gill #include <vector> 14cab87e9cSJagpal Singh Gill 15cab87e9cSJagpal Singh Gill namespace phosphor 16cab87e9cSJagpal Singh Gill { 17cab87e9cSJagpal Singh Gill namespace software 18cab87e9cSJagpal Singh Gill { 19cab87e9cSJagpal Singh Gill namespace manager 20cab87e9cSJagpal Singh Gill { 21cab87e9cSJagpal Singh Gill 22cab87e9cSJagpal Singh Gill typedef std::function<void(std::string)> eraseFunc; 23cab87e9cSJagpal Singh Gill 24cab87e9cSJagpal Singh Gill using VersionInherit = sdbusplus::server::object_t< 25cab87e9cSJagpal Singh Gill sdbusplus::server::xyz::openbmc_project::software::ExtendedVersion, 26cab87e9cSJagpal Singh Gill sdbusplus::server::xyz::openbmc_project::software::Version, 27cab87e9cSJagpal Singh Gill sdbusplus::server::xyz::openbmc_project::common::FilePath, 28cab87e9cSJagpal Singh Gill sdbusplus::server::xyz::openbmc_project::inventory::decorator::Compatible>; 29cab87e9cSJagpal Singh Gill using DeleteInherit = sdbusplus::server::object_t< 30cab87e9cSJagpal Singh Gill sdbusplus::server::xyz::openbmc_project::object::Delete>; 31cab87e9cSJagpal Singh Gill 32cab87e9cSJagpal Singh Gill class Version; 33cab87e9cSJagpal Singh Gill class Delete; 34cab87e9cSJagpal Singh Gill 35cab87e9cSJagpal Singh Gill /** @class Delete 36cab87e9cSJagpal Singh Gill * @brief OpenBMC Delete implementation. 37cab87e9cSJagpal Singh Gill * @details A concrete implementation for xyz.openbmc_project.Object.Delete 38cab87e9cSJagpal Singh Gill * D-Bus API. 39cab87e9cSJagpal Singh Gill */ 40cab87e9cSJagpal Singh Gill class Delete : public DeleteInherit 41cab87e9cSJagpal Singh Gill { 42cab87e9cSJagpal Singh Gill public: 43cab87e9cSJagpal Singh Gill /** @brief Constructs Delete. 44cab87e9cSJagpal Singh Gill * 45cab87e9cSJagpal Singh Gill * @param[in] bus - The D-Bus bus object 46cab87e9cSJagpal Singh Gill * @param[in] path - The D-Bus object path 47cab87e9cSJagpal Singh Gill * @param[in] parent - Parent object. 48cab87e9cSJagpal Singh Gill */ Delete(sdbusplus::bus_t & bus,const std::string & path,Version & parent)49cab87e9cSJagpal Singh Gill Delete(sdbusplus::bus_t& bus, const std::string& path, Version& parent) : 50cab87e9cSJagpal Singh Gill DeleteInherit(bus, path.c_str(), action::emit_interface_added), 51cab87e9cSJagpal Singh Gill parent(parent) 52cab87e9cSJagpal Singh Gill { 53cab87e9cSJagpal Singh Gill // Empty 54cab87e9cSJagpal Singh Gill } 55cab87e9cSJagpal Singh Gill 56cab87e9cSJagpal Singh Gill /** @brief delete the D-Bus object. */ 57cab87e9cSJagpal Singh Gill void delete_() override; 58cab87e9cSJagpal Singh Gill 59cab87e9cSJagpal Singh Gill private: 60cab87e9cSJagpal Singh Gill /** @brief Parent Object. */ 61cab87e9cSJagpal Singh Gill Version& parent; 62cab87e9cSJagpal Singh Gill }; 63cab87e9cSJagpal Singh Gill 64cab87e9cSJagpal Singh Gill /** @class Version 65cab87e9cSJagpal Singh Gill * @brief OpenBMC version software management implementation. 66cab87e9cSJagpal Singh Gill * @details A concrete implementation for xyz.openbmc_project.Software.Version 67cab87e9cSJagpal Singh Gill * D-Bus API. 68cab87e9cSJagpal Singh Gill */ 69cab87e9cSJagpal Singh Gill class Version : public VersionInherit 70cab87e9cSJagpal Singh Gill { 71cab87e9cSJagpal Singh Gill public: 72cab87e9cSJagpal Singh Gill /** @brief Constructs Version Software Manager 73cab87e9cSJagpal Singh Gill * 74cab87e9cSJagpal Singh Gill * @param[in] bus - The D-Bus bus object 75cab87e9cSJagpal Singh Gill * @param[in] objPath - The D-Bus object path 76cab87e9cSJagpal Singh Gill * @param[in] versionString - The version string 77cab87e9cSJagpal Singh Gill * @param[in] versionPurpose - The version purpose 78cab87e9cSJagpal Singh Gill * @param[in] extVersion - The extended version 79cab87e9cSJagpal Singh Gill * @param[in] filePath - The image filesystem path 80cab87e9cSJagpal Singh Gill * @param[in] compatibleNames - The device compatibility names 81cab87e9cSJagpal Singh Gill * @param[in] callback - The eraseFunc callback 82cab87e9cSJagpal Singh Gill */ Version(sdbusplus::bus_t & bus,const std::string & objPath,const std::string & versionString,VersionPurpose versionPurpose,const std::string & extVersion,const std::string & filePath,const std::vector<std::string> & compatibleNames,eraseFunc callback,const std::string & id)83cab87e9cSJagpal Singh Gill Version(sdbusplus::bus_t& bus, const std::string& objPath, 84cab87e9cSJagpal Singh Gill const std::string& versionString, VersionPurpose versionPurpose, 85cab87e9cSJagpal Singh Gill const std::string& extVersion, const std::string& filePath, 86cab87e9cSJagpal Singh Gill const std::vector<std::string>& compatibleNames, eraseFunc callback, 87cab87e9cSJagpal Singh Gill const std::string& id) : 88cab87e9cSJagpal Singh Gill VersionInherit(bus, (objPath).c_str(), 89cab87e9cSJagpal Singh Gill VersionInherit::action::defer_emit), 90cab87e9cSJagpal Singh Gill eraseCallback(std::move(callback)), id(id), objPath(objPath), 91cab87e9cSJagpal Singh Gill versionStr(versionString) 92cab87e9cSJagpal Singh Gill { 93cab87e9cSJagpal Singh Gill // Set properties. 94cab87e9cSJagpal Singh Gill extendedVersion(extVersion); 95cab87e9cSJagpal Singh Gill purpose(versionPurpose); 96cab87e9cSJagpal Singh Gill version(versionString); 97cab87e9cSJagpal Singh Gill path(filePath); 98cab87e9cSJagpal Singh Gill names(compatibleNames); 99cab87e9cSJagpal Singh Gill // Emit deferred signal. 100cab87e9cSJagpal Singh Gill emit_object_added(); 101cab87e9cSJagpal Singh Gill } 102cab87e9cSJagpal Singh Gill 103cab87e9cSJagpal Singh Gill /** 104cab87e9cSJagpal Singh Gill * @brief Read the manifest file to get the value of the key. 105cab87e9cSJagpal Singh Gill * 106cab87e9cSJagpal Singh Gill * @return The value of the key. 107cab87e9cSJagpal Singh Gill **/ 108cab87e9cSJagpal Singh Gill static std::string getValue(const std::string& manifestFilePath, 109cab87e9cSJagpal Singh Gill std::string key); 110cab87e9cSJagpal Singh Gill 111cab87e9cSJagpal Singh Gill /** 112cab87e9cSJagpal Singh Gill * @brief Read the manifest file to get the values of the repeated key. 113cab87e9cSJagpal Singh Gill * 114cab87e9cSJagpal Singh Gill * @return The values of the repeated key. 115cab87e9cSJagpal Singh Gill **/ 116*eae5ec9eSPatrick Williams static std::vector<std::string> getRepeatedValues( 117*eae5ec9eSPatrick Williams const std::string& manifestFilePath, std::string key); 118cab87e9cSJagpal Singh Gill 119cab87e9cSJagpal Singh Gill /** 120cab87e9cSJagpal Singh Gill * @brief Calculate the version id from the version string. 121cab87e9cSJagpal Singh Gill * 122cab87e9cSJagpal Singh Gill * @details The version id is a unique 8 hexadecimal digit id 123cab87e9cSJagpal Singh Gill * calculated from the version string. 124cab87e9cSJagpal Singh Gill * 125cab87e9cSJagpal Singh Gill * @param[in] versionWithSalt - The image's version string 126cab87e9cSJagpal Singh Gill * (e.g. v1.99.10-19) plus an optional salt 127cab87e9cSJagpal Singh Gill * string. 128cab87e9cSJagpal Singh Gill * 129cab87e9cSJagpal Singh Gill * @return The id. 130cab87e9cSJagpal Singh Gill */ 131cab87e9cSJagpal Singh Gill static std::string getId(const std::string& versionWithSalt); 132cab87e9cSJagpal Singh Gill 133cab87e9cSJagpal Singh Gill /** 134cab87e9cSJagpal Singh Gill * @brief Get the active BMC machine name string. 135cab87e9cSJagpal Singh Gill * 136cab87e9cSJagpal Singh Gill * @param[in] releaseFilePath - The path to the file which contains 137cab87e9cSJagpal Singh Gill * the release machine string. 138cab87e9cSJagpal Singh Gill * 139cab87e9cSJagpal Singh Gill * @return The machine name string (e.g. romulus, tiogapass). 140cab87e9cSJagpal Singh Gill */ 141cab87e9cSJagpal Singh Gill static std::string getBMCMachine(const std::string& releaseFilePath); 142cab87e9cSJagpal Singh Gill 143cab87e9cSJagpal Singh Gill /** 144cab87e9cSJagpal Singh Gill * @brief Get the BMC Extended Version string. 145cab87e9cSJagpal Singh Gill * 146cab87e9cSJagpal Singh Gill * @param[in] releaseFilePath - The path to the file which contains 147cab87e9cSJagpal Singh Gill * the release machine string. 148cab87e9cSJagpal Singh Gill * 149cab87e9cSJagpal Singh Gill * @return The extended version string. 150cab87e9cSJagpal Singh Gill */ 151*eae5ec9eSPatrick Williams static std::string getBMCExtendedVersion( 152*eae5ec9eSPatrick Williams const std::string& releaseFilePath); 153cab87e9cSJagpal Singh Gill 154cab87e9cSJagpal Singh Gill /** 155cab87e9cSJagpal Singh Gill * @brief Get the active BMC version string. 156cab87e9cSJagpal Singh Gill * 157cab87e9cSJagpal Singh Gill * @param[in] releaseFilePath - The path to the file which contains 158cab87e9cSJagpal Singh Gill * the release version string. 159cab87e9cSJagpal Singh Gill * 160cab87e9cSJagpal Singh Gill * @return The version string (e.g. v1.99.10-19). 161cab87e9cSJagpal Singh Gill */ 162cab87e9cSJagpal Singh Gill static std::string getBMCVersion(const std::string& releaseFilePath); 163cab87e9cSJagpal Singh Gill 164cab87e9cSJagpal Singh Gill /* @brief Check if this version is functional. 165cab87e9cSJagpal Singh Gill * 166cab87e9cSJagpal Singh Gill * @return - Returns the functional value. 167cab87e9cSJagpal Singh Gill */ isFunctional() const168cab87e9cSJagpal Singh Gill bool isFunctional() const 169cab87e9cSJagpal Singh Gill { 170cab87e9cSJagpal Singh Gill return functional; 171cab87e9cSJagpal Singh Gill } 172cab87e9cSJagpal Singh Gill 173cab87e9cSJagpal Singh Gill /** @brief Set the functional value. 174cab87e9cSJagpal Singh Gill * @param[in] value - True or False 175cab87e9cSJagpal Singh Gill */ setFunctional(bool value)176cab87e9cSJagpal Singh Gill void setFunctional(bool value) 177cab87e9cSJagpal Singh Gill { 178cab87e9cSJagpal Singh Gill functional = value; 179cab87e9cSJagpal Singh Gill } 180cab87e9cSJagpal Singh Gill 181cab87e9cSJagpal Singh Gill /** @brief Persistent Delete D-Bus object */ 182cab87e9cSJagpal Singh Gill std::unique_ptr<Delete> deleteObject; 183cab87e9cSJagpal Singh Gill 184cab87e9cSJagpal Singh Gill /** @brief The parent's erase callback. */ 185cab87e9cSJagpal Singh Gill eraseFunc eraseCallback; 186cab87e9cSJagpal Singh Gill 187cab87e9cSJagpal Singh Gill /** @brief The version ID of the object */ 188cab87e9cSJagpal Singh Gill const std::string id; 189cab87e9cSJagpal Singh Gill 190cab87e9cSJagpal Singh Gill /** @brief The path of the object */ 191cab87e9cSJagpal Singh Gill std::string objPath; 192cab87e9cSJagpal Singh Gill 193cab87e9cSJagpal Singh Gill private: 194cab87e9cSJagpal Singh Gill /** @brief This Version's version string */ 195cab87e9cSJagpal Singh Gill const std::string versionStr; 196cab87e9cSJagpal Singh Gill 197cab87e9cSJagpal Singh Gill /** @brief If this version is the functional one */ 198cab87e9cSJagpal Singh Gill bool functional = false; 199cab87e9cSJagpal Singh Gill }; 200cab87e9cSJagpal Singh Gill 201cab87e9cSJagpal Singh Gill } // namespace manager 202cab87e9cSJagpal Singh Gill } // namespace software 203cab87e9cSJagpal Singh Gill } // namespace phosphor 204