1 #pragma once
2 
3 #include "config.h"
4 
5 #include "xyz/openbmc_project/Common/FilePath/server.hpp"
6 #include "xyz/openbmc_project/Object/Delete/server.hpp"
7 #include "xyz/openbmc_project/Software/Version/server.hpp"
8 
9 #include <sdbusplus/bus.hpp>
10 
11 namespace openpower
12 {
13 namespace software
14 {
15 namespace updater
16 {
17 
18 class ItemUpdater;
19 
20 typedef std::function<void(std::string)> eraseFunc;
21 
22 using VersionInherit = sdbusplus::server::object::object<
23     sdbusplus::xyz::openbmc_project::Software::server::Version,
24     sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
25 using DeleteInherit = sdbusplus::server::object::object<
26     sdbusplus::xyz::openbmc_project::Object::server::Delete>;
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.
37  */
38 class Delete : public DeleteInherit
39 {
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) :
48         DeleteInherit(bus, path.c_str(), true), parent(parent), bus(bus),
49         path(path)
50     {
51         std::vector<std::string> interfaces({interface});
52         bus.emit_interfaces_added(path.c_str(), interfaces);
53     }
54 
55     ~Delete()
56     {
57         std::vector<std::string> interfaces({interface});
58         bus.emit_interfaces_removed(path.c_str(), interfaces);
59     }
60 
61     /**
62      * @brief Delete the D-Bus object.
63      *        Overrides the default delete function by calling
64      *        Version class erase Method.
65      **/
66     void delete_() override;
67 
68   private:
69     /** @brief Parent Object. */
70     Version& parent;
71 
72     // TODO Remove once openbmc/openbmc#1975 is resolved
73     static constexpr auto interface = "xyz.openbmc_project.Object.Delete";
74     sdbusplus::bus::bus& bus;
75     std::string path;
76 };
77 
78 /** @class Version
79  *  @brief OpenBMC version software management implementation.
80  *  @details A concrete implementation for xyz.openbmc_project.Software.Version
81  *  D-Bus API.
82  */
83 class Version : public VersionInherit
84 {
85   public:
86     /** @brief Constructs Version Software Manager.
87      *
88      * @param[in] bus            - The D-Bus bus object
89      * @param[in] objPath        - The D-Bus object path
90      * @param[in] parent         - Parent object.
91      * @param[in] versionId      - The version Id
92      * @param[in] versionString  - The version string
93      * @param[in] versionPurpose - The version purpose
94      * @param[in] filePath       - The image filesystem path
95      * @param[in] callback       - The eraseFunc callback
96      */
97     Version(sdbusplus::bus::bus& bus, const std::string& objPath,
98             ItemUpdater& parent, const std::string& versionId,
99             const std::string& versionString, VersionPurpose versionPurpose,
100             const std::string& filePath, eraseFunc callback) :
101         VersionInherit(bus, (objPath).c_str(), true),
102         bus(bus), objPath(objPath), parent(parent), versionId(versionId),
103         versionStr(versionString),
104         chassisStateSignals(
105             bus,
106             sdbusRule::type::signal() + sdbusRule::member("PropertiesChanged") +
107                 sdbusRule::path(CHASSIS_STATE_PATH) +
108                 sdbusRule::argN(0, CHASSIS_STATE_OBJ) +
109                 sdbusRule::interface(SYSTEMD_PROPERTY_INTERFACE),
110             std::bind(std::mem_fn(&Version::updateDeleteInterface), this,
111                       std::placeholders::_1))
112     {
113         // Bind erase method
114         eraseCallback = callback;
115         // Set properties.
116         purpose(versionPurpose);
117         version(versionString);
118         path(filePath);
119 
120         // Emit deferred signal.
121         emit_object_added();
122     }
123 
124     /**
125      * @brief Update the Object.Delete interface for this activation
126      *
127      *        Update the delete interface based on whether or not this
128      *        activation is currently functional. A functional activation
129      *        will have no Object.Delete, while a non-functional activation
130      *        will have one.
131      *
132      * @param[in]  msg       - Data associated with subscribed signal
133      */
134     void updateDeleteInterface(sdbusplus::message::message& msg);
135 
136     /**
137      * @brief Read the manifest file to get the value of the key.
138      *
139      * @param[in] filePath - The path to the file which contains the value
140      *                       of keys.
141      * @param[in] keys     - A map of keys with empty values.
142      *
143      * @return The map of keys with filled values.
144      **/
145     static std::map<std::string, std::string>
146         getValue(const std::string& filePath,
147                  std::map<std::string, std::string> keys);
148 
149     /**
150      * @brief Get version and extended version from VERSION partition string.
151      *
152      * @param[in] versionPart - The string containing the VERSION partition.
153      *
154      * @return The pair contains the version and extended version.
155      **/
156     static std::pair<std::string, std::string>
157         getVersions(const std::string& versionPart);
158 
159     /**
160      * @brief Calculate the version id from the version string.
161      *
162      * @details The version id is a unique 8 hexadecimal digit id
163      *          calculated from the version string.
164      *
165      * @param[in] version - The image version string (e.g. v1.99.10-19).
166      *
167      * @return The id.
168      */
169     static std::string getId(const std::string& version);
170 
171     /** @brief Persistent Delete D-Bus object */
172     std::unique_ptr<Delete> deleteObject;
173 
174     /** @brief The parent's erase callback. */
175     eraseFunc eraseCallback;
176 
177   private:
178     /** @brief Persistent sdbusplus DBus bus connection */
179     sdbusplus::bus::bus& bus;
180 
181     /** @brief Persistent DBus object path */
182     std::string objPath;
183 
184     /** @brief Parent Object. */
185     ItemUpdater& parent;
186 
187     /** @brief This Version's version Id */
188     const std::string versionId;
189 
190     /** @brief This Version's version string */
191     const std::string versionStr;
192 
193     /** @brief Used to subscribe to chassis power state changes **/
194     sdbusplus::bus::match_t chassisStateSignals;
195 };
196 
197 } // namespace updater
198 } // namespace software
199 } // namespace openpower
200