xref: /openbmc/phosphor-bmc-code-mgmt/bmc/version.hpp (revision eae5ec9e28d8e0586eae116802e1f0c173040df7)
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