blob: c50d9dea848ef36a96901f119083d5fb9d5d5012 [file] [log] [blame]
Gunnar Millsec1b41c2017-05-02 12:20:36 -05001#pragma once
2
Gunnar Millsec1b41c2017-05-02 12:20:36 -05003#include "activation.hpp"
Lei YU56aaf452018-06-21 16:09:44 +08004#include "item_updater_helper.hpp"
Saqib Khan705f1bf2017-06-09 23:58:38 -05005#include "version.hpp"
Gunnar Millsb0ce9962018-09-07 13:39:10 -05006#include "xyz/openbmc_project/Collection/DeleteAll/server.hpp"
7
8#include <sdbusplus/server.hpp>
John Wang85c356f2019-09-11 16:20:13 +08009#include <xyz/openbmc_project/Association/Definitions/server.hpp>
Michael Tritz37a59042017-07-12 13:44:53 -050010#include <xyz/openbmc_project/Common/FactoryReset/server.hpp>
Michael Tritz0129d922017-08-10 19:33:46 -050011#include <xyz/openbmc_project/Control/FieldMode/server.hpp>
Gunnar Millsec1b41c2017-05-02 12:20:36 -050012
Adriana Kobylak58aa7502020-06-08 11:12:11 -050013#include <string>
Bright Cheng8e9ccfe2019-11-18 16:18:44 +080014#include <vector>
Adriana Kobylak58aa7502020-06-08 11:12:11 -050015
Gunnar Millsec1b41c2017-05-02 12:20:36 -050016namespace phosphor
17{
18namespace software
19{
20namespace updater
21{
22
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050023using ItemUpdaterInherit = sdbusplus::server::object_t<
Adriana Kobylak2285fe02018-02-27 15:36:59 -060024 sdbusplus::xyz::openbmc_project::Common::server::FactoryReset,
25 sdbusplus::xyz::openbmc_project::Control::server::FieldMode,
John Wang85c356f2019-09-11 16:20:13 +080026 sdbusplus::xyz::openbmc_project::Association::server::Definitions,
Adriana Kobylak2285fe02018-02-27 15:36:59 -060027 sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll>;
Michael Tritz37a59042017-07-12 13:44:53 -050028
Patrick Williamse75d10f2017-05-30 16:56:32 -050029namespace MatchRules = sdbusplus::bus::match::rules;
Gunnar Mills48442912017-10-06 13:34:07 -050030using VersionClass = phosphor::software::manager::Version;
Gunnar Millsded875d2017-08-28 16:44:52 -050031using AssociationList =
Adriana Kobylak2285fe02018-02-27 15:36:59 -060032 std::vector<std::tuple<std::string, std::string, std::string>>;
Gunnar Millsded875d2017-08-28 16:44:52 -050033
Gunnar Millsec1b41c2017-05-02 12:20:36 -050034/** @class ItemUpdater
35 * @brief Manages the activation of the BMC version items.
36 */
Michael Tritz37a59042017-07-12 13:44:53 -050037class ItemUpdater : public ItemUpdaterInherit
Gunnar Millsec1b41c2017-05-02 12:20:36 -050038{
Adriana Kobylak2285fe02018-02-27 15:36:59 -060039 public:
40 /*
41 * @brief Types of Activation status for image validation.
42 */
43 enum class ActivationStatus
44 {
45 ready,
46 invalid,
47 active
48 };
Saqib Khan35e83f32017-05-22 11:37:32 -050049
Adriana Kobylak2285fe02018-02-27 15:36:59 -060050 /** @brief Constructs ItemUpdater
51 *
52 * @param[in] bus - The D-Bus bus object
53 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050054 ItemUpdater(sdbusplus::bus_t& bus, const std::string& path) :
Patrick Williams35aa9a82022-04-05 15:55:30 -050055 ItemUpdaterInherit(bus, path.c_str(),
56 ItemUpdaterInherit::action::defer_emit),
57 bus(bus), helper(bus),
Adriana Kobylak2285fe02018-02-27 15:36:59 -060058 versionMatch(bus,
59 MatchRules::interfacesAdded() +
60 MatchRules::path("/xyz/openbmc_project/software"),
61 std::bind(std::mem_fn(&ItemUpdater::createActivation),
62 this, std::placeholders::_1))
63 {
Lei YU531fbc22021-12-10 20:03:18 +080064 getRunningSlot();
Adriana Kobylak2285fe02018-02-27 15:36:59 -060065 setBMCInventoryPath();
66 processBMCImage();
67 restoreFieldModeStatus();
Lei YU6e9fb1d2021-02-19 18:01:40 +080068#ifdef HOST_BIOS_UPGRADE
69 createBIOSObject();
70#endif
Adriana Kobylak2285fe02018-02-27 15:36:59 -060071 emit_object_added();
72 };
Gunnar Millsec1b41c2017-05-02 12:20:36 -050073
Adriana Kobylakbbcb7be2018-07-17 15:47:34 -050074 /** @brief Save priority value to persistent storage (flash and optionally
75 * a U-Boot environment variable)
76 *
77 * @param[in] versionId - The Id of the version
78 * @param[in] value - The priority value
79 * @return None
80 */
81 void savePriority(const std::string& versionId, uint8_t value);
82
Adriana Kobylak2285fe02018-02-27 15:36:59 -060083 /** @brief Sets the given priority free by incrementing
84 * any existing priority with the same value by 1
85 *
86 * @param[in] value - The priority that needs to be set free.
87 * @param[in] versionId - The Id of the version for which we
88 * are trying to free up the priority.
89 * @return None
90 */
91 void freePriority(uint8_t value, const std::string& versionId);
Saqib Khan4c1aec02017-07-06 11:46:13 -050092
Adriana Kobylak2285fe02018-02-27 15:36:59 -060093 /**
94 * @brief Create and populate the active BMC Version.
95 */
96 void processBMCImage();
Saqib Khanba239882017-05-26 08:41:54 -050097
Adriana Kobylak2285fe02018-02-27 15:36:59 -060098 /**
99 * @brief Erase specified entry D-Bus object
100 * if Action property is not set to Active
101 *
102 * @param[in] entryId - unique identifier of the entry
103 */
104 void erase(std::string entryId);
Leonel Gonzalez3526ef72017-07-07 14:38:25 -0500105
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600106 /**
107 * @brief Deletes all versions except for the current one
108 */
109 void deleteAll();
Gunnar Millsded875d2017-08-28 16:44:52 -0500110
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600111 /** @brief Creates an active association to the
112 * newly active software image
113 *
114 * @param[in] path - The path to create the association to.
115 */
116 void createActiveAssociation(const std::string& path);
Gunnar Millsded875d2017-08-28 16:44:52 -0500117
Adriana Kobylak991af7e2018-12-10 13:08:38 -0600118 /** @brief Removes the associations from the provided software image path
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600119 *
Adriana Kobylak991af7e2018-12-10 13:08:38 -0600120 * @param[in] path - The path to remove the associations from.
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600121 */
Adriana Kobylak991af7e2018-12-10 13:08:38 -0600122 void removeAssociations(const std::string& path);
Gunnar Millsded875d2017-08-28 16:44:52 -0500123
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600124 /** @brief Determine if the given priority is the lowest
125 *
126 * @param[in] value - The priority that needs to be checked.
127 *
128 * @return boolean corresponding to whether the given
129 * priority is lowest.
130 */
131 bool isLowestPriority(uint8_t value);
Saqib Khanb9da6632017-09-13 09:48:37 -0500132
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600133 /**
134 * @brief Updates the U-Boot variables to point to the requested
135 * versionId, so that the systems boots from this version on
136 * the next reboot.
137 *
138 * @param[in] versionId - The version to point the system to boot from.
139 */
140 void updateUbootEnvVars(const std::string& versionId);
Adriana Kobylakb77551c2017-10-27 12:46:23 -0500141
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600142 /**
143 * @brief Updates the uboot variables to point to BMC version with lowest
144 * priority, so that the system boots from this version on the
145 * next boot.
146 */
147 void resetUbootEnvVars();
Saqib Khan49446ae2017-10-02 10:54:20 -0500148
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600149 /** @brief Brings the total number of active BMC versions to
150 * ACTIVE_BMC_MAX_ALLOWED -1. This function is intended to be
151 * run before activating a new BMC version. If this function
152 * needs to delete any BMC version(s) it will delete the
153 * version(s) with the highest priority, skipping the
154 * functional BMC version.
Adriana Kobylaka6963592018-09-07 14:13:29 -0500155 *
156 * @param[in] caller - The Activation object that called this function.
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600157 */
Lei YU0cd6d842021-12-27 11:56:02 +0800158 void freeSpace(const Activation& caller);
Adriana Kobylak204e1e72018-01-24 16:00:05 -0600159
AppaRao Puli1bb6dcb2020-03-27 20:51:57 +0530160 /** @brief Creates a updateable association to the
161 * "running" BMC software image
162 *
163 * @param[in] path - The path to create the association.
164 */
165 void createUpdateableAssociation(const std::string& path);
166
Adriana Kobylakec4eec32019-11-13 14:28:35 -0600167 /** @brief Persistent map of Version D-Bus objects and their
168 * version id */
169 std::map<std::string, std::unique_ptr<VersionClass>> versions;
170
Bright Cheng8e9ccfe2019-11-18 16:18:44 +0800171 /** @brief Vector of needed BMC images in the tarball*/
172 std::vector<std::string> imageUpdateList;
173
Lei YU531fbc22021-12-10 20:03:18 +0800174 /** @breif The slot of running BMC image */
175 uint32_t runningImageSlot = 0;
176
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600177 private:
178 /** @brief Callback function for Software.Version match.
179 * @details Creates an Activation D-Bus object.
180 *
181 * @param[in] msg - Data associated with subscribed signal
182 */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500183 void createActivation(sdbusplus::message_t& msg);
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500184
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600185 /**
186 * @brief Validates the presence of SquashFS image in the image dir.
187 *
188 * @param[in] filePath - The path to the image dir.
189 * @param[out] result - ActivationStatus Enum.
190 * ready if validation was successful.
191 * invalid if validation fail.
192 * active if image is the current version.
193 *
194 */
195 ActivationStatus validateSquashFSImage(const std::string& filePath);
Saqib Khan35e83f32017-05-22 11:37:32 -0500196
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600197 /** @brief BMC factory reset - marks the read-write partition for
198 * recreation upon reboot. */
199 void reset() override;
Michael Tritz37a59042017-07-12 13:44:53 -0500200
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600201 /**
202 * @brief Enables field mode, if value=true.
203 *
204 * @param[in] value - If true, enables field mode.
205 * @param[out] result - Returns the current state of field mode.
206 *
207 */
208 bool fieldModeEnabled(bool value) override;
Michael Tritz0129d922017-08-10 19:33:46 -0500209
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600210 /** @brief Sets the BMC inventory item path under
211 * /xyz/openbmc_project/inventory/system/chassis/. */
212 void setBMCInventoryPath();
Gunnar Millsb60add12017-08-24 16:41:42 -0500213
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600214 /** @brief The path to the BMC inventory item. */
215 std::string bmcInventoryPath;
Gunnar Millsb60add12017-08-24 16:41:42 -0500216
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600217 /** @brief Restores field mode status on reboot. */
218 void restoreFieldModeStatus();
Michael Tritz0129d922017-08-10 19:33:46 -0500219
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600220 /** @brief Creates a functional association to the
221 * "running" BMC software image
222 *
223 * @param[in] path - The path to create the association to.
224 */
225 void createFunctionalAssociation(const std::string& path);
Gunnar Mills88e8a322017-09-13 11:09:28 -0500226
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600227 /** @brief Persistent sdbusplus D-Bus bus connection. */
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -0500228 sdbusplus::bus_t& bus;
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500229
Lei YU56aaf452018-06-21 16:09:44 +0800230 /** @brief The helper of image updater. */
231 Helper helper;
232
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600233 /** @brief Persistent map of Activation D-Bus objects and their
234 * version id */
235 std::map<std::string, std::unique_ptr<Activation>> activations;
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500236
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600237 /** @brief sdbusplus signal match for Software.Version */
238 sdbusplus::bus::match_t versionMatch;
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500239
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600240 /** @brief This entry's associations */
241 AssociationList assocs = {};
Gunnar Millsded875d2017-08-28 16:44:52 -0500242
Adriana Kobylak2285fe02018-02-27 15:36:59 -0600243 /** @brief Clears read only partition for
244 * given Activation D-Bus object.
245 *
246 * @param[in] versionId - The version id.
247 */
248 void removeReadOnlyPartition(std::string versionId);
Eddie Jameseaa1ee02018-03-01 10:09:10 -0600249
250 /** @brief Copies U-Boot from the currently booted BMC chip to the
251 * alternate chip.
252 */
253 void mirrorUbootToAlt();
Bright Cheng8e9ccfe2019-11-18 16:18:44 +0800254
255 /** @brief Check the required image files
256 *
257 * @param[in] filePath - BMC tarball file path
258 * @param[in] imageList - Image filenames included in the BMC tarball
259 * @param[out] result - Boolean
260 * true if all image files are found in BMC tarball
261 * false if one of image files is missing
262 */
263 bool checkImage(const std::string& filePath,
264 const std::vector<std::string>& imageList);
Lei YU6e9fb1d2021-02-19 18:01:40 +0800265
266#ifdef HOST_BIOS_UPGRADE
267 /** @brief Create the BIOS object without knowing the version.
268 *
269 * The object is created only to provide the DBus access so that an
270 * external service could set the correct BIOS version.
271 * On BIOS code update, the version is updated accordingly.
272 */
273 void createBIOSObject();
274
275 /** @brief Persistent Activation D-Bus object for BIOS */
276 std::unique_ptr<Activation> biosActivation;
277
Lei YU16aa28a2021-05-07 10:17:30 +0800278 public:
Lei YU6e9fb1d2021-02-19 18:01:40 +0800279 /** @brief Persistent Version D-Bus object for BIOS */
280 std::unique_ptr<VersionClass> biosVersion;
281#endif
Lei YU531fbc22021-12-10 20:03:18 +0800282
283 /** @brief Get the slot number of running image */
284 void getRunningSlot();
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500285};
286
Gunnar Millsec1b41c2017-05-02 12:20:36 -0500287} // namespace updater
288} // namespace software
289} // namespace phosphor