1*fa5e4d32SSunny Srivastava #include "parser.hpp"
2*fa5e4d32SSunny Srivastava
3*fa5e4d32SSunny Srivastava #include "constants.hpp"
4*fa5e4d32SSunny Srivastava #include "event_logger.hpp"
5*fa5e4d32SSunny Srivastava
6*fa5e4d32SSunny Srivastava #include <utility/dbus_utility.hpp>
7*fa5e4d32SSunny Srivastava #include <utility/json_utility.hpp>
8*fa5e4d32SSunny Srivastava #include <utility/vpd_specific_utility.hpp>
9*fa5e4d32SSunny Srivastava
10*fa5e4d32SSunny Srivastava #include <fstream>
11*fa5e4d32SSunny Srivastava
12*fa5e4d32SSunny Srivastava namespace vpd
13*fa5e4d32SSunny Srivastava {
Parser(const std::string & vpdFilePath,nlohmann::json parsedJson)14*fa5e4d32SSunny Srivastava Parser::Parser(const std::string& vpdFilePath, nlohmann::json parsedJson) :
15*fa5e4d32SSunny Srivastava m_vpdFilePath(vpdFilePath), m_parsedJson(parsedJson)
16*fa5e4d32SSunny Srivastava {
17*fa5e4d32SSunny Srivastava std::error_code l_errCode;
18*fa5e4d32SSunny Srivastava
19*fa5e4d32SSunny Srivastava // ToDo: Add minimum file size check in all the concert praser classes,
20*fa5e4d32SSunny Srivastava // depends on their VPD type.
21*fa5e4d32SSunny Srivastava if (!std::filesystem::exists(m_vpdFilePath, l_errCode))
22*fa5e4d32SSunny Srivastava {
23*fa5e4d32SSunny Srivastava std::string l_message{"Parser object creation failed, file [" +
24*fa5e4d32SSunny Srivastava m_vpdFilePath + "] doesn't exists."};
25*fa5e4d32SSunny Srivastava
26*fa5e4d32SSunny Srivastava if (l_errCode)
27*fa5e4d32SSunny Srivastava {
28*fa5e4d32SSunny Srivastava l_message += " Error message: " + l_errCode.message();
29*fa5e4d32SSunny Srivastava }
30*fa5e4d32SSunny Srivastava
31*fa5e4d32SSunny Srivastava throw std::runtime_error(l_message);
32*fa5e4d32SSunny Srivastava }
33*fa5e4d32SSunny Srivastava
34*fa5e4d32SSunny Srivastava // Read VPD offset if applicable.
35*fa5e4d32SSunny Srivastava if (!m_parsedJson.empty())
36*fa5e4d32SSunny Srivastava {
37*fa5e4d32SSunny Srivastava m_vpdStartOffset = jsonUtility::getVPDOffset(m_parsedJson, vpdFilePath);
38*fa5e4d32SSunny Srivastava }
39*fa5e4d32SSunny Srivastava }
40*fa5e4d32SSunny Srivastava
getVpdParserInstance()41*fa5e4d32SSunny Srivastava std::shared_ptr<vpd::ParserInterface> Parser::getVpdParserInstance()
42*fa5e4d32SSunny Srivastava {
43*fa5e4d32SSunny Srivastava // Read the VPD data into a vector.
44*fa5e4d32SSunny Srivastava vpdSpecificUtility::getVpdDataInVector(m_vpdFilePath, m_vpdVector,
45*fa5e4d32SSunny Srivastava m_vpdStartOffset);
46*fa5e4d32SSunny Srivastava
47*fa5e4d32SSunny Srivastava // This will detect the type of parser required.
48*fa5e4d32SSunny Srivastava std::shared_ptr<vpd::ParserInterface> l_parser =
49*fa5e4d32SSunny Srivastava ParserFactory::getParser(m_vpdVector, m_vpdFilePath, m_vpdStartOffset);
50*fa5e4d32SSunny Srivastava
51*fa5e4d32SSunny Srivastava return l_parser;
52*fa5e4d32SSunny Srivastava }
53*fa5e4d32SSunny Srivastava
parse()54*fa5e4d32SSunny Srivastava types::VPDMapVariant Parser::parse()
55*fa5e4d32SSunny Srivastava {
56*fa5e4d32SSunny Srivastava std::shared_ptr<vpd::ParserInterface> l_parser = getVpdParserInstance();
57*fa5e4d32SSunny Srivastava return l_parser->parse();
58*fa5e4d32SSunny Srivastava }
59*fa5e4d32SSunny Srivastava
updateVpdKeyword(const types::WriteVpdParams & i_paramsToWriteData)60*fa5e4d32SSunny Srivastava int Parser::updateVpdKeyword(const types::WriteVpdParams& i_paramsToWriteData)
61*fa5e4d32SSunny Srivastava {
62*fa5e4d32SSunny Srivastava int l_bytesUpdatedOnHardware = constants::FAILURE;
63*fa5e4d32SSunny Srivastava
64*fa5e4d32SSunny Srivastava // A lambda to extract Record : Keyword string from i_paramsToWriteData
65*fa5e4d32SSunny Srivastava auto l_keyWordIdentifier =
66*fa5e4d32SSunny Srivastava [](const types::WriteVpdParams& i_paramsToWriteData) -> std::string {
67*fa5e4d32SSunny Srivastava std::string l_keywordString{};
68*fa5e4d32SSunny Srivastava if (const types::IpzData* l_ipzData =
69*fa5e4d32SSunny Srivastava std::get_if<types::IpzData>(&i_paramsToWriteData))
70*fa5e4d32SSunny Srivastava {
71*fa5e4d32SSunny Srivastava l_keywordString =
72*fa5e4d32SSunny Srivastava std::get<0>(*l_ipzData) + ":" + std::get<1>(*l_ipzData);
73*fa5e4d32SSunny Srivastava }
74*fa5e4d32SSunny Srivastava else if (const types::KwData* l_kwData =
75*fa5e4d32SSunny Srivastava std::get_if<types::KwData>(&i_paramsToWriteData))
76*fa5e4d32SSunny Srivastava {
77*fa5e4d32SSunny Srivastava l_keywordString = std::get<0>(*l_kwData);
78*fa5e4d32SSunny Srivastava }
79*fa5e4d32SSunny Srivastava return l_keywordString;
80*fa5e4d32SSunny Srivastava };
81*fa5e4d32SSunny Srivastava
82*fa5e4d32SSunny Srivastava try
83*fa5e4d32SSunny Srivastava {
84*fa5e4d32SSunny Srivastava // Enable Reboot Guard
85*fa5e4d32SSunny Srivastava if (constants::FAILURE == dbusUtility::EnableRebootGuard())
86*fa5e4d32SSunny Srivastava {
87*fa5e4d32SSunny Srivastava EventLogger::createAsyncPel(
88*fa5e4d32SSunny Srivastava types::ErrorType::DbusFailure,
89*fa5e4d32SSunny Srivastava types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
90*fa5e4d32SSunny Srivastava std::string(
91*fa5e4d32SSunny Srivastava "Failed to enable BMC Reboot Guard while updating " +
92*fa5e4d32SSunny Srivastava l_keyWordIdentifier(i_paramsToWriteData)),
93*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt, std::nullopt);
94*fa5e4d32SSunny Srivastava
95*fa5e4d32SSunny Srivastava return constants::FAILURE;
96*fa5e4d32SSunny Srivastava }
97*fa5e4d32SSunny Srivastava
98*fa5e4d32SSunny Srivastava // Update keyword's value on hardware
99*fa5e4d32SSunny Srivastava try
100*fa5e4d32SSunny Srivastava {
101*fa5e4d32SSunny Srivastava std::shared_ptr<ParserInterface> l_vpdParserInstance =
102*fa5e4d32SSunny Srivastava getVpdParserInstance();
103*fa5e4d32SSunny Srivastava l_bytesUpdatedOnHardware =
104*fa5e4d32SSunny Srivastava l_vpdParserInstance->writeKeywordOnHardware(
105*fa5e4d32SSunny Srivastava i_paramsToWriteData);
106*fa5e4d32SSunny Srivastava }
107*fa5e4d32SSunny Srivastava catch (const std::exception& l_exception)
108*fa5e4d32SSunny Srivastava {
109*fa5e4d32SSunny Srivastava std::string l_errMsg(
110*fa5e4d32SSunny Srivastava "Error while updating keyword's value on hardware path " +
111*fa5e4d32SSunny Srivastava m_vpdFilePath + ", error: " + std::string(l_exception.what()));
112*fa5e4d32SSunny Srivastava
113*fa5e4d32SSunny Srivastava // TODO : Log PEL
114*fa5e4d32SSunny Srivastava
115*fa5e4d32SSunny Srivastava throw std::runtime_error(l_errMsg);
116*fa5e4d32SSunny Srivastava }
117*fa5e4d32SSunny Srivastava
118*fa5e4d32SSunny Srivastava auto [l_fruPath, l_inventoryObjPath, l_redundantFruPath] =
119*fa5e4d32SSunny Srivastava jsonUtility::getAllPathsToUpdateKeyword(m_parsedJson,
120*fa5e4d32SSunny Srivastava m_vpdFilePath);
121*fa5e4d32SSunny Srivastava
122*fa5e4d32SSunny Srivastava // If inventory D-bus object path is present, update keyword's value on
123*fa5e4d32SSunny Srivastava // DBus
124*fa5e4d32SSunny Srivastava if (!l_inventoryObjPath.empty())
125*fa5e4d32SSunny Srivastava {
126*fa5e4d32SSunny Srivastava types::Record l_recordName;
127*fa5e4d32SSunny Srivastava std::string l_interfaceName;
128*fa5e4d32SSunny Srivastava std::string l_propertyName;
129*fa5e4d32SSunny Srivastava types::DbusVariantType l_keywordValue;
130*fa5e4d32SSunny Srivastava
131*fa5e4d32SSunny Srivastava if (const types::IpzData* l_ipzData =
132*fa5e4d32SSunny Srivastava std::get_if<types::IpzData>(&i_paramsToWriteData))
133*fa5e4d32SSunny Srivastava {
134*fa5e4d32SSunny Srivastava l_recordName = std::get<0>(*l_ipzData);
135*fa5e4d32SSunny Srivastava l_interfaceName = constants::ipzVpdInf + l_recordName;
136*fa5e4d32SSunny Srivastava l_propertyName = std::get<1>(*l_ipzData);
137*fa5e4d32SSunny Srivastava
138*fa5e4d32SSunny Srivastava try
139*fa5e4d32SSunny Srivastava {
140*fa5e4d32SSunny Srivastava // Read keyword's value from hardware to write the same on
141*fa5e4d32SSunny Srivastava // D-bus.
142*fa5e4d32SSunny Srivastava std::shared_ptr<ParserInterface> l_vpdParserInstance =
143*fa5e4d32SSunny Srivastava getVpdParserInstance();
144*fa5e4d32SSunny Srivastava
145*fa5e4d32SSunny Srivastava logging::logMessage(
146*fa5e4d32SSunny Srivastava "Performing VPD read on " + m_vpdFilePath);
147*fa5e4d32SSunny Srivastava
148*fa5e4d32SSunny Srivastava l_keywordValue =
149*fa5e4d32SSunny Srivastava l_vpdParserInstance->readKeywordFromHardware(
150*fa5e4d32SSunny Srivastava types::ReadVpdParams(
151*fa5e4d32SSunny Srivastava std::make_tuple(l_recordName, l_propertyName)));
152*fa5e4d32SSunny Srivastava }
153*fa5e4d32SSunny Srivastava catch (const std::exception& l_exception)
154*fa5e4d32SSunny Srivastava {
155*fa5e4d32SSunny Srivastava // Unable to read keyword's value from hardware.
156*fa5e4d32SSunny Srivastava std::string l_errMsg(
157*fa5e4d32SSunny Srivastava "Error while reading keyword's value from hadware path " +
158*fa5e4d32SSunny Srivastava m_vpdFilePath +
159*fa5e4d32SSunny Srivastava ", error: " + std::string(l_exception.what()));
160*fa5e4d32SSunny Srivastava
161*fa5e4d32SSunny Srivastava // TODO: Log PEL
162*fa5e4d32SSunny Srivastava
163*fa5e4d32SSunny Srivastava throw std::runtime_error(l_errMsg);
164*fa5e4d32SSunny Srivastava }
165*fa5e4d32SSunny Srivastava }
166*fa5e4d32SSunny Srivastava else
167*fa5e4d32SSunny Srivastava {
168*fa5e4d32SSunny Srivastava // Input parameter type provided isn't compatible to perform
169*fa5e4d32SSunny Srivastava // update.
170*fa5e4d32SSunny Srivastava std::string l_errMsg(
171*fa5e4d32SSunny Srivastava "Input parameter type isn't compatible to update keyword's value on DBus for object path: " +
172*fa5e4d32SSunny Srivastava l_inventoryObjPath);
173*fa5e4d32SSunny Srivastava throw std::runtime_error(l_errMsg);
174*fa5e4d32SSunny Srivastava }
175*fa5e4d32SSunny Srivastava
176*fa5e4d32SSunny Srivastava // Get D-bus name for the given keyword
177*fa5e4d32SSunny Srivastava l_propertyName =
178*fa5e4d32SSunny Srivastava vpdSpecificUtility::getDbusPropNameForGivenKw(l_propertyName);
179*fa5e4d32SSunny Srivastava
180*fa5e4d32SSunny Srivastava // Create D-bus object map
181*fa5e4d32SSunny Srivastava types::ObjectMap l_dbusObjMap = {std::make_pair(
182*fa5e4d32SSunny Srivastava l_inventoryObjPath,
183*fa5e4d32SSunny Srivastava types::InterfaceMap{std::make_pair(
184*fa5e4d32SSunny Srivastava l_interfaceName, types::PropertyMap{std::make_pair(
185*fa5e4d32SSunny Srivastava l_propertyName, l_keywordValue)})})};
186*fa5e4d32SSunny Srivastava
187*fa5e4d32SSunny Srivastava // Call PIM's Notify method to perform update
188*fa5e4d32SSunny Srivastava if (!dbusUtility::callPIM(std::move(l_dbusObjMap)))
189*fa5e4d32SSunny Srivastava {
190*fa5e4d32SSunny Srivastava // Call to PIM's Notify method failed.
191*fa5e4d32SSunny Srivastava std::string l_errMsg("Notify PIM is failed for object path: " +
192*fa5e4d32SSunny Srivastava l_inventoryObjPath);
193*fa5e4d32SSunny Srivastava throw std::runtime_error(l_errMsg);
194*fa5e4d32SSunny Srivastava }
195*fa5e4d32SSunny Srivastava }
196*fa5e4d32SSunny Srivastava
197*fa5e4d32SSunny Srivastava // Update keyword's value on redundant hardware if present
198*fa5e4d32SSunny Srivastava if (!l_redundantFruPath.empty())
199*fa5e4d32SSunny Srivastava {
200*fa5e4d32SSunny Srivastava if (updateVpdKeywordOnRedundantPath(l_redundantFruPath,
201*fa5e4d32SSunny Srivastava i_paramsToWriteData) < 0)
202*fa5e4d32SSunny Srivastava {
203*fa5e4d32SSunny Srivastava std::string l_errMsg(
204*fa5e4d32SSunny Srivastava "Error while updating keyword's value on redundant path " +
205*fa5e4d32SSunny Srivastava l_redundantFruPath);
206*fa5e4d32SSunny Srivastava throw std::runtime_error(l_errMsg);
207*fa5e4d32SSunny Srivastava }
208*fa5e4d32SSunny Srivastava }
209*fa5e4d32SSunny Srivastava
210*fa5e4d32SSunny Srivastava // TODO: Check if revert is required when any of the writes fails.
211*fa5e4d32SSunny Srivastava // TODO: Handle error logging
212*fa5e4d32SSunny Srivastava }
213*fa5e4d32SSunny Srivastava catch (const std::exception& l_ex)
214*fa5e4d32SSunny Srivastava {
215*fa5e4d32SSunny Srivastava logging::logMessage("Update VPD Keyword failed for : " +
216*fa5e4d32SSunny Srivastava l_keyWordIdentifier(i_paramsToWriteData) +
217*fa5e4d32SSunny Srivastava " failed due to error: " + l_ex.what());
218*fa5e4d32SSunny Srivastava
219*fa5e4d32SSunny Srivastava // update failed, set return value to failure
220*fa5e4d32SSunny Srivastava l_bytesUpdatedOnHardware = constants::FAILURE;
221*fa5e4d32SSunny Srivastava }
222*fa5e4d32SSunny Srivastava
223*fa5e4d32SSunny Srivastava // Disable Reboot Guard
224*fa5e4d32SSunny Srivastava if (constants::FAILURE == dbusUtility::DisableRebootGuard())
225*fa5e4d32SSunny Srivastava {
226*fa5e4d32SSunny Srivastava EventLogger::createAsyncPel(
227*fa5e4d32SSunny Srivastava types::ErrorType::DbusFailure, types::SeverityType::Critical,
228*fa5e4d32SSunny Srivastava __FILE__, __FUNCTION__, 0,
229*fa5e4d32SSunny Srivastava std::string("Failed to disable BMC Reboot Guard while updating " +
230*fa5e4d32SSunny Srivastava l_keyWordIdentifier(i_paramsToWriteData)),
231*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt, std::nullopt);
232*fa5e4d32SSunny Srivastava }
233*fa5e4d32SSunny Srivastava
234*fa5e4d32SSunny Srivastava return l_bytesUpdatedOnHardware;
235*fa5e4d32SSunny Srivastava }
236*fa5e4d32SSunny Srivastava
updateVpdKeywordOnRedundantPath(const std::string & i_fruPath,const types::WriteVpdParams & i_paramsToWriteData)237*fa5e4d32SSunny Srivastava int Parser::updateVpdKeywordOnRedundantPath(
238*fa5e4d32SSunny Srivastava const std::string& i_fruPath,
239*fa5e4d32SSunny Srivastava const types::WriteVpdParams& i_paramsToWriteData)
240*fa5e4d32SSunny Srivastava {
241*fa5e4d32SSunny Srivastava try
242*fa5e4d32SSunny Srivastava {
243*fa5e4d32SSunny Srivastava std::shared_ptr<Parser> l_parserObj =
244*fa5e4d32SSunny Srivastava std::make_shared<Parser>(i_fruPath, m_parsedJson);
245*fa5e4d32SSunny Srivastava
246*fa5e4d32SSunny Srivastava std::shared_ptr<ParserInterface> l_vpdParserInstance =
247*fa5e4d32SSunny Srivastava l_parserObj->getVpdParserInstance();
248*fa5e4d32SSunny Srivastava
249*fa5e4d32SSunny Srivastava return l_vpdParserInstance->writeKeywordOnHardware(i_paramsToWriteData);
250*fa5e4d32SSunny Srivastava }
251*fa5e4d32SSunny Srivastava catch (const std::exception& l_exception)
252*fa5e4d32SSunny Srivastava {
253*fa5e4d32SSunny Srivastava EventLogger::createSyncPel(
254*fa5e4d32SSunny Srivastava types::ErrorType::InvalidVpdMessage,
255*fa5e4d32SSunny Srivastava types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
256*fa5e4d32SSunny Srivastava "Error while updating keyword's value on redundant path " +
257*fa5e4d32SSunny Srivastava i_fruPath + ", error: " + std::string(l_exception.what()),
258*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt, std::nullopt);
259*fa5e4d32SSunny Srivastava return -1;
260*fa5e4d32SSunny Srivastava }
261*fa5e4d32SSunny Srivastava }
262*fa5e4d32SSunny Srivastava
updateVpdKeywordOnHardware(const types::WriteVpdParams & i_paramsToWriteData)263*fa5e4d32SSunny Srivastava int Parser::updateVpdKeywordOnHardware(
264*fa5e4d32SSunny Srivastava const types::WriteVpdParams& i_paramsToWriteData)
265*fa5e4d32SSunny Srivastava {
266*fa5e4d32SSunny Srivastava int l_bytesUpdatedOnHardware = constants::FAILURE;
267*fa5e4d32SSunny Srivastava
268*fa5e4d32SSunny Srivastava // A lambda to extract Record : Keyword string from i_paramsToWriteData
269*fa5e4d32SSunny Srivastava auto l_keyWordIdentifier =
270*fa5e4d32SSunny Srivastava [](const types::WriteVpdParams& i_paramsToWriteData) -> std::string {
271*fa5e4d32SSunny Srivastava std::string l_keywordString{};
272*fa5e4d32SSunny Srivastava if (const types::IpzData* l_ipzData =
273*fa5e4d32SSunny Srivastava std::get_if<types::IpzData>(&i_paramsToWriteData))
274*fa5e4d32SSunny Srivastava {
275*fa5e4d32SSunny Srivastava l_keywordString =
276*fa5e4d32SSunny Srivastava std::get<0>(*l_ipzData) + ":" + std::get<1>(*l_ipzData);
277*fa5e4d32SSunny Srivastava }
278*fa5e4d32SSunny Srivastava else if (const types::KwData* l_kwData =
279*fa5e4d32SSunny Srivastava std::get_if<types::KwData>(&i_paramsToWriteData))
280*fa5e4d32SSunny Srivastava {
281*fa5e4d32SSunny Srivastava l_keywordString = std::get<0>(*l_kwData);
282*fa5e4d32SSunny Srivastava }
283*fa5e4d32SSunny Srivastava return l_keywordString;
284*fa5e4d32SSunny Srivastava };
285*fa5e4d32SSunny Srivastava
286*fa5e4d32SSunny Srivastava try
287*fa5e4d32SSunny Srivastava {
288*fa5e4d32SSunny Srivastava // Enable Reboot Guard
289*fa5e4d32SSunny Srivastava if (constants::FAILURE == dbusUtility::EnableRebootGuard())
290*fa5e4d32SSunny Srivastava {
291*fa5e4d32SSunny Srivastava EventLogger::createAsyncPel(
292*fa5e4d32SSunny Srivastava types::ErrorType::DbusFailure,
293*fa5e4d32SSunny Srivastava types::SeverityType::Informational, __FILE__, __FUNCTION__, 0,
294*fa5e4d32SSunny Srivastava std::string(
295*fa5e4d32SSunny Srivastava "Failed to enable BMC Reboot Guard while updating " +
296*fa5e4d32SSunny Srivastava l_keyWordIdentifier(i_paramsToWriteData)),
297*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt, std::nullopt);
298*fa5e4d32SSunny Srivastava
299*fa5e4d32SSunny Srivastava return constants::FAILURE;
300*fa5e4d32SSunny Srivastava }
301*fa5e4d32SSunny Srivastava
302*fa5e4d32SSunny Srivastava std::shared_ptr<ParserInterface> l_vpdParserInstance =
303*fa5e4d32SSunny Srivastava getVpdParserInstance();
304*fa5e4d32SSunny Srivastava l_bytesUpdatedOnHardware =
305*fa5e4d32SSunny Srivastava l_vpdParserInstance->writeKeywordOnHardware(i_paramsToWriteData);
306*fa5e4d32SSunny Srivastava }
307*fa5e4d32SSunny Srivastava catch (const std::exception& l_exception)
308*fa5e4d32SSunny Srivastava {
309*fa5e4d32SSunny Srivastava types::ErrorType l_errorType;
310*fa5e4d32SSunny Srivastava
311*fa5e4d32SSunny Srivastava if (typeid(l_exception) == typeid(EccException))
312*fa5e4d32SSunny Srivastava {
313*fa5e4d32SSunny Srivastava l_errorType = types::ErrorType::EccCheckFailed;
314*fa5e4d32SSunny Srivastava }
315*fa5e4d32SSunny Srivastava else
316*fa5e4d32SSunny Srivastava {
317*fa5e4d32SSunny Srivastava l_errorType = types::ErrorType::InvalidVpdMessage;
318*fa5e4d32SSunny Srivastava }
319*fa5e4d32SSunny Srivastava
320*fa5e4d32SSunny Srivastava EventLogger::createAsyncPel(
321*fa5e4d32SSunny Srivastava l_errorType, types::SeverityType::Informational, __FILE__,
322*fa5e4d32SSunny Srivastava __FUNCTION__, 0,
323*fa5e4d32SSunny Srivastava "Error while updating keyword's value on hardware path [" +
324*fa5e4d32SSunny Srivastava m_vpdFilePath + "], error: " + std::string(l_exception.what()),
325*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt, std::nullopt);
326*fa5e4d32SSunny Srivastava }
327*fa5e4d32SSunny Srivastava
328*fa5e4d32SSunny Srivastava // Disable Reboot Guard
329*fa5e4d32SSunny Srivastava if (constants::FAILURE == dbusUtility::DisableRebootGuard())
330*fa5e4d32SSunny Srivastava {
331*fa5e4d32SSunny Srivastava EventLogger::createAsyncPel(
332*fa5e4d32SSunny Srivastava types::ErrorType::DbusFailure, types::SeverityType::Critical,
333*fa5e4d32SSunny Srivastava __FILE__, __FUNCTION__, 0,
334*fa5e4d32SSunny Srivastava std::string("Failed to disable BMC Reboot Guard while updating " +
335*fa5e4d32SSunny Srivastava l_keyWordIdentifier(i_paramsToWriteData)),
336*fa5e4d32SSunny Srivastava std::nullopt, std::nullopt, std::nullopt, std::nullopt);
337*fa5e4d32SSunny Srivastava }
338*fa5e4d32SSunny Srivastava
339*fa5e4d32SSunny Srivastava return l_bytesUpdatedOnHardware;
340*fa5e4d32SSunny Srivastava }
341*fa5e4d32SSunny Srivastava
342*fa5e4d32SSunny Srivastava } // namespace vpd
343