浏览代码

Z991239-5721 #comment feat: 升级实体兼容支持适配器升级改造,适配器心跳回退

Signed-Off-By: commit-hook
刘文涛80174520 11 月之前
父节点
当前提交
6ef652fc97
共有 3 个文件被更改,包括 164 次插入42 次删除
  1. 48 9
      Module/mod_UpgradeMgr/UpgradeTaskFSM.cpp
  2. 2 1
      Module/mod_UpgradeMgr/UpgradeTaskFSM.h
  3. 114 32
      Module/mod_UpgradeMgr/mod_UpgradeMgr.cpp

+ 48 - 9
Module/mod_UpgradeMgr/UpgradeTaskFSM.cpp

@@ -1653,7 +1653,8 @@ namespace Task
 			string failReason = "";
 			CSimpleStringA strErrMsg = "";
 			//判定是适配器or应用回退
-			if(m_fsm->judgeRollbackTaskClass(failReason,strErrMsg))
+			CSimpleStringA verDirName = m_fsm->m_currentTask.pack_version.GetData();
+			if(m_fsm->judgeRollbackTaskClass(verDirName,failReason,strErrMsg))
 			{
 				if (!m_fsm->m_TempDepUpgradeFlag) {
 					//升级回退
@@ -4514,7 +4515,7 @@ void CUpgradeTaskFSM::judgeTaskClass()
 
 }
 
-ErrorCodeEnum CUpgradeTaskFSM::judgeRollbackTaskClass(string& failReason, CSimpleStringA& strErrMsg)
+ErrorCodeEnum CUpgradeTaskFSM::judgeRollbackTaskClass(CSimpleStringA verDirName, string& failReason, CSimpleStringA& strErrMsg)
 {
 	//搜索终端应用目录,适配器应用目录,
 
@@ -4539,18 +4540,18 @@ ErrorCodeEnum CUpgradeTaskFSM::judgeRollbackTaskClass(string& failReason, CSimpl
 	}
 
 	CSimpleStringA strDestDir = "";
-	if (DirIsExist(verPathStr.GetData(), m_currentTask.pack_version.GetData())) {
+	if (DirIsExist(verPathStr.GetData(), verDirName.GetData())) {
 		m_TempDepUpgradeFlag = false;//应用版本
 		return Error_Succeed;
 	}
-	else if (DirIsExist(depPathStr.GetData(), m_currentTask.pack_version.GetData())) {
+	else if (DirIsExist(depPathStr.GetData(), verDirName.GetData())) {
 		m_TempDepUpgradeFlag = true;//适配器版本
 		return Error_Succeed;
 	}
 	else {
-		CSimpleStringA errStr = CSimpleStringA::Format("judgeRollbackTaskClass fail, RollbackVerRootPath =[%s|%s] not find version dir [%s],fail", verPathStr.GetData(), depPathStr.GetData(), m_currentTask.pack_version.GetData());
+		CSimpleStringA errStr = CSimpleStringA::Format("judgeRollbackTaskClass fail, RollbackVerRootPath =[%s|%s] not find version dir [%s],fail", verPathStr.GetData(), depPathStr.GetData(), verDirName.GetData());
 		LogWarn(Severity_Middle, Error_Exception, ERR_TASK_ROLLBACK_VERSION_CHECK_FAIL, errStr.GetData());
-		strErrMsg = CSimpleStringA::Format("指定回退版本文件夹不存在(配置:%s)", m_currentTask.pack_version.GetData());
+		strErrMsg = CSimpleStringA::Format("指定回退版本文件夹不存在(配置:%s)", verDirName.GetData());
 		failReason = "X";
 		return Error_Unexpect;//不存在
 	}
@@ -4857,19 +4858,19 @@ ErrorCodeEnum CUpgradeTaskFSM::SwitchUpgradeDepNow()
 		}
 		else if (m_currentTask.task_type.Compare("R") == 0) {
 			//适配器版本回退
-			LogEvent(Severity_Middle, Event_Req_Framework_Rollback_Restart,
+			LogEvent(Severity_Middle, Event_DeviceAdapterRollBack_Framework_Restart,
 				CSimpleStringA::Format("rollback to old dep version [%s] succeed, request to restart framework , taskID=[%s]", m_currentTask.depNewVersion.GetData(), m_currentTask.upgradeTaskId.GetData()));
 			PostEventFIFO(new FSMEvent(CUpgradeTaskFSM::Event_PreRestart));//进入S7
 		}
 	}
 	else if (m_currentTask.reboot_type == 2) {
 		if (m_currentTask.task_type.Compare("U") == 0) {
-			LogEvent(Severity_Middle, Event_Req_OS_Upgrade_Restart,
+			LogEvent(Severity_Middle, Event_DeviceAdapterUpgrade_OS_Restart,
 				CSimpleStringA::Format("upgrade to new dep version [%s] succeed, request to restart OS, taskID=[%s]", m_currentTask.depNewVersion.GetData(), m_currentTask.upgradeTaskId.GetData()));
 			PostEventFIFO(new FSMEvent(CUpgradeTaskFSM::Event_PreRestart));//进入S7
 		}
 		else {
-			LogEvent(Severity_Middle, Event_Req_OS_Restart,
+			LogEvent(Severity_Middle, Event_DeviceAdapterRollBack_OS_Restart,
 				CSimpleStringA::Format("rollback to old dep version [%s] succeed, request to restart OS, taskID=[%s]", m_currentTask.depNewVersion.GetData(), m_currentTask.upgradeTaskId.GetData()));
 			PostEventFIFO(new FSMEvent(CUpgradeTaskFSM::Event_PreRestart));//进入S7
 		}
@@ -4925,6 +4926,44 @@ ErrorCodeEnum CUpgradeTaskFSM::RollBackDepVersionCheck(string& failReason, CSimp
 	return Error_Succeed;
 }
 
+ErrorCodeEnum CUpgradeTaskFSM::RollBackToHistoryDepVersion(CSimpleStringA historyDepVersion)
+{
+	//判断是否为空
+	if (historyDepVersion.IsNullOrEmpty())
+	{
+		LogWarn(Severity_Middle, Error_Exception, ERR_TASK_ROLL_BACK_ACTIVE_FAIL, "RollBackToHistoryDepVersion fail , historyDepVersion is null");
+		return Error_Param;
+	}
+	// 判断目标版本是否等于当前版本
+	if (historyDepVersion == m_currentDepVersion) {
+		LogWarn(Severity_Middle, Error_Exception, ERR_TASK_ROLL_BACK_ACTIVE_FAIL, CSimpleStringA::Format("history version [%s] >= current version [%s]", historyDepVersion.GetData(), m_currentDepVersion.GetData()).GetData());
+		return Error_Param;
+	}
+
+	// 检查对应文件夹是否存在
+	CSimpleStringA rootVerPath;
+	ErrorCodeEnum rc = m_pEntity->GetFunction()->GetPath("DepBase", rootVerPath);//获取version根路径
+	if (rc != Error_Succeed) {
+		LogWarn(Severity_Middle, Error_Exception, ERR_TASK_ROLL_BACK_ACTIVE_FAIL, "RollBackToHistoryDepVersion fail , get DepBase path is fail");
+		return Error_Bug;
+	}
+
+	CSimpleStringA strHisVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", rootVerPath.GetData(), historyDepVersion.GetData());
+	if (!ExistsDirA(strHisVerPath.GetData()))
+	{
+		LogWarn(Severity_Middle, Error_Exception, ERR_TASK_ROLL_BACK_ACTIVE_FAIL, CSimpleStringA::Format("RollBackToHistoryDepVersion fail, history version dir [%s] not exists", strHisVerPath.GetData()).GetData());
+		return Error_NotExist;
+	}
+
+	ErrorCodeEnum ec = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->RewriteDepVersion(historyDepVersion, false);
+	if (ec != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RollBackToHistoryDepVersion fail, RewriteDepVersion version %s return %s", strHisVerPath.GetData(), SpStrError(ec));
+		LogWarn(Severity_Middle, Error_Exception, ERR_TASK_ROLL_BACK_ACTIVE_FAIL, CSimpleStringA::Format("RollBackToHistoryDepVersion fail, RewriteDepVersion version %s return %s", strHisVerPath.GetData(), SpStrError(ec)));
+	}
+	return ec;
+
+}
+
 ErrorCodeEnum CUpgradeTaskFSM::SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub)
 {
 	if(strFilePath.IsNullOrEmpty()){

+ 2 - 1
Module/mod_UpgradeMgr/UpgradeTaskFSM.h

@@ -422,13 +422,14 @@ public:
 	static void HttpsLogCallBack(const char* logtxt);
 
 	void judgeTaskClass();//临时判定升级任务类别
-	ErrorCodeEnum judgeRollbackTaskClass(string& failReason, CSimpleStringA& strErrMsg);//临时判定回退任务类别
+	ErrorCodeEnum judgeRollbackTaskClass(CSimpleStringA verDirName, string& failReason, CSimpleStringA& strErrMsg);//临时判定回退任务类别
 	int ExecDepInstall(CSimpleStringA& strErrMsg);//适配器升级 0:失败 1:成功 
 	ErrorCodeEnum CreateNewDepVersion(CSimpleStringA NewSoftwareVersion, CSimpleStringA& strErrInfo);//创建新适配器版本
 	ErrorCodeEnum ClearUpgradeFailDepVersion(CSimpleStringA NewSoftwareVersion);//清理升级新版本临时文件
 	ErrorCodeEnum UpgradeDepToNewVersion();//更新depactive文件
 	ErrorCodeEnum SwitchUpgradeDepNow();//切换适配器版本
 	ErrorCodeEnum RollBackDepVersionCheck(string& failReason, CSimpleStringA& strErrMsg);//回退版本检查 C:一般错误 X:终端找不到需要回退的版本文件夹
+	ErrorCodeEnum RollBackToHistoryDepVersion(CSimpleStringA historyDepVersion);//适配器回退到某个历史版本
 
 	bool isWork();
 	bool isAuthSucc();

+ 114 - 32
Module/mod_UpgradeMgr/mod_UpgradeMgr.cpp

@@ -31,15 +31,15 @@ namespace Task
 	struct QueryUpgradeControlTaskRet : CHTTPRet {
 		string m_retStr;
 		bool Parse(string strData) {
-			m_retStr=strData;
+			m_retStr = strData;
 			return true;
 		}
 	};
 
-	struct InitFSMTask : public ITaskSp{
+	struct InitFSMTask : public ITaskSp {
 		CUpgradeMgrEntity* Mgr;
 		explicit InitFSMTask(CUpgradeMgrEntity* e) : Mgr(e) {}
-		void Process(){
+		void Process() {
 			LOG_FUNCTION();
 
 			Mgr->bNewUpgradeMgr = true;//默认新模式
@@ -50,27 +50,29 @@ namespace Task
 				LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_NEW_MODE, "init new upgradeTaskMgr");
 			}
 			else {
-				LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_NEW_MODE, CSimpleStringA::Format("init new upgradeTaskMgr, version = %s",info.InstallVersion.ToString().GetData()).GetData());
+				LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_NEW_MODE, CSimpleStringA::Format("init new upgradeTaskMgr, version = %s", info.InstallVersion.ToString().GetData()).GetData());
 			}
 
 
-			if(Mgr->bNewUpgradeMgr){
-				ErrorCodeEnum rc =Mgr->m_taskFSM.Init(Mgr);//启动新状态机	
+			if (Mgr->bNewUpgradeMgr) {
+				ErrorCodeEnum rc = Mgr->m_taskFSM.Init(Mgr);//启动新状态机	
 				if (rc != Error_Succeed)
 				{
 					LogWarn(Severity_Middle, Error_Exception, ERR_TASK_INIT_NEW_UPGRADE, "init new upgradeTaskMgr FSM fail");
-					Mgr->m_testResult=Error_InvalidState;//自检失败
+					Mgr->m_testResult = Error_InvalidState;//自检失败
 					return;
-				}else{
-					DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("InitFSMTask")("init new upgradeTaskMgr FSM succ");
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitFSMTask")("init new upgradeTaskMgr FSM succ");
 					Mgr->m_initSucc = true;
 				}
 
 				Mgr->m_beginSM3HashTime = CSmallDateTime::GetNow();
-			}else{
+			}
+			else {
 				LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_OLD_MODE, "init old upgradeTaskMgr");
 			}
-			
+
 		}
 	};
 
@@ -131,7 +133,70 @@ namespace Task
 						Sleep(30 * 1000);//继续循环
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("enter not main page, rollback version delay 30s");
 					}
-				}	
+				}
+			}
+			Mgr->m_taskFSM.m_bRollbackTask = false;//线程退出
+		}
+	};
+
+	struct RollBackDepTask : public ITaskSp {
+		CUpgradeMgrEntity* Mgr;
+		CSimpleStringA historyVersion;
+		explicit RollBackDepTask(CUpgradeMgrEntity* e, CSimpleStringA depVersion) : Mgr(e) {
+			historyVersion = depVersion;
+		}
+		void Process() {
+			bool loop = true;
+			while (loop) {
+				//判断是否继续执行
+				CSmartPointer<IConfigInfo> spConfig;
+				ErrorCodeEnum ret = Mgr->GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
+				int rollbackTemp = 0;
+				if (ret == Error_Succeed) {
+					spConfig->ReadConfigValueInt("UpgradeManager", "RollbackFlag", rollbackTemp);
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get centerSetting RollbackFlag=%d", rollbackTemp);
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get centerSetting RollbackFlag fail");
+				}
+				if (rollbackTemp == 0) {
+					//立即回退模式
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Immediate mode,begin rollback dep version");
+					ErrorCodeEnum rc = Mgr->m_taskFSM.RollBackToHistoryDepVersion(historyVersion);
+					if (rc == Error_Succeed)
+					{
+						// 通过事件通知健康实体
+						LogEvent(Severity_Middle, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade succeed");
+					}
+					else
+					{
+						LogWarn(Severity_Low, rc, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade fail");
+					}
+					loop = false;//退出
+				}
+				else {
+					//等待首页回退模式
+					CSimpleStringA strValue;
+					if (Mgr->GetFunction()->GetSysVar("UIState", strValue) == Error_Succeed && strValue.Compare("M") == 0) {
+						// 已经进入首页,开始回退
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("enter main page, begin rollback dep version");
+						ErrorCodeEnum rc = Mgr->m_taskFSM.RollBackToHistoryDepVersion(historyVersion);
+						if (rc == Error_Succeed)
+						{
+							// 通过事件通知健康实体
+							LogEvent(Severity_Middle, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade succeed");
+						}
+						else
+						{
+							LogWarn(Severity_Low, rc, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade fail");
+						}
+						loop = false;//退出
+					}
+					else {
+						Sleep(30 * 1000);//继续循环
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("enter not main page, rollback dep version delay 30s");
+					}
+				}
 			}
 			Mgr->m_taskFSM.m_bRollbackTask = false;//线程退出
 		}
@@ -326,31 +391,48 @@ ErrorCodeEnum CUpgradeMgrEntity::RollbackUpdate(const CSimpleStringA &strVersion
 				LogWarn(Severity_Low, Error_NotImpl, ERR_TASK_ROLLBACK_FAIL, "version is empty , rollback upgrade fail");
 				return Error_NotImpl;
 			}else{
-				ErrorCodeEnum rc = Error_Succeed;
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("try rollback to version: [%s]", (const char*)strVersion);
-				int w1, w2, w3, w4;
-				int ret = sscanf(strVersion, "%d.%d.%d.%d", &w1, &w2, &w3, &w4);
-				if (ret <4)
-				{
-					DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("version [%s] parse fail", (const char*)strVersion);
-					rc=  Error_Param;
+				//判定适配器or应用心跳回退
+				string failReason = "";
+				CSimpleStringA strErrMsg = "";
+				ErrorCodeEnum err =  this->m_taskFSM.judgeRollbackTaskClass(strVersion, failReason, strErrMsg);
+				if (err != Error_Succeed) {
+					LogWarn(Severity_Low, Error_Exception, ERR_TASK_ROLLBACK_FAIL, CSimpleStringA::Format("judgeRollbackTaskClass fail,err=%s", strErrMsg.GetData()).GetData());
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("judgeRollbackTaskClass fail,err=%s", strErrMsg.GetData());
+					return err;
 				}
-				else
-				{	//回退放入线程当中
-					if (!m_taskFSM.m_bRollbackTask) {						
-						Task::RollBackTask* rTask = new Task::RollBackTask(this, CVersion(w1, w2, w3, w4));
-						ErrorCodeEnum rc = this->GetFunction()->PostThreadPoolTask(rTask);
-						if (Error_Succeed == rc) {
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start succ");
-							m_taskFSM.m_bRollbackTask = true;//启动线程
+				else {
+					if (!this->m_taskFSM.m_TempDepUpgradeFlag) {
+
+						ErrorCodeEnum rc = Error_Succeed;
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("try rollback to version: [%s]", (const char*)strVersion);
+						int w1, w2, w3, w4;
+						int ret = sscanf(strVersion, "%d.%d.%d.%d", &w1, &w2, &w3, &w4);
+						if (ret < 4)
+						{
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("version [%s] parse fail", (const char*)strVersion);
+							rc = Error_Param;
 						}
-						else {
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start fail : %d",(int)rc);
+						else
+						{	//回退放入线程当中
+							if (!m_taskFSM.m_bRollbackTask) {
+								Task::RollBackTask* rTask = new Task::RollBackTask(this, CVersion(w1, w2, w3, w4));
+								ErrorCodeEnum rc = this->GetFunction()->PostThreadPoolTask(rTask);
+								if (Error_Succeed == rc) {
+									DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start succ");
+									m_taskFSM.m_bRollbackTask = true;//启动线程
+								}
+								else {
+									DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start fail : %d", (int)rc);
+								}
+							}
+							else {
+								DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread is exist");
+								return Error_Succeed;
+							}
 						}
 					}
 					else {
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread is exist");
-						return Error_Succeed;
+
 					}
 				}
 			}