blob: e67115c8ca61d6dcc8609493135186c53c1bef7a [file] [log] [blame]
George Liu073a6532021-10-25 14:40:03 +08001#pragma once
2
George Liu5107c452021-11-09 20:06:31 +08003#include "utils.hpp"
4
George Liu073a6532021-10-25 14:40:03 +08005#include <phosphor-logging/lg2.hpp>
George Liu5107c452021-11-09 20:06:31 +08006#include <sdeventplus/event.hpp>
George Liu073a6532021-10-25 14:40:03 +08007
8#include <filesystem>
9
10namespace phosphor
11{
12namespace usb
13{
14namespace fs = std::filesystem;
George Liu5107c452021-11-09 20:06:31 +080015namespace MatchRules = sdbusplus::bus::match::rules;
George Liu073a6532021-10-25 14:40:03 +080016
17class 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&&) = default;
26
George Liu5107c452021-11-09 20:06:31 +080027 explicit USBManager(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
28 const fs::path& path) :
29 bus(bus),
30 event(event), usbPath(path), 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 }
George Liu073a6532021-10-25 14:40:03 +080046
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
George Liu5107c452021-11-09 20:06:31 +080054 /** @brief Creates an Activation D-Bus object.
55 *
56 * @param[in] msg - Data associated with subscribed signal
57 */
58 void updateActivation(sdbusplus::message::message& 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
George Liu073a6532021-10-25 14:40:03 +080071 private:
George Liu5107c452021-11-09 20:06:31 +080072 /** @brief Persistent sdbusplus DBus bus connection. */
73 sdbusplus::bus::bus& bus;
74
75 /** sd event handler. */
76 sdeventplus::Event& event;
77
George Liu073a6532021-10-25 14:40:03 +080078 /** The USB path detected. */
79 const fs::path& usbPath;
George Liu5107c452021-11-09 20:06:31 +080080
81 /** Indicates whether USB codeupdate is going on. */
82 bool isUSBCodeUpdate;
83
84 /** sdbusplus signal match for new image. */
85 sdbusplus::bus::match_t fwUpdateMatcher;
George Liu073a6532021-10-25 14:40:03 +080086};
87
88} // namespace usb
89} // namespace phosphor