| #pragma once |
| |
| #include "config.h" |
| |
| #include <sdbusplus/async.hpp> |
| #include <xyz/openbmc_project/Software/Update/server.hpp> |
| |
| #include <random> |
| #include <string> |
| #include <tuple> |
| |
| namespace phosphor::software::updater |
| { |
| class ItemUpdater; |
| } |
| |
| namespace phosphor::software::update |
| { |
| |
| using UpdateIntf = sdbusplus::server::object_t< |
| sdbusplus::xyz::openbmc_project::Software::server::Update>; |
| using ItemUpdaterIntf = phosphor::software::updater::ItemUpdater; |
| |
| using ApplyTimeIntf = |
| sdbusplus::common::xyz::openbmc_project::software::ApplyTime; |
| |
| /** @class Manager |
| * @brief Processes the image file from update D-Bus interface. |
| * @details The update manager class handles software updates and manages |
| * software info through version and activation objects. |
| */ |
| class Manager : public UpdateIntf |
| { |
| public: |
| /** @brief Constructs Manager Class |
| * |
| * @param[in] bus - The Dbus bus object |
| */ |
| explicit Manager(sdbusplus::async::context& ctx, const std::string& path, |
| ItemUpdaterIntf& itemUpdater) : |
| UpdateIntf(ctx.get_bus(), path.c_str(), UpdateIntf::action::defer_emit), |
| ctx(ctx), itemUpdater(itemUpdater) |
| { |
| emit_object_added(); |
| } |
| |
| private: |
| /** @brief Implementation for StartUpdate |
| * Start a firware update to be performed asynchronously. |
| */ |
| sdbusplus::message::object_path |
| startUpdate(sdbusplus::message::unix_fd image, |
| ApplyTimeIntf::RequestedApplyTimes applyTime) override; |
| |
| /* @brief Process the image supplied via image fd */ |
| auto processImage(sdbusplus::message::unix_fd image, |
| ApplyTimeIntf::RequestedApplyTimes applyTime, |
| std::string id, |
| std::string objPath) -> sdbusplus::async::task<>; |
| |
| /* @brief The handler for the image processing failure */ |
| void processImageFailed(sdbusplus::message::unix_fd image, std::string& id); |
| |
| /** @brief The random generator for the software id */ |
| std::mt19937 randomGen{static_cast<unsigned>( |
| std::chrono::system_clock::now().time_since_epoch().count())}; |
| |
| /** @brief D-Bus context */ |
| sdbusplus::async::context& ctx; |
| /** @brief item_updater reference */ |
| ItemUpdaterIntf& itemUpdater; |
| /** @brief State whether update is in progress */ |
| bool updateInProgress = false; |
| }; |
| |
| } // namespace phosphor::software::update |