blob: 7e8eec5ad57928f6627c1f745c068f8fa2385302 [file] [log] [blame]
Adriana Kobylak2d8fa222017-03-15 12:34:32 -05001#pragma once
2
Gunnar Millsf6ed5892018-09-07 17:08:02 -05003#include "config.h"
4
5#include "org/openbmc/Associations/server.hpp"
6#include "xyz/openbmc_project/Software/ActivationProgress/server.hpp"
7#include "xyz/openbmc_project/Software/ExtendedVersion/server.hpp"
8#include "xyz/openbmc_project/Software/RedundancyPriority/server.hpp"
9
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -050010#include <sdbusplus/server.hpp>
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050011#include <xyz/openbmc_project/Software/Activation/server.hpp>
Adriana Kobylakea9626f2017-04-05 15:37:40 -050012#include <xyz/openbmc_project/Software/ActivationBlocksTransition/server.hpp>
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050013
14namespace openpower
15{
16namespace software
17{
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -050018namespace updater
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050019{
20
Gunnar Mills3edb84b2017-08-18 15:13:15 -050021using AssociationList =
Adriana Kobylak70dcb632018-02-27 15:46:52 -060022 std::vector<std::tuple<std::string, std::string, std::string>>;
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050023using ActivationInherit = sdbusplus::server::object::object<
Saqib Khan7254f0e2017-04-10 21:45:37 -050024 sdbusplus::xyz::openbmc_project::Software::server::ExtendedVersion,
Saqib Khanc350c612017-08-13 13:36:44 -050025 sdbusplus::xyz::openbmc_project::Software::server::Activation,
26 sdbusplus::org::openbmc::server::Associations>;
Adriana Kobylakea9626f2017-04-05 15:37:40 -050027using ActivationBlocksTransitionInherit = sdbusplus::server::object::object<
Adriana Kobylak70dcb632018-02-27 15:46:52 -060028 sdbusplus::xyz::openbmc_project::Software::server::
29 ActivationBlocksTransition>;
Saqib Khan942df8a2017-06-01 14:09:27 -050030using RedundancyPriorityInherit = sdbusplus::server::object::object<
31 sdbusplus::xyz::openbmc_project::Software::server::RedundancyPriority>;
Michael Tritz1793b642017-06-28 18:35:58 -050032using ActivationProgressInherit = sdbusplus::server::object::object<
33 sdbusplus::xyz::openbmc_project::Software::server::ActivationProgress>;
Saqib Khan942df8a2017-06-01 14:09:27 -050034
Michael Tritz9d25b602017-06-14 14:41:43 -050035namespace sdbusRule = sdbusplus::bus::match::rules;
36
Saqib Khan81bac882017-06-08 12:17:01 -050037class ItemUpdater;
38class Activation;
39class RedundancyPriority;
40
Saqib Khan942df8a2017-06-01 14:09:27 -050041/** @class RedundancyPriority
42 * @brief OpenBMC RedundancyPriority implementation
43 * @details A concrete implementation for
44 * xyz.openbmc_project.Software.RedundancyPriority DBus API.
45 */
46class RedundancyPriority : public RedundancyPriorityInherit
47{
Adriana Kobylak70dcb632018-02-27 15:46:52 -060048 public:
49 /** @brief Constructs RedundancyPriority.
50 *
51 * @param[in] bus - The Dbus bus object
52 * @param[in] path - The Dbus object path
53 * @param[in] parent - Parent object.
54 * @param[in] value - The redundancyPriority value
55 */
56 RedundancyPriority(sdbusplus::bus::bus& bus, const std::string& path,
57 Activation& parent, uint8_t value) :
58 RedundancyPriorityInherit(bus, path.c_str(), true),
59 parent(parent), bus(bus), path(path)
60 {
61 // Set Property
62 priority(value);
63 std::vector<std::string> interfaces({interface});
64 bus.emit_interfaces_added(path.c_str(), interfaces);
65 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -050066
Lei YU9b21efc2019-02-21 15:52:53 +080067 virtual ~RedundancyPriority()
Adriana Kobylak70dcb632018-02-27 15:46:52 -060068 {
69 std::vector<std::string> interfaces({interface});
70 bus.emit_interfaces_removed(path.c_str(), interfaces);
71 }
Saqib Khan2021b4c2017-06-07 14:37:36 -050072
Adriana Kobylak70dcb632018-02-27 15:46:52 -060073 /** @brief Overloaded Priority property set function
74 *
75 * @param[in] value - uint8_t
76 *
77 * @return Success or exception thrown
78 */
79 uint8_t priority(uint8_t value) override;
Saqib Khan81bac882017-06-08 12:17:01 -050080
Adriana Kobylak70dcb632018-02-27 15:46:52 -060081 /** @brief Priority property get function
82 *
83 * @returns uint8_t - The Priority value
84 */
85 using RedundancyPriorityInherit::priority;
Saqib Khan81bac882017-06-08 12:17:01 -050086
Adriana Kobylak70dcb632018-02-27 15:46:52 -060087 /** @brief Parent Object. */
88 Activation& parent;
Adriana Kobylaka8eda562017-07-17 15:24:29 -050089
Adriana Kobylak70dcb632018-02-27 15:46:52 -060090 private:
91 // TODO Remove once openbmc/openbmc#1975 is resolved
92 static constexpr auto interface =
93 "xyz.openbmc_project.Software.RedundancyPriority";
94 sdbusplus::bus::bus& bus;
95 std::string path;
Saqib Khan942df8a2017-06-01 14:09:27 -050096};
Adriana Kobylak2d8fa222017-03-15 12:34:32 -050097
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -050098/** @class ActivationBlocksTransition
99 * @brief OpenBMC ActivationBlocksTransition implementation.
100 * @details A concrete implementation for
101 * xyz.openbmc_project.Software.ActivationBlocksTransition DBus API.
102 */
103class ActivationBlocksTransition : public ActivationBlocksTransitionInherit
104{
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600105 public:
106 /** @brief Constructs ActivationBlocksTransition.
107 *
108 * @param[in] bus - The Dbus bus object
109 * @param[in] path - The Dbus object path
110 */
111 ActivationBlocksTransition(sdbusplus::bus::bus& bus,
112 const std::string& path) :
113 ActivationBlocksTransitionInherit(bus, path.c_str(), true),
114 bus(bus), path(path)
115 {
116 std::vector<std::string> interfaces({interface});
117 bus.emit_interfaces_added(path.c_str(), interfaces);
118 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500119
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600120 ~ActivationBlocksTransition()
121 {
122 std::vector<std::string> interfaces({interface});
123 bus.emit_interfaces_removed(path.c_str(), interfaces);
124 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500125
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600126 private:
127 // TODO Remove once openbmc/openbmc#1975 is resolved
128 static constexpr auto interface =
129 "xyz.openbmc_project.Software.ActivationBlocksTransition";
130 sdbusplus::bus::bus& bus;
131 std::string path;
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -0500132};
133
Michael Tritz1793b642017-06-28 18:35:58 -0500134class ActivationProgress : public ActivationProgressInherit
135{
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600136 public:
137 /** @brief Constructs ActivationProgress.
138 *
139 * @param[in] bus - The Dbus bus object
140 * @param[in] path - The Dbus object path
141 */
142 ActivationProgress(sdbusplus::bus::bus& bus, const std::string& path) :
143 ActivationProgressInherit(bus, path.c_str(), true), bus(bus), path(path)
144 {
145 progress(0);
146 std::vector<std::string> interfaces({interface});
147 bus.emit_interfaces_added(path.c_str(), interfaces);
148 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500149
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600150 ~ActivationProgress()
151 {
152 std::vector<std::string> interfaces({interface});
153 bus.emit_interfaces_removed(path.c_str(), interfaces);
154 }
Adriana Kobylaka8eda562017-07-17 15:24:29 -0500155
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600156 private:
157 // TODO Remove once openbmc/openbmc#1975 is resolved
158 static constexpr auto interface =
159 "xyz.openbmc_project.Software.ActivationProgress";
160 sdbusplus::bus::bus& bus;
161 std::string path;
Michael Tritz1793b642017-06-28 18:35:58 -0500162};
163
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500164/** @class Activation
165 * @brief OpenBMC activation software management implementation.
166 * @details A concrete implementation for
167 * xyz.openbmc_project.Software.Activation DBus API.
168 */
169class Activation : public ActivationInherit
170{
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600171 public:
172 /** @brief Constructs Activation Software Manager
173 *
174 * @param[in] bus - The Dbus bus object
175 * @param[in] path - The Dbus object path
176 * @param[in] parent - Parent object.
177 * @param[in] versionId - The software version id
178 * @param[in] extVersion - The extended version
179 * @param[in] activationStatus - The status of Activation
180 * @param[in] assocs - Association objects
181 */
182 Activation(sdbusplus::bus::bus& bus, const std::string& path,
183 ItemUpdater& parent, std::string& versionId,
184 std::string& extVersion,
185 sdbusplus::xyz::openbmc_project::Software::server::Activation::
186 Activations activationStatus,
187 AssociationList& assocs) :
188 ActivationInherit(bus, path.c_str(), true),
189 bus(bus), path(path), parent(parent), versionId(versionId),
190 systemdSignals(
191 bus,
192 sdbusRule::type::signal() + sdbusRule::member("JobRemoved") +
193 sdbusRule::path("/org/freedesktop/systemd1") +
194 sdbusRule::interface("org.freedesktop.systemd1.Manager"),
195 std::bind(std::mem_fn(&Activation::unitStateChange), this,
196 std::placeholders::_1))
197 {
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600198 // 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 }
Lei YU9b21efc2019-02-21 15:52:53 +0800206 virtual ~Activation() = default;
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500207
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600208 /** @brief Activation property get function
209 *
210 * @returns One of Activation::Activations
211 */
212 using ActivationInherit::activation;
Saqib Khan2cbfa032017-08-17 14:52:37 -0500213
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600214 /** @brief Overloaded requestedActivation property setter function
215 *
216 * @param[in] value - One of Activation::RequestedActivations
217 *
218 * @return Success or exception thrown
219 */
220 RequestedActivations
221 requestedActivation(RequestedActivations value) override;
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500222
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600223 /**
224 * @brief subscribe to the systemd signals
225 *
226 * This object needs to capture when it's systemd targets complete
227 * so it can keep it's state updated
228 *
229 **/
230 void subscribeToSystemdSignals();
Michael Tritz9d25b602017-06-14 14:41:43 -0500231
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600232 /**
233 * @brief unsubscribe from the systemd signals
234 *
235 * Once the activation process has completed successfully, we can
236 * safely unsubscribe from systemd signals.
237 *
238 **/
239 void unsubscribeFromSystemdSignals();
Michael Tritz1cb127f2017-07-26 15:40:38 -0500240
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600241 /** @brief Persistent sdbusplus DBus bus connection */
242 sdbusplus::bus::bus& bus;
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -0500243
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600244 /** @brief Persistent DBus object path */
245 std::string path;
Adriana Kobylak99c8c0e2017-04-17 13:39:11 -0500246
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600247 /** @brief Parent Object. */
248 ItemUpdater& parent;
Saqib Khan81bac882017-06-08 12:17:01 -0500249
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600250 /** @brief Version id */
251 std::string versionId;
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500252
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600253 /** @brief Persistent ActivationBlocksTransition dbus object */
254 std::unique_ptr<ActivationBlocksTransition> activationBlocksTransition;
Saqib Khan942df8a2017-06-01 14:09:27 -0500255
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600256 /** @brief Persistent ActivationProgress dbus object */
257 std::unique_ptr<ActivationProgress> activationProgress;
Michael Tritz1793b642017-06-28 18:35:58 -0500258
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600259 /** @brief Persistent RedundancyPriority dbus object */
260 std::unique_ptr<RedundancyPriority> redundancyPriority;
Michael Tritz9d25b602017-06-14 14:41:43 -0500261
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600262 /** @brief Used to subscribe to dbus systemd signals **/
263 sdbusplus::bus::match_t systemdSignals;
Michael Tritz9d25b602017-06-14 14:41:43 -0500264
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600265 /** @brief activation status property get function
266 *
267 * @returns Activations - The activation value
268 */
269 using ActivationInherit::activation;
Leonel Gonzalez9c8adfa2017-07-12 11:08:40 -0500270
Lei YU9b21efc2019-02-21 15:52:53 +0800271 protected:
272 /** @brief Check if systemd state change is relevant to this object
273 *
274 * Instance specific interface to handle the detected systemd state
275 * change
276 *
277 * @param[in] msg - Data associated with subscribed signal
278 *
279 */
280 virtual void unitStateChange(sdbusplus::message::message& msg) = 0;
281
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600282 /**
283 * @brief Deletes the version from Image Manager and the
284 * untar image from image upload dir.
285 */
286 void deleteImageManagerObject();
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500287
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600288 /** @brief Member function for clarity & brevity at activation start */
Lei YU9b21efc2019-02-21 15:52:53 +0800289 virtual void startActivation() = 0;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500290
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600291 /** @brief Member function for clarity & brevity at activation end */
Lei YU9b21efc2019-02-21 15:52:53 +0800292 virtual void finishActivation() = 0;
Jayanth Othayoth11271fb2018-03-29 10:25:50 -0500293
294#ifdef WANT_SIGNATURE_VERIFY
295 /**
296 * @brief Wrapper function for the signature verify function.
297 * Signature class verify function used for validating
298 * signed image. Also added additional logic to continue
299 * update process in lab environment by checking the
300 * fieldModeEnabled property.
301 *
302 * @return true if successful signature validation or field
303 * mode is disabled.
304 * false for unsuccessful signature validation or
305 * any internal failure during the mapper call.
306 */
Lei YU9b21efc2019-02-21 15:52:53 +0800307 bool validateSignature();
Jayanth Othayoth11271fb2018-03-29 10:25:50 -0500308
309 /**
310 * @brief Gets the fieldModeEnabled property value.
311 *
312 * @return fieldModeEnabled property value
313 * @error InternalFailure exception thrown
314 */
315 bool fieldModeEnabled();
316
317 /**
318 * @brief Gets the D-Bus Service name for the input D-Bus path
319 *
320 * @param[in] bus - Bus handler
321 * @param[in] path - Object Path
322 * @param[in] intf - Interface
323 *
324 * @return Service name
325 * @error InternalFailure exception thrown
326 */
327 std::string getService(sdbusplus::bus::bus& bus, const std::string& path,
328 const std::string& intf);
329#endif
Adriana Kobylakea9626f2017-04-05 15:37:40 -0500330};
331
Adriana Kobylakbefe5ce2017-04-05 15:57:44 -0500332} // namespace updater
Adriana Kobylak2d8fa222017-03-15 12:34:32 -0500333} // namespace software
334} // namespace openpower