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