blob: 67c2881f5b25cbe1a9c31d05e0ba8749c98c614d [file] [log] [blame]
Saqib Khanb0774702017-05-23 16:02:41 -05001#include "activation.hpp"
Gunnar Millsb0ce9962018-09-07 13:39:10 -05002
Lei YU1be8d502018-06-20 11:48:36 +08003#include "images.hpp"
Saqib Khan4c1aec02017-07-06 11:46:13 -05004#include "item_updater.hpp"
Miguel Gomez21dad042020-06-26 20:54:48 +00005#include "msl_verify.hpp"
Saqib Khan5d532672017-08-09 10:44:50 -05006#include "serialize.hpp"
Gunnar Millsb0ce9962018-09-07 13:39:10 -05007
Lei YU25868182021-05-14 14:50:51 +08008#include <boost/asio/io_context.hpp>
Lei YU7d2fa142021-08-06 10:58:19 +08009#include <boost/asio/post.hpp>
Jayashankar Padatha0135602019-04-22 16:22:58 +053010#include <phosphor-logging/elog-errors.hpp>
11#include <phosphor-logging/elog.hpp>
Patrick Williamsc9bb6422021-08-27 06:18:35 -050012#include <phosphor-logging/lg2.hpp>
Adriana Kobylakaea48f22018-07-10 10:20:56 -050013#include <sdbusplus/exception.hpp>
Jayashankar Padatha0135602019-04-22 16:22:58 +053014#include <xyz/openbmc_project/Common/error.hpp>
Miguel Gomez21dad042020-06-26 20:54:48 +000015#include <xyz/openbmc_project/Software/Version/error.hpp>
Saqib Khanb9da6632017-09-13 09:48:37 -050016
Jayanth Othayoth0e0c1272018-02-21 05:46:36 -060017#ifdef WANT_SIGNATURE_VERIFY
Jayanth Othayoth0e0c1272018-02-21 05:46:36 -060018#include "image_verify.hpp"
Jayanth Othayoth0e0c1272018-02-21 05:46:36 -060019#endif
20
Saqib Khanb0774702017-05-23 16:02:41 -050021namespace phosphor
22{
23namespace software
24{
25namespace updater
26{
27
Patrick Williams1e9a5f12023-08-23 16:53:06 -050028namespace softwareServer = sdbusplus::server::xyz::openbmc_project::software;
Saqib Khanb0774702017-05-23 16:02:41 -050029
Patrick Williamsc9bb6422021-08-27 06:18:35 -050030PHOSPHOR_LOG2_USING;
Saqib Khanb9da6632017-09-13 09:48:37 -050031using namespace phosphor::logging;
Jayanth Othayoth0e0c1272018-02-21 05:46:36 -060032using InternalFailure =
Adriana Kobylakce82de52024-01-16 13:56:38 -060033 sdbusplus::error::xyz::openbmc_project::common::InternalFailure;
Jayashankar Padatha0135602019-04-22 16:22:58 +053034
35#ifdef WANT_SIGNATURE_VERIFY
Patrick Williams1e9a5f12023-08-23 16:53:06 -050036namespace control = sdbusplus::server::xyz::openbmc_project::control;
Jayanth Othayoth0e0c1272018-02-21 05:46:36 -060037#endif
38
Michael Tritzbed88af2017-07-19 16:00:06 -050039void Activation::subscribeToSystemdSignals()
40{
Adriana Kobylak2285fe02018-02-27 15:36:59 -060041 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
42 SYSTEMD_INTERFACE, "Subscribe");
Adriana Kobylakaea48f22018-07-10 10:20:56 -050043 try
44 {
45 this->bus.call_noreply(method);
46 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050047 catch (const sdbusplus::exception_t& e)
Adriana Kobylakaea48f22018-07-10 10:20:56 -050048 {
49 if (e.name() != nullptr &&
50 strcmp("org.freedesktop.systemd1.AlreadySubscribed", e.name()) == 0)
51 {
52 // If an Activation attempt fails, the Unsubscribe method is not
53 // called. This may lead to an AlreadySubscribed error if the
54 // Activation is re-attempted.
55 }
56 else
57 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -050058 error("Error subscribing to systemd: {ERROR}", "ERROR", e);
Adriana Kobylakaea48f22018-07-10 10:20:56 -050059 }
60 }
Michael Tritzbed88af2017-07-19 16:00:06 -050061
62 return;
63}
64
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050065void Activation::unsubscribeFromSystemdSignals()
66{
Adriana Kobylak2285fe02018-02-27 15:36:59 -060067 auto method = this->bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
68 SYSTEMD_INTERFACE, "Unsubscribe");
Jayashankar Padatha0135602019-04-22 16:22:58 +053069 try
70 {
71 this->bus.call_noreply(method);
72 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050073 catch (const sdbusplus::exception_t& e)
Jayashankar Padatha0135602019-04-22 16:22:58 +053074 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -050075 error("Error unsubscribing from systemd signals: {ERROR}", "ERROR", e);
Jayashankar Padatha0135602019-04-22 16:22:58 +053076 }
Michael Tritzf2b5e0d2017-07-25 14:39:34 -050077
78 return;
79}
80
Adriana Kobylak2285fe02018-02-27 15:36:59 -060081auto Activation::activation(Activations value) -> Activations
Saqib Khanb0774702017-05-23 16:02:41 -050082{
Adriana Kobylak8bd84c82018-01-24 14:19:24 -060083 if ((value != softwareServer::Activation::Activations::Active) &&
84 (value != softwareServer::Activation::Activations::Activating))
Saqib Khan4c1aec02017-07-06 11:46:13 -050085 {
86 redundancyPriority.reset(nullptr);
87 }
88
Saqib Khanb0774702017-05-23 16:02:41 -050089 if (value == softwareServer::Activation::Activations::Activating)
90 {
Lei YU7ab55e22021-05-19 13:26:53 +080091#ifdef WANT_SIGNATURE_VERIFY
92 fs::path uploadDir(IMG_UPLOAD_DIR);
93 if (!verifySignature(uploadDir / versionId, SIGNED_IMAGE_CONF_PATH))
94 {
Adriana Kobylakce82de52024-01-16 13:56:38 -060095 using InvalidSignatureErr = sdbusplus::error::xyz::openbmc_project::
96 software::version::InvalidSignature;
zamiseck3afdaaf2022-03-28 11:26:09 -050097 report<InvalidSignatureErr>();
Lei YU7ab55e22021-05-19 13:26:53 +080098 // Stop the activation process, if fieldMode is enabled.
99 if (parent.control::FieldMode::fieldModeEnabled())
100 {
101 return softwareServer::Activation::activation(
102 softwareServer::Activation::Activations::Failed);
103 }
104 }
105#endif
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800106
Miguel Gomez21dad042020-06-26 20:54:48 +0000107 auto versionStr = parent.versions.find(versionId)->second->version();
108
109 if (!minimum_ship_level::verify(versionStr))
110 {
Miguel Gomez21dad042020-06-26 20:54:48 +0000111 return softwareServer::Activation::activation(
112 softwareServer::Activation::Activations::Failed);
113 }
114
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500115 if (!activationProgress)
116 {
Patrick Williamsfc33ba82024-08-16 15:19:54 -0400117 activationProgress =
118 std::make_unique<ActivationProgress>(bus, path);
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500119 }
120
121 if (!activationBlocksTransition)
122 {
123 activationBlocksTransition =
124 std::make_unique<ActivationBlocksTransition>(bus, path);
125 }
126
Thang Tranbee62432022-03-14 22:18:38 +0700127#ifdef HOST_BIOS_UPGRADE
128 auto purpose = parent.versions.find(versionId)->second->purpose();
129 if (purpose == VersionPurpose::Host)
130 {
131 // Enable systemd signals
132 subscribeToSystemdSignals();
133
134 // Set initial progress
135 activationProgress->progress(20);
136
137 // Initiate image writing to flash
138 flashWriteHost();
139
140 return softwareServer::Activation::activation(value);
141 }
142#endif
143
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500144 activationProgress->progress(10);
145
Adriana Kobylaka6963592018-09-07 14:13:29 -0500146 parent.freeSpace(*this);
Lei YUa7853ee2018-05-23 11:13:12 +0800147
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500148 // Enable systemd signals
149 Activation::subscribeToSystemdSignals();
150
Lei YUa7853ee2018-05-23 11:13:12 +0800151 flashWrite();
152
Adriana Kobylak70f5bc02020-05-13 14:08:14 -0500153#if defined UBIFS_LAYOUT || defined MMC_LAYOUT
Lei YUa7853ee2018-05-23 11:13:12 +0800154
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500155 return softwareServer::Activation::activation(value);
Lei YUa7853ee2018-05-23 11:13:12 +0800156
Adriana Kobylak70f5bc02020-05-13 14:08:14 -0500157#else // STATIC_LAYOUT
Lei YUa7853ee2018-05-23 11:13:12 +0800158
Lei YUd8c9eea2021-12-16 16:08:30 +0800159 if (parent.runningImageSlot == 0)
160 {
161 // On primary, update it as before
162 onFlashWriteSuccess();
163 return softwareServer::Activation::activation(
164 softwareServer::Activation::Activations::Active);
165 }
166 // On secondary, wait for the service to complete
Lei YUa7853ee2018-05-23 11:13:12 +0800167#endif
Saqib Khanb0774702017-05-23 16:02:41 -0500168 }
169 else
170 {
171 activationBlocksTransition.reset(nullptr);
172 }
173 return softwareServer::Activation::activation(value);
174}
175
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500176void Activation::onFlashWriteSuccess()
177{
178 activationProgress->progress(100);
179
180 activationBlocksTransition.reset(nullptr);
181 activationProgress.reset(nullptr);
182
183 rwVolumeCreated = false;
184 roVolumeCreated = false;
185 ubootEnvVarsUpdated = false;
186 Activation::unsubscribeFromSystemdSignals();
187
Adriana Kobylak780220f2022-01-18 20:01:53 +0000188 auto flashId = parent.versions.find(versionId)->second->path();
189 storePurpose(flashId, parent.versions.find(versionId)->second->purpose());
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500190
191 if (!redundancyPriority)
192 {
Patrick Williamsfc33ba82024-08-16 15:19:54 -0400193 redundancyPriority =
194 std::make_unique<RedundancyPriority>(bus, path, *this, 0);
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500195 }
196
Jagpal Singh Gill6d131aa2024-04-07 23:56:48 -0700197 if (!parent.useUpdateDBusInterface)
198 {
199 // Remove version object from image manager
200 Activation::deleteImageManagerObject();
201 }
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500202
203 // Create active association
204 parent.createActiveAssociation(path);
205
206 // Create updateable association as this
207 // can be re-programmed.
208 parent.createUpdateableAssociation(path);
209
Pavithra Barithaya2d5704e2024-06-26 02:35:08 -0500210 if (Activation::checkApplyTimeImmediate())
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500211 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500212 info("Image Active and ApplyTime is immediate; rebooting BMC.");
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500213 Activation::rebootBmc();
214 }
215 else
216 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500217 info("BMC image ready; need reboot to get activated.");
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500218 }
219
Jagpal Singh Gill6d131aa2024-04-07 23:56:48 -0700220 // Create Update Object for this version.
221 parent.createUpdateObject(versionId, path);
222
Adriana Kobylakb824b2f2020-05-14 14:57:53 -0500223 activation(softwareServer::Activation::Activations::Active);
224}
225
Saqib Khanee13e832017-10-23 12:53:11 -0500226void Activation::deleteImageManagerObject()
227{
zamiseck0b1fd512021-12-02 10:56:51 -0600228 // Call the Delete object for <versionID> inside image_manager if the object
229 // has not already been deleted due to a successful update or Delete call
230 const std::string interface = std::string{VERSION_IFACE};
231 auto method = this->bus.new_method_call(MAPPER_BUSNAME, MAPPER_PATH,
232 MAPPER_BUSNAME, "GetObject");
233 method.append(path.c_str());
234 method.append(std::vector<std::string>({interface}));
235
236 std::map<std::string, std::vector<std::string>> response;
237
Adriana Kobylak3b6a4cd2018-12-10 13:45:09 -0600238 try
239 {
zamiseck0b1fd512021-12-02 10:56:51 -0600240 auto reply = bus.call(method);
241 reply.read(response);
242 auto it = response.find(VERSION_IFACE);
243 if (it != response.end())
244 {
245 auto deleteMethod = this->bus.new_method_call(
246 VERSION_BUSNAME, path.c_str(),
247 "xyz.openbmc_project.Object.Delete", "Delete");
248 try
249 {
250 bus.call_noreply(deleteMethod);
251 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500252 catch (const sdbusplus::exception_t& e)
zamiseck0b1fd512021-12-02 10:56:51 -0600253 {
254 error(
255 "Error deleting image ({PATH}) from image manager: {ERROR}",
256 "PATH", path, "ERROR", e);
257 return;
258 }
259 }
Adriana Kobylak3b6a4cd2018-12-10 13:45:09 -0600260 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500261 catch (const sdbusplus::exception_t& e)
Saqib Khanee13e832017-10-23 12:53:11 -0500262 {
zamiseck0b1fd512021-12-02 10:56:51 -0600263 error("Error in mapper method call for ({PATH}, {INTERFACE}: {ERROR}",
264 "ERROR", e, "PATH", path, "INTERFACE", interface);
Saqib Khanee13e832017-10-23 12:53:11 -0500265 }
zamiseck0b1fd512021-12-02 10:56:51 -0600266 return;
Saqib Khanee13e832017-10-23 12:53:11 -0500267}
268
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600269auto Activation::requestedActivation(RequestedActivations value)
270 -> RequestedActivations
Saqib Khanb0774702017-05-23 16:02:41 -0500271{
Michael Tritzbed88af2017-07-19 16:00:06 -0500272 rwVolumeCreated = false;
273 roVolumeCreated = false;
Adriana Kobylak166bdf32018-04-09 14:24:06 -0500274 ubootEnvVarsUpdated = false;
Michael Tritzbed88af2017-07-19 16:00:06 -0500275
Saqib Khanb0774702017-05-23 16:02:41 -0500276 if ((value == softwareServer::Activation::RequestedActivations::Active) &&
277 (softwareServer::Activation::requestedActivation() !=
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600278 softwareServer::Activation::RequestedActivations::Active))
Saqib Khanb0774702017-05-23 16:02:41 -0500279 {
280 if ((softwareServer::Activation::activation() ==
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600281 softwareServer::Activation::Activations::Ready) ||
Saqib Khanb0774702017-05-23 16:02:41 -0500282 (softwareServer::Activation::activation() ==
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600283 softwareServer::Activation::Activations::Failed))
Saqib Khanb0774702017-05-23 16:02:41 -0500284 {
285 Activation::activation(
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600286 softwareServer::Activation::Activations::Activating);
Saqib Khanb0774702017-05-23 16:02:41 -0500287 }
288 }
289 return softwareServer::Activation::requestedActivation(value);
290}
291
Saqib Khan4c1aec02017-07-06 11:46:13 -0500292uint8_t RedundancyPriority::priority(uint8_t value)
293{
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500294 // Set the priority value so that the freePriority() function can order
295 // the versions by priority.
296 auto newPriority = softwareServer::RedundancyPriority::priority(value);
Adriana Kobylakbbcb7be2018-07-17 15:47:34 -0500297 parent.parent.savePriority(parent.versionId, value);
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500298 parent.parent.freePriority(value, parent.versionId);
299 return newPriority;
Saqib Khan4c1aec02017-07-06 11:46:13 -0500300}
301
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500302uint8_t RedundancyPriority::sdbusPriority(uint8_t value)
Saqib Khanf0382c32017-10-24 13:36:22 -0500303{
Adriana Kobylakbbcb7be2018-07-17 15:47:34 -0500304 parent.parent.savePriority(parent.versionId, value);
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500305 return softwareServer::RedundancyPriority::priority(value);
Saqib Khanf0382c32017-10-24 13:36:22 -0500306}
307
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500308void Activation::unitStateChange(sdbusplus::message_t& msg)
Michael Tritzbed88af2017-07-19 16:00:06 -0500309{
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500310 if (softwareServer::Activation::activation() !=
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600311 softwareServer::Activation::Activations::Activating)
Michael Tritz0edd4ad2017-07-26 14:27:42 -0500312 {
313 return;
314 }
315
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800316#ifdef HOST_BIOS_UPGRADE
317 auto purpose = parent.versions.find(versionId)->second->purpose();
318 if (purpose == VersionPurpose::Host)
319 {
320 onStateChangesBios(msg);
321 return;
322 }
323#endif
324
Adriana Kobylak3ce563a2018-06-06 16:41:15 -0500325 onStateChanges(msg);
Michael Tritzbed88af2017-07-19 16:00:06 -0500326
327 return;
328}
329
Lei YU90532252018-05-24 11:15:24 +0800330#ifdef WANT_SIGNATURE_VERIFY
331bool Activation::verifySignature(const fs::path& imageDir,
332 const fs::path& confDir)
333{
334 using Signature = phosphor::software::image::Signature;
335
336 Signature signature(imageDir, confDir);
337
338 return signature.verify();
339}
Lei YU90532252018-05-24 11:15:24 +0800340#endif
341
Saqib Khanf37cefc2017-09-12 08:44:41 -0500342void ActivationBlocksTransition::enableRebootGuard()
343{
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500344 info("BMC image activating - BMC reboots are disabled.");
Saqib Khanf37cefc2017-09-12 08:44:41 -0500345
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600346 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
347 SYSTEMD_INTERFACE, "StartUnit");
Saqib Khanf37cefc2017-09-12 08:44:41 -0500348 method.append("reboot-guard-enable.service", "replace");
349 bus.call_noreply(method);
350}
351
352void ActivationBlocksTransition::disableRebootGuard()
353{
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500354 info("BMC activation has ended - BMC reboots are re-enabled.");
Saqib Khanf37cefc2017-09-12 08:44:41 -0500355
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600356 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
357 SYSTEMD_INTERFACE, "StartUnit");
Saqib Khanf37cefc2017-09-12 08:44:41 -0500358 method.append("reboot-guard-disable.service", "replace");
359 bus.call_noreply(method);
360}
Michael Tritzbed88af2017-07-19 16:00:06 -0500361
Jayashankar Padatha0135602019-04-22 16:22:58 +0530362bool Activation::checkApplyTimeImmediate()
363{
Jagpal Singh Gillbb024eb2024-04-07 23:34:00 -0700364 if (parent.useUpdateDBusInterface)
365 {
366 return (applyTime == ApplyTimeIntf::RequestedApplyTimes::Immediate);
367 }
Jayashankar Padatha0135602019-04-22 16:22:58 +0530368 auto service = utils::getService(bus, applyTimeObjPath, applyTimeIntf);
369 if (service.empty())
370 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500371 info("Error getting the service name for BMC image ApplyTime. "
372 "The BMC needs to be manually rebooted to complete the image "
373 "activation if needed immediately.");
Jayashankar Padatha0135602019-04-22 16:22:58 +0530374 }
375 else
376 {
Jayashankar Padatha0135602019-04-22 16:22:58 +0530377 auto method = bus.new_method_call(service.c_str(), applyTimeObjPath,
378 dbusPropIntf, "Get");
379 method.append(applyTimeIntf, applyTimeProp);
380
381 try
382 {
383 auto reply = bus.call(method);
384
Patrick Williams24048b52020-05-13 17:51:30 -0500385 std::variant<std::string> result;
Jayashankar Padatha0135602019-04-22 16:22:58 +0530386 reply.read(result);
Patrick Williamse883fb82020-05-13 11:38:55 -0500387 auto applyTime = std::get<std::string>(result);
Jayashankar Padatha0135602019-04-22 16:22:58 +0530388 if (applyTime == applyTimeImmediate)
389 {
390 return true;
391 }
392 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500393 catch (const sdbusplus::exception_t& e)
Jayashankar Padatha0135602019-04-22 16:22:58 +0530394 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500395 error("Error in getting ApplyTime: {ERROR}", "ERROR", e);
Jayashankar Padatha0135602019-04-22 16:22:58 +0530396 }
397 }
398 return false;
399}
400
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800401#ifdef HOST_BIOS_UPGRADE
402void Activation::flashWriteHost()
403{
404 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
405 SYSTEMD_INTERFACE, "StartUnit");
406 auto biosServiceFile = "obmc-flash-host-bios@" + versionId + ".service";
407 method.append(biosServiceFile, "replace");
408 try
409 {
410 auto reply = bus.call(method);
411 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500412 catch (const sdbusplus::exception_t& e)
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800413 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500414 error("Error in trying to upgrade Host Bios: {ERROR}", "ERROR", e);
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800415 report<InternalFailure>();
416 }
417}
418
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500419void Activation::onStateChangesBios(sdbusplus::message_t& msg)
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800420{
421 uint32_t newStateID{};
422 sdbusplus::message::object_path newStateObjPath;
423 std::string newStateUnit{};
424 std::string newStateResult{};
425
426 // Read the msg and populate each variable
427 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
428
429 auto biosServiceFile = "obmc-flash-host-bios@" + versionId + ".service";
430
431 if (newStateUnit == biosServiceFile)
432 {
433 // unsubscribe to systemd signals
434 unsubscribeFromSystemdSignals();
435
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800436 if (newStateResult == "done")
437 {
438 // Set activation progress to 100
439 activationProgress->progress(100);
440
441 // Set Activation value to active
442 activation(softwareServer::Activation::Activations::Active);
443
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500444 info("Bios upgrade completed successfully.");
Lei YU16aa28a2021-05-07 10:17:30 +0800445 parent.biosVersion->version(
446 parent.versions.find(versionId)->second->version());
Lei YU25868182021-05-14 14:50:51 +0800447
448 // Delete the uploaded activation
Jagpal Singh Gill6397c092025-07-16 21:18:00 -0700449 ctx.spawn([](auto self) -> sdbusplus::async::task<> {
450 self->parent.erase(self->versionId);
451 co_return;
452 }(this));
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800453 }
454 else if (newStateResult == "failed")
455 {
456 // Set Activation value to Failed
457 activation(softwareServer::Activation::Activations::Failed);
458
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500459 error("Bios upgrade failed.");
Vijay Khemkae9f6c842020-01-14 14:32:39 -0800460 }
461 }
462
463 return;
464}
465
466#endif
467
Jayashankar Padatha0135602019-04-22 16:22:58 +0530468void Activation::rebootBmc()
469{
470 auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
471 SYSTEMD_INTERFACE, "StartUnit");
472 method.append("force-reboot.service", "replace");
473 try
474 {
475 auto reply = bus.call(method);
476 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500477 catch (const sdbusplus::exception_t& e)
Jayashankar Padatha0135602019-04-22 16:22:58 +0530478 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500479 alert("Error in trying to reboot the BMC. The BMC needs to be manually "
480 "rebooted to complete the image activation. {ERROR}",
481 "ERROR", e);
Jayashankar Padatha0135602019-04-22 16:22:58 +0530482 report<InternalFailure>();
483 }
484}
485
Saqib Khanb0774702017-05-23 16:02:41 -0500486} // namespace updater
487} // namespace software
488} // namespace phosphor