mod_selfchecker.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // mod_selfchecker.cpp : Defines the exported functions for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include "mod_selfchecker.h"
  5. #include "EventCode.h"
  6. #include "ModuleMix.h"
  7. void SelfCheckerSession::Handle_RealCheck(SpReqAnsContext<SelfCheckerService_RealCheck_Req, SelfCheckerService_RealCheck_Ans>::Pointer ctx)
  8. {
  9. LOG_FUNCTION();
  10. DbgToBeidou(ctx->link, __FUNCTION__)();
  11. m_pEntity->RealCheck(ctx);
  12. }
  13. void SelfCheckerSession::Handle_GetEntityErrorList(SpReqAnsContext<SelfCheckerService_GetEntityErrorList_Req, SelfCheckerService_GetEntityErrorList_Ans>::Pointer ctx)
  14. {
  15. DbgToBeidou(ctx->link, __FUNCTION__)();
  16. m_pEntity->GetEntityErrorList(ctx);
  17. }
  18. ErrorCodeEnum CSelfCheckerEntity::GetEntityTestCode(const char* pszEntityName, ErrorCodeEnum& LastTestError, TestActionEnum& eLastAction)
  19. {
  20. return Error_NotImpl;
  21. }
  22. ErrorCodeEnum CSelfCheckerEntity::ExamineEntity(const char* pszEntityName)
  23. {
  24. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  25. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  26. CSmartPointer<IAsynWaitSp> spWait;
  27. //ErrorCodeEnum errCode;
  28. pFuncPrivilege->TestEntity(pszEntityName, Test_Examine, spWait);
  29. return Error_Succeed;
  30. }
  31. //ErrorCodeEnum CSelfCheckerEntity::AddEntity(const char *pszEntityName)
  32. //{
  33. // if (pszEntityName == NULL)
  34. // return Error_Null;
  35. // return m_fsm.AddEntity(pszEntityName);
  36. //}
  37. //ErrorCodeEnum CSelfCheckerEntity::RemoveEntity(vector<CSimpleStringA> &entityVec, const char *pszEntityName)
  38. //{
  39. // if (pszEntityName == NULL)
  40. // return Error_Null;
  41. // return m_fsm.RemoveEntity(pszEntityName);
  42. //}
  43. //ErrorCodeEnum CSelfCheckerEntity::CheckEntity()
  44. //{
  45. // return Error_Succeed;
  46. //}
  47. // if pszTriggerEntity=null mean created by shell
  48. void CSelfCheckerEntity::OnCreated(const char* pszEntityName, ErrorCodeEnum eOnStartErrorCode, const char* pszCallerEntity)
  49. {
  50. m_fsm.DoOnCreated(pszEntityName, eOnStartErrorCode, pszCallerEntity);
  51. }
  52. //Call after the entity has close or killed, eOnCloseErrorCode notic if the entity do OnClose normally and resource has beed release
  53. void CSelfCheckerEntity::OnClosed(const char* pszEntityName, EntityCloseCauseEnum eCloseCause, ErrorCodeEnum eOnCloseErrorCode, const char* pszCallerEntity)
  54. {
  55. m_fsm.DoOnClosed(pszEntityName, eCloseCause, eOnCloseErrorCode, pszCallerEntity);
  56. }
  57. //the following OnException & OnEntityStateHook doing the same thing repeatly???
  58. //1 case is entity raise exception and catch by framework,but not mean the entity will close,2 case is the entity is enter lost state
  59. void CSelfCheckerEntity::OnException(const char* pszEntityName, const char* pszFunctionName, EntityStateEnum eState, EntityStateEnum eLastState, ErrorCodeEnum eErrorCode)
  60. {
  61. m_fsm.DoOnException(pszEntityName, pszFunctionName, eState, eLastState, eErrorCode);
  62. }
  63. void CSelfCheckerEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState)
  64. {
  65. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s trigger by %s: from %s to %s",pszEntityName,pszTriggerEntity, SpStrEntityState(eLastState), SpStrEntityState(eState));
  66. m_fsm.AddEntityState(pszEntityName, eState);
  67. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  68. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  69. if (pFuncPrivilege == NULL)
  70. {
  71. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("NoPrivilege");
  72. return;
  73. }
  74. CSmartPointer<IAsynWaitSp> spWait;
  75. ErrorCodeEnum errCode;
  76. int count = 0;
  77. {
  78. switch (eState)
  79. {
  80. case EntityState_Lost:
  81. {
  82. //oilyang@20220415 special process of RVC.PAD with FWB
  83. CSimpleStringA tmpFWBDevSN("");
  84. GetFunction()->GetSysVar("FWBDevSN", tmpFWBDevSN);
  85. if (m_sysInfo.strMachineType.Compare("RVC.PAD", true) == 0 && !tmpFWBDevSN.IsNullOrEmpty())
  86. {
  87. if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0
  88. || _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0
  89. || _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0)
  90. {
  91. count = m_entityProcInfo[pszEntityName].restartTimes;
  92. if (count >= m_maxEtyRestartTimes)
  93. {
  94. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_SELFCHECK_ENTITY_LOST_TIMES
  95. , CSimpleStringA::Format("%s restart %d times, give up.", pszEntityName, count).GetData());
  96. break;
  97. }
  98. m_fsm.CheckEntity(pszEntityName, Test_ShakeHand);
  99. m_entityProcInfo[pszEntityName].restartTimes = count + 1;
  100. }
  101. break;
  102. }
  103. //doing nothing except for loading stage. HandShake will take it.
  104. //and only for MediaController module.
  105. //oilyang@20210809 add entity lost LogWarn
  106. CSimpleStringA tmpWarnMsg = CSimpleStringA::Format("%s lost. trig entity:%s,lastState:%d", pszEntityName, pszTriggerEntity, eLastState);
  107. CEntityStaticInfo esi = { 0 };
  108. ErrorCodeEnum ec = GetFunction()->GetEntityStaticInfo(pszEntityName, esi);
  109. LogWarn(Severity_High, Error_Unexpect, SelfChecker_UserErrorCode_EntityLost_Start + esi.wEntityDevelopID, tmpWarnMsg.GetData());
  110. if (m_bEverInMainPage && _strnicmp("TokenKeeper", pszEntityName, strlen("TokenKeeper")) == 0)
  111. {
  112. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TokenKeeper lost");
  113. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_TOKEN_KEEPER_LOST, "TokenKeeper lost,restart and auth again.");
  114. break;
  115. }
  116. if (m_bEverInMainPage)
  117. break;
  118. if (_strnicmp("MediaController", pszEntityName, strlen("MediaController")) != 0)
  119. break;
  120. count = m_entityProcInfo[pszEntityName].restartTimes;
  121. if (count >= m_maxEtyRestartTimes)
  122. {
  123. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s has restart %d times,give up to restart it again.", pszEntityName, count);
  124. CSimpleStringA tmpWarnMsg = CSimpleStringA::Format("%s restart %d times,give up.", (LPCTSTR)pszEntityName, count);
  125. LogWarn(Severity_High, Error_Unexpect, LOG_WARN_SELFCHECK_ENTITY_LOST_TIMES, tmpWarnMsg.GetData());
  126. break;
  127. }
  128. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s lost count %d", pszEntityName, count);
  129. errCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  130. if (errCode == Error_Succeed)
  131. {
  132. errCode = spWait->WaitAnswer(10000);
  133. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("onlost kill wait %d", errCode);
  134. }
  135. else
  136. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("onlost kill %d", errCode);
  137. Sleep(5000);
  138. errCode = pFuncPrivilege->StartEntity(pszEntityName, NULL, spWait);
  139. if (errCode == Error_Succeed)
  140. {
  141. errCode = spWait->WaitAnswer(10000);
  142. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("onlost start wait %d", errCode);
  143. }
  144. else
  145. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("onlost start %d", errCode);
  146. m_entityProcInfo[pszEntityName].restartTimes = count + 1;
  147. }
  148. break;
  149. case EntityState_Idle:
  150. {
  151. m_entityProcInfo[pszEntityName].restartTimes = 0;
  152. if (!_strnicmp("SIPPhone", pszEntityName, strlen("SIPPhone")))
  153. {
  154. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SIPPhone change to idle.");
  155. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_SIPPHONE_IDLE, "SIPPhone to idle.");
  156. }
  157. else if (!_strnicmp("HealthManager", pszEntityName, strlen("HealthManager")))
  158. {
  159. }
  160. else if (!_strnicmp("LocalMediaPlay", pszEntityName, strlen("LocalMediaPlay")))
  161. {
  162. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_LOCALMEDIAPLAY_IDLE, "LocalMediaPlay to idle.");
  163. }
  164. if (_strnicmp("Chromium", pszEntityName, strlen("Chromium")) == 0)
  165. {
  166. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_IEBROWSER_IDLE, "Chromium to idle.");
  167. m_bIEIdle = true;
  168. }
  169. }
  170. break;
  171. default:
  172. break;
  173. }
  174. }
  175. }
  176. void CSelfCheckerEntity::OnUserStateHook(const char* pszEntityName, DWORD dwState, DWORD dwLastState)
  177. {
  178. }
  179. void CSelfCheckerEntity::OnCeateConnection(const char* pszCallerEntity, const char* pszServiceEntity)
  180. {
  181. }
  182. void CSelfCheckerEntity::OnCloseConnection(const char* pszCallerEntity, const char* pszServiceEntity)
  183. {
  184. }
  185. void CSelfCheckerEntity::RealCheck(SpReqAnsContext<SelfCheckerService_RealCheck_Req, SelfCheckerService_RealCheck_Ans>::Pointer ctx)
  186. {
  187. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Real check %s", (LPCTSTR)ctx->Req.name);
  188. m_fsm.CheckEntity(ctx->Req.name, Test_ShakeHand, false);
  189. ctx->Answer(Error_Succeed);
  190. }
  191. void CSelfCheckerEntity::GetEntityErrorList(SpReqAnsContext<SelfCheckerService_GetEntityErrorList_Req, SelfCheckerService_GetEntityErrorList_Ans>::Pointer ctx)
  192. {
  193. ErrorCodeEnum eErr = m_fsm.GetEntityErrorList(ctx->Ans.warmLevel, ctx->Ans.list);
  194. ctx->Answer(eErr);
  195. }
  196. void CSelfCheckerEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  197. const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  198. const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
  199. {
  200. //oilyang@20170918 only process the Log_Error of Severity_High
  201. if (eLogType != Log_Error || eLevel != Severity_High)
  202. return;
  203. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("user code %d,%s", dwUserCode, (LPCTSTR)pszMessage);
  204. switch (dwUserCode)
  205. {
  206. default:
  207. break;
  208. }
  209. m_fsm.Proc(pszEntityName, ProcType_Warn, dwUserCode, pszMessage);
  210. }
  211. ErrorCodeEnum CSelfCheckerEntity::GetEntityStatusStr(CSimpleStringA& result)
  212. {
  213. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  214. CEntityRunInfo runInfo;
  215. ErrorCodeEnum eErr;
  216. vector<CSimpleStringA>::iterator it;
  217. for (it = m_vQueryStateEntity.begin(); it != m_vQueryStateEntity.end(); ++it)
  218. {
  219. eErr = pFunc->GetEntityRunInfo(*it, runInfo);
  220. if (eErr == Error_Succeed)
  221. {
  222. result += UserDefEntityMsg[runInfo.dwUserState][0];
  223. result += " ;";
  224. }
  225. }
  226. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("state[%s]", (LPCTSTR)result);
  227. return Error_Succeed;
  228. }
  229. ErrorCodeEnum CSelfCheckerEntity::RestartModule(const char* pEntityName)
  230. {
  231. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to RestartModule:%s", pEntityName);
  232. m_fsm.SetEntityRestarting(pEntityName, true);
  233. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  234. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  235. if (pFuncPrivilege == NULL)
  236. {
  237. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("restart mc NoPrivilege");
  238. m_fsm.SetEntityRestarting(pEntityName, false);
  239. return Error_NoPrivilege;
  240. }
  241. CSmartPointer<IAsynWaitSp> spWait;
  242. ErrorCodeEnum eErrCode = Error_Succeed;
  243. eErrCode = pFuncPrivilege->TerminateEntity(pEntityName, spWait);
  244. if (spWait != NULL)
  245. eErrCode = spWait->WaitAnswer(10000);
  246. if (eErrCode != Error_Succeed)
  247. {
  248. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("kill %s %d", pEntityName, eErrCode);
  249. m_fsm.SetEntityRestarting(pEntityName, false);
  250. return eErrCode;
  251. }
  252. Sleep(1000);
  253. eErrCode = pFuncPrivilege->StartEntity(pEntityName, NULL, spWait);
  254. if (spWait != NULL)
  255. eErrCode = spWait->WaitAnswer(10000);
  256. if (eErrCode != Error_Succeed)
  257. {
  258. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start %s %d", pEntityName, eErrCode);
  259. m_fsm.SetEntityRestarting(pEntityName, false);
  260. return eErrCode;
  261. }
  262. m_fsm.SetEntityRestarting(pEntityName, false);
  263. return Error_Succeed;
  264. }
  265. void CSelfCheckerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
  266. {
  267. if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
  268. {
  269. if (_strnicmp(pszValue, "M", strlen("M")) == 0)
  270. {
  271. m_bEverInMainPage = true;
  272. m_fsm.SetEverEnterMainPageFlag();
  273. }
  274. }
  275. else if ((_strnicmp(pszKey, "TerminalStage", strlen("TerminalStage")) == 0))
  276. {
  277. //oiltmp
  278. if (!m_bGetEntityList)
  279. {
  280. m_bGetEntityList = true;
  281. CSmartPointer<IConfigInfo> spConfigCen;
  282. GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  283. CSimpleStringA csCoreBootList(true), csSafeLoadList(true), csOperatingList(true), csKeyCB("CoreBootList."), csKeySL("SafeLoadList."), csKeyOp("OperatingList.");
  284. spConfigCen->ReadConfigValue("VtmLoader", (csKeyCB + m_sysInfo.strMachineType).GetData(), csCoreBootList);
  285. spConfigCen->ReadConfigValue("VtmLoader", (csKeySL + m_sysInfo.strMachineType).GetData(), csSafeLoadList);
  286. spConfigCen->ReadConfigValue("VtmLoader", (csKeyOp + m_sysInfo.strMachineType).GetData(), csOperatingList);
  287. m_fsm.GetEntityList(csCoreBootList);
  288. m_fsm.GetEntityList(csSafeLoadList);
  289. m_fsm.GetEntityList(csOperatingList);
  290. }
  291. }
  292. }
  293. SP_BEGIN_ENTITY_MAP()
  294. SP_ENTITY(CSelfCheckerEntity)
  295. SP_END_ENTITY_MAP()