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),
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