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 Calculate the version id from the version string.
151      *
152      * @details The version id is a unique 8 hexadecimal digit id
153      *          calculated from the version string.
154      *
155      * @param[in] version - The image version string (e.g. v1.99.10-19).
156      *
157      * @return The id.
158      */
159     static std::string getId(const std::string& version);
160 
161     /** @brief Persistent Delete D-Bus object */
162     std::unique_ptr<Delete> deleteObject;
163 
164     /** @brief The parent's erase callback. */
165     eraseFunc eraseCallback;
166 
167   private:
168     /** @brief Persistent sdbusplus DBus bus connection */
169     sdbusplus::bus::bus& bus;
170 
171     /** @brief Persistent DBus object path */
172     std::string objPath;
173 
174     /** @brief Parent Object. */
175     ItemUpdater& parent;
176 
177     /** @brief This Version's version Id */
178     const std::string versionId;
179 
180     /** @brief This Version's version string */
181     const std::string versionStr;
182 
183     /** @brief Used to subscribe to chassis power state changes **/
184     sdbusplus::bus::match_t chassisStateSignals;
185 };
186 
187 } // namespace updater
188 } // namespace software
189 } // namespace openpower
190