blob: 8552e88e49b48df734bd25e4e9376f1708579f8a [file] [log] [blame]
Gunnar Millsec1b41c2017-05-02 12:20:36 -05001#pragma once
2
Gunnar Millsb0ce9962018-09-07 13:39:10 -05003#include "config.h"
4
5#include "flash.hpp"
Jayashankar Padatha0135602019-04-22 16:22:58 +05306#include "utils.hpp"
Gunnar Millsb0ce9962018-09-07 13:39:10 -05007#include "xyz/openbmc_project/Software/ActivationProgress/server.hpp"
8#include "xyz/openbmc_project/Software/RedundancyPriority/server.hpp"
9
Saqib Khanb0774702017-05-23 16:02:41 -050010#include <sdbusplus/server.hpp>
John Wang85c356f2019-09-11 16:20:13 +080011#include <xyz/openbmc_project/Association/Definitions/server.hpp>
Gunnar Millsec1b41c2017-05-02 12:20:36 -050012#include <xyz/openbmc_project/Software/Activation/server.hpp>
Saqib Khanb0774702017-05-23 16:02:41 -050013#include <xyz/openbmc_project/Software/ActivationBlocksTransition/server.hpp>
Lei YU90532252018-05-24 11:15:24 +080014
15#ifdef WANT_SIGNATURE_VERIFY
Adriana Kobylakc98d9122020-05-05 10:36:01 -050016#include <filesystem>
Lei YU90532252018-05-24 11:15:24 +080017#endif
18
Gunnar Millsec1b41c2017-05-02 12:20:36 -050019namespace phosphor
20{
21namespace software
22{
23namespace updater
24{
25
Lei YU90532252018-05-24 11:15:24 +080026#ifdef WANT_SIGNATURE_VERIFY
Adriana Kobylakc98d9122020-05-05 10:36:01 -050027namespace fs = std::filesystem;
Lei YU90532252018-05-24 11:15:24 +080028#endif
29
Gunnar Millsb60add12017-08-24 16:41:42 -050030using AssociationList =
Adriana Kobylak2285fe02018-02-27 15:36:59 -060031 std::vector<std::tuple<std::string, std::string, std::string>>;
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050032using ActivationInherit = sdbusplus::server::object_t<
Patrick Williams1e9a5f12023-08-23 16:53:06 -050033 sdbusplus::server::xyz::openbmc_project::software::Activation,
34 sdbusplus::server::xyz::openbmc_project::association::Definitions>;
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050035using ActivationBlocksTransitionInherit =
Adriana Kobylakce82de52024-01-16 13:56:38 -060036 sdbusplus::server::object_t<sdbusplus::server::xyz::openbmc_project::
37 software::ActivationBlocksTransition>;
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050038using RedundancyPriorityInherit = sdbusplus::server::object_t<
Patrick Williams1e9a5f12023-08-23 16:53:06 -050039 sdbusplus::server::xyz::openbmc_project::software::RedundancyPriority>;
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050040using ActivationProgressInherit = sdbusplus::server::object_t<
Patrick Williams1e9a5f12023-08-23 16:53:06 -050041 sdbusplus::server::xyz::openbmc_project::software::ActivationProgress>;
Saqib Khan4c1aec02017-07-06 11:46:13 -050042
Jayashankar Padatha0135602019-04-22 16:22:58 +053043constexpr auto applyTimeImmediate =
44 "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.Immediate";
45constexpr auto applyTimeIntf = "xyz.openbmc_project.Software.ApplyTime";
46constexpr auto dbusPropIntf = "org.freedesktop.DBus.Properties";
47constexpr auto applyTimeObjPath = "/xyz/openbmc_project/software/apply_time";
48constexpr auto applyTimeProp = "RequestedApplyTime";
49
Michael Tritzbed88af2017-07-19 16:00:06 -050050namespace sdbusRule = sdbusplus::bus::match::rules;
51
Saqib Khan4c1aec02017-07-06 11:46:13 -050052class ItemUpdater;
53class Activation;
54class RedundancyPriority;
55
56/** @class RedundancyPriority
57 * @brief OpenBMC RedundancyPriority implementation
58 * @details A concrete implementation for
59 * xyz.openbmc_project.Software.RedundancyPriority DBus API.
60 */
61class RedundancyPriority : public RedundancyPriorityInherit
62{
Adriana Kobylak2285fe02018-02-27 15:36:59 -060063 public:
64 /** @brief Constructs RedundancyPriority.
65 *
66 * @param[in] bus - The Dbus bus object
67 * @param[in] path - The Dbus object path
68 * @param[in] parent - Parent object.
69 * @param[in] value - The redundancyPriority value
70 * @param[in] freePriority - Call freePriorioty, default to true
71 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050072 RedundancyPriority(sdbusplus::bus_t& bus, const std::string& path,
Adriana Kobylak2285fe02018-02-27 15:36:59 -060073 Activation& parent, uint8_t value,
74 bool freePriority = true) :
Lei YU29d84b02020-02-13 15:13:09 +080075 RedundancyPriorityInherit(bus, path.c_str(),
76 action::emit_interface_added),
77 parent(parent)
Adriana Kobylak2285fe02018-02-27 15:36:59 -060078 {
79 // Set Property
80 if (freePriority)
Saqib Khan4c1aec02017-07-06 11:46:13 -050081 {
Adriana Kobylak2285fe02018-02-27 15:36:59 -060082 priority(value);
83 }
84 else
85 {
86 sdbusPriority(value);
Saqib Khan140fcb12017-08-07 09:06:57 -050087 }
Adriana Kobylak2285fe02018-02-27 15:36:59 -060088 }
Saqib Khan4c1aec02017-07-06 11:46:13 -050089
Gunnar Millse11a2022018-03-23 12:04:48 -050090 /** @brief Overridden Priority property set function, calls freePriority
Adriana Kobylak2285fe02018-02-27 15:36:59 -060091 * to bump the duplicated priority values.
92 *
93 * @param[in] value - uint8_t
94 *
95 * @return Success or exception thrown
96 */
97 uint8_t priority(uint8_t value) override;
Adriana Kobylakb77551c2017-10-27 12:46:23 -050098
Adriana Kobylak2285fe02018-02-27 15:36:59 -060099 /** @brief Non-Overriden Priority property set function
100 *
101 * @param[in] value - uint8_t
102 *
103 * @return Success or exception thrown
104 */
105 uint8_t sdbusPriority(uint8_t value);
Saqib Khan4c1aec02017-07-06 11:46:13 -0500106
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600107 /** @brief Priority property get function
108 *
109 * @returns uint8_t - The Priority value
110 */
111 using RedundancyPriorityInherit::priority;
Saqib Khan140fcb12017-08-07 09:06:57 -0500112
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600113 /** @brief Parent Object. */
114 Activation& parent;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500115};
Saqib Khanb0774702017-05-23 16:02:41 -0500116
117/** @class ActivationBlocksTransition
118 * @brief OpenBMC ActivationBlocksTransition implementation.
119 * @details A concrete implementation for
120 * xyz.openbmc_project.Software.ActivationBlocksTransition DBus API.
121 */
122class ActivationBlocksTransition : public ActivationBlocksTransitionInherit
123{
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600124 public:
125 /** @brief Constructs ActivationBlocksTransition.
126 *
127 * @param[in] bus - The Dbus bus object
128 * @param[in] path - The Dbus object path
129 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500130 ActivationBlocksTransition(sdbusplus::bus_t& bus, const std::string& path) :
Lei YU29d84b02020-02-13 15:13:09 +0800131 ActivationBlocksTransitionInherit(bus, path.c_str(),
132 action::emit_interface_added),
133 bus(bus)
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600134 {
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600135 enableRebootGuard();
136 }
Saqib Khan140fcb12017-08-07 09:06:57 -0500137
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600138 ~ActivationBlocksTransition()
139 {
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600140 disableRebootGuard();
141 }
Saqib Khan140fcb12017-08-07 09:06:57 -0500142
Pavithra Barithaya48de55f2024-06-22 05:30:44 -0500143 ActivationBlocksTransition(const ActivationBlocksTransition&) = delete;
144 ActivationBlocksTransition&
145 operator=(const ActivationBlocksTransition&) = delete;
146 ActivationBlocksTransition(ActivationBlocksTransition&&) = delete;
147 ActivationBlocksTransition&
148 operator=(ActivationBlocksTransition&&) = delete;
149
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600150 private:
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500151 sdbusplus::bus_t& bus;
Saqib Khanf37cefc2017-09-12 08:44:41 -0500152
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600153 /** @brief Enables a Guard that blocks any BMC reboot commands */
154 void enableRebootGuard();
Saqib Khanf37cefc2017-09-12 08:44:41 -0500155
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600156 /** @brief Disables any guard that was blocking the BMC reboot */
157 void disableRebootGuard();
Saqib Khanb0774702017-05-23 16:02:41 -0500158};
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500159
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500160class ActivationProgress : public ActivationProgressInherit
161{
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600162 public:
163 /** @brief Constructs ActivationProgress.
164 *
165 * @param[in] bus - The Dbus bus object
166 * @param[in] path - The Dbus object path
167 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500168 ActivationProgress(sdbusplus::bus_t& bus, const std::string& path) :
Lei YU29d84b02020-02-13 15:13:09 +0800169 ActivationProgressInherit(bus, path.c_str(),
170 action::emit_interface_added)
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600171 {
172 progress(0);
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600173 }
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500174};
175
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500176/** @class Activation
177 * @brief OpenBMC activation software management implementation.
178 * @details A concrete implementation for
179 * xyz.openbmc_project.Software.Activation DBus API.
180 */
Lei YU1be8d502018-06-20 11:48:36 +0800181class Activation : public ActivationInherit, public Flash
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500182{
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600183 public:
184 /** @brief Constructs Activation Software Manager
185 *
186 * @param[in] bus - The Dbus bus object
187 * @param[in] path - The Dbus object path
188 * @param[in] parent - Parent object.
189 * @param[in] versionId - The software version id
190 * @param[in] activationStatus - The status of Activation
191 * @param[in] assocs - Association objects
192 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500193 Activation(sdbusplus::bus_t& bus, const std::string& path,
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600194 ItemUpdater& parent, std::string& versionId,
Patrick Williams1e9a5f12023-08-23 16:53:06 -0500195 sdbusplus::server::xyz::openbmc_project::software::Activation::
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600196 Activations activationStatus,
197 AssociationList& assocs) :
Patrick Williams35aa9a82022-04-05 15:55:30 -0500198 ActivationInherit(bus, path.c_str(),
199 ActivationInherit::action::defer_emit),
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600200 bus(bus), path(path), parent(parent), versionId(versionId),
201 systemdSignals(
202 bus,
203 sdbusRule::type::signal() + sdbusRule::member("JobRemoved") +
204 sdbusRule::path("/org/freedesktop/systemd1") +
205 sdbusRule::interface("org.freedesktop.systemd1.Manager"),
206 std::bind(std::mem_fn(&Activation::unitStateChange), this,
207 std::placeholders::_1))
208 {
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600209 // Set Properties.
210 activation(activationStatus);
211 associations(assocs);
Gunnar Millsb60add12017-08-24 16:41:42 -0500212
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600213 // Emit deferred signal.
214 emit_object_added();
215 }
Gunnar Mills2ce7da22017-05-04 15:37:56 -0500216
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600217 /** @brief Overloaded Activation property setter function
218 *
219 * @param[in] value - One of Activation::Activations
220 *
221 * @return Success or exception thrown
222 */
223 Activations activation(Activations value) override;
Saqib Khanb0774702017-05-23 16:02:41 -0500224
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600225 /** @brief Activation */
226 using ActivationInherit::activation;
Leonel Gonzaleze4233682017-07-07 14:38:25 -0500227
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600228 /** @brief Overloaded requestedActivation property setter function
229 *
230 * @param[in] value - One of Activation::RequestedActivations
231 *
232 * @return Success or exception thrown
233 */
234 RequestedActivations
235 requestedActivation(RequestedActivations value) override;
Saqib Khanb0774702017-05-23 16:02:41 -0500236
Adriana Kobylak9f89e2e2018-05-30 13:16:20 -0500237 /** @brief Overloaded write flash function */
238 void flashWrite() override;
239
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500240 /**
241 * @brief Handle the success of the flashWrite() function
242 *
243 * @details Perform anything that is necessary to mark the activation
244 * successful after the image has been written to flash. Sets the Activation
245 * value to Active.
246 */
247 void onFlashWriteSuccess();
248
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800249#ifdef HOST_BIOS_UPGRADE
250 /* @brief write to Host flash function */
251 void flashWriteHost();
252
253 /** @brief Function that acts on Bios upgrade service file state changes */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500254 void onStateChangesBios(sdbusplus::message_t&);
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800255#endif
256
Adriana Kobylak3ce563a2018-06-06 16:41:15 -0500257 /** @brief Overloaded function that acts on service file state changes */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500258 void onStateChanges(sdbusplus::message_t&) override;
Adriana Kobylak3ce563a2018-06-06 16:41:15 -0500259
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600260 /** @brief Check if systemd state change is relevant to this object
261 *
262 * Instance specific interface to handle the detected systemd state
263 * change
264 *
265 * @param[in] msg - Data associated with subscribed signal
266 *
267 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500268 void unitStateChange(sdbusplus::message_t& msg);
Michael Tritzbed88af2017-07-19 16:00:06 -0500269
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600270 /**
271 * @brief subscribe to the systemd signals
272 *
273 * This object needs to capture when it's systemd targets complete
274 * so it can keep it's state updated
275 *
276 */
277 void subscribeToSystemdSignals();
Michael Tritzbed88af2017-07-19 16:00:06 -0500278
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600279 /**
280 * @brief unsubscribe from the systemd signals
281 *
282 * systemd signals are only of interest during the activation process.
283 * Once complete, we want to unsubscribe to avoid unnecessary calls of
284 * unitStateChange().
285 *
286 */
287 void unsubscribeFromSystemdSignals();
Michael Tritzf2b5e0d2017-07-25 14:39:34 -0500288
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600289 /**
290 * @brief Deletes the version from Image Manager and the
291 * untar image from image upload dir.
292 */
293 void deleteImageManagerObject();
Saqib Khanee13e832017-10-23 12:53:11 -0500294
Jayashankar Padatha0135602019-04-22 16:22:58 +0530295 /**
296 * @brief Determine the configured image apply time value
297 *
298 * @return true if the image apply time value is immediate
299 **/
300 bool checkApplyTimeImmediate();
301
302 /**
303 * @brief Reboot the BMC. Called when ApplyTime is immediate.
304 *
305 * @return none
306 **/
307 void rebootBmc();
308
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600309 /** @brief Persistent sdbusplus DBus bus connection */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500310 sdbusplus::bus_t& bus;
Gunnar Mills2ce7da22017-05-04 15:37:56 -0500311
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600312 /** @brief Persistent DBus object path */
313 std::string path;
Gunnar Mills2ce7da22017-05-04 15:37:56 -0500314
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600315 /** @brief Parent Object. */
316 ItemUpdater& parent;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500317
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600318 /** @brief Version id */
319 std::string versionId;
Saqib Khanb0774702017-05-23 16:02:41 -0500320
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600321 /** @brief Persistent ActivationBlocksTransition dbus object */
322 std::unique_ptr<ActivationBlocksTransition> activationBlocksTransition;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500323
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600324 /** @brief Persistent RedundancyPriority dbus object */
325 std::unique_ptr<RedundancyPriority> redundancyPriority;
Michael Tritzbed88af2017-07-19 16:00:06 -0500326
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600327 /** @brief Persistent ActivationProgress dbus object */
328 std::unique_ptr<ActivationProgress> activationProgress;
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500329
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600330 /** @brief Used to subscribe to dbus systemd signals **/
331 sdbusplus::bus::match_t systemdSignals;
Michael Tritzbed88af2017-07-19 16:00:06 -0500332
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600333 /** @brief Tracks whether the read-write volume has been created as
334 * part of the activation process. **/
335 bool rwVolumeCreated = false;
Michael Tritzbed88af2017-07-19 16:00:06 -0500336
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600337 /** @brief Tracks whether the read-only volume has been created as
338 * part of the activation process. **/
339 bool roVolumeCreated = false;
Adriana Kobylak166bdf32018-04-09 14:24:06 -0500340
341 /** @brief Tracks if the service that updates the U-Boot environment
342 * variables has completed. **/
343 bool ubootEnvVarsUpdated = false;
Lei YU90532252018-05-24 11:15:24 +0800344
345#ifdef WANT_SIGNATURE_VERIFY
346 private:
347 /** @brief Verify signature of the images.
348 *
349 * @param[in] imageDir - The path of images to verify
350 * @param[in] confDir - The path of configs for verification
351 *
352 * @return true if verification successful and false otherwise
353 */
354 bool verifySignature(const fs::path& imageDir, const fs::path& confDir);
355
356 /** @brief Called when image verification fails. */
357 void onVerifyFailed();
358#endif
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500359};
360
361} // namespace updater
362} // namespace software
363} // namespace phosphor