1 #pragma once
2 
3 #include "config.h"
4 
5 #include <sdbusplus/async.hpp>
6 #include <xyz/openbmc_project/Software/Update/server.hpp>
7 
8 #include <random>
9 #include <string>
10 #include <tuple>
11 
12 namespace phosphor::software::updater
13 {
14 class ItemUpdater;
15 }
16 
17 namespace phosphor::software::update
18 {
19 
20 using UpdateIntf = sdbusplus::server::object_t<
21     sdbusplus::xyz::openbmc_project::Software::server::Update>;
22 using ItemUpdaterIntf = phosphor::software::updater::ItemUpdater;
23 
24 using ApplyTimeIntf =
25     sdbusplus::common::xyz::openbmc_project::software::ApplyTime;
26 
27 /** @class Manager
28  *  @brief Processes the image file from update D-Bus interface.
29  *  @details The update manager class handles software updates and manages
30  * software info through version and activation objects.
31  */
32 class Manager : public UpdateIntf
33 {
34   public:
35     /** @brief Constructs Manager Class
36      *
37      * @param[in] bus - The Dbus bus object
38      */
Manager(sdbusplus::async::context & ctx,const std::string & path,ItemUpdaterIntf & itemUpdater)39     explicit Manager(sdbusplus::async::context& ctx, const std::string& path,
40                      ItemUpdaterIntf& itemUpdater) :
41         UpdateIntf(ctx.get_bus(), path.c_str(), UpdateIntf::action::defer_emit),
42         ctx(ctx), itemUpdater(itemUpdater)
43     {
44         emit_object_added();
45     }
46 
47   private:
48     /** @brief Implementation for StartUpdate
49      *  Start a firware update to be performed asynchronously.
50      */
51     sdbusplus::message::object_path
52         startUpdate(sdbusplus::message::unix_fd image,
53                     ApplyTimeIntf::RequestedApplyTimes applyTime) override;
54 
55     /* @brief Process the image supplied via image fd */
56     auto processImage(sdbusplus::message::unix_fd image,
57                       ApplyTimeIntf::RequestedApplyTimes applyTime,
58                       std::string id,
59                       std::string objPath) -> sdbusplus::async::task<>;
60 
61     /* @brief The handler for the image processing failure  */
62     void processImageFailed(sdbusplus::message::unix_fd image, std::string& id);
63 
64     /** @brief The random generator for the software id */
65     std::mt19937 randomGen{static_cast<unsigned>(
66         std::chrono::system_clock::now().time_since_epoch().count())};
67 
68     /** @brief D-Bus context */
69     sdbusplus::async::context& ctx;
70     /** @brief item_updater reference */
71     ItemUpdaterIntf& itemUpdater;
72     /** @brief State whether update is in progress */
73     bool updateInProgress = false;
74 };
75 
76 } // namespace phosphor::software::update
77