1 #pragma once
2 
3 #include <sdbusplus/server.hpp>
4 #include "activation.hpp"
5 #include "version.hpp"
6 
7 namespace phosphor
8 {
9 namespace software
10 {
11 namespace updater
12 {
13 
14 namespace MatchRules = sdbusplus::bus::match::rules;
15 
16 /** @class ItemUpdater
17  *  @brief Manages the activation of the BMC version items.
18  */
19 class ItemUpdater
20 {
21     public:
22         ItemUpdater() = delete;
23         ~ItemUpdater() = default;
24         ItemUpdater(const ItemUpdater&) = delete;
25         ItemUpdater& operator=(const ItemUpdater&) = delete;
26         ItemUpdater(ItemUpdater&&) = delete;
27         ItemUpdater& operator=(ItemUpdater&&) = delete;
28 
29         /*
30          * @brief Types of Activation status for image validation.
31          */
32         enum class ActivationStatus
33         {
34             ready,
35             invalid,
36             active
37         };
38 
39         /** @brief Constructs ItemUpdater
40          *
41          * @param[in] bus    - The Dbus bus object
42          */
43         ItemUpdater(sdbusplus::bus::bus& bus) :
44                     bus(bus),
45                     versionMatch(
46                             bus,
47                             MatchRules::interfacesAdded() +
48                             MatchRules::path("/xyz/openbmc_project/software"),
49                             std::bind(
50                                     std::mem_fn(&ItemUpdater::createActivation),
51                                     this,
52                                     std::placeholders::_1))
53         {
54             processBMCImage();
55         };
56 
57     /** @brief Sets the given priority free by incrementing
58      *  any existing priority with the same value by 1
59      *
60      *  @param[in] value - The priority that needs to be set free.
61      *
62      *  @return None
63      */
64     void freePriority(uint8_t value);
65 
66     /**
67      * @brief Create and populate the active BMC Version.
68      */
69     void processBMCImage();
70 
71     private:
72         /** @brief Callback function for Software.Version match.
73          *  @details Creates an Activation dbus object.
74          *
75          * @param[in]  msg       - Data associated with subscribed signal
76          */
77         void createActivation(sdbusplus::message::message& msg);
78 
79         /**
80          * @brief Validates the presence of SquashFS iamge in the image dir.
81          *
82          * @param[in]  filePath  - The path to the image dir.
83          * @param[out] result    - ActivationStatus Enum.
84          *                         ready if validation was successful.
85          *                         invalid if validation fail.
86          *                         active if image is the current version.
87          *
88          */
89         ActivationStatus validateSquashFSImage(const std::string& filePath);
90 
91         /** @brief Persistent sdbusplus DBus bus connection. */
92         sdbusplus::bus::bus& bus;
93 
94         /** @brief Persistent map of Activation dbus objects and their
95           * version id */
96         std::map<std::string, std::unique_ptr<Activation>> activations;
97 
98         /** @brief Persistent map of Version dbus objects and their
99           * version id */
100         std::map<std::string, std::unique_ptr<phosphor::software::
101             manager::Version>> versions;
102 
103         /** @brief sdbusplus signal match for Software.Version */
104         sdbusplus::bus::match_t versionMatch;
105 
106 };
107 
108 
109 
110 } // namespace updater
111 } // namespace software
112 } // namespace phosphor
113