#pragma once #include "utils.hpp" #include #include #include #include namespace phosphor { namespace usb { namespace fs = std::filesystem; namespace MatchRules = sdbusplus::bus::match::rules; class USBManager { public: ~USBManager() = default; USBManager() = delete; USBManager(const USBManager&) = delete; USBManager(USBManager&&) = default; USBManager& operator=(const USBManager&) = delete; USBManager& operator=(USBManager&&) = delete; #ifdef START_UPDATE_DBUS_INTEFACE explicit USBManager(sdbusplus::async::context& ctx, const fs::path& devPath, const fs::path& usbPath) : ctx(ctx), devicePath(devPath), usbPath(usbPath) { ctx.spawn(run()); } /** @brief Run the USBManager */ auto run() -> sdbusplus::async::task; private: /** @brief D-Bus context. */ sdbusplus::async::context& ctx; /** @brief Starts the firmware update. * @param[in] fd - The file descriptor of the image to update. * @return Success or Fail */ auto startUpdate(int fd) -> sdbusplus::async::task; #else explicit USBManager(sdbusplus::bus_t& bus, sdeventplus::Event& event, const fs::path& devPath, const fs::path& usbPath) : bus(bus), event(event), isUSBCodeUpdate(false), fwUpdateMatcher(bus, MatchRules::interfacesAdded() + MatchRules::path("/xyz/openbmc_project/software"), std::bind(std::mem_fn(&USBManager::updateActivation), this, std::placeholders::_1)), devicePath(devPath), usbPath(usbPath) { if (!run()) { lg2::error("Failed to FW Update via USB, usbPath:{USBPATH}", "USBPATH", usbPath); event.exit(0); } isUSBCodeUpdate = true; } /** @brief Find the first file with a .tar extension according to the USB * file path. * * @return Success or Fail */ bool run(); private: /** @brief Persistent sdbusplus DBus bus connection. */ sdbusplus::bus_t& bus; /** sd event handler. */ sdeventplus::Event& event; /** Indicates whether USB codeupdate is going on. */ bool isUSBCodeUpdate; /** sdbusplus signal match for new image. */ sdbusplus::bus::match_t fwUpdateMatcher; /** @brief Creates an Activation D-Bus object. * * @param[in] msg - Data associated with subscribed signal */ void updateActivation(sdbusplus::message_t& msg); /** @brief Set Apply Time to OnReset. * */ void setApplyTime(); /** @brief Method to set the RequestedActivation D-Bus property. * * @param[in] path - Update the object path of the firmware */ void setRequestedActivation(const std::string& path); #endif /* START_UPDATE_DBUS_INTEFACE */ /** @brief Find the first file with a .tar extension according to the USB * file path and copy to IMG_UPLOAD_DIR * * @return Success or Fail */ bool copyImage(); /** The USB device path. */ const fs::path& devicePath; /** The USB mount path. */ const fs::path& usbPath; /** The destination path for copied over image file */ fs::path imageDstPath; }; } // namespace usb } // namespace phosphor