1*fa5e4d32SSunny Srivastava #include "backup_restore.hpp"
2*fa5e4d32SSunny Srivastava
3*fa5e4d32SSunny Srivastava #include "constants.hpp"
4*fa5e4d32SSunny Srivastava #include "event_logger.hpp"
5*fa5e4d32SSunny Srivastava #include "exceptions.hpp"
6*fa5e4d32SSunny Srivastava #include "logger.hpp"
7*fa5e4d32SSunny Srivastava #include "parser.hpp"
8*fa5e4d32SSunny Srivastava #include "types.hpp"
9*fa5e4d32SSunny Srivastava
10*fa5e4d32SSunny Srivastava #include <utility/json_utility.hpp>
11*fa5e4d32SSunny Srivastava #include <utility/vpd_specific_utility.hpp>
12*fa5e4d32SSunny Srivastava
13*fa5e4d32SSunny Srivastava namespace vpd
14*fa5e4d32SSunny Srivastava {
15*fa5e4d32SSunny Srivastava BackupAndRestoreStatus BackupAndRestore::m_backupAndRestoreStatus =
16*fa5e4d32SSunny Srivastava BackupAndRestoreStatus::NotStarted;
17*fa5e4d32SSunny Srivastava
BackupAndRestore(const nlohmann::json & i_sysCfgJsonObj)18*fa5e4d32SSunny Srivastava BackupAndRestore::BackupAndRestore(const nlohmann::json& i_sysCfgJsonObj) :
19*fa5e4d32SSunny Srivastava m_sysCfgJsonObj(i_sysCfgJsonObj)
20*fa5e4d32SSunny Srivastava {
21*fa5e4d32SSunny Srivastava std::string l_backupAndRestoreCfgFilePath =
22*fa5e4d32SSunny Srivastava i_sysCfgJsonObj.value("backupRestoreConfigPath", "");
23*fa5e4d32SSunny Srivastava try
24*fa5e4d32SSunny Srivastava {
25*fa5e4d32SSunny Srivastava m_backupAndRestoreCfgJsonObj =
26*fa5e4d32SSunny Srivastava jsonUtility::getParsedJson(l_backupAndRestoreCfgFilePath);
27*fa5e4d32SSunny Srivastava }
28*fa5e4d32SSunny Srivastava catch (const std::exception& ex)
29*fa5e4d32SSunny Srivastava {
30*fa5e4d32SSunny Srivastava logging::logMessage(
31*fa5e4d32SSunny Srivastava "Failed to intialize backup and restore object for file = " +
32*fa5e4d32SSunny Srivastava l_backupAndRestoreCfgFilePath);
33*fa5e4d32SSunny Srivastava throw(ex);
34*fa5e4d32SSunny Srivastava }
35*fa5e4d32SSunny Srivastava }
36*fa5e4d32SSunny Srivastava
37*fa5e4d32SSunny Srivastava std::tuple<types::VPDMapVariant, types::VPDMapVariant>
backupAndRestore()38*fa5e4d32SSunny Srivastava BackupAndRestore::backupAndRestore()
39*fa5e4d32SSunny Srivastava {
40*fa5e4d32SSunny Srivastava auto l_emptyVariantPair =
41*fa5e4d32SSunny Srivastava std::make_tuple(std::monostate{}, std::monostate{});
42*fa5e4d32SSunny Srivastava
43*fa5e4d32SSunny Srivastava if (m_backupAndRestoreStatus >= BackupAndRestoreStatus::Invoked)
44*fa5e4d32SSunny Srivastava {
45*fa5e4d32SSunny Srivastava logging::logMessage("Backup and restore invoked already.");
46*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
47*fa5e4d32SSunny Srivastava }
48*fa5e4d32SSunny Srivastava
49*fa5e4d32SSunny Srivastava m_backupAndRestoreStatus = BackupAndRestoreStatus::Invoked;
50*fa5e4d32SSunny Srivastava try
51*fa5e4d32SSunny Srivastava {
52*fa5e4d32SSunny Srivastava if (m_backupAndRestoreCfgJsonObj.empty() ||
53*fa5e4d32SSunny Srivastava !m_backupAndRestoreCfgJsonObj.contains("source") ||
54*fa5e4d32SSunny Srivastava !m_backupAndRestoreCfgJsonObj.contains("destination") ||
55*fa5e4d32SSunny Srivastava !m_backupAndRestoreCfgJsonObj.contains("type") ||
56*fa5e4d32SSunny Srivastava !m_backupAndRestoreCfgJsonObj.contains("backupMap"))
57*fa5e4d32SSunny Srivastava {
58*fa5e4d32SSunny Srivastava logging::logMessage(
59*fa5e4d32SSunny Srivastava "Backup restore config JSON is missing necessary tag(s), can't initiate backup and restore.");
60*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
61*fa5e4d32SSunny Srivastava }
62*fa5e4d32SSunny Srivastava
63*fa5e4d32SSunny Srivastava std::string l_srcVpdPath;
64*fa5e4d32SSunny Srivastava types::VPDMapVariant l_srcVpdVariant;
65*fa5e4d32SSunny Srivastava if (l_srcVpdPath = m_backupAndRestoreCfgJsonObj["source"].value(
66*fa5e4d32SSunny Srivastava "hardwarePath", "");
67*fa5e4d32SSunny Srivastava !l_srcVpdPath.empty() && std::filesystem::exists(l_srcVpdPath))
68*fa5e4d32SSunny Srivastava {
69*fa5e4d32SSunny Srivastava std::shared_ptr<Parser> l_vpdParser =
70*fa5e4d32SSunny Srivastava std::make_shared<Parser>(l_srcVpdPath, m_sysCfgJsonObj);
71*fa5e4d32SSunny Srivastava l_srcVpdVariant = l_vpdParser->parse();
72*fa5e4d32SSunny Srivastava }
73*fa5e4d32SSunny Srivastava else if (l_srcVpdPath = m_backupAndRestoreCfgJsonObj["source"].value(
74*fa5e4d32SSunny Srivastava "inventoryPath", "");
75*fa5e4d32SSunny Srivastava l_srcVpdPath.empty())
76*fa5e4d32SSunny Srivastava {
77*fa5e4d32SSunny Srivastava logging::logMessage(
78*fa5e4d32SSunny Srivastava "Couldn't extract source path, can't initiate backup and restore.");
79*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
80*fa5e4d32SSunny Srivastava }
81*fa5e4d32SSunny Srivastava
82*fa5e4d32SSunny Srivastava std::string l_dstVpdPath;
83*fa5e4d32SSunny Srivastava types::VPDMapVariant l_dstVpdVariant;
84*fa5e4d32SSunny Srivastava if (l_dstVpdPath = m_backupAndRestoreCfgJsonObj["destination"].value(
85*fa5e4d32SSunny Srivastava "hardwarePath", "");
86*fa5e4d32SSunny Srivastava !l_dstVpdPath.empty() && std::filesystem::exists(l_dstVpdPath))
87*fa5e4d32SSunny Srivastava {
88*fa5e4d32SSunny Srivastava std::shared_ptr<Parser> l_vpdParser =
89*fa5e4d32SSunny Srivastava std::make_shared<Parser>(l_dstVpdPath, m_sysCfgJsonObj);
90*fa5e4d32SSunny Srivastava l_dstVpdVariant = l_vpdParser->parse();
91*fa5e4d32SSunny Srivastava }
92*fa5e4d32SSunny Srivastava else if (l_dstVpdPath = m_backupAndRestoreCfgJsonObj["destination"]
93*fa5e4d32SSunny Srivastava .value("inventoryPath", "");
94*fa5e4d32SSunny Srivastava l_dstVpdPath.empty())
95*fa5e4d32SSunny Srivastava {
96*fa5e4d32SSunny Srivastava logging::logMessage(
97*fa5e4d32SSunny Srivastava "Couldn't extract destination path, can't initiate backup and restore.");
98*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
99*fa5e4d32SSunny Srivastava }
100*fa5e4d32SSunny Srivastava
101*fa5e4d32SSunny Srivastava // Implement backup and restore for IPZ type VPD
102*fa5e4d32SSunny Srivastava auto l_backupAndRestoreType =
103*fa5e4d32SSunny Srivastava m_backupAndRestoreCfgJsonObj.value("type", "");
104*fa5e4d32SSunny Srivastava if (l_backupAndRestoreType.compare("IPZ") == constants::STR_CMP_SUCCESS)
105*fa5e4d32SSunny Srivastava {
106*fa5e4d32SSunny Srivastava types::IPZVpdMap l_srcVpdMap;
107*fa5e4d32SSunny Srivastava if (auto l_srcVpdPtr =
108*fa5e4d32SSunny Srivastava std::get_if<types::IPZVpdMap>(&l_srcVpdVariant))
109*fa5e4d32SSunny Srivastava {
110*fa5e4d32SSunny Srivastava l_srcVpdMap = *l_srcVpdPtr;
111*fa5e4d32SSunny Srivastava }
112*fa5e4d32SSunny Srivastava else if (!std::holds_alternative<std::monostate>(l_srcVpdVariant))
113*fa5e4d32SSunny Srivastava {
114*fa5e4d32SSunny Srivastava logging::logMessage("Source VPD is not of IPZ type.");
115*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
116*fa5e4d32SSunny Srivastava }
117*fa5e4d32SSunny Srivastava
118*fa5e4d32SSunny Srivastava types::IPZVpdMap l_dstVpdMap;
119*fa5e4d32SSunny Srivastava if (auto l_dstVpdPtr =
120*fa5e4d32SSunny Srivastava std::get_if<types::IPZVpdMap>(&l_dstVpdVariant))
121*fa5e4d32SSunny Srivastava {
122*fa5e4d32SSunny Srivastava l_dstVpdMap = *l_dstVpdPtr;
123*fa5e4d32SSunny Srivastava }
124*fa5e4d32SSunny Srivastava else if (!std::holds_alternative<std::monostate>(l_dstVpdVariant))
125*fa5e4d32SSunny Srivastava {
126*fa5e4d32SSunny Srivastava logging::logMessage("Destination VPD is not of IPZ type.");
127*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
128*fa5e4d32SSunny Srivastava }
129*fa5e4d32SSunny Srivastava
130*fa5e4d32SSunny Srivastava backupAndRestoreIpzVpd(l_srcVpdMap, l_dstVpdMap, l_srcVpdPath,
131*fa5e4d32SSunny Srivastava l_dstVpdPath);
132*fa5e4d32SSunny Srivastava m_backupAndRestoreStatus = BackupAndRestoreStatus::Completed;
133*fa5e4d32SSunny Srivastava
134*fa5e4d32SSunny Srivastava return std::make_tuple(l_srcVpdMap, l_dstVpdMap);
135*fa5e4d32SSunny Srivastava }
136*fa5e4d32SSunny Srivastava // Note: add implementation here to support any other VPD type.
137*fa5e4d32SSunny Srivastava }
138*fa5e4d32SSunny Srivastava catch (const std::exception& ex)
139*fa5e4d32SSunny Srivastava {
140*fa5e4d32SSunny Srivastava logging::logMessage("Back up and restore failed with exception: " +
141*fa5e4d32SSunny Srivastava std::string(ex.what()));
142*fa5e4d32SSunny Srivastava }
143*fa5e4d32SSunny Srivastava return l_emptyVariantPair;
144*fa5e4d32SSunny Srivastava }
145*fa5e4d32SSunny Srivastava
backupAndRestoreIpzVpd(types::IPZVpdMap & io_srcVpdMap,types::IPZVpdMap & io_dstVpdMap,const std::string & i_srcPath,const std::string & i_dstPath)146*fa5e4d32SSunny Srivastava void BackupAndRestore::backupAndRestoreIpzVpd(
147*fa5e4d32SSunny Srivastava types::IPZVpdMap& io_srcVpdMap, types::IPZVpdMap& io_dstVpdMap,
148*fa5e4d32SSunny Srivastava const std::string& i_srcPath, const std::string& i_dstPath)
149*fa5e4d32SSunny Srivastava {
150*fa5e4d32SSunny Srivastava if (!m_backupAndRestoreCfgJsonObj["backupMap"].is_array())
151*fa5e4d32SSunny Srivastava {
152*fa5e4d32SSunny Srivastava logging::logMessage(
153*fa5e4d32SSunny Srivastava "Invalid value found for tag backupMap, in backup and restore config JSON.");
154*fa5e4d32SSunny Srivastava return;
155*fa5e4d32SSunny Srivastava }
156*fa5e4d32SSunny Srivastava
157*fa5e4d32SSunny Srivastava const std::string l_srcFruPath =
158*fa5e4d32SSunny Srivastava jsonUtility::getFruPathFromJson(m_sysCfgJsonObj, i_srcPath);
159*fa5e4d32SSunny Srivastava const std::string l_dstFruPath =
160*fa5e4d32SSunny Srivastava jsonUtility::getFruPathFromJson(m_sysCfgJsonObj, i_dstPath);
161*fa5e4d32SSunny Srivastava if (l_srcFruPath.empty() || l_dstFruPath.empty())
162*fa5e4d32SSunny Srivastava {
163*fa5e4d32SSunny Srivastava logging::logMessage(
164*fa5e4d32SSunny Srivastava "Couldn't find either source or destination FRU path.");
165*fa5e4d32SSunny Srivastava return;
166*fa5e4d32SSunny Srivastava }
167*fa5e4d32SSunny Srivastava
168*fa5e4d32SSunny Srivastava const std::string l_srcInvPath =
169*fa5e4d32SSunny Srivastava jsonUtility::getInventoryObjPathFromJson(m_sysCfgJsonObj, i_srcPath);
170*fa5e4d32SSunny Srivastava const std::string l_dstInvPath =
171*fa5e4d32SSunny Srivastava jsonUtility::getInventoryObjPathFromJson(m_sysCfgJsonObj, i_dstPath);
172*fa5e4d32SSunny Srivastava if (l_srcInvPath.empty() || l_dstInvPath.empty())
173*fa5e4d32SSunny Srivastava {
174*fa5e4d32SSunny Srivastava logging::logMessage(
175*fa5e4d32SSunny Srivastava "Couldn't find either source or destination inventory path.");
176*fa5e4d32SSunny Srivastava return;
177*fa5e4d32SSunny Srivastava }
178*fa5e4d32SSunny Srivastava
179*fa5e4d32SSunny Srivastava const std::string l_srcServiceName =
180*fa5e4d32SSunny Srivastava jsonUtility::getServiceName(m_sysCfgJsonObj, l_srcInvPath);
181*fa5e4d32SSunny Srivastava const std::string l_dstServiceName =
182*fa5e4d32SSunny Srivastava jsonUtility::getServiceName(m_sysCfgJsonObj, l_dstInvPath);
183*fa5e4d32SSunny Srivastava if (l_srcServiceName.empty() || l_dstServiceName.empty())
184*fa5e4d32SSunny Srivastava {
185*fa5e4d32SSunny Srivastava logging::logMessage(
186*fa5e4d32SSunny Srivastava "Couldn't find either source or destination DBus service name.");
187*fa5e4d32SSunny Srivastava return;
188*fa5e4d32SSunny Srivastava }
189*fa5e4d32SSunny Srivastava
190*fa5e4d32SSunny Srivastava for (const auto& l_aRecordKwInfo :
191*fa5e4d32SSunny Srivastava m_backupAndRestoreCfgJsonObj["backupMap"])
192*fa5e4d32SSunny Srivastava {
193*fa5e4d32SSunny Srivastava const std::string& l_srcRecordName =
194*fa5e4d32SSunny Srivastava l_aRecordKwInfo.value("sourceRecord", "");
195*fa5e4d32SSunny Srivastava const std::string& l_srcKeywordName =
196*fa5e4d32SSunny Srivastava l_aRecordKwInfo.value("sourceKeyword", "");
197*fa5e4d32SSunny Srivastava const std::string& l_dstRecordName =
198*fa5e4d32SSunny Srivastava l_aRecordKwInfo.value("destinationRecord", "");
199*fa5e4d32SSunny Srivastava const std::string& l_dstKeywordName =
200*fa5e4d32SSunny Srivastava l_aRecordKwInfo.value("destinationKeyword", "");
201*fa5e4d32SSunny Srivastava
202*fa5e4d32SSunny Srivastava if (l_srcRecordName.empty() || l_dstRecordName.empty() ||
203*fa5e4d32SSunny Srivastava l_srcKeywordName.empty() || l_dstKeywordName.empty())
204*fa5e4d32SSunny Srivastava {
205*fa5e4d32SSunny Srivastava logging::logMessage(
206*fa5e4d32SSunny Srivastava "Record or keyword not found in the backup and restore config JSON.");
207*fa5e4d32SSunny Srivastava continue;
208*fa5e4d32SSunny Srivastava }
209*fa5e4d32SSunny Srivastava
210*fa5e4d32SSunny Srivastava if (!io_srcVpdMap.empty() &&
211*fa5e4d32SSunny Srivastava io_srcVpdMap.find(l_srcRecordName) == io_srcVpdMap.end())
212*fa5e4d32SSunny Srivastava {
213*fa5e4d32SSunny Srivastava logging::logMessage(
214*fa5e4d32SSunny Srivastava "Record: " + l_srcRecordName +
215*fa5e4d32SSunny Srivastava ", is not found in the source path: " + i_srcPath);
216*fa5e4d32SSunny Srivastava continue;
217*fa5e4d32SSunny Srivastava }
218*fa5e4d32SSunny Srivastava
219*fa5e4d32SSunny Srivastava if (!io_dstVpdMap.empty() &&
220*fa5e4d32SSunny Srivastava io_dstVpdMap.find(l_dstRecordName) == io_dstVpdMap.end())
221*fa5e4d32SSunny Srivastava {
222*fa5e4d32SSunny Srivastava logging::logMessage(
223*fa5e4d32SSunny Srivastava "Record: " + l_dstRecordName +
224*fa5e4d32SSunny Srivastava ", is not found in the destination path: " + i_dstPath);
225*fa5e4d32SSunny Srivastava continue;
226*fa5e4d32SSunny Srivastava }
227*fa5e4d32SSunny Srivastava
228*fa5e4d32SSunny Srivastava types::BinaryVector l_defaultBinaryValue;
229*fa5e4d32SSunny Srivastava if (l_aRecordKwInfo.contains("defaultValue") &&
230*fa5e4d32SSunny Srivastava l_aRecordKwInfo["defaultValue"].is_array())
231*fa5e4d32SSunny Srivastava {
232*fa5e4d32SSunny Srivastava l_defaultBinaryValue =
233*fa5e4d32SSunny Srivastava l_aRecordKwInfo["defaultValue"].get<types::BinaryVector>();
234*fa5e4d32SSunny Srivastava }
235*fa5e4d32SSunny Srivastava else
236*fa5e4d32SSunny Srivastava {
237*fa5e4d32SSunny Srivastava logging::logMessage(
238*fa5e4d32SSunny Srivastava "Couldn't read default value for record name: " +
239*fa5e4d32SSunny Srivastava l_srcRecordName + ", keyword name: " + l_srcKeywordName +
240*fa5e4d32SSunny Srivastava " from backup and restore config JSON file.");
241*fa5e4d32SSunny Srivastava continue;
242*fa5e4d32SSunny Srivastava }
243*fa5e4d32SSunny Srivastava
244*fa5e4d32SSunny Srivastava bool l_isPelRequired = l_aRecordKwInfo.value("isPelRequired", false);
245*fa5e4d32SSunny Srivastava
246*fa5e4d32SSunny Srivastava types::BinaryVector l_srcBinaryValue;
247*fa5e4d32SSunny Srivastava std::string l_srcStrValue;
248*fa5e4d32SSunny Srivastava if (!io_srcVpdMap.empty())
249*fa5e4d32SSunny Srivastava {
250*fa5e4d32SSunny Srivastava vpdSpecificUtility::getKwVal(io_srcVpdMap.at(l_srcRecordName),
251*fa5e4d32SSunny Srivastava l_srcKeywordName, l_srcStrValue);
252*fa5e4d32SSunny Srivastava l_srcBinaryValue =
253*fa5e4d32SSunny Srivastava types::BinaryVector(l_srcStrValue.begin(), l_srcStrValue.end());
254*fa5e4d32SSunny Srivastava }
255*fa5e4d32SSunny Srivastava else
256*fa5e4d32SSunny Srivastava {
257*fa5e4d32SSunny Srivastava // Read keyword value from DBus
258*fa5e4d32SSunny Srivastava const auto l_value = dbusUtility::readDbusProperty(
259*fa5e4d32SSunny Srivastava l_srcServiceName, l_srcInvPath,
260*fa5e4d32SSunny Srivastava constants::ipzVpdInf + l_srcRecordName, l_srcKeywordName);
261*fa5e4d32SSunny Srivastava if (const auto l_binaryValue =
262*fa5e4d32SSunny Srivastava std::get_if<types::BinaryVector>(&l_value))
263*fa5e4d32SSunny Srivastava {
264*fa5e4d32SSunny Srivastava l_srcBinaryValue = *l_binaryValue;
265*fa5e4d32SSunny Srivastava l_srcStrValue = std::string(l_srcBinaryValue.begin(),
266*fa5e4d32SSunny Srivastava l_srcBinaryValue.end());
267*fa5e4d32SSunny Srivastava }
268*fa5e4d32SSunny Srivastava }
269*fa5e4d32SSunny Srivastava
270*fa5e4d32SSunny Srivastava types::BinaryVector l_dstBinaryValue;
271*fa5e4d32SSunny Srivastava std::string l_dstStrValue;
272*fa5e4d32SSunny Srivastava if (!io_dstVpdMap.empty())
273*fa5e4d32SSunny Srivastava {
274*fa5e4d32SSunny Srivastava vpdSpecificUtility::getKwVal(io_dstVpdMap.at(l_dstRecordName),
275*fa5e4d32SSunny Srivastava l_dstKeywordName, l_dstStrValue);
276*fa5e4d32SSunny Srivastava l_dstBinaryValue =
277*fa5e4d32SSunny Srivastava types::BinaryVector(l_dstStrValue.begin(), l_dstStrValue.end());
278*fa5e4d32SSunny Srivastava }
279*fa5e4d32SSunny Srivastava else
280*fa5e4d32SSunny Srivastava {
281*fa5e4d32SSunny Srivastava // Read keyword value from DBus
282*fa5e4d32SSunny Srivastava const auto l_value = dbusUtility::readDbusProperty(
283*fa5e4d32SSunny Srivastava l_dstServiceName, l_dstInvPath,
284*fa5e4d32SSunny Srivastava constants::ipzVpdInf + l_dstRecordName, l_dstKeywordName);
285*fa5e4d32SSunny Srivastava if (const auto l_binaryValue =
286*fa5e4d32SSunny Srivastava std::get_if<types::BinaryVector>(&l_value))
287*fa5e4d32SSunny Srivastava {
288*fa5e4d32SSunny Srivastava l_dstBinaryValue = *l_binaryValue;
289*fa5e4d32SSunny Srivastava l_dstStrValue = std::string(l_dstBinaryValue.begin(),
290*fa5e4d32SSunny Srivastava l_dstBinaryValue.end());
291*fa5e4d32SSunny Srivastava }
292*fa5e4d32SSunny Srivastava }
293*fa5e4d32SSunny Srivastava
294*fa5e4d32SSunny Srivastava if (l_srcBinaryValue != l_dstBinaryValue)
295*fa5e4d32SSunny Srivastava {
296*fa5e4d32SSunny Srivastava // ToDo: Handle if there is no valid default value in the backup and
297*fa5e4d32SSunny Srivastava // restore config JSON.
298*fa5e4d32SSunny Srivastava if (l_dstBinaryValue == l_defaultBinaryValue)
299*fa5e4d32SSunny Srivastava {
300*fa5e4d32SSunny Srivastava // Update keyword's value on hardware
301*fa5e4d32SSunny Srivastava auto l_vpdParser =
302*fa5e4d32SSunny Srivastava std::make_shared<Parser>(l_dstFruPath, m_sysCfgJsonObj);
303*fa5e4d32SSunny Srivastava
304*fa5e4d32SSunny Srivastava auto l_bytesUpdatedOnHardware = l_vpdParser->updateVpdKeyword(
305*fa5e4d32SSunny Srivastava types::IpzData(l_dstRecordName, l_dstKeywordName,
306*fa5e4d32SSunny Srivastava l_srcBinaryValue));
307*fa5e4d32SSunny Srivastava
308*fa5e4d32SSunny Srivastava /* To keep the data in sync between hardware and parsed map
309*fa5e4d32SSunny Srivastava updating the io_dstVpdMap. This should only be done if write
310*fa5e4d32SSunny Srivastava on hardware returns success.*/
311*fa5e4d32SSunny Srivastava if (!io_dstVpdMap.empty() && l_bytesUpdatedOnHardware > 0)
312*fa5e4d32SSunny Srivastava {
313*fa5e4d32SSunny Srivastava io_dstVpdMap[l_dstRecordName][l_dstKeywordName] =
314*fa5e4d32SSunny Srivastava l_srcStrValue;
315*fa5e4d32SSunny Srivastava }
316*fa5e4d32SSunny Srivastava continue;
317*fa5e4d32SSunny Srivastava }
318*fa5e4d32SSunny Srivastava
319*fa5e4d32SSunny Srivastava if (l_srcBinaryValue == l_defaultBinaryValue)
320*fa5e4d32SSunny Srivastava {
321*fa5e4d32SSunny Srivastava // Update keyword's value on hardware
322*fa5e4d32SSunny Srivastava auto l_vpdParser =
323*fa5e4d32SSunny Srivastava std::make_shared<Parser>(l_srcFruPath, m_sysCfgJsonObj);
324*fa5e4d32SSunny Srivastava
325*fa5e4d32SSunny Srivastava auto l_bytesUpdatedOnHardware = l_vpdParser->updateVpdKeyword(
326*fa5e4d32SSunny Srivastava types::IpzData(l_srcRecordName, l_srcKeywordName,
327*fa5e4d32SSunny Srivastava l_dstBinaryValue));
328*fa5e4d32SSunny Srivastava
329*fa5e4d32SSunny Srivastava /* To keep the data in sync between hardware and parsed map
330*fa5e4d32SSunny Srivastava updating the io_srcVpdMap. This should only be done if write
331*fa5e4d32SSunny Srivastava on hardware returns success.*/
332*fa5e4d32SSunny Srivastava if (!io_srcVpdMap.empty() && l_bytesUpdatedOnHardware > 0)
333*fa5e4d32SSunny Srivastava {
334*fa5e4d32SSunny Srivastava io_srcVpdMap[l_srcRecordName][l_srcKeywordName] =
335*fa5e4d32SSunny Srivastava l_dstStrValue;
336*fa5e4d32SSunny Srivastava }
337*fa5e4d32SSunny Srivastava }
338*fa5e4d32SSunny Srivastava else
339*fa5e4d32SSunny Srivastava {
340*fa5e4d32SSunny Srivastava /**
341*fa5e4d32SSunny Srivastava * Update io_srcVpdMap to publish the same data on DBus, which
342*fa5e4d32SSunny Srivastava * is already present on the DBus. Because after calling
343*fa5e4d32SSunny Srivastava * backupAndRestore API the map value will get published to DBus
344*fa5e4d32SSunny Srivastava * in the worker flow.
345*fa5e4d32SSunny Srivastava */
346*fa5e4d32SSunny Srivastava if (!io_srcVpdMap.empty() && io_dstVpdMap.empty())
347*fa5e4d32SSunny Srivastava {
348*fa5e4d32SSunny Srivastava io_srcVpdMap[l_srcRecordName][l_srcKeywordName] =
349*fa5e4d32SSunny Srivastava l_dstStrValue;
350*fa5e4d32SSunny Srivastava }
351*fa5e4d32SSunny Srivastava
352*fa5e4d32SSunny Srivastava std::string l_errorMsg(
353*fa5e4d32SSunny Srivastava "Mismatch found between source and destination VPD for record : " +
354*fa5e4d32SSunny Srivastava l_srcRecordName + " and keyword : " + l_srcKeywordName +
355*fa5e4d32SSunny Srivastava " . Value read from source : " + l_srcStrValue +
356*fa5e4d32SSunny Srivastava " . Value read from destination : " + l_dstStrValue);
357*fa5e4d32SSunny Srivastava
358*fa5e4d32SSunny Srivastava EventLogger::createSyncPel(
359*fa5e4d32SSunny Srivastava types::ErrorType::VpdMismatch, types::SeverityType::Warning,
360*fa5e4d32SSunny Srivastava __FILE__, __FUNCTION__, 0, l_errorMsg, std::nullopt,
361*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt);
362*fa5e4d32SSunny Srivastava }
363*fa5e4d32SSunny Srivastava }
364*fa5e4d32SSunny Srivastava else if (l_srcBinaryValue == l_defaultBinaryValue &&
365*fa5e4d32SSunny Srivastava l_dstBinaryValue == l_defaultBinaryValue && l_isPelRequired)
366*fa5e4d32SSunny Srivastava {
367*fa5e4d32SSunny Srivastava std::string l_errorMsg(
368*fa5e4d32SSunny Srivastava "Default value found on both source and destination VPD, for record: " +
369*fa5e4d32SSunny Srivastava l_srcRecordName + " and keyword: " + l_srcKeywordName);
370*fa5e4d32SSunny Srivastava
371*fa5e4d32SSunny Srivastava EventLogger::createSyncPel(
372*fa5e4d32SSunny Srivastava types::ErrorType::DefaultValue, types::SeverityType::Error,
373*fa5e4d32SSunny Srivastava __FILE__, __FUNCTION__, 0, l_errorMsg, std::nullopt,
374*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt);
375*fa5e4d32SSunny Srivastava }
376*fa5e4d32SSunny Srivastava }
377*fa5e4d32SSunny Srivastava }
378*fa5e4d32SSunny Srivastava
setBackupAndRestoreStatus(const BackupAndRestoreStatus & i_status)379*fa5e4d32SSunny Srivastava void BackupAndRestore::setBackupAndRestoreStatus(
380*fa5e4d32SSunny Srivastava const BackupAndRestoreStatus& i_status)
381*fa5e4d32SSunny Srivastava {
382*fa5e4d32SSunny Srivastava m_backupAndRestoreStatus = i_status;
383*fa5e4d32SSunny Srivastava }
384*fa5e4d32SSunny Srivastava } // namespace vpd
385