1 #pragma once 2 #include "getConfig.hpp" 3 4 #include <filesystem> 5 #include <optional> 6 #include <string> 7 8 namespace estoraged 9 { 10 namespace util 11 { 12 13 struct DeviceInfo 14 { 15 std::filesystem::path deviceFile; 16 std::filesystem::path sysfsDir; 17 std::string luksName; 18 std::string locationCode; 19 uint64_t eraseMaxGeometry; 20 uint64_t eraseMinGeometry; 21 std::string driveType; 22 std::string driveProtocol; 23 DeviceInfoestoraged::util::DeviceInfo24 DeviceInfo(std::filesystem::path& deviceFile, 25 std::filesystem::path& sysfsDir, std::string& luksName, 26 std::string& locationCode, uint64_t eraseMaxGeometry, 27 uint64_t eraseMinGeometry, std::string& driveType, 28 std::string& driveProtocol) : 29 deviceFile(deviceFile), sysfsDir(sysfsDir), luksName(luksName), 30 locationCode(locationCode), eraseMaxGeometry(eraseMaxGeometry), 31 eraseMinGeometry(eraseMinGeometry), driveType(driveType), 32 driveProtocol(driveProtocol) 33 {} 34 }; 35 36 /** @brief finds the size of the linux block device in bytes 37 * @param[in] devpath - the name of the linux block device 38 * @return size of a block device using the devPath 39 */ 40 uint64_t findSizeOfBlockDevice(const std::string& devPath); 41 42 /** @brief finds the predicted life left for a eMMC device 43 * @param[in] sysfsPath - The path to the linux sysfs interface 44 * @return the life remaining for the emmc, as a percentage. 45 */ 46 uint8_t findPredictedMediaLifeLeftPercent(const std::string& sysfsPath); 47 48 /** @brief Get the part number (aka part name) for the storage device 49 * @param[in] sysfsPath - The path to the linux sysfs interface. 50 * @return part name as a string (or "unknown" if it couldn't be retrieved) 51 */ 52 std::string getPartNumber(const std::filesystem::path& sysfsPath); 53 54 /** @brief Get the serial number for the storage device 55 * @param[in] sysfsPath - The path to the linux sysfs interface. 56 * @return serial name as a string (or "unknown" if it couldn't be retrieved) 57 */ 58 std::string getSerialNumber(const std::filesystem::path& sysfsPath); 59 60 /** @brief Look for the device described by the provided StorageData. 61 * @details Currently, this function assumes that there's only one eMMC. 62 * When we need to support multiple eMMCs, we will put more information in 63 * the EntityManager config, to differentiate between them. Also, if we 64 * want to support other types of storage devices, this function will need 65 * to be updated. 66 * 67 * @param[in] data - map of properties from the config object. 68 * @param[in] searchDir - directory to search for devices in sysfs, e.g. 69 * /sys/block 70 * @return DeviceInfo - metadata for the device if device is found. Null 71 * otherwise. 72 */ 73 std::optional<DeviceInfo> findDevice(const StorageData& data, 74 const std::filesystem::path& searchDir); 75 76 } // namespace util 77 78 } // namespace estoraged 79