blob: ef3bd635df12b47bae566335904188b7fc4c6720 [file] [log] [blame]
John Wedig2098dab2021-09-14 13:56:28 -07001
2#include "estoraged.hpp"
3
John Edward Broadbent59dffa62022-01-13 17:41:32 -08004#include "cryptErase.hpp"
John Wedigb810c922021-11-17 16:38:03 -08005#include "cryptsetupInterface.hpp"
John Edward Broadbent7f2ab642021-11-11 21:00:38 -08006#include "pattern.hpp"
John Edward Broadbent605085a2021-11-05 13:45:45 -07007#include "sanitize.hpp"
John Edward Broadbente6ffe702021-10-14 14:03:11 -07008#include "verifyDriveGeometry.hpp"
John Edward Broadbent4bc8a102021-12-30 16:11:49 -08009#include "zero.hpp"
John Edward Broadbent4e13b0a2021-11-15 15:21:59 -080010
John Wedigb810c922021-11-17 16:38:03 -080011#include <libcryptsetup.h>
12#include <openssl/rand.h>
John Wedigb810c922021-11-17 16:38:03 -080013
14#include <phosphor-logging/lg2.hpp>
John Wedig67a47442022-04-05 17:21:29 -070015#include <sdbusplus/asio/object_server.hpp>
John Wedig972c3fa2021-12-29 17:30:41 -080016#include <xyz/openbmc_project/Common/error.hpp>
John Wedigb810c922021-11-17 16:38:03 -080017
Ed Tanous82897c32022-02-21 14:11:59 -080018#include <cstdlib>
John Wedigb810c922021-11-17 16:38:03 -080019#include <filesystem>
John Wedig2098dab2021-09-14 13:56:28 -070020#include <iostream>
John Wedig67a47442022-04-05 17:21:29 -070021#include <string>
John Wedigb810c922021-11-17 16:38:03 -080022#include <string_view>
John Wedig67a47442022-04-05 17:21:29 -070023#include <utility>
John Wedig2098dab2021-09-14 13:56:28 -070024#include <vector>
25
26namespace estoraged
27{
28
John Wedig6c0d8ce2022-04-22 14:00:43 -070029using Association = std::tuple<std::string, std::string, std::string>;
John Wedig972c3fa2021-12-29 17:30:41 -080030using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
John Wedig972c3fa2021-12-29 17:30:41 -080031using sdbusplus::xyz::openbmc_project::Common::Error::UnsupportedRequest;
John Edward Broadbent91c1ec12022-05-20 16:51:43 -070032using sdbusplus::xyz::openbmc_project::Inventory::Item::server::Drive;
John Wedig67a47442022-04-05 17:21:29 -070033using sdbusplus::xyz::openbmc_project::Inventory::Item::server::Volume;
John Wedigb810c922021-11-17 16:38:03 -080034
John Wedig67a47442022-04-05 17:21:29 -070035EStoraged::EStoraged(sdbusplus::asio::object_server& server,
John Wedig6c0d8ce2022-04-22 14:00:43 -070036 const std::string& configPath, const std::string& devPath,
37 const std::string& luksName, uint64_t size,
John Wedigb4838302022-07-22 13:51:16 -070038 uint8_t lifeTime, const std::string& partNumber,
39 const std::string& serialNumber,
John Wedig67a47442022-04-05 17:21:29 -070040 std::unique_ptr<CryptsetupInterface> cryptInterface,
41 std::unique_ptr<FilesystemInterface> fsInterface) :
42 devPath(devPath),
43 containerName(luksName), mountPoint("/mnt/" + luksName + "_fs"),
John Edward Broadbent6771c692022-06-22 19:49:27 -070044 cryptIface(std::move(cryptInterface)), fsIface(std::move(fsInterface)),
45 objectServer(server)
John Wedig67a47442022-04-05 17:21:29 -070046{
47 /* Get the filename of the device (without "/dev/"). */
48 std::string deviceName = std::filesystem::path(devPath).filename().string();
49 /* DBus object path */
John Wedig6c0d8ce2022-04-22 14:00:43 -070050 std::string objectPath =
51 "/xyz/openbmc_project/inventory/storage/" + deviceName;
John Wedig67a47442022-04-05 17:21:29 -070052
53 /* Add Volume interface. */
54 volumeInterface = objectServer.add_interface(
John Wedig6c0d8ce2022-04-22 14:00:43 -070055 objectPath, "xyz.openbmc_project.Inventory.Item.Volume");
John Wedig67a47442022-04-05 17:21:29 -070056 volumeInterface->register_method(
57 "FormatLuks", [this](const std::vector<uint8_t>& password,
58 Volume::FilesystemType type) {
59 this->formatLuks(password, type);
60 });
61 volumeInterface->register_method(
62 "Erase",
63 [this](Volume::EraseMethod eraseType) { this->erase(eraseType); });
64 volumeInterface->register_method("Lock", [this]() { this->lock(); });
65 volumeInterface->register_method(
66 "Unlock",
67 [this](std::vector<uint8_t>& password) { this->unlock(password); });
68 volumeInterface->register_method(
69 "ChangePassword", [this](const std::vector<uint8_t>& oldPassword,
70 const std::vector<uint8_t>& newPassword) {
71 this->changePassword(oldPassword, newPassword);
72 });
73 volumeInterface->register_property_r(
74 "Locked", lockedProperty, sdbusplus::vtable::property_::emits_change,
75 [this](bool& value) {
76 value = this->isLocked();
77 return value;
78 });
79
80 /* Add Drive interface. */
81 driveInterface = objectServer.add_interface(
John Wedig6c0d8ce2022-04-22 14:00:43 -070082 objectPath, "xyz.openbmc_project.Inventory.Item.Drive");
John Wedig67a47442022-04-05 17:21:29 -070083 driveInterface->register_property("Capacity", size);
John Edward Broadbent5d799bb2022-03-22 16:14:24 -070084 driveInterface->register_property("PredictedMediaLifeLeftPercent",
85 lifeTime);
John Edward Broadbent14aee772022-04-20 13:46:48 -070086 /* This registers the Locked property for the Drives interface.
87 * Now it is the same as the volume Locked property */
88 driveInterface->register_property_r(
89 "Locked", lockedProperty, sdbusplus::vtable::property_::emits_change,
90 [this](bool& value) {
91 value = this->isLocked();
92 return value;
93 });
John Wedig67a47442022-04-05 17:21:29 -070094
John Edward Broadbent91c1ec12022-05-20 16:51:43 -070095 driveInterface->register_property_r(
96 "EncryptionStatus", encryptionStatus,
97 sdbusplus::vtable::property_::emits_change,
98 [this](Drive::DriveEncryptionState& value) {
99 value = this->findEncryptionStatus();
100 return value;
101 });
102
John Edward Broadbent49796412022-06-22 18:31:52 -0700103 embeddedLocationInterface = objectServer.add_interface(
104 objectPath, "xyz.openbmc_project.Inventory.Connector.Embedded");
John Edward Broadbent740e94b2022-06-10 19:42:30 -0700105
John Wedigb4838302022-07-22 13:51:16 -0700106 /* Add Asset interface. */
107 assetInterface = objectServer.add_interface(
108 objectPath, "xyz.openbmc_project.Inventory.Decorator.Asset");
109 assetInterface->register_property("PartNumber", partNumber);
110 assetInterface->register_property("SerialNumber", serialNumber);
111
John Wedig67a47442022-04-05 17:21:29 -0700112 volumeInterface->initialize();
113 driveInterface->initialize();
John Edward Broadbent49796412022-06-22 18:31:52 -0700114 embeddedLocationInterface->initialize();
John Wedigb4838302022-07-22 13:51:16 -0700115 assetInterface->initialize();
John Wedig6c0d8ce2022-04-22 14:00:43 -0700116
117 /* Set up the association between chassis and drive. */
118 association = objectServer.add_interface(
119 objectPath, "xyz.openbmc_project.Association.Definitions");
120
121 std::vector<Association> associations;
122 associations.emplace_back("chassis", "drive",
123 std::filesystem::path(configPath).parent_path());
124 association->register_property("Associations", associations);
125 association->initialize();
John Wedig67a47442022-04-05 17:21:29 -0700126}
127
128EStoraged::~EStoraged()
129{
130 objectServer.remove_interface(volumeInterface);
131 objectServer.remove_interface(driveInterface);
John Edward Broadbent49796412022-06-22 18:31:52 -0700132 objectServer.remove_interface(embeddedLocationInterface);
John Wedigb4838302022-07-22 13:51:16 -0700133 objectServer.remove_interface(assetInterface);
John Wedig6c0d8ce2022-04-22 14:00:43 -0700134 objectServer.remove_interface(association);
John Wedig67a47442022-04-05 17:21:29 -0700135}
136
137void EStoraged::formatLuks(const std::vector<uint8_t>& password,
138 Volume::FilesystemType type)
John Wedig2098dab2021-09-14 13:56:28 -0700139{
John Edward Broadbent4e13b0a2021-11-15 15:21:59 -0800140 std::string msg = "OpenBMC.0.1.DriveFormat";
141 lg2::info("Starting format", "REDFISH_MESSAGE_ID", msg);
John Wedigb810c922021-11-17 16:38:03 -0800142
John Wedig67a47442022-04-05 17:21:29 -0700143 if (type != Volume::FilesystemType::ext4)
John Wedig972c3fa2021-12-29 17:30:41 -0800144 {
145 lg2::error("Only ext4 filesystems are supported currently",
146 "REDFISH_MESSAGE_ID", std::string("OpenBMC.0.1.FormatFail"));
147 throw UnsupportedRequest();
148 }
149
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700150 formatLuksDev(password);
151 activateLuksDev(password);
John Wedigb810c922021-11-17 16:38:03 -0800152
153 createFilesystem();
154 mountFilesystem();
John Wedig2098dab2021-09-14 13:56:28 -0700155}
156
John Wedig67a47442022-04-05 17:21:29 -0700157void EStoraged::erase(Volume::EraseMethod inEraseMethod)
John Wedig2098dab2021-09-14 13:56:28 -0700158{
159 std::cerr << "Erasing encrypted eMMC" << std::endl;
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700160 lg2::info("Starting erase", "REDFISH_MESSAGE_ID",
161 std::string("OpenBMC.0.1.DriveErase"));
162 switch (inEraseMethod)
163 {
John Wedig67a47442022-04-05 17:21:29 -0700164 case Volume::EraseMethod::CryptoErase:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700165 {
John Edward Broadbent59dffa62022-01-13 17:41:32 -0800166 CryptErase myCryptErase(devPath);
167 myCryptErase.doErase();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700168 break;
169 }
John Wedig67a47442022-04-05 17:21:29 -0700170 case Volume::EraseMethod::VerifyGeometry:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700171 {
172 VerifyDriveGeometry myVerifyGeometry(devPath);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -0700173 myVerifyGeometry.geometryOkay();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700174 break;
175 }
John Wedig67a47442022-04-05 17:21:29 -0700176 case Volume::EraseMethod::LogicalOverWrite:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700177 {
John Edward Broadbent7f2ab642021-11-11 21:00:38 -0800178 Pattern myErasePattern(devPath);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -0700179 myErasePattern.writePattern();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700180 break;
181 }
John Wedig67a47442022-04-05 17:21:29 -0700182 case Volume::EraseMethod::LogicalVerify:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700183 {
John Edward Broadbent7f2ab642021-11-11 21:00:38 -0800184 Pattern myErasePattern(devPath);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -0700185 myErasePattern.verifyPattern();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700186 break;
187 }
John Wedig67a47442022-04-05 17:21:29 -0700188 case Volume::EraseMethod::VendorSanitize:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700189 {
John Edward Broadbent605085a2021-11-05 13:45:45 -0700190 Sanitize mySanitize(devPath);
191 mySanitize.doSanitize();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700192 break;
193 }
John Wedig67a47442022-04-05 17:21:29 -0700194 case Volume::EraseMethod::ZeroOverWrite:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700195 {
John Edward Broadbent4bc8a102021-12-30 16:11:49 -0800196 Zero myZero(devPath);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -0700197 myZero.writeZero();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700198 break;
199 }
John Wedig67a47442022-04-05 17:21:29 -0700200 case Volume::EraseMethod::ZeroVerify:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700201 {
John Edward Broadbent4bc8a102021-12-30 16:11:49 -0800202 Zero myZero(devPath);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -0700203 myZero.verifyZero();
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700204 break;
205 }
John Wedig67a47442022-04-05 17:21:29 -0700206 case Volume::EraseMethod::SecuredLocked:
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700207 {
John Edward Broadbentf59b7292022-02-15 15:07:15 -0800208 if (isLocked())
209 {
210 lock();
211 }
212 // TODO: implement hardware locking
213 // Until that is done, we can lock using eStoraged::lock()
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700214 break;
215 }
216 }
John Wedig2098dab2021-09-14 13:56:28 -0700217}
218
Ed Tanous82897c32022-02-21 14:11:59 -0800219void EStoraged::lock()
John Wedig2098dab2021-09-14 13:56:28 -0700220{
John Edward Broadbent4e13b0a2021-11-15 15:21:59 -0800221 std::string msg = "OpenBMC.0.1.DriveLock";
222 lg2::info("Starting lock", "REDFISH_MESSAGE_ID", msg);
John Wedigb810c922021-11-17 16:38:03 -0800223
224 unmountFilesystem();
225 deactivateLuksDev();
John Wedig2098dab2021-09-14 13:56:28 -0700226}
227
Ed Tanous82897c32022-02-21 14:11:59 -0800228void EStoraged::unlock(std::vector<uint8_t> password)
John Wedig2098dab2021-09-14 13:56:28 -0700229{
John Edward Broadbent4e13b0a2021-11-15 15:21:59 -0800230 std::string msg = "OpenBMC.0.1.DriveUnlock";
231 lg2::info("Starting unlock", "REDFISH_MESSAGE_ID", msg);
John Wedigb810c922021-11-17 16:38:03 -0800232
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700233 activateLuksDev(std::move(password));
John Wedigb810c922021-11-17 16:38:03 -0800234 mountFilesystem();
John Wedig2098dab2021-09-14 13:56:28 -0700235}
236
John Wedig8d5a3a02022-09-29 15:25:58 -0700237void EStoraged::changePassword(const std::vector<uint8_t>& oldPassword,
238 const std::vector<uint8_t>& newPassword)
John Wedig2098dab2021-09-14 13:56:28 -0700239{
John Edward Broadbente6ffe702021-10-14 14:03:11 -0700240 lg2::info("Starting change password", "REDFISH_MESSAGE_ID",
241 std::string("OpenBMC.0.1.DrivePasswordChanged"));
John Wedig8d5a3a02022-09-29 15:25:58 -0700242
243 CryptHandle cryptHandle = loadLuksHeader();
244
245 int retval = cryptIface->cryptKeyslotChangeByPassphrase(
246 cryptHandle.get(), CRYPT_ANY_SLOT, CRYPT_ANY_SLOT,
247 reinterpret_cast<const char*>(oldPassword.data()), oldPassword.size(),
248 reinterpret_cast<const char*>(newPassword.data()), newPassword.size());
249 if (retval < 0)
250 {
251 lg2::error("Failed to change password", "REDFISH_MESSAGE_ID",
252 std::string("OpenBMC.0.1.DrivePasswordChangeFail"));
253 throw InternalFailure();
254 }
255
256 lg2::info("Successfully changed password for {DEV}", "DEV", devPath,
257 "REDFISH_MESSAGE_ID",
258 std::string("OpenBMC.0.1.DrivePasswordChangeSuccess"));
John Wedig2098dab2021-09-14 13:56:28 -0700259}
260
Ed Tanous82897c32022-02-21 14:11:59 -0800261bool EStoraged::isLocked() const
John Wedigb810c922021-11-17 16:38:03 -0800262{
John Wedig67a47442022-04-05 17:21:29 -0700263 return lockedProperty;
John Wedigb810c922021-11-17 16:38:03 -0800264}
265
Ed Tanous82897c32022-02-21 14:11:59 -0800266std::string_view EStoraged::getMountPoint() const
John Wedigb810c922021-11-17 16:38:03 -0800267{
268 return mountPoint;
269}
270
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700271void EStoraged::formatLuksDev(std::vector<uint8_t> password)
John Wedigb810c922021-11-17 16:38:03 -0800272{
273 lg2::info("Formatting device {DEV}", "DEV", devPath, "REDFISH_MESSAGE_ID",
274 std::string("OpenBMC.0.1.FormatLuksDev"));
275
276 /* Generate the volume key. */
277 const std::size_t keySize = 64;
278 std::vector<uint8_t> volumeKey(keySize);
279 if (RAND_bytes(volumeKey.data(), keySize) != 1)
280 {
281 lg2::error("Failed to create volume key", "REDFISH_MESSAGE_ID",
282 std::string("OpenBMC.0.1.FormatLuksDevFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800283 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800284 }
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700285
286 /* Create the handle. */
287 CryptHandle cryptHandle(devPath);
288
John Wedigb810c922021-11-17 16:38:03 -0800289 /* Format the LUKS encrypted device. */
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700290 int retval = cryptIface->cryptFormat(
291 cryptHandle.get(), CRYPT_LUKS2, "aes", "xts-plain64", nullptr,
292 reinterpret_cast<const char*>(volumeKey.data()), volumeKey.size(),
293 nullptr);
John Wedigb810c922021-11-17 16:38:03 -0800294 if (retval < 0)
295 {
296 lg2::error("Failed to format encrypted device: {RETVAL}", "RETVAL",
297 retval, "REDFISH_MESSAGE_ID",
298 std::string("OpenBMC.0.1.FormatLuksDevFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800299 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800300 }
301
302 /* Device is now encrypted. */
303 locked(true);
304
305 /* Set the password. */
306 retval = cryptIface->cryptKeyslotAddByVolumeKey(
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700307 cryptHandle.get(), CRYPT_ANY_SLOT, nullptr, 0,
John Wedigb810c922021-11-17 16:38:03 -0800308 reinterpret_cast<const char*>(password.data()), password.size());
309
310 if (retval < 0)
311 {
312 lg2::error("Failed to set encryption password", "REDFISH_MESSAGE_ID",
313 std::string("OpenBMC.0.1.FormatLuksDevFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800314 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800315 }
316
317 lg2::info("Encrypted device {DEV} successfully formatted", "DEV", devPath,
318 "REDFISH_MESSAGE_ID",
319 std::string("OpenBMC.0.1.FormatLuksDevSuccess"));
320}
321
John Edward Broadbent91c1ec12022-05-20 16:51:43 -0700322CryptHandle EStoraged::loadLuksHeader()
John Wedigb810c922021-11-17 16:38:03 -0800323{
John Wedigb810c922021-11-17 16:38:03 -0800324
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700325 CryptHandle cryptHandle(devPath);
326
327 int retval = cryptIface->cryptLoad(cryptHandle.get(), CRYPT_LUKS2, nullptr);
John Wedigb810c922021-11-17 16:38:03 -0800328 if (retval < 0)
329 {
330 lg2::error("Failed to load LUKS header: {RETVAL}", "RETVAL", retval,
331 "REDFISH_MESSAGE_ID",
332 std::string("OpenBMC.0.1.ActivateLuksDevFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800333 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800334 }
John Edward Broadbent91c1ec12022-05-20 16:51:43 -0700335 return cryptHandle;
336}
John Wedigb810c922021-11-17 16:38:03 -0800337
John Edward Broadbent91c1ec12022-05-20 16:51:43 -0700338Drive::DriveEncryptionState EStoraged::findEncryptionStatus()
339{
340 try
341 {
342 loadLuksHeader();
343 return Drive::DriveEncryptionState::Encrypted;
344 }
345 catch (...)
346 {
347 return Drive::DriveEncryptionState::Unknown;
348 }
349}
350
351void EStoraged::activateLuksDev(std::vector<uint8_t> password)
352{
353 lg2::info("Activating LUKS dev {DEV}", "DEV", devPath, "REDFISH_MESSAGE_ID",
354 std::string("OpenBMC.0.1.ActivateLuksDev"));
355
356 /* Create the handle. */
357 CryptHandle cryptHandle = loadLuksHeader();
358
359 int retval = cryptIface->cryptActivateByPassphrase(
John Edward Broadbentb2c86be2022-04-15 11:45:53 -0700360 cryptHandle.get(), containerName.c_str(), CRYPT_ANY_SLOT,
John Wedigb810c922021-11-17 16:38:03 -0800361 reinterpret_cast<const char*>(password.data()), password.size(), 0);
362
363 if (retval < 0)
364 {
365 lg2::error("Failed to activate LUKS dev: {RETVAL}", "RETVAL", retval,
366 "REDFISH_MESSAGE_ID",
367 std::string("OpenBMC.0.1.ActivateLuksDevFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800368 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800369 }
370
371 /* Device is now unlocked. */
372 locked(false);
373
374 lg2::info("Successfully activated LUKS dev {DEV}", "DEV", devPath,
375 "REDFISH_MESSAGE_ID",
376 std::string("OpenBMC.0.1.ActivateLuksDevSuccess"));
377}
378
Ed Tanous82897c32022-02-21 14:11:59 -0800379void EStoraged::createFilesystem()
John Wedigb810c922021-11-17 16:38:03 -0800380{
381 /* Run the command to create the filesystem. */
382 int retval = fsIface->runMkfs(containerName);
Ed Tanous82897c32022-02-21 14:11:59 -0800383 if (retval != 0)
John Wedigb810c922021-11-17 16:38:03 -0800384 {
385 lg2::error("Failed to create filesystem: {RETVAL}", "RETVAL", retval,
386 "REDFISH_MESSAGE_ID",
387 std::string("OpenBMC.0.1.CreateFilesystemFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800388 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800389 }
390 lg2::info("Successfully created filesystem for /dev/mapper/{CONTAINER}",
391 "CONTAINER", containerName, "REDFISH_MESSAGE_ID",
392 std::string("OpenBMC.0.1.CreateFilesystemSuccess"));
393}
394
Ed Tanous82897c32022-02-21 14:11:59 -0800395void EStoraged::mountFilesystem()
John Wedigb810c922021-11-17 16:38:03 -0800396{
John Wedigb17f8252022-01-12 14:24:26 -0800397 /*
398 * Create directory for the filesystem, if it's not already present. It
399 * might already exist if, for example, the BMC reboots after creating the
400 * directory.
401 */
402 if (!fsIface->directoryExists(std::filesystem::path(mountPoint)))
John Wedigb810c922021-11-17 16:38:03 -0800403 {
John Wedigb17f8252022-01-12 14:24:26 -0800404 bool success =
405 fsIface->createDirectory(std::filesystem::path(mountPoint));
406 if (!success)
407 {
408 lg2::error("Failed to create mount point: {DIR}", "DIR", mountPoint,
409 "REDFISH_MESSAGE_ID",
410 std::string("OpenBMC.0.1.MountFilesystemFail"));
411 throw InternalFailure();
412 }
John Wedigb810c922021-11-17 16:38:03 -0800413 }
414
415 /* Run the command to mount the filesystem. */
416 std::string luksContainer("/dev/mapper/" + containerName);
417 int retval = fsIface->doMount(luksContainer.c_str(), mountPoint.c_str(),
418 "ext4", 0, nullptr);
Ed Tanous82897c32022-02-21 14:11:59 -0800419 if (retval != 0)
John Wedigb810c922021-11-17 16:38:03 -0800420 {
421 lg2::error("Failed to mount filesystem: {RETVAL}", "RETVAL", retval,
422 "REDFISH_MESSAGE_ID",
423 std::string("OpenBMC.0.1.MountFilesystemFail"));
424 bool removeSuccess =
425 fsIface->removeDirectory(std::filesystem::path(mountPoint));
426 if (!removeSuccess)
427 {
428 lg2::error("Failed to remove mount point: {DIR}", "DIR", mountPoint,
429 "REDFISH_MESSAGE_ID",
430 std::string("OpenBMC.0.1.MountFilesystemFail"));
431 }
John Wedig972c3fa2021-12-29 17:30:41 -0800432 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800433 }
434
435 lg2::info("Successfully mounted filesystem at {DIR}", "DIR", mountPoint,
436 "REDFISH_MESSAGE_ID",
437 std::string("OpenBMC.0.1.MountFilesystemSuccess"));
438}
439
Ed Tanous82897c32022-02-21 14:11:59 -0800440void EStoraged::unmountFilesystem()
John Wedigb810c922021-11-17 16:38:03 -0800441{
442 int retval = fsIface->doUnmount(mountPoint.c_str());
Ed Tanous82897c32022-02-21 14:11:59 -0800443 if (retval != 0)
John Wedigb810c922021-11-17 16:38:03 -0800444 {
445 lg2::error("Failed to unmount filesystem: {RETVAL}", "RETVAL", retval,
446 "REDFISH_MESSAGE_ID",
447 std::string("OpenBMC.0.1.UnmountFilesystemFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800448 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800449 }
450
451 /* Remove the mount point. */
452 bool success = fsIface->removeDirectory(std::filesystem::path(mountPoint));
453 if (!success)
454 {
455 lg2::error("Failed to remove mount point {DIR}", "DIR", mountPoint,
456 "REDFISH_MESSAGE_ID",
457 std::string("OpenBMC.0.1.UnmountFilesystemFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800458 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800459 }
460
461 lg2::info("Successfully unmounted filesystem at {DIR}", "DIR", mountPoint,
462 "REDFISH_MESSAGE_ID",
463 std::string("OpenBMC.0.1.MountFilesystemSuccess"));
464}
465
Ed Tanous82897c32022-02-21 14:11:59 -0800466void EStoraged::deactivateLuksDev()
John Wedigb810c922021-11-17 16:38:03 -0800467{
468 lg2::info("Deactivating LUKS device {DEV}", "DEV", devPath,
469 "REDFISH_MESSAGE_ID",
470 std::string("OpenBMC.0.1.DeactivateLuksDev"));
471
472 int retval = cryptIface->cryptDeactivate(nullptr, containerName.c_str());
473 if (retval < 0)
474 {
475 lg2::error("Failed to deactivate crypt device: {RETVAL}", "RETVAL",
476 retval, "REDFISH_MESSAGE_ID",
477 std::string("OpenBMC.0.1.DeactivateLuksDevFail"));
John Wedig972c3fa2021-12-29 17:30:41 -0800478 throw InternalFailure();
John Wedigb810c922021-11-17 16:38:03 -0800479 }
480
481 /* Device is now locked. */
482 locked(true);
483
484 lg2::info("Successfully deactivated LUKS device {DEV}", "DEV", devPath,
485 "REDFISH_MESSAGE_ID",
486 std::string("OpenBMC.0.1.DeactivateLuksDevSuccess"));
487}
488
John Wedig67a47442022-04-05 17:21:29 -0700489void EStoraged::locked(bool isLocked)
490{
491 lockedProperty = isLocked;
492}
493
John Wedig2098dab2021-09-14 13:56:28 -0700494} // namespace estoraged