blob: 51a70243be140db10151471c90f4fe95f9f1eef8 [file] [log] [blame]
Saqib Khance148702017-06-11 12:01:58 -05001#pragma once
2
Gunnar Millsf6ed5892018-09-07 17:08:02 -05003#include "config.h"
4
Saqib Khance148702017-06-11 12:01:58 -05005#include "xyz/openbmc_project/Common/FilePath/server.hpp"
Saqib Khan7f80e0b2017-10-22 11:29:07 -05006#include "xyz/openbmc_project/Object/Delete/server.hpp"
Gunnar Millsf6ed5892018-09-07 17:08:02 -05007#include "xyz/openbmc_project/Software/Version/server.hpp"
8
9#include <sdbusplus/bus.hpp>
Brad Bishop8facccf2020-11-04 09:44:58 -050010
Andrew Geisslerab139ce2020-05-16 13:22:09 -050011#include <string>
Saqib Khance148702017-06-11 12:01:58 -050012
13namespace openpower
14{
15namespace software
16{
17namespace updater
18{
19
Leonel Gonzalez9c8adfa2017-07-12 11:08:40 -050020class ItemUpdater;
21
Saqib Khan7f80e0b2017-10-22 11:29:07 -050022typedef std::function<void(std::string)> eraseFunc;
23
Saqib Khance148702017-06-11 12:01:58 -050024using VersionInherit = sdbusplus::server::object::object<
Adriana Kobylak70dcb632018-02-27 15:46:52 -060025 sdbusplus::xyz::openbmc_project::Software::server::Version,
26 sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
Saqib Khan7f80e0b2017-10-22 11:29:07 -050027using DeleteInherit = sdbusplus::server::object::object<
Adriana Kobylak70dcb632018-02-27 15:46:52 -060028 sdbusplus::xyz::openbmc_project::Object::server::Delete>;
Saqib Khan7f80e0b2017-10-22 11:29:07 -050029
30namespace sdbusRule = sdbusplus::bus::match::rules;
31
32class Delete;
33class Version;
34
35/** @class Delete
36 * @brief OpenBMC Delete implementation.
37 * @details A concrete implementation for xyz.openbmc_project.Object.Delete
38 * D-Bus API.
Adriana Kobylak70dcb632018-02-27 15:46:52 -060039 */
Saqib Khan7f80e0b2017-10-22 11:29:07 -050040class Delete : public DeleteInherit
41{
Adriana Kobylak70dcb632018-02-27 15:46:52 -060042 public:
43 /** @brief Constructs Delete.
44 *
45 * @param[in] bus - The D-Bus bus object
46 * @param[in] path - The D-Bus object path
47 * @param[in] parent - Parent object.
48 */
49 Delete(sdbusplus::bus::bus& bus, const std::string& path, Version& parent) :
Albert Zhang7f1967d2020-03-02 14:12:08 +080050 DeleteInherit(bus, path.c_str(), action::emit_interface_added),
51 parent(parent)
Brad Bishop8facccf2020-11-04 09:44:58 -050052 {}
Saqib Khan7f80e0b2017-10-22 11:29:07 -050053
Adriana Kobylak70dcb632018-02-27 15:46:52 -060054 /**
55 * @brief Delete the D-Bus object.
56 * Overrides the default delete function by calling
57 * Version class erase Method.
58 **/
59 void delete_() override;
Saqib Khan7f80e0b2017-10-22 11:29:07 -050060
Adriana Kobylak70dcb632018-02-27 15:46:52 -060061 private:
62 /** @brief Parent Object. */
63 Version& parent;
Saqib Khan7f80e0b2017-10-22 11:29:07 -050064};
Saqib Khance148702017-06-11 12:01:58 -050065
66/** @class Version
67 * @brief OpenBMC version software management implementation.
68 * @details A concrete implementation for xyz.openbmc_project.Software.Version
Gunnar Millsb78dfa52017-09-21 16:05:22 -050069 * D-Bus API.
Saqib Khance148702017-06-11 12:01:58 -050070 */
71class Version : public VersionInherit
72{
Adriana Kobylak70dcb632018-02-27 15:46:52 -060073 public:
74 /** @brief Constructs Version Software Manager.
75 *
76 * @param[in] bus - The D-Bus bus object
77 * @param[in] objPath - The D-Bus object path
78 * @param[in] parent - Parent object.
79 * @param[in] versionId - The version Id
80 * @param[in] versionString - The version string
81 * @param[in] versionPurpose - The version purpose
82 * @param[in] filePath - The image filesystem path
83 * @param[in] callback - The eraseFunc callback
84 */
85 Version(sdbusplus::bus::bus& bus, const std::string& objPath,
86 ItemUpdater& parent, const std::string& versionId,
87 const std::string& versionString, VersionPurpose versionPurpose,
88 const std::string& filePath, eraseFunc callback) :
89 VersionInherit(bus, (objPath).c_str(), true),
Lei YU1db9adf2019-03-05 16:02:31 +080090 eraseCallback(callback), bus(bus), objPath(objPath), parent(parent),
91 versionId(versionId), versionStr(versionString),
Adriana Kobylak70dcb632018-02-27 15:46:52 -060092 chassisStateSignals(
93 bus,
94 sdbusRule::type::signal() + sdbusRule::member("PropertiesChanged") +
95 sdbusRule::path(CHASSIS_STATE_PATH) +
96 sdbusRule::argN(0, CHASSIS_STATE_OBJ) +
97 sdbusRule::interface(SYSTEMD_PROPERTY_INTERFACE),
98 std::bind(std::mem_fn(&Version::updateDeleteInterface), this,
99 std::placeholders::_1))
100 {
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600101 // Set properties.
102 purpose(versionPurpose);
103 version(versionString);
104 path(filePath);
Saqib Khance148702017-06-11 12:01:58 -0500105
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600106 // Emit deferred signal.
107 emit_object_added();
108 }
Saqib Khan167601b2017-06-18 23:33:46 -0500109
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600110 /**
111 * @brief Update the Object.Delete interface for this activation
112 *
113 * Update the delete interface based on whether or not this
114 * activation is currently functional. A functional activation
115 * will have no Object.Delete, while a non-functional activation
116 * will have one.
117 *
118 * @param[in] msg - Data associated with subscribed signal
119 */
120 void updateDeleteInterface(sdbusplus::message::message& msg);
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500121
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600122 /**
123 * @brief Read the manifest file to get the value of the key.
124 *
125 * @param[in] filePath - The path to the file which contains the value
126 * of keys.
127 * @param[in] keys - A map of keys with empty values.
128 *
129 * @return The map of keys with filled values.
130 **/
131 static std::map<std::string, std::string>
132 getValue(const std::string& filePath,
133 std::map<std::string, std::string> keys);
Saqib Khan167601b2017-06-18 23:33:46 -0500134
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600135 /**
Lei YUdec8cf92019-02-21 17:47:05 +0800136 * @brief Get version and extended version from VERSION partition string.
137 *
138 * @param[in] versionPart - The string containing the VERSION partition.
139 *
140 * @return The pair contains the version and extended version.
141 **/
142 static std::pair<std::string, std::string>
143 getVersions(const std::string& versionPart);
144
145 /**
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600146 * @brief Calculate the version id from the version string.
147 *
148 * @details The version id is a unique 8 hexadecimal digit id
149 * calculated from the version string.
150 *
151 * @param[in] version - The image version string (e.g. v1.99.10-19).
152 *
153 * @return The id.
154 */
155 static std::string getId(const std::string& version);
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500156
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600157 /** @brief Persistent Delete D-Bus object */
158 std::unique_ptr<Delete> deleteObject;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500159
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600160 /** @brief The parent's erase callback. */
161 eraseFunc eraseCallback;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500162
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600163 private:
164 /** @brief Persistent sdbusplus DBus bus connection */
165 sdbusplus::bus::bus& bus;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500166
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600167 /** @brief Persistent DBus object path */
168 std::string objPath;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500169
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600170 /** @brief Parent Object. */
171 ItemUpdater& parent;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500172
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600173 /** @brief This Version's version Id */
174 const std::string versionId;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500175
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600176 /** @brief This Version's version string */
177 const std::string versionStr;
Saqib Khan7f80e0b2017-10-22 11:29:07 -0500178
Adriana Kobylak70dcb632018-02-27 15:46:52 -0600179 /** @brief Used to subscribe to chassis power state changes **/
180 sdbusplus::bus::match_t chassisStateSignals;
Saqib Khance148702017-06-11 12:01:58 -0500181};
182
183} // namespace updater
184} // namespace software
185} // namespace openpower