1 #pragma once 2 3 #include "utils.hpp" 4 5 #include <phosphor-logging/lg2.hpp> 6 #include <sdeventplus/event.hpp> 7 8 #include <filesystem> 9 10 namespace phosphor 11 { 12 namespace usb 13 { 14 namespace fs = std::filesystem; 15 namespace MatchRules = sdbusplus::bus::match::rules; 16 17 class USBManager 18 { 19 public: 20 ~USBManager() = default; 21 USBManager() = delete; 22 USBManager(const USBManager&) = delete; 23 USBManager(USBManager&&) = default; 24 USBManager& operator=(const USBManager&) = delete; 25 USBManager& operator=(USBManager&&) = delete; 26 27 explicit USBManager(sdbusplus::bus_t& bus, sdeventplus::Event& event, 28 const fs::path& devPath, const fs::path& usbPath) : 29 bus(bus), 30 event(event), devicePath(devPath), usbPath(usbPath), 31 isUSBCodeUpdate(false), 32 fwUpdateMatcher(bus, 33 MatchRules::interfacesAdded() + 34 MatchRules::path("/xyz/openbmc_project/software"), 35 std::bind(std::mem_fn(&USBManager::updateActivation), 36 this, std::placeholders::_1)) 37 { 38 if (!run()) 39 { 40 lg2::error("Failed to FW Update via USB, usbPath:{USBPATH}", 41 "USBPATH", usbPath); 42 event.exit(0); 43 } 44 45 isUSBCodeUpdate = true; 46 } 47 48 /** @brief Find the first file with a .tar extension according to the USB 49 * file path. 50 * 51 * @return Success or Fail 52 */ 53 bool run(); 54 55 /** @brief Creates an Activation D-Bus object. 56 * 57 * @param[in] msg - Data associated with subscribed signal 58 */ 59 void updateActivation(sdbusplus::message_t& msg); 60 61 /** @brief Set Apply Time to OnReset. 62 * 63 */ 64 void setApplyTime(); 65 66 /** @brief Method to set the RequestedActivation D-Bus property. 67 * 68 * @param[in] path - Update the object path of the firmware 69 */ 70 void setRequestedActivation(const std::string& path); 71 72 private: 73 /** @brief Persistent sdbusplus DBus bus connection. */ 74 sdbusplus::bus_t& bus; 75 76 /** sd event handler. */ 77 sdeventplus::Event& event; 78 79 /** The USB device path. */ 80 const fs::path& devicePath; 81 82 /** The USB mount path. */ 83 const fs::path& usbPath; 84 85 /** Indicates whether USB codeupdate is going on. */ 86 bool isUSBCodeUpdate; 87 88 /** sdbusplus signal match for new image. */ 89 sdbusplus::bus::match_t fwUpdateMatcher; 90 }; 91 92 } // namespace usb 93 } // namespace phosphor 94