blob: 3213af4ab7b93f3c6a365fc35879c10acd85d390 [file] [log] [blame]
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -05001#pragma once
2
3#include "tool_utils.hpp"
4
5#include <nlohmann/json.hpp>
6
7#include <optional>
8#include <string>
9
10namespace vpd
11{
12/**
13 * @brief Class to support operations on VPD.
14 *
15 * The class provides API's to,
16 * Read keyword value from DBus/hardware.
17 * Update keyword value to DBus/hardware.
18 * Dump DBus object's critical information.
19 * Fix system VPD if any mismatch between DBus and hardware data.
20 * Reset specific system VPD keywords to its default value.
21 * Force VPD collection for hardware.
22 */
23class VpdTool
24{
25 private:
26 /**
27 * @brief Get specific properties of a FRU in JSON format.
28 *
29 * For a given object path of a FRU, this API returns the following
30 * properties of the FRU in JSON format:
31 * - Pretty Name, Location Code, Sub Model
32 * - SN, PN, CC, FN, DR keywords under VINI record.
33 *
34 * @param[in] i_objectPath - DBus object path
35 *
36 * @return On success, returns the properties of the FRU in JSON format,
37 * otherwise returns an empty JSON.
38 * If FRU's "Present" property is false, this API returns an empty JSON.
39 * Note: The caller of this API should handle empty JSON.
40 *
Souvik Roy549d0902025-01-22 02:37:37 -060041 * @throw json::exception, std::out_of_range, std::bad_alloc
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -050042 */
43 nlohmann::json getFruProperties(const std::string& i_objectPath) const;
44
45 /**
46 * @brief Get any inventory property in JSON.
47 *
48 * API to get any property of a FRU in JSON format. Given an object path,
49 * interface and property name, this API does a D-Bus read property on PIM
50 * to get the value of that property and returns it in JSON format. This API
51 * returns empty JSON in case of failure. The caller of the API must check
52 * for empty JSON.
53 *
54 * @param[in] i_objectPath - DBus object path
55 * @param[in] i_interface - Interface name
56 * @param[in] i_propertyName - Property name
57 *
58 * @return On success, returns the property and its value in JSON format,
59 * otherwise return empty JSON.
60 * {"SN" : "ABCD"}
61 */
62 template <typename PropertyType>
63 nlohmann::json getInventoryPropertyJson(
64 const std::string& i_objectPath, const std::string& i_interface,
65 const std::string& i_propertyName) const noexcept;
66
67 /**
68 * @brief Get the "type" property for a FRU.
69 *
70 * Given a FRU path, and parsed System Config JSON, this API returns the
71 * "type" property for the FRU in JSON format. This API gets
72 * these properties from Phosphor Inventory Manager.
73 *
74 * @param[in] i_objectPath - DBus object path.
75 *
76 * @return On success, returns the "type" property in JSON
77 * format, otherwise returns empty JSON. The caller of this API should
78 * handle empty JSON.
79 */
80 nlohmann::json
81 getFruTypeProperty(const std::string& i_objectPath) const noexcept;
82
83 /**
84 * @brief Check if a FRU is present in the system.
85 *
86 * Given a FRU's object path, this API checks if the FRU is present in the
87 * system by reading the "Present" property of the FRU.
88 *
89 * @param[in] i_objectPath - DBus object path.
90 *
91 * @return true if FRU's "Present" property is true, false otherwise.
92 */
93 bool isFruPresent(const std::string& i_objectPath) const noexcept;
94
95 /**
96 * @brief An API to get backup-restore config JSON of the system.
97 *
98 * API gets this file by prasing system config JSON file and reading
99 * backupRestoreConfigPath tag.
100 *
101 * @return On success returns valid JSON object, otherwise returns empty
102 * JSON object.
103 *
104 * Note: The caller of this API should verify, is received JSON object is
105 * empty or not.
106 */
107 nlohmann::json getBackupRestoreCfgJsonObj() const noexcept;
108
109 /**
110 * @brief Prints the user options for fix system VPD command.
111 *
112 * @param[in] i_option - Option to use.
113 */
114 void printFixSystemVpdOption(
115 const types::UserOption& i_option) const noexcept;
116
117 /**
118 * @brief API to update source and destination keyword's value.
119 *
120 * API fetches source and destination keyword's value,
121 * for each keyword entries found in the input JSON object and updates the
122 * JSON object. If the path(source / destination) in JSON object is
123 * inventory object path, API sends the request to Inventory.Manager DBus
124 * service. Otherwise if its a hardware path, API sends the request to
125 * vpd-manager DBus service to get the keyword's value.
126 *
127 * @param[in,out] io_parsedJsonObj - Parsed JSON object.
128 *
129 * @return true on success, false in case of any error.
130 */
131 bool fetchKeywordInfo(nlohmann::json& io_parsedJsonObj) const noexcept;
132
133 /**
134 * @brief API to print system VPD keyword's information.
135 *
136 * The API prints source and destination keyword's information in the table
137 * format, found in the JSON object.
138 *
139 * @param[in] i_parsedJsonObj - Parsed JSON object.
140 */
141 void printSystemVpd(const nlohmann::json& i_parsedJsonObj) const noexcept;
142
143 /**
144 * @brief API to update keyword's value.
145 *
146 * API iterates the given JSON object for all record-keyword pairs, if there
147 * is any mismatch between source and destination keyword's value, API calls
148 * the utils::writeKeyword API to update keyword's value.
149 *
150 * Note: writeKeyword API, internally updates primary, backup, redundant
151 * EEPROM paths(if exists) with the given keyword's value.
152 *
153 * @param i_parsedJsonObj - Parsed JSON object.
154 * @param i_useBackupData - Specifies whether to use source or destination
155 * keyword's value to update the keyword's value.
156 *
157 * @return On success return 0, otherwise return -1.
158 */
159 int updateAllKeywords(const nlohmann::json& i_parsedJsonObj,
160 bool i_useBackupData) const noexcept;
161
162 /**
163 * @brief API to handle more option for fix system VPD command.
164 *
165 * @param i_parsedJsonObj - Parsed JSON object.
166 *
167 * @return On success return 0, otherwise return -1.
168 */
169 int handleMoreOption(const nlohmann::json& i_parsedJsonObj) const noexcept;
170
171 public:
172 /**
173 * @brief Read keyword value.
174 *
175 * API to read VPD keyword's value from the given input path.
176 * If the provided i_onHardware option is true, read keyword's value from
177 * the hardware. Otherwise read keyword's value from DBus.
178 *
179 * @param[in] i_vpdPath - DBus object path or EEPROM path.
180 * @param[in] i_recordName - Record name.
181 * @param[in] i_keywordName - Keyword name.
182 * @param[in] i_onHardware - True if i_vpdPath is EEPROM path, false
183 * otherwise.
184 * @param[in] i_fileToSave - File path to save keyword's value, if not given
185 * result will redirect to a console.
186 *
187 * @return On success return 0, otherwise return -1.
188 */
189 int readKeyword(const std::string& i_vpdPath,
190 const std::string& i_recordName,
191 const std::string& i_keywordName, const bool i_onHardware,
192 const std::string& i_fileToSave = {});
193
194 /**
195 * @brief Dump the given inventory object in JSON format to console.
196 *
197 * For a given object path of a FRU, this API dumps the following properties
198 * of the FRU in JSON format to console:
199 * - Pretty Name, Location Code, Sub Model
200 * - SN, PN, CC, FN, DR keywords under VINI record.
201 * If the FRU's "Present" property is not true, the above properties are not
202 * dumped to console.
203 *
204 * @param[in] i_fruPath - DBus object path.
205 *
206 * @return On success returns 0, otherwise returns -1.
207 */
208 int dumpObject(std::string i_fruPath) const noexcept;
209
210 /**
211 * @brief API to fix system VPD keywords.
212 *
213 * The API to fix the system VPD keywords. Mainly used when there
214 * is a mismatch between the primary and backup(secondary) VPD. User can
215 * choose option to update all primary keywords value with corresponding
216 * backup keywords value or can choose primary keyword value to sync
217 * secondary VPD. Otherwise, user can also interactively choose different
218 * action for individual keyword.
219 *
220 * @return On success returns 0, otherwise returns -1.
221 */
222 int fixSystemVpd() const noexcept;
223
224 /**
225 * @brief Write keyword's value.
226 *
227 * API to update VPD keyword's value to the given input path.
228 * If i_onHardware value in true, i_vpdPath is considered has hardware path
229 * otherwise it will be considered as DBus object path.
230 *
231 * For provided DBus object path both primary path or secondary path will
232 * get updated, also redundant EEPROM(if any) path with new keyword's value.
233 *
234 * In case of hardware path, only given hardware path gets updated with new
235 * keyword’s value, any backup or redundant EEPROM (if exists) paths won't
236 * get updated.
237 *
238 * @param[in] i_vpdPath - DBus object path or EEPROM path.
239 * @param[in] i_recordName - Record name.
240 * @param[in] i_keywordName - Keyword name.
241 * @param[in] i_keywordValue - Keyword value.
242 * @param[in] i_onHardware - True if i_vpdPath is EEPROM path, false
243 * otherwise.
244 *
245 * @return On success returns 0, otherwise returns -1.
246 */
247 int writeKeyword(std::string i_vpdPath, const std::string& i_recordName,
248 const std::string& i_keywordName,
249 const std::string& i_keywordValue,
250 const bool i_onHardware) noexcept;
251
252 /**
253 * @brief Reset specific keywords on System VPD to default value.
254 *
255 * This API resets specific System VPD keywords to default value. The
256 * keyword values are reset on:
257 * 1. Primary EEPROM path.
258 * 2. Secondary EEPROM path.
259 * 3. D-Bus cache.
260 * 4. Backup path.
261 *
262 * @return On success returns 0, otherwise returns -1.
263 */
264 int cleanSystemVpd() const noexcept;
265
266 /**
267 * @brief Dump all the inventory objects in JSON or table format to console.
268 *
269 * This API dumps specific properties of all the inventory objects to
270 * console in JSON or table format to console. The inventory object paths
271 * are extracted from PIM. For each object, the following properties are
272 * dumped to console:
273 * - Present property, Pretty Name, Location Code, Sub Model
274 * - SN, PN, CC, FN, DR keywords under VINI record.
275 * If the "Present" property of a FRU is false, the FRU is not dumped to
276 * console.
277 * FRUs whose object path end in "unit([0-9][0-9]?)" are also not dumped to
278 * console.
279 *
280 * @param[in] i_dumpTable - Flag which specifies if the inventory should be
281 * dumped in table format or not.
282 *
283 * @return On success returns 0, otherwise returns -1.
284 */
285 int dumpInventory(bool i_dumpTable = false) const noexcept;
286};
287} // namespace vpd