| George Liu | 073a653 | 2021-10-25 14:40:03 +0800 | [diff] [blame] | 1 | #include "config.h" | 
|  | 2 |  | 
|  | 3 | #include "usb_manager.hpp" | 
|  | 4 |  | 
| George Liu | 6d775e6 | 2021-10-26 10:44:30 +0800 | [diff] [blame] | 5 | #include <sys/mount.h> | 
|  | 6 |  | 
| George Liu | 073a653 | 2021-10-25 14:40:03 +0800 | [diff] [blame] | 7 | namespace phosphor | 
|  | 8 | { | 
|  | 9 | namespace usb | 
|  | 10 | { | 
|  | 11 |  | 
|  | 12 | bool USBManager::run() | 
|  | 13 | { | 
|  | 14 | fs::path dir(usbPath); | 
| George Liu | 6d775e6 | 2021-10-26 10:44:30 +0800 | [diff] [blame] | 15 | fs::create_directories(dir); | 
|  | 16 |  | 
|  | 17 | auto rc = mount(devicePath.c_str(), usbPath.c_str(), "vfat", 0, NULL); | 
|  | 18 | if (rc) | 
| George Liu | 073a653 | 2021-10-25 14:40:03 +0800 | [diff] [blame] | 19 | { | 
| George Liu | 6d775e6 | 2021-10-26 10:44:30 +0800 | [diff] [blame] | 20 | lg2::error("Error ({ERRNO}) occurred during the mount call", "ERRNO", | 
|  | 21 | errno); | 
| George Liu | 073a653 | 2021-10-25 14:40:03 +0800 | [diff] [blame] | 22 | return false; | 
|  | 23 | } | 
|  | 24 |  | 
|  | 25 | for (const auto& p : std::filesystem::directory_iterator(dir)) | 
|  | 26 | { | 
|  | 27 | if (p.path().extension() == ".tar") | 
|  | 28 | { | 
|  | 29 | fs::path dstPath{IMG_UPLOAD_DIR / p.path().filename()}; | 
|  | 30 | if (fs::exists(dstPath)) | 
|  | 31 | { | 
|  | 32 | lg2::info( | 
|  | 33 | "{DSTPATH} already exists in the /tmp/images directory, exit the upgrade", | 
|  | 34 | "DSTPATH", p.path().filename()); | 
|  | 35 |  | 
|  | 36 | break; | 
|  | 37 | } | 
|  | 38 |  | 
|  | 39 | try | 
|  | 40 | { | 
|  | 41 | return fs::copy_file(fs::absolute(p.path()), dstPath); | 
|  | 42 | } | 
|  | 43 | catch (const std::exception& e) | 
|  | 44 | { | 
|  | 45 | lg2::error("Error when copying {SRC} to /tmp/images: {ERROR}", | 
|  | 46 | "SRC", p.path(), "ERROR", e.what()); | 
|  | 47 | } | 
|  | 48 |  | 
|  | 49 | break; | 
|  | 50 | } | 
|  | 51 | } | 
|  | 52 |  | 
|  | 53 | return false; | 
|  | 54 | } | 
|  | 55 |  | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 56 | void USBManager::setApplyTime() | 
|  | 57 | { | 
|  | 58 | utils::PropertyValue value = | 
|  | 59 | "xyz.openbmc_project.Software.ApplyTime.RequestedApplyTimes.OnReset"; | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 60 | try | 
|  | 61 | { | 
| Lei YU | 0cd6d84 | 2021-12-27 11:56:02 +0800 | [diff] [blame] | 62 | constexpr auto objectPath = "/xyz/openbmc_project/software/apply_time"; | 
|  | 63 | constexpr auto interface = "xyz.openbmc_project.Software.ApplyTime"; | 
|  | 64 | constexpr auto propertyName = "RequestedApplyTime"; | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 65 | utils::setProperty(bus, objectPath, interface, propertyName, value); | 
|  | 66 | } | 
|  | 67 | catch (const std::exception& e) | 
|  | 68 | { | 
|  | 69 | lg2::error("Failed to set RequestedApplyTime property, ERROR:{ERROR}", | 
|  | 70 | "ERROR", e.what()); | 
|  | 71 | } | 
|  | 72 | } | 
|  | 73 |  | 
|  | 74 | void USBManager::setRequestedActivation(const std::string& path) | 
|  | 75 | { | 
|  | 76 | utils::PropertyValue value = | 
|  | 77 | "xyz.openbmc_project.Software.Activation.RequestedActivations.Active"; | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 78 | try | 
|  | 79 | { | 
| Lei YU | 0cd6d84 | 2021-12-27 11:56:02 +0800 | [diff] [blame] | 80 | constexpr auto interface = "xyz.openbmc_project.Software.Activation"; | 
|  | 81 | constexpr auto propertyName = "RequestedActivation"; | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 82 | utils::setProperty(bus, path, interface, propertyName, value); | 
|  | 83 | } | 
|  | 84 | catch (const std::exception& e) | 
|  | 85 | { | 
|  | 86 | lg2::error("Failed to set RequestedActivation property, ERROR:{ERROR}", | 
|  | 87 | "ERROR", e.what()); | 
|  | 88 | } | 
|  | 89 |  | 
|  | 90 | return; | 
|  | 91 | } | 
|  | 92 |  | 
| Patrick Williams | bf2bb2b | 2022-07-22 19:26:52 -0500 | [diff] [blame^] | 93 | void USBManager::updateActivation(sdbusplus::message_t& msg) | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 94 | { | 
|  | 95 | std::map<std::string, std::map<std::string, std::variant<std::string>>> | 
|  | 96 | interfaces; | 
|  | 97 | sdbusplus::message::object_path path; | 
|  | 98 | msg.read(path, interfaces); | 
|  | 99 |  | 
|  | 100 | constexpr auto imageInterface = "xyz.openbmc_project.Software.Activation"; | 
|  | 101 | constexpr auto readyPro = | 
|  | 102 | "xyz.openbmc_project.Software.Activation.Activations.Ready"; | 
|  | 103 | for (auto& interface : interfaces) | 
|  | 104 | { | 
|  | 105 | if (interface.first != imageInterface) | 
|  | 106 | { | 
|  | 107 | continue; | 
|  | 108 | } | 
|  | 109 |  | 
|  | 110 | try | 
|  | 111 | { | 
| Andrew Geissler | 047f60e | 2022-04-06 15:38:07 -0500 | [diff] [blame] | 112 | auto imageProp = utils::getProperty<std::string>( | 
|  | 113 | bus, path.str, imageInterface, "Activation"); | 
|  | 114 |  | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 115 | if (imageProp == readyPro && isUSBCodeUpdate) | 
|  | 116 | { | 
|  | 117 | setApplyTime(); | 
|  | 118 | setRequestedActivation(path.str); | 
|  | 119 | event.exit(0); | 
|  | 120 | } | 
|  | 121 | } | 
|  | 122 | catch (const std::exception& e) | 
|  | 123 | { | 
|  | 124 | lg2::error("Failed in getting Activation status, ERROR:{ERROR}", | 
|  | 125 | "ERROR", e.what()); | 
|  | 126 | } | 
|  | 127 | } | 
|  | 128 | } | 
|  | 129 |  | 
| George Liu | 073a653 | 2021-10-25 14:40:03 +0800 | [diff] [blame] | 130 | } // namespace usb | 
| George Liu | 5107c45 | 2021-11-09 20:06:31 +0800 | [diff] [blame] | 131 | } // namespace phosphor |