xref: /openbmc/openpower-vpd-parser/wait-vpd-parser/src/inventory_backup_handler.cpp (revision b767f56ccbf07c3d85c81e139681727a1b95434d)
1*b767f56cSSouvik Roy #include "inventory_backup_handler.hpp"
2*b767f56cSSouvik Roy 
3*b767f56cSSouvik Roy #include "error_codes.hpp"
4*b767f56cSSouvik Roy #include "utility/common_utility.hpp"
5*b767f56cSSouvik Roy 
6*b767f56cSSouvik Roy bool InventoryBackupHandler::checkInventoryBackupPath(
7*b767f56cSSouvik Roy     uint16_t& o_errCode) const noexcept
8*b767f56cSSouvik Roy {
9*b767f56cSSouvik Roy     bool l_rc{false};
10*b767f56cSSouvik Roy     o_errCode = 0;
11*b767f56cSSouvik Roy     try
12*b767f56cSSouvik Roy     {
13*b767f56cSSouvik Roy         /* TODO:
14*b767f56cSSouvik Roy             Check inventory backup path to see if it
15*b767f56cSSouvik Roy            has sub directories with inventory backup data and return true if so.
16*b767f56cSSouvik Roy         */
17*b767f56cSSouvik Roy     }
18*b767f56cSSouvik Roy     catch (const std::exception& l_ex)
19*b767f56cSSouvik Roy     {
20*b767f56cSSouvik Roy         o_errCode = vpd::error_code::STANDARD_EXCEPTION;
21*b767f56cSSouvik Roy 
22*b767f56cSSouvik Roy         m_logger->logMessage("Failed to check inventory path. Error: " +
23*b767f56cSSouvik Roy                              std::string(l_ex.what()));
24*b767f56cSSouvik Roy     }
25*b767f56cSSouvik Roy     return l_rc;
26*b767f56cSSouvik Roy }
27*b767f56cSSouvik Roy 
28*b767f56cSSouvik Roy bool InventoryBackupHandler::restoreInventoryBackupData(
29*b767f56cSSouvik Roy     uint16_t& o_errCode) const noexcept
30*b767f56cSSouvik Roy {
31*b767f56cSSouvik Roy     bool l_rc{false};
32*b767f56cSSouvik Roy     o_errCode = 0;
33*b767f56cSSouvik Roy     try
34*b767f56cSSouvik Roy     {
35*b767f56cSSouvik Roy         if (!checkInventoryBackupPath(o_errCode))
36*b767f56cSSouvik Roy         {
37*b767f56cSSouvik Roy             if (o_errCode)
38*b767f56cSSouvik Roy             {
39*b767f56cSSouvik Roy                 throw std::runtime_error(
40*b767f56cSSouvik Roy                     "Failed to check if inventory backup path exists. Error: " +
41*b767f56cSSouvik Roy                     vpd::commonUtility::getErrCodeMsg(o_errCode));
42*b767f56cSSouvik Roy             }
43*b767f56cSSouvik Roy             return l_rc;
44*b767f56cSSouvik Roy         }
45*b767f56cSSouvik Roy 
46*b767f56cSSouvik Roy         /* TODO:
47*b767f56cSSouvik Roy             1. Iterate through directories under
48*b767f56cSSouvik Roy            /var/lib/phosphor-data-sync/bmc_data_bkp/
49*b767f56cSSouvik Roy             2. Extract the object path and interface information
50*b767f56cSSouvik Roy             3. Restore the data to inventory manager persisted path.
51*b767f56cSSouvik Roy         */
52*b767f56cSSouvik Roy     }
53*b767f56cSSouvik Roy     catch (const std::exception& l_ex)
54*b767f56cSSouvik Roy     {
55*b767f56cSSouvik Roy         const vpd::types::PelInfoTuple l_pelInfo{
56*b767f56cSSouvik Roy             vpd::types::ErrorType::FirmwareError,
57*b767f56cSSouvik Roy             vpd::types::SeverityType::Warning,
58*b767f56cSSouvik Roy             0,
59*b767f56cSSouvik Roy             std::nullopt,
60*b767f56cSSouvik Roy             std::nullopt,
61*b767f56cSSouvik Roy             std::nullopt,
62*b767f56cSSouvik Roy             std::nullopt};
63*b767f56cSSouvik Roy 
64*b767f56cSSouvik Roy         m_logger->logMessage("Failed to restore inventory backup data from [" +
65*b767f56cSSouvik Roy                                  m_inventoryBackupPath.string() + "] to [" +
66*b767f56cSSouvik Roy                                  m_inventoryPrimaryPath.string() +
67*b767f56cSSouvik Roy                                  "] Error: " + std::string(l_ex.what()),
68*b767f56cSSouvik Roy                              vpd::PlaceHolder::PEL, &l_pelInfo);
69*b767f56cSSouvik Roy 
70*b767f56cSSouvik Roy         o_errCode = vpd::error_code::STANDARD_EXCEPTION;
71*b767f56cSSouvik Roy     }
72*b767f56cSSouvik Roy     return l_rc;
73*b767f56cSSouvik Roy }
74*b767f56cSSouvik Roy 
75*b767f56cSSouvik Roy bool InventoryBackupHandler::clearInventoryBackupData(
76*b767f56cSSouvik Roy     uint16_t& o_errCode) const noexcept
77*b767f56cSSouvik Roy {
78*b767f56cSSouvik Roy     bool l_rc{false};
79*b767f56cSSouvik Roy     o_errCode = 0;
80*b767f56cSSouvik Roy     try
81*b767f56cSSouvik Roy     {
82*b767f56cSSouvik Roy         /* TODO:
83*b767f56cSSouvik Roy            Clear all directories under inventory backup path
84*b767f56cSSouvik Roy         */
85*b767f56cSSouvik Roy     }
86*b767f56cSSouvik Roy     catch (const std::exception& l_ex)
87*b767f56cSSouvik Roy     {
88*b767f56cSSouvik Roy         const vpd::types::PelInfoTuple l_pelInfo{
89*b767f56cSSouvik Roy             vpd::types::ErrorType::FirmwareError,
90*b767f56cSSouvik Roy             vpd::types::SeverityType::Warning,
91*b767f56cSSouvik Roy             0,
92*b767f56cSSouvik Roy             std::nullopt,
93*b767f56cSSouvik Roy             std::nullopt,
94*b767f56cSSouvik Roy             std::nullopt,
95*b767f56cSSouvik Roy             std::nullopt};
96*b767f56cSSouvik Roy 
97*b767f56cSSouvik Roy         m_logger->logMessage(
98*b767f56cSSouvik Roy             "Failed to clear inventory backup data from path [" +
99*b767f56cSSouvik Roy                 m_inventoryBackupPath.string() +
100*b767f56cSSouvik Roy                 "]. Error: " + std::string(l_ex.what()),
101*b767f56cSSouvik Roy             vpd::PlaceHolder::PEL, &l_pelInfo);
102*b767f56cSSouvik Roy 
103*b767f56cSSouvik Roy         o_errCode = vpd::error_code::STANDARD_EXCEPTION;
104*b767f56cSSouvik Roy     }
105*b767f56cSSouvik Roy     return l_rc;
106*b767f56cSSouvik Roy }
107*b767f56cSSouvik Roy 
108*b767f56cSSouvik Roy bool InventoryBackupHandler::restartInventoryManagerService(
109*b767f56cSSouvik Roy     uint16_t& o_errCode) const noexcept
110*b767f56cSSouvik Roy {
111*b767f56cSSouvik Roy     bool l_rc{false};
112*b767f56cSSouvik Roy     o_errCode = 0;
113*b767f56cSSouvik Roy     try
114*b767f56cSSouvik Roy     {
115*b767f56cSSouvik Roy         /* TODO:
116*b767f56cSSouvik Roy            1. Restart inventory manager service, with a re-try limit of 3
117*b767f56cSSouvik Roy            attempts
118*b767f56cSSouvik Roy            2. If above step fails, check inventory manager service state
119*b767f56cSSouvik Roy            3. If service is in running state, then log critical PEL and go for
120*b767f56cSSouvik Roy            re-collection. If not running then along with critical PEL, fail this
121*b767f56cSSouvik Roy            service as well.
122*b767f56cSSouvik Roy         */
123*b767f56cSSouvik Roy     }
124*b767f56cSSouvik Roy     catch (const std::exception& l_ex)
125*b767f56cSSouvik Roy     {
126*b767f56cSSouvik Roy         m_logger->logMessage("Failed to restart inventory manager service " +
127*b767f56cSSouvik Roy                              m_inventoryManagerServiceName +
128*b767f56cSSouvik Roy                              ". Error: " + std::string(l_ex.what()));
129*b767f56cSSouvik Roy         o_errCode = vpd::error_code::STANDARD_EXCEPTION;
130*b767f56cSSouvik Roy     }
131*b767f56cSSouvik Roy     return l_rc;
132*b767f56cSSouvik Roy }
133