/* * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /////////////////////////////////////////////////////////////////////////////// /// \ingroup tag_SS_LoggerService /// \brief Provide support for SS Logger module utility functions. /// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////// #include "ss_logger_util.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ss_logger_common.h" #include #define SS_STORE_FILENAME_SYSILG_TERM "_SYS_ILG_RESET.tar.gz" #define SS_STORE_FILENAME__CWORD52__TERM "__CWORD52_.log" char CLoggerUtil::m_usbpath[USB_PATH_SIZE]; /////////////////////////////////////////////////////////////////////////////// // CLASS METHODS /////////////////////////////////////////////////////////////////////////////// CLoggerUtil::CLoggerUtil(void) : m_pCfg(NULL), m_Milage(0), m_bootCount(0) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); m_usbpath[0] = '\0'; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } CLoggerUtil::~CLoggerUtil(void) { // LCOV_EXCL_START 14:globle instance AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); } // LCOV_EXCL_STOP EFrameworkunifiedStatus CLoggerUtil::Initialize(CLoggerCfg *f_pLoggerCfg) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus; m_pCfg = f_pLoggerCfg; l_eStatus = (NULL != f_pLoggerCfg) ? eFrameworkunifiedStatusOK : eFrameworkunifiedStatusInvldParam; FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } std::string CLoggerUtil::getDestination(TLoggerErrorEvent &f_eventNtfData) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+: %d ", f_eventNtfData.EventType); std::string l_path = ""; EFrameworkunifiedStatus l_eStatus; switch (f_eventNtfData.EventType) { case eErrorEventTypeProcessCrash: case eErrorEventTypeHeartBeatFailure: case eErrorEventTypeSystemLowMemory: case eErrorEventTypeBootMicroReset: case eErrorEventTypeProcessExit: case eErrorEventTypeUserInvokedUserForceReset: case eErrorEventTypeModConnFailed: case eErrorEventTypeStartRespFailed: case eErrorEventTypeUserInvokedCollectDevLogs: case eErrorEventTypeModuleInvokedResetRequest: case eErrorEventTypeModuleInvokedCollectDebugLogs: case eErrorEventTypeDtcEvent: case eErrorEventTypeUserInvokedClearLogs: case eErrorEventTypeGroupRelaunch: l_eStatus = m_pCfg->GetEmmcDestination(l_path); break; case eErrorEventTypeUserInvokedCollectNaviLog: l_eStatus = m_pCfg->GetEmmcNaviLogDestination(l_path); break; case eErrorEventTypeEelExport: l_path = f_eventNtfData.ModuleName; l_eStatus = eFrameworkunifiedStatusOK; break; case eErrorEventTypeInterfaceunifiedEmmcLogs: l_path = f_eventNtfData.ModuleName; l_eStatus = eFrameworkunifiedStatusOK; break; case eErrorEventTypeUserInvokedCollectAllLogs: case eErrorEventTypeUserInvokedCollectScreenShot: case eErrorEventTypeUserInvokedCollectInterfaceunifiedLogs: case eErrorEventTypeCanEvent: l_eStatus = m_pCfg->GetUserInvokedDestination(l_path); break; case eErrorEventTypeDiagEvent: l_path = f_eventNtfData.ModuleName; l_eStatus = eFrameworkunifiedStatusOK; break; default: l_eStatus = eFrameworkunifiedStatusFail; break; } if (eFrameworkunifiedStatusOK != l_eStatus) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Could not get filepath "); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-: %s", l_path.c_str()); return (l_path); } EFrameworkunifiedStatus CLoggerUtil::checkDestinationAvailable( TLoggerErrorEvent &f_eventNtfData) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusFail; std::string l_path = CLoggerUtil::getDestination(f_eventNtfData); std::string::size_type ret; if (l_path.length() > 0) { ret = l_path.find(DEBUG_USB_PATH); if (ret != std::string::npos && ret == 0) { if (0 == access(m_usbpath, W_OK)) { // LCOV_EXCL_BR_LINE 5:C code // LCOV_EXCL_START 5:C code AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert std::string path = l_path.substr(sizeof(DEBUG_USB_PATH) - 1); f_eventNtfData.ModuleName = m_usbpath; f_eventNtfData.ModuleName.append(path); l_eStatus = eFrameworkunifiedStatusOK; // LCOV_EXCL_STOP } } else { if (0 == access(l_path.c_str(), W_OK)) { // LCOV_EXCL_BR_LINE 5:C code l_eStatus = eFrameworkunifiedStatusOK; } } } if (eFrameworkunifiedStatusOK != l_eStatus) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Failed the check path: l_eStatus(%d), l_path(%s)", l_eStatus, l_path.c_str()); // LCOV_EXCL_BR_LINE 11:except,C++ STL } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } static void SetSuffixFromType(std::string &pathAndName, EErrorEventType type) { // NOLINT (runtime/references) switch (type) { case eErrorEventTypeProcessCrash: case eErrorEventTypeHeartBeatFailure: case eErrorEventTypeSystemLowMemory: case eErrorEventTypeBootMicroReset: case eErrorEventTypeProcessExit: case eErrorEventTypeModConnFailed: case eErrorEventTypeStartRespFailed: case eErrorEventTypeModuleInvokedResetRequest: pathAndName.insert(pathAndName.find(".tar.gz"), "_ERR"); break; case eErrorEventTypeUserInvokedUserForceReset: case eErrorEventTypeUserInvokedCollectAllLogs: case eErrorEventTypeUserInvokedCollectScreenShot: case eErrorEventTypeUserInvokedCollectInterfaceunifiedLogs: case eErrorEventTypeDiagEvent: case eErrorEventTypeCanEvent: case eErrorEventTypeDtcEvent: case eErrorEventTypeModuleInvokedCollectDebugLogs: pathAndName.insert(pathAndName.find(".tar.gz"), "_DIAG"); break; case eErrorEventTypeUserInvokedCollectDevLogs: pathAndName.insert(pathAndName.find(".tar.gz"), "_DEBUG"); break; case eErrorEventTypeGroupRelaunch: pathAndName.insert(pathAndName.find(".tar.gz"), "_GRP_RELAUNCH"); break; default: break; } } EFrameworkunifiedStatus CLoggerUtil::getFilePathAndName(HANDLE f_hApp, TLoggerErrorEvent &f_eventNtfData, uint32_t f_time, std::string &f_pathAndName) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; f_pathAndName = ""; switch (f_eventNtfData.EventType) { // LCOV_EXCL_BR_LINE 200: eErrorEventTypeEelExport ex. can not be run case eErrorEventTypeProcessCrash: case eErrorEventTypeProcessExit: case eErrorEventTypeHeartBeatFailure: case eErrorEventTypeSystemLowMemory: case eErrorEventTypeBootMicroReset: case eErrorEventTypeModConnFailed: case eErrorEventTypeStartRespFailed: case eErrorEventTypeGroupRelaunch: l_eStatus = m_pCfg->GetEmmcDestination(f_pathAndName); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 6:it will aways return ok // LCOV_EXCL_START 6:it will aways return ok AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetEmmcDestination() returned %d.", l_eStatus); // LCOV_EXCL_STOP } else { f_pathAndName.append("/"); f_pathAndName.append(GetEmmcFilename(f_time)); } break; case eErrorEventTypeUserInvokedUserForceReset: case eErrorEventTypeUserInvokedCollectDevLogs: l_eStatus = m_pCfg->GetEmmcDestination(f_pathAndName); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 6:it will aways return ok // LCOV_EXCL_START 6:it will aways return ok AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetEmmcDestination() returned %d.", l_eStatus); // LCOV_EXCL_STOP } else { f_pathAndName.append("/"); f_pathAndName.append(GetEmmcFilename(f_time)); } break; case eErrorEventTypeModuleInvokedResetRequest: case eErrorEventTypeModuleInvokedCollectDebugLogs: case eErrorEventTypeDtcEvent: l_eStatus = m_pCfg->GetEmmcDestination(f_pathAndName); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 6:it will aways return ok // LCOV_EXCL_START 6:it will aways return ok AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetEmmcDestination() returned %d.", l_eStatus); // LCOV_EXCL_STOP } else { f_pathAndName.append("/"); f_pathAndName.append(GetEmmcFilename(f_time)); if (!f_eventNtfData.ModuleName.empty()) { // LCOV_EXCL_BR_LINE 6: ModuleName can not be empty size_t l_pos = f_pathAndName.find(".tar.gz"); if (l_pos != std::string::npos) { // LCOV_EXCL_BR_LINE 6: ".tar.gz" is aways exist f_pathAndName.insert(l_pos, f_eventNtfData.ModuleName); } } } break; case eErrorEventTypeEelExport: // LCOV_EXCL_START 6: impossible to confirm because it can not get in AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert f_pathAndName = f_eventNtfData.ModuleName; f_pathAndName.append("/"); f_pathAndName.append("loggerservicelogs_export_"); f_pathAndName.append(GetTimeString(f_time)); f_pathAndName.append(".tar.gz"); break; // LCOV_EXCL_STOP case eErrorEventTypeInterfaceunifiedEmmcLogs: // LCOV_EXCL_START 6: impossible to confirm because it can not get in AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert // store the target location on event trigger f_pathAndName = f_eventNtfData.ModuleName; break; // LCOV_EXCL_STOP case eErrorEventTypeUserInvokedCollectAllLogs: l_eStatus = m_pCfg->GetUserInvokedDestination(f_pathAndName); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 6: impossible to confirm because it can not be fail // LCOV_EXCL_START 6: impossible to confirm because it can not be fail AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetUserInvokedDestination() returned %d.", l_eStatus); // LCOV_EXCL_STOP } else { std::string l_emmc_path = m_pCfg->getEmmcOutputPath(); f_pathAndName.append(l_emmc_path); f_pathAndName.append("/"); f_pathAndName.append(GetUserInvokedFilename(f_hApp, f_time)); if (!f_eventNtfData.ModuleName.empty()) { // LCOV_EXCL_BR_LINE 6: it can not be empty size_t l_pos = f_pathAndName.find(".tar.gz"); if (l_pos != std::string::npos) { // LCOV_EXCL_BR_LINE 6: ".tar.gz" is aways exist f_pathAndName.insert(l_pos, f_eventNtfData.ModuleName); } } } break; case eErrorEventTypeUserInvokedCollectScreenShot: case eErrorEventTypeUserInvokedCollectInterfaceunifiedLogs: case eErrorEventTypeCanEvent: l_eStatus = m_pCfg->GetUserInvokedDestination(f_pathAndName); if (eFrameworkunifiedStatusOK != l_eStatus) { // LCOV_EXCL_BR_LINE 6: impossible to confirm because it can not be fail // LCOV_EXCL_START 6: impossible to confirm because it can not be fail AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetUserInvokedDestination() returned %d.", l_eStatus); // LCOV_EXCL_STOP } else { f_pathAndName.append("/"); f_pathAndName.append(GetUserInvokedFilename(f_hApp, f_time)); } break; case eErrorEventTypeDiagEvent: // LCOV_EXCL_START 6: impossible to confirm because it can not get in AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert f_pathAndName = f_eventNtfData.ModuleName; f_pathAndName.append("/"); f_pathAndName.append(GetUserInvokedFilename(f_hApp, f_time)); l_eStatus = eFrameworkunifiedStatusOK; break; // LCOV_EXCL_STOP case eErrorEventTypeUserInvokedClearLogs: case eErrorEventTypeUserInvokedCollectNaviLog: l_eStatus = eFrameworkunifiedStatusOK; break; default: FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. Unknown event type: %d.", f_eventNtfData.EventType); l_eStatus = eFrameworkunifiedStatusFail; break; } SetSuffixFromType(f_pathAndName, f_eventNtfData.EventType); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_START 13: EFrameworkunifiedStatus CLoggerUtil::getNaviLogFilePathAndName(std::string &f_prefix, uint32_t f_time, std::string &f_pathAndName) { // LCOV_EXCL_BR_LINE 13: AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; l_eStatus = m_pCfg->GetEmmcNaviLogDestination(f_pathAndName); if (eFrameworkunifiedStatusOK != l_eStatus) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. GetEmmNaviLogDestination() returned %d.", l_eStatus); } else { f_pathAndName.append("/"); f_pathAndName.append(f_prefix); f_pathAndName.append(GetEmmcNaviLogFilename(f_time)); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP // LCOV_EXCL_START 200: EFrameworkunifiedStatus CLoggerUtil::getEmmcNaviLogParams( uint32_t f_time, EPWR_SHUTDOWN_TRIGGER_TYPE errorType, std::string &f_pathName, UI_32 &f_logMax) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); DIR *l_dirp = NULL; EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; std::string l_prefix = ""; std::vector l_vector; std::string l_path = m_pCfg->getEmmcOutputNaviLogPath(); if ((errorType == epssdmsdtGENERIC_ERROR_RESET) || (errorType == epssdmsdtFATAL_ERROR_RESET)) { /*When reset occured !!*/ f_logMax = m_pCfg->m_emmcOutputNaviLogErrMax; l_prefix = "ERR_"; } else { /* ACC OFF occured*/ f_logMax = m_pCfg->m_emmcOutputNaviLogNmlMax; l_prefix = "NML_"; } if (f_logMax == 0) { l_eStatus = eFrameworkunifiedStatusOK; return l_eStatus; } l_dirp = opendir(l_path.c_str()); if (l_dirp != NULL) { struct dirent l_dirent; struct dirent* next; while (0 == readdir_r(l_dirp, &l_dirent, &next) && next != NULL) { std::string l_findFileName = l_dirent.d_name; size_t l_find_pos_top = l_findFileName.find(l_prefix.c_str()); size_t l_find_pos = l_findFileName.find(".log"); if (std::string::npos != l_find_pos && std::string::npos != l_find_pos_top) { l_vector.push_back(l_findFileName); } } closedir(l_dirp); } std::sort(l_vector.begin(), l_vector.end()); for (UI_32 i = static_cast(l_vector.size()); i != 0; i--) { std::string l_FilePath = l_path; std::string l_FileName = l_vector.at(i - 1); l_FilePath.append("/"); l_FilePath.append(l_FileName.c_str()); if (i < f_logMax) { size_t l_pos = l_FileName.find("_", l_prefix.size()); if (std::string::npos != l_pos) { std::string l_renameFilePath = l_path; std::stringstream l_numStream; l_numStream << std::setw(5) << std::setfill('0') << std::right << std::dec << (i + 1); l_renameFilePath.append("/"); l_renameFilePath.append(l_prefix); l_renameFilePath.append(l_numStream.str()); l_renameFilePath.append(l_FileName, l_pos, (l_FileName.size() - l_pos)); if (0 != rename(l_FilePath.c_str(), l_renameFilePath.c_str())) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. rename navilog file %s:%d.", l_FilePath.c_str(), errno); } } } else { if (0 != unlink(l_FilePath.c_str())) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. delete navilog file %s:%d.", l_FilePath.c_str(), errno); } } } // sync parent directory SyncDir(l_path); l_eStatus = getNaviLogFilePathAndName(l_prefix, f_time, f_pathName); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; } // LCOV_EXCL_STOP // LCOV_EXCL_START 200: can not be called size_t CLoggerUtil::deleteRequestLogs(std::string f_emmcpath, ELOGGERSERVICELOGTYPE f_reqtype, size_t f_reqsize, ELOGGERSERVICELOGTYPE f_deltype) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); DIR* l_dirp = NULL; std::vector vect; std::vector::iterator it; UI_32 l_count = 0; size_t l_totalsize = 0; // create saved file list on eMMC l_dirp = opendir(f_emmcpath.c_str()); if (l_dirp != NULL) { struct dirent l_dirent; struct dirent* next; while (0 == readdir_r(l_dirp, &l_dirent, &next) && next != NULL) { std::string l_filename = l_dirent.d_name; if (CLoggerUtil::QueryLoggerservicelogType(l_filename) == f_deltype) { vect.push_back(l_filename); } } closedir(l_dirp); } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " open failed eMMC path: %s", f_emmcpath.c_str()); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return 0; } // get num of delete logs std::sort(vect.begin(), vect.end()); for (it = vect.begin(); it != vect.end(); it++) { l_count++; std::string l_filename = *it; struct stat st_buf; std::string l_tmpstr = f_emmcpath; l_tmpstr.append(l_filename.c_str()); if (stat(l_tmpstr.c_str(), &st_buf) != -1) { l_totalsize += st_buf.st_size; } if (l_totalsize > f_reqsize) { break; } } // start delete logs if ((l_totalsize > f_reqsize) || (f_reqtype == eLoggerservicelogTypeAbnormal) || (f_reqtype == eLoggerservicelogTypeGrpRelaunch)) { for (it = vect.begin(); it != vect.end() && l_count > 0; it++) { l_count--; std::string l_filename = *it; std::string l_tmpstr = f_emmcpath; l_tmpstr.append(l_filename.c_str()); if (unlink(l_tmpstr.c_str()) != 0) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " unlink failed %s:%d.", l_tmpstr.c_str(), errno); } FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " del-file=%s total=%d", l_tmpstr.c_str(), l_totalsize); } SyncDir(f_emmcpath); } else { l_totalsize = 0; FRAMEWORKUNIFIEDLOG( ZONE_INFO, __FUNCTION__, " nothing to delete logs req-type=%d del-logtype=%d total=%d, log_count=%d", f_reqtype, f_deltype, l_totalsize, l_count); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_totalsize; } // LCOV_EXCL_STOP // LCOV_EXCL_START 200: can not be called EFrameworkunifiedStatus CLoggerUtil::forceDeleteOldLog(std::string f_archive_destination, size_t f_req_size) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusFail; std::string l_emmc_path; size_t l_delsize = 0; ELOGGERSERVICELOGTYPE l_logtype = eLoggerservicelogTypeOther; size_t l_pos = f_archive_destination.find_last_of('/'); if (std::string::npos != l_pos) { l_emmc_path = f_archive_destination.substr(0, l_pos); l_emmc_path.append("/"); l_logtype = CLoggerUtil::QueryLoggerservicelogType( f_archive_destination.substr(l_pos + 1, f_archive_destination.size() - l_pos + 1)); } if (l_logtype == eLoggerservicelogTypeOther) { // not found FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Invalid Parameter. dest=%s", f_archive_destination.c_str()); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return eFrameworkunifiedStatusFail; } // remove dirty-file if exist if (unlink(f_archive_destination.c_str()) != 0) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " unlink failed %s:%d.", f_archive_destination.c_str(), errno); } // delete normal log l_delsize = deleteRequestLogs(l_emmc_path, l_logtype, f_req_size, eLoggerservicelogTypeNormal); if (l_delsize >= f_req_size) { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " delete normal logs success: req-size=%d, del-size=%d", f_req_size, l_delsize); l_eStatus = eFrameworkunifiedStatusOK; } else if (l_logtype == eLoggerservicelogTypeAbnormal) { // delete abnormal log if request type is abnormal FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " continue delete abnormal logs: req-size=%d, del-size=%d", f_req_size, l_delsize); size_t l_tmpsize = f_req_size; l_tmpsize -= l_delsize; l_delsize = deleteRequestLogs(l_emmc_path, l_logtype, l_tmpsize, eLoggerservicelogTypeAbnormal); if (l_delsize >= l_tmpsize) { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " delete abnormal logs success: req-size=%d, del-size=%d", f_req_size, l_delsize); l_eStatus = eFrameworkunifiedStatusOK; } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " abnormal log delete not complete. req-size=%d, del-size=%d", f_req_size, l_delsize); } } else if (l_logtype == eLoggerservicelogTypeGrpRelaunch) { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " continue delete group relaunch logs: req-size=%d, del-size=%d", f_req_size, l_delsize); size_t l_tmpsize = f_req_size; l_tmpsize -= l_delsize; l_delsize = deleteRequestLogs(l_emmc_path, l_logtype, l_tmpsize, eLoggerservicelogTypeGrpRelaunch); if (l_delsize >= l_tmpsize) { FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, " delete group relaunch logs success: req-size=%d, del-size=%d", f_req_size, l_delsize); l_eStatus = eFrameworkunifiedStatusOK; } else { FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " group relaunch log delete not complete. req-size=%d, del-size=%d", f_req_size, l_delsize); } } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " normal log del not complete. req-size=%d, del-size=%d", f_req_size, l_delsize); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; } // LCOV_EXCL_STOP EFrameworkunifiedStatus CLoggerUtil::deleteOldLog(std::string log_path, std::vector& l_vector, std::string& f_archive_destination, UI_32 max_num) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; size_t l_pos = f_archive_destination.find_last_of('/'); if (std::string::npos != l_pos) { // LCOV_EXCL_BR_LINE 200: there is always '/' in f_destination std::sort(l_vector.begin(), l_vector.end()); std::vector::iterator itr = l_vector.begin(); for (UI_32 i = static_cast(l_vector.size()); (max_num - 1) < i; i--, itr++) { if (itr == l_vector.end()) { // LCOV_EXCL_BR_LINE 200: (max_num - 1) can not be -1. break; } std::string l_FilePath = log_path; std::string l_FileName = *itr; l_FilePath.append("/"); l_FilePath.append(l_FileName.c_str()); if (0 != unlink(l_FilePath.c_str())) { l_eStatus = eFrameworkunifiedStatusAccessError; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. delete old log file %s:%d.", l_FilePath.c_str(), errno); } } SyncDir(log_path); } else { // LCOV_EXCL_START 200: there is always '/' in f_destination AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert l_eStatus = eFrameworkunifiedStatusFail; FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. delete target not found. %s", f_archive_destination.c_str()); // LCOV_EXCL_STOP } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; } EFrameworkunifiedStatus CLoggerUtil::deleteOldEmmcLog(std::string& f_archive_destination, EErrorEventType type) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); DIR *l_dirp = NULL; std::vector vect_abnrm; /* ILLEGAL RESET LOG INFO or ERROR EXIT LOG INFO */ std::vector vect_nrm; /* NORMAL LOG INFO */ std::vector vect_rlnc; /* RELAUNCH LOG INFO */ std::string l_emmc_path = m_pCfg->getEmmcOutputPath(); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; UI_32 abnrm_count = 0; l_dirp = opendir(l_emmc_path.c_str()); if (l_dirp != NULL) { // LCOV_EXCL_BR_LINE 5: opendir's error case. struct dirent l_dirent; struct dirent* next; while (0 == readdir_r(l_dirp, &l_dirent, &next) && next != NULL) { std::string l_findFileName = l_dirent.d_name; // if ((std::string::npos != l_findFileName.find("_ILG_RESET.tar.gz")) // || (std::string::npos != l_findFileName.find("_ERR.tar.gz"))) { // vect_abnrm.push_back(l_findFileName); if ((l_findFileName == ".") || (l_findFileName == "..")) { continue; } else if (std::string::npos != l_findFileName.find(SS_STORE_FILENAME_SYSILG_TERM)) { vect_abnrm.push_back(l_findFileName); } else if(std::string::npos != l_findFileName.find(SS_STORE_FILENAME__CWORD52__TERM)) { // LCOV_EXCL_BR_LINE 8: SS_STORE_FILENAME__CWORD52__TERM can not be set // NOLINT[whitespace/line_length] AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert vect_abnrm.push_back(l_findFileName); // LCOV_EXCL_LINE 8: SS_STORE_FILENAME_SYSILG_TERM can not be set // NOLINT[whitespace/line_length] } else if((std::string::npos != l_findFileName.find("_ILG_RESET.tar.gz")) || (std::string::npos != l_findFileName.find("_ERR.tar.gz"))) { vect_abnrm.push_back(l_findFileName); abnrm_count++; } else if (std::string::npos != l_findFileName.find("_GRP_RELAUNCH.tar.gz")) { vect_rlnc.push_back(l_findFileName); } else if (std::string::npos != l_findFileName.find(".tar.gz")) { vect_nrm.push_back(l_findFileName); } } closedir(l_dirp); } switch (type) { case eErrorEventTypeProcessCrash: case eErrorEventTypeProcessExit: case eErrorEventTypeHeartBeatFailure: case eErrorEventTypeSystemLowMemory: case eErrorEventTypeBootMicroReset: case eErrorEventTypeModConnFailed: case eErrorEventTypeStartRespFailed: case eErrorEventTypeModuleInvokedResetRequest: // if ((UI_32) m_pCfg->m_emmcOutputErrMax <= vect_abnrm.size()) { // l_eStatus = deleteOldLog(l_emmc_path, vect_abnrm, f_archive_destination, // (UI_32) m_pCfg->m_emmcOutputErrMax); if ((UI_32)m_pCfg->m_emmcOutputErrMax <= abnrm_count) { l_eStatus = SS_LoggerStoreLogs_deleteOldLogAbnrm(l_emmc_path, vect_abnrm, f_archive_destination, (UI_32)m_pCfg->m_emmcOutputErrMax, abnrm_count); } break; case eErrorEventTypeGroupRelaunch: if ((UI_32) m_pCfg->m_emmcOutputGrpRelaunchMax <= vect_rlnc.size()) { l_eStatus = deleteOldLog(l_emmc_path, vect_rlnc, f_archive_destination, (UI_32) m_pCfg->m_emmcOutputGrpRelaunchMax); } break; default: if ((UI_32) m_pCfg->m_emmcOutputMax <= vect_nrm.size()) { l_eStatus = deleteOldLog(l_emmc_path, vect_nrm, f_archive_destination, (UI_32) m_pCfg->m_emmcOutputMax); } break; } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return l_eStatus; } void CLoggerUtil::SetMilage(UI_32 f_Milage) { m_Milage = f_Milage; } std::string CLoggerUtil::GetUserInvokedFilename(HANDLE f_hApp, uint32_t f_time) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); std::string l_ret = ""; std::stringstream l_nameStream; UI_32 l_seqNumber = 0; EFrameworkunifiedStatus l_eStatus = m_pCfg->GetIncrementAndPersistUserInvokedCounter( f_hApp, l_seqNumber); LOG_STATUS_IF_ERRORED( l_eStatus, "GetIncrementAndPersistUserInvokedCounter()"); /* new counter value was not persisted if l_eStatus != eFrameworkunifiedStatusOK */ l_nameStream << std::setw(5) << std::setfill('0') << std::right << std::dec << l_seqNumber << '_'; l_nameStream << std::setw(8) << std::setfill('0') << std::right << std::dec << m_Milage << '_'; l_nameStream << std::setw(5) << std::setfill('0') << std::right << std::dec << m_bootCount << '_'; l_nameStream << std::setw(15) << GetTimeString(f_time) << ".tar.gz"; l_ret = l_nameStream.str(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_ret); } std::string CLoggerUtil::GetEmmcFilename(uint32_t f_time) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); std::string l_ret = ""; std::stringstream l_nameStream; UI_32 l_counter = 0; m_pCfg->GetAndIncrementEmmcCounter(l_counter); l_nameStream << std::setw(5) << std::setfill('0') << std::right << std::dec << l_counter << '_'; l_nameStream << std::setw(15) << this->GetTimeString(f_time) << ".tar.gz"; l_ret = l_nameStream.str(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_ret); } // LCOV_EXCL_START 8: dead code std::string CLoggerUtil::GetEmmcErrorFilename(uint32_t f_time) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); std::string l_ret = ""; std::stringstream l_nameStream; UI_32 l_counter = 0; m_pCfg->GetAndIncrementEmmcCounter(l_counter); l_nameStream << std::setw(5) << std::setfill('0') << std::right << std::dec << l_counter << '_'; l_nameStream << std::setw(15) << this->GetTimeString(f_time) << "_ERR.tar.gz"; l_ret = l_nameStream.str(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_ret); } // LCOV_EXCL_STOP // LCOV_EXCL_START 13: std::string CLoggerUtil::GetEmmcNaviLogFilename(uint32_t f_time) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); std::string l_ret = ""; std::stringstream l_nameStream; UI_32 l_counter = 1; l_nameStream << std::setw(5) << std::setfill('0') << std::right << std::dec << l_counter << '_'; l_nameStream << std::setw(15) << this->GetTimeString(f_time) << ".log"; l_ret = l_nameStream.str(); FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_ret); } // LCOV_EXCL_STOP std::string CLoggerUtil::GetTimeString(uint32_t f_time) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); std::string l_ret = "00000000_000000"; struct tm local_time; Clock_getLocalTimeY2K38(&f_time, &local_time); char buffer[20]; if (0 != strftime(buffer, sizeof(buffer), "%Y%m%d_%H%M%S", // LCOV_EXCL_BR_LINE 5: c code &local_time)) { l_ret = buffer; } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_ret); } void CLoggerUtil::SetUsbMountPath(std::string usbpath) { strncpy(m_usbpath, usbpath.c_str(), USB_PATH_SIZE - 1); m_usbpath[USB_PATH_SIZE - 1] = '\0'; } #ifdef RELEASE_BUILD EFrameworkunifiedStatus CLoggerUtil::PathCheckAndCopyFile(std::string f_source, std::string f_destination) { EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusFail; std::string::size_type ret; ret = f_destination.find(m_usbpath); l_eStatus = CopyFile(f_source, f_destination); return l_eStatus; } #endif // RELEASE_BUILD ///////////////////////////////////////////////////////////////////////// ///// Static Functions ///////////////////////////////////////////////////////////////////////// EFrameworkunifiedStatus CLoggerUtil::CopyFile(std::string f_source, std::string f_destination) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; ssize_t l_nrd; ssize_t l_nwr; char l_buf[BUF_MAX_SIZE]; int l_if = open(f_source.c_str(), O_RDONLY | O_CLOEXEC, 0); if (-1 == l_if) { // LCOV_EXCL_BR_LINE 5: open's error case. // LCOV_EXCL_START 5: open's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "src open fail:%s,errno:%d,msg:%s", f_source.c_str(), errno, strerror(errno)); l_eStatus = eFrameworkunifiedStatusFail; // LCOV_EXCL_STOP } else { bool isWebdav = false; std::string l_tmpDest; size_t l_pos = f_destination.find_last_of('/'); l_tmpDest = f_destination; if (f_destination.find("/mnt/import") != std::string::npos) { // LCOV_EXCL_BR_LINE 13: // if output to webdav's directory, don't create temporary file. // because of being unable to rename the file on it. isWebdav = true; } int l_of = open(l_tmpDest.c_str(), O_WRONLY | O_CREAT | O_CLOEXEC, 0640); if (-1 == l_of) { // LCOV_EXCL_BR_LINE 5: open's error case. // LCOV_EXCL_START 5: open's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "dest open fail:%s,errno:%d,msg:%s", l_tmpDest.c_str(), errno, strerror(errno)); l_eStatus = eFrameworkunifiedStatusFail; // LCOV_EXCL_STOP } else { do { l_nrd = read(l_if, l_buf, sizeof(l_buf)); if (l_nrd == -1) { // LCOV_EXCL_BR_LINE 5: read's error case. // LCOV_EXCL_START 5: read's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "read fail:%s,errno:%d,msg:%s", f_source.c_str(), errno, strerror(errno)); l_eStatus = eFrameworkunifiedStatusAccessError; break; // LCOV_EXCL_STOP } l_nwr = write(l_of, l_buf, l_nrd); if (l_nwr == -1) { // LCOV_EXCL_BR_LINE 5: write's error case. // LCOV_EXCL_START 5: write's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert if (ENOSPC == errno) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "write fail(ENOSPC):%s,errno:%d,msg:%s", l_tmpDest.c_str(), errno, strerror(errno)); l_eStatus = eFrameworkunifiedStatusErrNoEAGAIN; } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "write fail:%s,errno:%d,msg%s", l_tmpDest.c_str(), errno, strerror(errno)); l_eStatus = eFrameworkunifiedStatusAccessError; } break; // LCOV_EXCL_STOP } } while (l_nrd > 0); fsync(l_of); close(l_of); if (l_eStatus != eFrameworkunifiedStatusOK) { // LCOV_EXCL_BR_LINE 6: can not be fail // LCOV_EXCL_START 6: can not be fail AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert close(l_if); return l_eStatus; // LCOV_EXCL_STOP } { struct stat istat_buf, ostat_buf; int ret; ret = fstat(l_if, &istat_buf); if (ret < 0) { // LCOV_EXCL_BR_LINE 5: fstat's error case. // LCOV_EXCL_START 5: fstat's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. stat(%s). errno: %d, %s", f_source.c_str(), errno, strerror(errno)); // LCOV_EXCL_STOP } else { while (1) { ret = stat(l_tmpDest.c_str(), &ostat_buf); if (ret < 0) { // LCOV_EXCL_BR_LINE 5: stat's error case. // LCOV_EXCL_START 5: stat's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. stat(%s). errno: %d, %s", l_tmpDest.c_str(), errno, strerror(errno)); break; // LCOV_EXCL_STOP } if (ostat_buf.st_size >= istat_buf.st_size) { // LCOV_EXCL_BR_LINE 5: read and write can not fail, so the size is same // NOLINT[whitespace/line_length] break; } usleep(10000); // interval } } } } close(l_if); if (!isWebdav) { // LCOV_EXCL_BR_LINE 6: isWebdav is aways false if (rename(l_tmpDest.c_str(), f_destination.c_str()) != 0) { // LCOV_EXCL_BR_LINE 5: rename's error case. // LCOV_EXCL_START 5: rename's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "rename %s to %s fail,errno:%d,msg:%s", l_tmpDest.c_str(), f_destination.c_str(), errno, strerror(errno)); // LCOV_EXCL_STOP } } if (std::string::npos != l_pos) { // LCOV_EXCL_BR_LINE 200: there is always '/' in f_destination std::string l_destPath = f_destination.substr(0, l_pos); SyncDir(l_destPath); } else { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "dest invalid:%s", f_destination.c_str()); // LCOV_EXCL_LINE 200: there is always '/' in f_destination // NOLINT[whitespace/line_length] } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_START 8: can not be called EFrameworkunifiedStatus CLoggerUtil::CopyUntyped(std::string f_source, std::string f_destination) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; struct stat l_stat; int l_statRetVal; if (0 != access(f_source.c_str(), F_OK)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. The specified file path and name does not exist: %s", f_source.c_str()); } else if (0 != (l_statRetVal = lstat(f_source.c_str(), &l_stat))) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. stat() for file or directory returned error: %s -> %d", f_source.c_str(), l_statRetVal); } else if (0 != S_ISDIR(l_stat.st_mode)) { l_eStatus = CopyDirectory(f_source, f_destination); } else if (0 != S_ISLNK(l_stat.st_mode)) { // avoid duplicate copy for eErrorEventTypeInterfaceunifiedEmmcLogs: /nv/log/awlog -> /nv/BS/ss/logger_service/rwdata/log2/awlog if (f_source.find("/nv/BS/ss/logger_service/rwdata/awlog") == std::string::npos) { l_eStatus = CopyDirectory(f_source, f_destination); } } else if (0 != S_ISREG(l_stat.st_mode)) { #ifdef RELEASE_BUILD l_eStatus = PathCheckAndCopyFile(f_source, f_destination); #else l_eStatus = CopyFile(f_source, f_destination); #endif // RELEASE_BUILD } else { FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. specified file may be a symbolic link or other non 'regular' type. File: %s, mode: 0x%04X.", f_source.c_str(), l_stat.st_mode); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP // LCOV_EXCL_START 8: can not be called EFrameworkunifiedStatus CLoggerUtil::CopyDirectory(std::string f_source, std::string f_destination) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; DIR * l_pDir = opendir(f_source.c_str()); if (l_pDir == NULL) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not open directory: %s", f_source.c_str()); } else { if (mkdir(f_destination.c_str(), 0775) == -1) { if (errno == EEXIST) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "Directory: %s already exists.", f_destination.c_str()); } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not create directory: %s. Errno: %s", f_destination.c_str(), strerror(errno)); l_eStatus = eFrameworkunifiedStatusFail; } } else { SyncDir(f_destination); size_t l_pos = f_destination.find_last_of('/'); if (l_pos != std::string::npos) { std::string l_destPath = f_destination.substr(0, l_pos); SyncDir(l_destPath); } } struct dirent l_pDirent; struct dirent* next; while (0 == readdir_r(l_pDir, &l_pDirent, &next) && next != NULL) { if ((0 != strcmp(l_pDirent.d_name, ".")) && /* Ignore special . directory. */ (0 != strcmp(l_pDirent.d_name, "..")) && /* Ignore special .. directory. */ (0 != strcmp(l_pDirent.d_name, "lost+found")) && /* Ignore lost+found. */ ('.' != l_pDirent.d_name[0])) { /* Ignore hidden files */ std::string l_fileSource = f_source; std::string l_fileDestination = f_destination; l_fileSource.append("/"); l_fileSource.append(l_pDirent.d_name); l_fileDestination.append("/"); l_fileDestination.append(l_pDirent.d_name); l_eStatus = CopyUntyped(l_fileSource, l_fileDestination); } } closedir(l_pDir); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP // LCOV_EXCL_START 8: can not be called EFrameworkunifiedStatus CLoggerUtil::MoveFile(std::string f_source, std::string f_destination) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; #ifdef RELEASE_BUILD l_eStatus = CLoggerUtil::PathCheckAndCopyFile(f_source, f_destination); LOG_STATUS_IF_ERRORED(l_eStatus, "CLoggerUtil::PathCheckAndCopyFile()"); #else l_eStatus = CLoggerUtil::CopyFile(f_source, f_destination); LOG_STATUS_IF_ERRORED(l_eStatus, "CLoggerUtil::CopyFile()"); #endif // RELEASE_BUILD if (eFrameworkunifiedStatusOK == l_eStatus) { l_eStatus = (0 == remove(f_source.c_str())) ? eFrameworkunifiedStatusOK : eFrameworkunifiedStatusFail; if (l_eStatus == eFrameworkunifiedStatusOK) { size_t l_pos = f_source.find_last_of('/'); if (std::string::npos != l_pos) { std::string l_emmc_path = f_source.substr(0, l_pos); SyncDir(l_emmc_path); } } } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP // LCOV_EXCL_START 8: can not be called EFrameworkunifiedStatus CLoggerUtil::MoveUntyped(std::string f_source, std::string f_destination) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusFail; struct stat l_stat; int l_statRetVal; if (0 != access(f_source.c_str(), F_OK)) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. The specified file path and name does not exist: %s", f_source.c_str()); } else if (0 != (l_statRetVal = stat(f_source.c_str(), &l_stat))) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, " Error. stat() for file or directory returned error: %s -> %d", f_source.c_str(), l_statRetVal); } else if (0 != S_ISDIR(l_stat.st_mode)) { l_eStatus = CLoggerUtil::MoveDirectory(f_source, f_destination); LOG_STATUS_IF_ERRORED( l_eStatus, "CLoggerUtil::MoveDirectory(f_source, f_destination);"); } else if (0 != S_ISREG(l_stat.st_mode)) { l_eStatus = CLoggerUtil::MoveFile(f_source, f_destination); LOG_STATUS_IF_ERRORED(l_eStatus, "CLoggerUtil::MoveFile(f_source, f_destination)"); } else { FRAMEWORKUNIFIEDLOG( ZONE_ERR, __FUNCTION__, " Error. specified file may be a symbolic link or other non 'regular' type. File: %s, mode: 0x%04X.", f_source.c_str(), l_stat.st_mode); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP // LCOV_EXCL_START 8: can not be called EFrameworkunifiedStatus CLoggerUtil::MoveDirectory(std::string f_source, std::string f_destination) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "+"); EFrameworkunifiedStatus l_eStatus = eFrameworkunifiedStatusOK; DIR * l_pDir = opendir(f_source.c_str()); if (l_pDir == NULL) { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not open directory: %s", f_source.c_str()); l_eStatus = eFrameworkunifiedStatusFail; } else { errno = 0; if (mkdir(f_destination.c_str(), 0666) == -1) { if (errno == EEXIST) { FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "Directory: %s already exists.", f_destination.c_str()); } else { FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, "Could not create directory: %s. Errno: %s", f_destination.c_str(), strerror(errno)); l_eStatus = eFrameworkunifiedStatusFail; } errno = 0; } else { SyncDir(f_destination); size_t l_pos = f_destination.find_last_of('/'); if (l_pos != std::string::npos) { std::string l_destPath = f_destination.substr(0, l_pos); SyncDir(l_destPath); } } if (eFrameworkunifiedStatusOK == l_eStatus) { /* if directory already exists or has been newly created */ struct dirent l_pDirent; struct dirent* next; while (0 == readdir_r(l_pDir, &l_pDirent, &next) && next != NULL) { if ((0 != strcmp(l_pDirent.d_name, ".")) && /* Ignore special . directory. */ (0 != strcmp(l_pDirent.d_name, "..")) && /* Ignore special .. directory. */ (0 != strcmp(l_pDirent.d_name, "lost+found")) && /* Ignore lost+found. */ ('.' != l_pDirent.d_name[0])) { /* Ignore hidden files */ std::string l_fileSource = f_source; std::string l_fileDestination = f_destination; l_fileSource.append("/"); l_fileSource.append(l_pDirent.d_name); l_fileDestination.append("/"); l_fileDestination.append(l_pDirent.d_name); l_eStatus = MoveUntyped(l_fileSource, l_fileDestination); } } } else { } closedir(l_pDir); } FRAMEWORKUNIFIEDLOG(ZONE_FUNC, __FUNCTION__, "-"); return (l_eStatus); } // LCOV_EXCL_STOP // LCOV_EXCL_START 200: can not be called ELOGGERSERVICELOGTYPE CLoggerUtil::QueryLoggerservicelogType(std::string f_logname) { AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert // if (f_logname.find("_ILG_RESET.tar.gz") != std::string::npos if (f_logname.find(SS_STORE_FILENAME_SYSILG_TERM) != std::string::npos) { return eLoggerservicelogTypeAbnormal; } else if (f_logname.find(SS_STORE_FILENAME__CWORD52__TERM) != std::string::npos) { return eLoggerservicelogTypeAbnormal; } else if (f_logname.find("_ILG_RESET.tar.gz") != std::string::npos || f_logname.find("_ERR.tar.gz") != std::string::npos) { return eLoggerservicelogTypeAbnormal; } else if (f_logname.find("_GRP_RELAUNCH.tar.gz") != std::string::npos) { return eLoggerservicelogTypeGrpRelaunch; } else if (f_logname.find(".tar.gz") != std::string::npos) { return eLoggerservicelogTypeNormal; } else { return eLoggerservicelogTypeOther; } } // LCOV_EXCL_STOP void CLoggerUtil::SyncDir(std::string f_dir_path) { int fd = open(f_dir_path.c_str(), O_RDONLY | O_DIRECTORY | O_CLOEXEC); #define OPE_ERR_MSG "%s %s failed. errno:%d,msg:%s" if (fd == -1) { // LCOV_EXCL_BR_LINE 5: open's error case. // LCOV_EXCL_START 5: open's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, OPE_ERR_MSG, f_dir_path.c_str(), "open", errno, strerror(errno)); // LCOV_EXCL_STOP } else { if (fsync(fd) == -1) { // LCOV_EXCL_BR_LINE 5: open's error case. // LCOV_EXCL_START 5: open's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, OPE_ERR_MSG, f_dir_path.c_str(), "fsync", errno, strerror(errno)); // LCOV_EXCL_STOP } if (close(fd) == -1) { // LCOV_EXCL_BR_LINE 5: open's error case. // LCOV_EXCL_START 5: open's error case. AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, OPE_ERR_MSG, f_dir_path.c_str(), "close", errno, strerror(errno)); // LCOV_EXCL_STOP } } #undef OPE_ERR_MSG }