1 2 #include "estoraged.hpp" 3 4 #include <unistd.h> 5 6 #include <phosphor-logging/lg2.hpp> 7 #include <sdbusplus/bus.hpp> 8 9 #include <filesystem> 10 #include <iostream> 11 #include <string> 12 13 static void usage(std::string_view name) 14 { 15 std::cerr 16 << "Usage: " << name 17 << "eStorageD service on the BMC\n\n" 18 " -b <blockDevice> The phyical encrypted device\n" 19 " If omitted, default is /dev/mmcblk0.\n" 20 " -c <containerName> The LUKS container name to be created\n" 21 " If omitted, default is luks-<devName>"; 22 } 23 24 int main(int argc, char** argv) 25 { 26 27 std::string physicalBlockDev = "/dev/mmcblk0"; 28 std::string containerBlockDev; 29 int opt = 0; 30 while ((opt = getopt(argc, argv, "b:c:")) != -1) 31 { 32 switch (opt) 33 { 34 case 'b': 35 physicalBlockDev = optarg; 36 break; 37 case 'c': 38 containerBlockDev = optarg; 39 break; 40 default: 41 usage(*argv); 42 exit(EXIT_FAILURE); 43 } 44 } 45 try 46 { 47 /* Get the filename of the device (without "/dev/"). */ 48 std::string deviceName = 49 std::filesystem::path(physicalBlockDev).filename().string(); 50 /* If containerName arg wasn't provided, create one based on deviceName. 51 */ 52 if (containerBlockDev.empty()) 53 { 54 containerBlockDev = "luks-" + deviceName; 55 } 56 57 /* DBus path location to place the object. */ 58 std::string path = "/xyz/openbmc_project/storage/" + deviceName; 59 60 /* 61 * Create a new bus and affix an object manager for the subtree path we 62 * intend to place objects at. 63 */ 64 auto b = sdbusplus::bus::new_default(); 65 sdbusplus::server::manager_t m{b, path.c_str()}; 66 67 /* Reserve the dbus service name. */ 68 std::string busName = "xyz.openbmc_project.eStoraged." + deviceName; 69 b.request_name(busName.c_str()); 70 71 /* Create an eStoraged object. */ 72 estoraged::EStoraged esObject{b, path.c_str(), physicalBlockDev, 73 containerBlockDev}; 74 lg2::info("Storage management service is running", "REDFISH_MESSAGE_ID", 75 std::string("OpenBMC.1.0.ServiceStarted")); 76 77 while (true) 78 { 79 b.wait(); 80 b.process_discard(); 81 } 82 } 83 catch (const std::exception& e) 84 { 85 lg2::error(e.what(), "REDFISH_MESSAGE_ID", 86 std::string("OpenBMC.1.0.ServiceException")); 87 88 return 2; 89 } 90 return 1; 91 } 92