blob: 1a600cc0dfecad1a09f53e61b1e22d720c0987c5 [file] [log] [blame]
Adriana Kobylak2d8fa222017-03-15 12:34:32 -05001#pragma once
2
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -05003#include <sdbusplus/server.hpp>
Adriana Kobylak2d8fa222017-03-15 12:34:32 -05004#include <xyz/openbmc_project/Software/Activation/server.hpp>
Adriana Kobylakea9626f2017-04-05 15:37:40 -05005#include <xyz/openbmc_project/Software/ActivationBlocksTransition/server.hpp>
Saqib Khan7254f0e2017-04-10 21:45:37 -05006#include "xyz/openbmc_project/Software/ExtendedVersion/server.hpp"
Saqib Khan942df8a2017-06-01 14:09:27 -05007#include "xyz/openbmc_project/Software/RedundancyPriority/server.hpp"
Michael Tritz1793b642017-06-28 18:35:58 -05008#include "xyz/openbmc_project/Software/ActivationProgress/server.hpp"
Saqib Khanc350c612017-08-13 13:36:44 -05009#include "org/openbmc/Associations/server.hpp"
Jayanth Othayoth11271fb2018-03-29 10:25:50 -050010#include "config.h"
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050011
12namespace openpower
13{
14namespace software
15{
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -050016namespace updater
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050017{
18
Gunnar Mills3edb84b2017-08-18 15:13:15 -050019using AssociationList =
Adriana Kobylak70dcb632018-02-27 15:46:52 -060020 std::vector<std::tuple<std::string, std::string, std::string>>;
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050021using ActivationInherit = sdbusplus::server::object::object<
Saqib Khan7254f0e2017-04-10 21:45:37 -050022 sdbusplus::xyz::openbmc_project::Software::server::ExtendedVersion,
Saqib Khanc350c612017-08-13 13:36:44 -050023 sdbusplus::xyz::openbmc_project::Software::server::Activation,
24 sdbusplus::org::openbmc::server::Associations>;
Adriana Kobylakea9626f2017-04-05 15:37:40 -050025using ActivationBlocksTransitionInherit = sdbusplus::server::object::object<
Adriana Kobylak70dcb632018-02-27 15:46:52 -060026 sdbusplus::xyz::openbmc_project::Software::server::
27 ActivationBlocksTransition>;
Saqib Khan942df8a2017-06-01 14:09:27 -050028using RedundancyPriorityInherit = sdbusplus::server::object::object<
29 sdbusplus::xyz::openbmc_project::Software::server::RedundancyPriority>;
Michael Tritz1793b642017-06-28 18:35:58 -050030using ActivationProgressInherit = sdbusplus::server::object::object<
31 sdbusplus::xyz::openbmc_project::Software::server::ActivationProgress>;
Saqib Khan942df8a2017-06-01 14:09:27 -050032
Michael Tritz9d25b602017-06-14 14:41:43 -050033namespace sdbusRule = sdbusplus::bus::match::rules;
34
Saqib Khan81bac882017-06-08 12:17:01 -050035class ItemUpdater;
36class Activation;
37class RedundancyPriority;
38
Saqib Khan942df8a2017-06-01 14:09:27 -050039/** @class RedundancyPriority
40 * @brief OpenBMC RedundancyPriority implementation
41 * @details A concrete implementation for
42 * xyz.openbmc_project.Software.RedundancyPriority DBus API.
43 */
44class RedundancyPriority : public RedundancyPriorityInherit
45{
Adriana Kobylak70dcb632018-02-27 15:46:52 -060046 public:
47 /** @brief Constructs RedundancyPriority.
48 *
49 * @param[in] bus - The Dbus bus object
50 * @param[in] path - The Dbus object path
51 * @param[in] parent - Parent object.
52 * @param[in] value - The redundancyPriority value
53 */
54 RedundancyPriority(sdbusplus::bus::bus& bus, const std::string& path,
55 Activation& parent, uint8_t value) :
56 RedundancyPriorityInherit(bus, path.c_str(), true),
57 parent(parent), bus(bus), path(path)
58 {
59 // Set Property
60 priority(value);
61 std::vector<std::string> interfaces({interface});
62 bus.emit_interfaces_added(path.c_str(), interfaces);
63 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -050064
Adriana Kobylak70dcb632018-02-27 15:46:52 -060065 ~RedundancyPriority()
66 {
67 std::vector<std::string> interfaces({interface});
68 bus.emit_interfaces_removed(path.c_str(), interfaces);
69 }
Saqib Khan2021b4c2017-06-07 14:37:36 -050070
Adriana Kobylak70dcb632018-02-27 15:46:52 -060071 /** @brief Overloaded Priority property set function
72 *
73 * @param[in] value - uint8_t
74 *
75 * @return Success or exception thrown
76 */
77 uint8_t priority(uint8_t value) override;
Saqib Khan81bac882017-06-08 12:17:01 -050078
Adriana Kobylak70dcb632018-02-27 15:46:52 -060079 /** @brief Priority property get function
80 *
81 * @returns uint8_t - The Priority value
82 */
83 using RedundancyPriorityInherit::priority;
Saqib Khan81bac882017-06-08 12:17:01 -050084
Adriana Kobylak70dcb632018-02-27 15:46:52 -060085 /** @brief Parent Object. */
86 Activation& parent;
Adriana Kobylaka8eda562017-07-17 15:24:29 -050087
Adriana Kobylak70dcb632018-02-27 15:46:52 -060088 private:
89 // TODO Remove once openbmc/openbmc#1975 is resolved
90 static constexpr auto interface =
91 "xyz.openbmc_project.Software.RedundancyPriority";
92 sdbusplus::bus::bus& bus;
93 std::string path;
Saqib Khan942df8a2017-06-01 14:09:27 -050094};
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050095
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -050096/** @class ActivationBlocksTransition
97 * @brief OpenBMC ActivationBlocksTransition implementation.
98 * @details A concrete implementation for
99 * xyz.openbmc_project.Software.ActivationBlocksTransition DBus API.
100 */
101class ActivationBlocksTransition : public ActivationBlocksTransitionInherit
102{
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600103 public:
104 /** @brief Constructs ActivationBlocksTransition.
105 *
106 * @param[in] bus - The Dbus bus object
107 * @param[in] path - The Dbus object path
108 */
109 ActivationBlocksTransition(sdbusplus::bus::bus& bus,
110 const std::string& path) :
111 ActivationBlocksTransitionInherit(bus, path.c_str(), true),
112 bus(bus), path(path)
113 {
114 std::vector<std::string> interfaces({interface});
115 bus.emit_interfaces_added(path.c_str(), interfaces);
116 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500117
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600118 ~ActivationBlocksTransition()
119 {
120 std::vector<std::string> interfaces({interface});
121 bus.emit_interfaces_removed(path.c_str(), interfaces);
122 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500123
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600124 private:
125 // TODO Remove once openbmc/openbmc#1975 is resolved
126 static constexpr auto interface =
127 "xyz.openbmc_project.Software.ActivationBlocksTransition";
128 sdbusplus::bus::bus& bus;
129 std::string path;
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -0500130};
131
Michael Tritz1793b642017-06-28 18:35:58 -0500132class ActivationProgress : public ActivationProgressInherit
133{
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600134 public:
135 /** @brief Constructs ActivationProgress.
136 *
137 * @param[in] bus - The Dbus bus object
138 * @param[in] path - The Dbus object path
139 */
140 ActivationProgress(sdbusplus::bus::bus& bus, const std::string& path) :
141 ActivationProgressInherit(bus, path.c_str(), true), bus(bus), path(path)
142 {
143 progress(0);
144 std::vector<std::string> interfaces({interface});
145 bus.emit_interfaces_added(path.c_str(), interfaces);
146 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500147
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600148 ~ActivationProgress()
149 {
150 std::vector<std::string> interfaces({interface});
151 bus.emit_interfaces_removed(path.c_str(), interfaces);
152 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500153
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600154 private:
155 // TODO Remove once openbmc/openbmc#1975 is resolved
156 static constexpr auto interface =
157 "xyz.openbmc_project.Software.ActivationProgress";
158 sdbusplus::bus::bus& bus;
159 std::string path;
Michael Tritz1793b642017-06-28 18:35:58 -0500160};
161
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500162/** @class Activation
163 * @brief OpenBMC activation software management implementation.
164 * @details A concrete implementation for
165 * xyz.openbmc_project.Software.Activation DBus API.
166 */
167class Activation : public ActivationInherit
168{
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600169 public:
170 /** @brief Constructs Activation Software Manager
171 *
172 * @param[in] bus - The Dbus bus object
173 * @param[in] path - The Dbus object path
174 * @param[in] parent - Parent object.
175 * @param[in] versionId - The software version id
176 * @param[in] extVersion - The extended version
177 * @param[in] activationStatus - The status of Activation
178 * @param[in] assocs - Association objects
179 */
180 Activation(sdbusplus::bus::bus& bus, const std::string& path,
181 ItemUpdater& parent, std::string& versionId,
182 std::string& extVersion,
183 sdbusplus::xyz::openbmc_project::Software::server::Activation::
184 Activations activationStatus,
185 AssociationList& assocs) :
186 ActivationInherit(bus, path.c_str(), true),
187 bus(bus), path(path), parent(parent), versionId(versionId),
188 systemdSignals(
189 bus,
190 sdbusRule::type::signal() + sdbusRule::member("JobRemoved") +
191 sdbusRule::path("/org/freedesktop/systemd1") +
192 sdbusRule::interface("org.freedesktop.systemd1.Manager"),
193 std::bind(std::mem_fn(&Activation::unitStateChange), this,
194 std::placeholders::_1))
195 {
196 // Enable systemd signals
197 subscribeToSystemdSignals();
198 // Set Properties.
199 extendedVersion(extVersion);
200 activation(activationStatus);
201 associations(assocs);
Gunnar Mills3edb84b2017-08-18 15:13:15 -0500202
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600203 // Emit deferred signal.
204 emit_object_added();
205 }
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500206
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600207 /** @brief Activation property get function
208 *
209 * @returns One of Activation::Activations
210 */
211 using ActivationInherit::activation;
Saqib Khan2cbfa032017-08-17 14:52:37 -0500212
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600213 /** @brief Overloaded Activation property setter function
214 *
215 * @param[in] value - One of Activation::Activations
216 *
217 * @return Success or exception thrown
218 */
219 Activations activation(Activations value) override;
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500220
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600221 /** @brief Overloaded requestedActivation property setter function
222 *
223 * @param[in] value - One of Activation::RequestedActivations
224 *
225 * @return Success or exception thrown
226 */
227 RequestedActivations
228 requestedActivation(RequestedActivations value) override;
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500229
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600230 /** @brief Check if systemd state change is relevant to this object
231 *
232 * Instance specific interface to handle the detected systemd state
233 * change
234 *
235 * @param[in] msg - Data associated with subscribed signal
236 *
237 */
238 void unitStateChange(sdbusplus::message::message& msg);
Michael Tritz9d25b602017-06-14 14:41:43 -0500239
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600240 /**
241 * @brief subscribe to the systemd signals
242 *
243 * This object needs to capture when it's systemd targets complete
244 * so it can keep it's state updated
245 *
246 **/
247 void subscribeToSystemdSignals();
Michael Tritz9d25b602017-06-14 14:41:43 -0500248
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600249 /**
250 * @brief unsubscribe from the systemd signals
251 *
252 * Once the activation process has completed successfully, we can
253 * safely unsubscribe from systemd signals.
254 *
255 **/
256 void unsubscribeFromSystemdSignals();
Michael Tritz1cb127f2017-07-26 15:40:38 -0500257
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600258 /** @brief Persistent sdbusplus DBus bus connection */
259 sdbusplus::bus::bus& bus;
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -0500260
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600261 /** @brief Persistent DBus object path */
262 std::string path;
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -0500263
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600264 /** @brief Parent Object. */
265 ItemUpdater& parent;
Saqib Khan81bac882017-06-08 12:17:01 -0500266
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600267 /** @brief Version id */
268 std::string versionId;
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500269
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600270 /** @brief Persistent ActivationBlocksTransition dbus object */
271 std::unique_ptr<ActivationBlocksTransition> activationBlocksTransition;
Saqib Khan942df8a2017-06-01 14:09:27 -0500272
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600273 /** @brief Persistent ActivationProgress dbus object */
274 std::unique_ptr<ActivationProgress> activationProgress;
Michael Tritz1793b642017-06-28 18:35:58 -0500275
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600276 /** @brief Persistent RedundancyPriority dbus object */
277 std::unique_ptr<RedundancyPriority> redundancyPriority;
Michael Tritz9d25b602017-06-14 14:41:43 -0500278
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600279 /** @brief Used to subscribe to dbus systemd signals **/
280 sdbusplus::bus::match_t systemdSignals;
Michael Tritz9d25b602017-06-14 14:41:43 -0500281
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600282 /** @brief Tracks whether the read-only & read-write volumes have been
283 *created as part of the activation process. **/
284 bool ubiVolumesCreated = false;
Leonel Gonzalez9c8adfa2017-07-12 11:08:40 -0500285
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600286 /** @brief activation status property get function
287 *
288 * @returns Activations - The activation value
289 */
290 using ActivationInherit::activation;
Leonel Gonzalez9c8adfa2017-07-12 11:08:40 -0500291
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600292 private:
293 /**
294 * @brief Deletes the version from Image Manager and the
295 * untar image from image upload dir.
296 */
297 void deleteImageManagerObject();
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500298
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600299 /** @brief Member function for clarity & brevity at activation start */
300 void startActivation();
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500301
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600302 /** @brief Member function for clarity & brevity at activation end */
303 void finishActivation();
Jayanth Othayoth11271fb2018-03-29 10:25:50 -0500304
305#ifdef WANT_SIGNATURE_VERIFY
306 /**
307 * @brief Wrapper function for the signature verify function.
308 * Signature class verify function used for validating
309 * signed image. Also added additional logic to continue
310 * update process in lab environment by checking the
311 * fieldModeEnabled property.
312 *
313 * @return true if successful signature validation or field
314 * mode is disabled.
315 * false for unsuccessful signature validation or
316 * any internal failure during the mapper call.
317 */
318 inline bool validateSignature();
319
320 /**
321 * @brief Gets the fieldModeEnabled property value.
322 *
323 * @return fieldModeEnabled property value
324 * @error InternalFailure exception thrown
325 */
326 bool fieldModeEnabled();
327
328 /**
329 * @brief Gets the D-Bus Service name for the input D-Bus path
330 *
331 * @param[in] bus - Bus handler
332 * @param[in] path - Object Path
333 * @param[in] intf - Interface
334 *
335 * @return Service name
336 * @error InternalFailure exception thrown
337 */
338 std::string getService(sdbusplus::bus::bus& bus, const std::string& path,
339 const std::string& intf);
340#endif
Adriana Kobylakea9626f2017-04-05 15:37:40 -0500341};
342
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500343} // namespace updater
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500344} // namespace software
345} // namespace openpower