xref: /openbmc/openpower-pnor-code-mgmt/version.hpp (revision cbf707b6fd0b11b6879df8c7ef623c80417b5c08)
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