Эх сурвалжийг харах

Z991239-5255 #comment 自检功能迁移到健康

oilyang 1 жил өмнө
parent
commit
d2c5d95752

+ 47 - 0
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -1591,4 +1591,51 @@ void CHealthManagerFSM::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_Q
 	}
 
 	ctx->Answer(Error_Succeed);
+}
+ErrorCodeEnum CHealthManagerFSM::CheckEntity(const char* pszEntityName, EntityTestEnum eTestType, bool bNormalCheck)
+{
+	if (bNormalCheck)
+	{
+		//oilyang@20230426 ,常规自检时,针对"TerminalStage"做对应处理(自检分常规自检和即时自检)
+		//"S":准入服务告知准入不过,不再进行实体自检
+		//非"A":其他启动失败导致进关门页,不再对硬件以及其他没必要自检的实体进行自检
+		CSimpleStringA tmpTerminalStage("");
+		GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", tmpTerminalStage);
+		if (tmpTerminalStage.Compare("S") == 0)
+			return Error_Succeed;
+		else if (tmpTerminalStage.Compare("A") != 0)
+		{
+			//the hardward entity and some other entity no need to test
+			if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0 || _strnicmp("CardIssuer", pszEntityName, strlen("CardIssuer")) == 0
+				|| _strnicmp("ContactlessCard", pszEntityName, strlen("ContactlessCard")) == 0
+				|| _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0
+				|| _strnicmp("gpio", pszEntityName, strlen("gpio")) == 0 || _strnicmp("HSPScanner", pszEntityName, strlen("HSPScanner")) == 0
+				|| _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0
+				)
+				return Error_Succeed;
+		}
+	}
+	//oilyang@20170926 no need to check by self.Let the HealthManager entity to do it.
+	//oilyang@20231106 no need to check VtmLoader
+	if (pszEntityName != NULL && (strnicmp(pszEntityName, GetEntityBase()->GetEntityName(), strlen(GetEntityBase()->GetEntityName())) == 0
+		|| strnicmp(pszEntityName, "VtmLoader", strlen("VtmLoader")) == 0))
+		return Error_Succeed;
+	CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	CSmartPointer<IAsynWaitSp> spWait;
+	ErrorCodeEnum errCode;
+	errCode = pFuncPrivilege->TestEntity(pszEntityName, eTestType, spWait);
+
+	if (errCode == Error_Succeed)
+	{
+		callback_entry* entry = new callback_entry();
+		entry->pRawData = NULL;
+		entry->EntityName = pszEntityName;
+		entry->ErrorResult = Error_Unexpect;
+		entry->op = Test_ShakeHand;
+		spWait->SetCallback(this, entry);
+	}
+	else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Test %s,%d", pszEntityName, errCode);
+	return errCode;
 }

+ 1 - 0
Module/mod_healthmanager/HealthManagerFSM.h

@@ -216,6 +216,7 @@ public:
 	CSimpleStringA GetAuthErrMsg();
 	void QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx);
 	void SetPinPadOpenSuc() { m_bPinPadOpenSuc = true; }
+	ErrorCodeEnum CheckEntity(const char* pszEntityName, EntityTestEnum eTestType, bool bNormalCheck = true);
 
 private:
 	

+ 31 - 30
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -58,9 +58,11 @@ using namespace std;
 
 const DWORD HEALTHMANAGER_TIMER_ID = 1;
 const DWORD HEALTHMANAGER_WAIT_MAINPAGE_OPEN_TIMER_ID = 2;
+const DWORD HEALTHMANAGER_SELFCHECK_TIMER_ID = 3;
 const DWORD HEALTHMANAGER_TIMER_INTERVAL = 60000;
 const DWORD HEALTHMANAGER_WAIT_MAINPAGE_OPEN_TIMER_INTERVAL = 60000;
 const DWORD HEALTHMANAGER_TIMER_INTERVAL_MINUTE = (HEALTHMANAGER_TIMER_INTERVAL/60000)*3;
+const DWORD HEALTHMANAGER_SELFCHECK_TIMER_INTERVAL = 60000;
 
 #define WORKING_BUFFER_SIZE 15000
 #define MAX_TRIES 3
@@ -142,10 +144,6 @@ void HealthManagerSession::Handle_DoEvent(SpReqAnsContext<HealthManagerService_D
 	DbgToBeidou(ctx->link, __FUNCTION__)();
 	m_pEntity->DoEvent(ctx);
 }
-void HealthManagerSession::Handle_GetEntityCfgInfo(SpReqAnsContext<HealthManagerService_GetEntityCfgInfo_Req, HealthManagerService_GetEntityCfgInfo_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
 void HealthManagerSession::Handle_GetNetworkState(SpReqAnsContext<HealthManagerService_GetNetworkState_Req, HealthManagerService_GetNetworkState_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
@@ -180,33 +178,11 @@ void HealthManagerSession::Handle_ControlEntityLife(SpReqAnsContext<HealthManage
 	DbgToBeidou(ctx->link, __FUNCTION__)();
     m_pEntity->ControlEntityLife(ctx);
 }
-
-//通过当前实施步骤判断当前为第几次的临时重启
-static inline int GetDeployStepFromStatus(int status)
+void HealthManagerSession::Handle_RealCheck(SpReqAnsContext<HealthManagerService_RealCheck_Req, HealthManagerService_RealCheck_Ans>::Pointer ctx)
 {
-	int result(-1);
-
-	switch (status) {
-	case DeployStep_Begin:
-	case DeployStep_3rdParty_FontInstall:
-	case DeployStep_3rdParty_SogouInstall:
-    case DeployStep_GetTerminalInfo:
-		result = 0;
-		break;
-	case DeployStep_AdapterConfig:
-		result = 1;
-		break;
-    case DeployStep_MediaConfig:
-    case DeployStep_FetchCenterSettings:
-    case DeployStep_AccessAuthorize:
-        result = 2;
-        break;
-	default:
-		result = 0;
-		break;
-	}
-
-	return result;
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	m_pEntity->RealCheck(ctx);
 }
 
 /** 
@@ -1509,6 +1485,8 @@ void CHealthManagerEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nL
 			WarnPromptTask* task = new WarnPromptTask(this); //通过工作线程弹窗并告警
 			GetFunction()->PostThreadPoolTask(task);
 		}
+		ITimerListener* pListener = new TimerOutHelper<CHealthManagerEntity>(this, &CHealthManagerEntity::OnSelfCheckTimeout);
+		GetFunction()->SetTimer(HEALTHMANAGER_SELFCHECK_TIMER_ID, pListener, HEALTHMANAGER_SELFCHECK_TIMER_INTERVAL);
 
 		break;
 	}	//oilyang@20210331 distinguish reasons of accessauth failed to decide what to do next
@@ -1980,6 +1958,29 @@ void CHealthManagerEntity::ToCalcRebootHourAndMinute(int restartBegin, int resta
 	m_restartMinute = minutes - (m_restartHour - 1) * 60;
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("restartBegin:%d, restartEnd:%d, xTerm:%d, minutes:%d, m_restartHour:%d, m_restartMinute:%d", restartBegin, restartEnd, xTerm, minutes, m_restartHour, m_restartMinute);
 }
+void CHealthManagerEntity::RealCheck(SpReqAnsContext<HealthManagerService_RealCheck_Req, HealthManagerService_RealCheck_Ans>::Pointer ctx)
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Real check %s", (LPCTSTR)ctx->Req.name);
+	m_fsm.CheckEntity(ctx->Req.name, Test_ShakeHand, false);
+	ctx->Answer(Error_Succeed);
+}
+void CHealthManagerEntity::OnSelfCheckTimeout()
+{
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	CSmartPointer<IAsynWaitSp> spWait;
+	ErrorCodeEnum errCode;
+	int activeEnCount = m_activeEntity.GetCount();
+
+	for (int i = 0; i < activeEnCount; ++i)
+	{
+		//invalid or "HealthManager" itself,no need to check
+		if (m_activeEntity[i].IsNullOrEmpty() || m_activeEntity[i].Compare(GetEntityName()) == 0)
+			continue;
+		m_fsm.CheckEntity(m_activeEntity[i].GetData(), Test_ShakeHand);//oiltmp move to entity?
+	}
+	GetFunction()->ResetTimer(HEALTHMANAGER_SELFCHECK_TIMER_ID, HEALTHMANAGER_SELFCHECK_TIMER_INTERVAL);
+}
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CHealthManagerEntity)
 SP_END_ENTITY_MAP()

+ 14 - 1
Module/mod_healthmanager/mod_healthmanager.h

@@ -76,7 +76,7 @@ public:
 	virtual void Handle_EnterState(SpReqAnsContext<HealthManagerService_EnterState_Req, HealthManagerService_EnterState_Ans>::Pointer ctx);
 	virtual void Handle_ExitState(SpReqAnsContext<HealthManagerService_ExitState_Req, HealthManagerService_ExitState_Ans>::Pointer ctx);
 	virtual void Handle_DoEvent(SpReqAnsContext<HealthManagerService_DoEvent_Req, HealthManagerService_DoEvent_Ans>::Pointer ctx);
-	virtual void Handle_GetEntityCfgInfo(SpReqAnsContext<HealthManagerService_GetEntityCfgInfo_Req, HealthManagerService_GetEntityCfgInfo_Ans>::Pointer ctx);
+	virtual void Handle_RealCheck(SpReqAnsContext<HealthManagerService_RealCheck_Req, HealthManagerService_RealCheck_Ans>::Pointer ctx);
 	virtual void Handle_GetNetworkState(SpReqAnsContext<HealthManagerService_GetNetworkState_Req, HealthManagerService_GetNetworkState_Ans>::Pointer ctx);
 	virtual void Handle_QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx);
 	virtual void Handle_ReadCenterConfigStr(SpReqAnsContext<HealthManagerService_ReadCenterConfigStr_Req, HealthManagerService_ReadCenterConfigStr_Ans>::Pointer ctx);
@@ -192,7 +192,17 @@ public:
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive %x", ctx->Req.code);
 			FSMEvent* pEvt = new FSMEvent(USER_EVT_VTMLOADER_FINISHED);
 			if (ctx->Req.code == Event_VtmLoader_EntityLoad_Finished)
+			{
 				pEvt->param1 = 0;
+				//to get entity list
+				CSimpleStringA csEntityList("");
+				ErrorCodeEnum eErrCode = GetFunction()->GetSysVar("LoadEntityList", csEntityList);
+				if (eErrCode == Error_Succeed)
+				{
+					m_activeEntity.Init(100);
+					m_activeEntity = csEntityList.Split(';');
+				}
+			}
 			else
 				pEvt->param1 = 1;
 			m_fsm.PostEventFIFO(pEvt);
@@ -232,6 +242,7 @@ public:
 	void WarnAndRestartFramwork();
 	void ControlTerminalLife(SpReqAnsContext<HealthManagerService_ControlTerminalLife_Req, HealthManagerService_ControlTerminalLife_Ans>::Pointer ctx);
 	void ControlEntityLife(SpReqAnsContext<HealthManagerService_ControlEntityLife_Req, HealthManagerService_ControlEntityLife_Ans>::Pointer ctx);
+	void RealCheck(SpReqAnsContext<HealthManagerService_RealCheck_Req, HealthManagerService_RealCheck_Ans>::Pointer ctx);
 
 	virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
@@ -267,6 +278,7 @@ private:
 	map<CSimpleStringA,ModuleReMode> m_modCfgInfo;
 	map<ModuleReMode,RestartModeInfo> m_restartMode;
 	UpgradeMgrService_ClientBase *m_pUpgMgr;
+	CAutoArray<CSimpleStringA> m_activeEntity;
 
 	pfShakeHands m_pfShake;
 	pfUpgradeRestart m_pfUpgradeRestart;
@@ -276,6 +288,7 @@ private:
 	/** 启动限制配置读取以及监护模块初始化*/
 	bool DoRestart();
 	void OnCheckTimeTimeout();
+	void OnSelfCheckTimeout();
 	ErrorCodeEnum RestartModule(const char* pEntityName);
 	void AfterWaitRestartPC();
 	void SplitModuleNames(CSimpleStringA csLine,ModuleReMode eMode);

+ 9 - 3
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -1040,7 +1040,7 @@ int CVtmLoaderFSM::EntityLoad()
 
 	//int count, cbNum, slNum, opNum;
 	//count = cbNum = slNum = opNum = 0;
-
+	CSimpleStringA csEntityList("GuiConsole;Chromium;VtmLoader;");
 	CAutoArray<CSimpleStringA> arrCoreBoot;
 	arrCoreBoot.Init(64);
 	arrCoreBoot = csCoreBootList.Split('|');
@@ -1055,6 +1055,7 @@ int CVtmLoaderFSM::EntityLoad()
 			|| arrEntity[0].Compare("GuiConsole", true) == 0)
 			continue;
 		m_vCoreBoot.push_back(arrEntity[0]);
+		csEntityList += arrEntity[0] + ";";
 		if (arrEntity[1].Compare("1") == 0)
 			m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
 		else if (arrEntity[1].Compare("2") == 0)
@@ -1082,6 +1083,7 @@ int CVtmLoaderFSM::EntityLoad()
 		if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end())
 			continue;
 		m_vSafeLoad.push_back(arrEntity[0].GetData());
+		csEntityList += arrEntity[0] + ";";
 		if (arrEntity[1].Compare("1") == 0)
 			m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
 		else if (arrEntity[1].Compare("2") == 0)
@@ -1110,6 +1112,7 @@ int CVtmLoaderFSM::EntityLoad()
 			|| find(m_vSafeLoad.begin(), m_vSafeLoad.end(), arrEntity[0].GetData()) != m_vSafeLoad.end())
 			continue;
 		m_vOperating.push_back(arrEntity[0].GetData());
+		csEntityList += arrEntity[0] + ";";
 		if (arrEntity[1].Compare("1") == 0)
 			m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
 		else if (arrEntity[1].Compare("2") == 0)
@@ -1120,10 +1123,13 @@ int CVtmLoaderFSM::EntityLoad()
 		//m_operatingOpt[arrEntity[0].GetData()].initSn = opNum;
 		//opNum++;
 	}
-
+	ErrorCodeEnum eErrCode = GetEntityBase()->GetFunction()->SetSysVar("LoadEntityList", csEntityList);
+	if (eErrCode != Error_Succeed)
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("set LoadEntityList failed:%d,%s", eErrCode,csEntityList.GetData());
+	}
 	//oilyang if install VTM ,just wait for msg to start entity
 	CSimpleStringA csTermStage("");
-	ErrorCodeEnum eErrCode;
 	eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TerminalStage %s.", csTermStage.GetData());
 	if (csTermStage.Compare("N") == 0)//"N" for installing