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