mod_selfchecker.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. //read from config file? oiltmp
  8. const int MAX_RESTART_COUNT = 5;
  9. void SelfCheckerSession::Handle_RealCheck(SpReqAnsContext<SelfCheckerService_RealCheck_Req, SelfCheckerService_RealCheck_Ans>::Pointer ctx)
  10. {
  11. LOG_FUNCTION();
  12. m_pEntity->RealCheck(ctx);
  13. }
  14. void SelfCheckerSession::Handle_GetEntityErrorList(SpReqAnsContext<SelfCheckerService_GetEntityErrorList_Req, SelfCheckerService_GetEntityErrorList_Ans>::Pointer ctx)
  15. {
  16. m_pEntity->GetEntityErrorList(ctx);
  17. }
  18. ErrorCodeEnum CSelfCheckerEntity::GetLiveEntityList(CAutoArray<CSimpleString> &LiveEntitys)
  19. {
  20. ErrorCodeEnum errCode;
  21. errCode = m_fsm.GetAllLiveEntity(LiveEntitys);
  22. return errCode;
  23. }
  24. ErrorCodeEnum CSelfCheckerEntity::GetEntityTestCode(const char *pszEntityName,ErrorCodeEnum &LastTestError, TestActionEnum &eLastAction)
  25. {
  26. return Error_NotImpl;
  27. }
  28. ErrorCodeEnum CSelfCheckerEntity::ExamineEntity(const char *pszEntityName)
  29. {
  30. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  31. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  32. CSmartPointer<IAsynWaitSp> spWait;
  33. //ErrorCodeEnum errCode;
  34. pFuncPrivilege->TestEntity(pszEntityName,Test_Examine,spWait);
  35. return Error_Succeed;
  36. }
  37. //ErrorCodeEnum CSelfCheckerEntity::AddEntity(const char *pszEntityName)
  38. //{
  39. // if (pszEntityName == NULL)
  40. // return Error_Null;
  41. // return m_fsm.AddEntity(pszEntityName);
  42. //}
  43. //ErrorCodeEnum CSelfCheckerEntity::RemoveEntity(vector<CSimpleStringA> &entityVec, const char *pszEntityName)
  44. //{
  45. // if (pszEntityName == NULL)
  46. // return Error_Null;
  47. // return m_fsm.RemoveEntity(pszEntityName);
  48. //}
  49. //ErrorCodeEnum CSelfCheckerEntity::CheckEntity()
  50. //{
  51. // return Error_Succeed;
  52. //}
  53. // if pszTriggerEntity=null mean created by shell
  54. void CSelfCheckerEntity::OnCreated(const char *pszEntityName,ErrorCodeEnum eOnStartErrorCode,const char *pszCallerEntity)
  55. {
  56. m_fsm.DoOnCreated(pszEntityName,eOnStartErrorCode,pszCallerEntity);
  57. }
  58. //Call after the entity has close or killed, eOnCloseErrorCode notic if the entity do OnClose normally and resource has beed release
  59. void CSelfCheckerEntity::OnClosed(const char *pszEntityName,EntityCloseCauseEnum eCloseCause,ErrorCodeEnum eOnCloseErrorCode,const char *pszCallerEntity)
  60. {
  61. m_fsm.DoOnClosed(pszEntityName,eCloseCause,eOnCloseErrorCode,pszCallerEntity);
  62. }
  63. //the following OnException & OnEntityStateHook doing the same thing repeatly???
  64. //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
  65. void CSelfCheckerEntity::OnException(const char *pszEntityName,const char *pszFunctionName,EntityStateEnum eState,EntityStateEnum eLastState,ErrorCodeEnum eErrorCode)
  66. {
  67. m_fsm.DoOnException(pszEntityName,pszFunctionName,eState,eLastState,eErrorCode);
  68. }
  69. void CSelfCheckerEntity::OnEntityStateHook(const char *pszEntityName,const char *pszTriggerEntity,EntityStateEnum eState,EntityStateEnum eLastState)
  70. {
  71. Dbg("%s,(trig)%s,(c)%d,%d",pszEntityName,pszTriggerEntity,eState,eLastState);
  72. m_fsm.AddEntityState(pszEntityName,eState);
  73. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  74. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  75. if (pFuncPrivilege == NULL)
  76. {
  77. Dbg("NoPrivilege");
  78. return;
  79. }
  80. CSmartPointer<IAsynWaitSp> spWait;
  81. ErrorCodeEnum errCode;
  82. int count = 0;
  83. //oiltest
  84. //if (!_strnicmp("MediaController",pszEntityName,strlen("MediaController")))
  85. {
  86. switch(eState)
  87. {
  88. case EntityState_Lost:
  89. //doing nothing except for loading stage. HandShake will take it.
  90. //and only for MediaController module.
  91. if (m_bIEIdle && _strnicmp("TokenKeeper",pszEntityName,strlen("TokenKeeper")) == 0)
  92. {
  93. Dbg("TokenKeeper lost");
  94. LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_TOKEN_KEEPER_LOST,"TokenKeeper lost,restart and auth again.");
  95. break;
  96. }
  97. if (m_bIEIdle)
  98. break;
  99. if (_strnicmp("MediaController",pszEntityName,strlen("MediaController")) != 0)
  100. break;
  101. count = m_entityProcInfo[pszEntityName].restartTimes;
  102. if (count >= MAX_RESTART_COUNT)
  103. {
  104. Dbg("%s has restart %d times,give up to restart it again.",pszEntityName,count);
  105. char xxx[256] = {0};
  106. sprintf(xxx,"%s restart %d times,give up.",(LPCTSTR)pszEntityName,count);
  107. Dbg("logwarn %s",xxx);
  108. LogWarn(Severity_High,Error_Unexpect,LOG_WARN_SELFCHECK_ENTITY_LOST_TIMES,xxx);
  109. break;
  110. }
  111. Dbg("%s lost count %d",pszEntityName,count);
  112. errCode = pFuncPrivilege->TerminateEntity(pszEntityName,spWait);
  113. if (errCode == Error_Succeed)
  114. {
  115. errCode = spWait->WaitAnswer(10000);
  116. Dbg("onlost kill wait %d",errCode);
  117. }
  118. else
  119. Dbg("onlost kill %d",errCode);
  120. Sleep(5000);
  121. Dbg("to start(lost)");
  122. errCode = pFuncPrivilege->StartEntity(pszEntityName,NULL,spWait);
  123. if (errCode == Error_Succeed)
  124. {
  125. errCode = spWait->WaitAnswer(10000);
  126. Dbg("onlost start wait %d",errCode);
  127. }
  128. else
  129. Dbg("onlost start %d",errCode);
  130. m_entityProcInfo[pszEntityName].restartTimes = count + 1;
  131. break;
  132. case EntityState_Idle:
  133. if (!_strnicmp("AssistantChannel",pszEntityName,strlen("AssistantChannel")))
  134. {
  135. if (m_pAssChanClient != NULL)
  136. {
  137. //m_pAssChanClient->SafeDelete();
  138. m_pAssChanClient = NULL;
  139. }
  140. Dbg("AssistantChannel change to idle.");
  141. LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE,"AssistantChannel to idle.");
  142. ConnectToAssistChannel();
  143. }
  144. if (!_strnicmp("SIPPhone",pszEntityName,strlen("SIPPhone")))
  145. {
  146. Dbg("SIPPhone change to idle.");
  147. LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_SIPPHONE_IDLE,"SIPPhone to idle.");
  148. }
  149. if (!_strnicmp("IEBrowser",pszEntityName,strlen("IEBrowser")))
  150. {
  151. Dbg("selfchecker to connect healthmanager...");
  152. //ConnectToHealthManager();
  153. Dbg("IEBrowser change to idle.");
  154. LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_IEBROWSER_IDLE,"IEBrowser to idle.");
  155. m_bIEIdle = true;
  156. }
  157. if (!_strnicmp("HealthManager", pszEntityName, strlen("HealthManager")))
  158. {
  159. Dbg("selfchecker to connect healthmanager...after healthmanager have been restarted.");
  160. //ConnectToHealthManager();
  161. }
  162. if (!_strnicmp("LocalMediaPlay",pszEntityName,strlen("LocalMediaPlay")))
  163. {
  164. Dbg("LocalMediaPlay change to idle.");
  165. LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_LOCALMEDIAPLAY_IDLE,"LocalMediaPlay to idle.");
  166. }
  167. break;
  168. default:
  169. break;
  170. }
  171. }
  172. }
  173. void CSelfCheckerEntity::OnUserStateHook(const char *pszEntityName,DWORD dwState,DWORD dwLastState)
  174. {
  175. }
  176. void CSelfCheckerEntity::OnCeateConnection(const char *pszCallerEntity,const char *pszServiceEntity)
  177. {
  178. }
  179. void CSelfCheckerEntity::OnCloseConnection(const char *pszCallerEntity,const char *pszServiceEntity)
  180. {
  181. }
  182. void CSelfCheckerEntity::RealCheck(SpReqAnsContext<SelfCheckerService_RealCheck_Req, SelfCheckerService_RealCheck_Ans>::Pointer ctx)
  183. {
  184. Dbg("Real check %s",(LPCTSTR)ctx->Req.name);
  185. m_fsm.CheckEntity(ctx->Req.name,Test_ShakeHand);
  186. ctx->Answer(Error_Succeed);
  187. }
  188. void CSelfCheckerEntity::GetEntityErrorList(SpReqAnsContext<SelfCheckerService_GetEntityErrorList_Req, SelfCheckerService_GetEntityErrorList_Ans>::Pointer ctx)
  189. {
  190. ErrorCodeEnum eErr = m_fsm.GetEntityErrorList(ctx->Ans.warmLevel,ctx->Ans.list);
  191. ctx->Answer(eErr);
  192. }
  193. void CSelfCheckerEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  194. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  195. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage)
  196. {
  197. //oilyang@20200304 add process FWB open suc.
  198. if (dwUserCode == LOG_EVT_CARDREADER_OPEN_SUC_FWB)
  199. {
  200. //Dbg("fwb user code %d,%s", dwUserCode, (LPCTSTR)pszMessage);
  201. //m_fsm.CheckEntity("PinPad", Test_ShakeHand);
  202. //m_fsm.CheckEntity("FingerPrint", Test_ShakeHand);
  203. //m_fsm.CheckEntity("IDCertificate", Test_ShakeHand);
  204. //m_fsm.CheckEntity("Sensors", Test_ShakeHand);
  205. //m_fsm.CheckEntity("DeviceControl", Test_ShakeHand);
  206. }
  207. //oilyang@20200407 move the following RestartModule from Healthmanager to here
  208. switch (dwUserCode)
  209. {
  210. case LOG_EVT_CARDSWIPER_PINPAD_RESTART:
  211. {
  212. RestartModule("PinPad");
  213. }
  214. break;
  215. case LOG_EVT_CARDSWIPER_CARDSWIPER_RESTART:
  216. {
  217. RestartModule("CardSwiper");
  218. }
  219. break;
  220. case LOG_EVT_CARDSWIPER_DEVICECONTROL_RESTART:
  221. {
  222. RestartModule("DeviceControl");
  223. }
  224. break;
  225. case LOG_EVT_CARDSWIPER_IDCERTIFICATE_RESTART:
  226. {
  227. RestartModule("IDCertificate");
  228. }
  229. break;
  230. case LOG_EVT_CARDSWIPER_FINGERPRINT_RESTART:
  231. {
  232. RestartModule("FingerPrint");
  233. }
  234. break;
  235. case LOG_EVT_CARDSWIPER_SENSORS_RESTART:
  236. {
  237. RestartModule("Sensors");
  238. }
  239. break;
  240. }
  241. //oilyang@20170918 only process the Log_Error of Severity_High
  242. if (eLogType != Log_Error || eLevel != Severity_High)
  243. return;
  244. Dbg("user code %d,%s",dwUserCode,(LPCTSTR)pszMessage);
  245. switch(dwUserCode)
  246. {
  247. //case LOG_ERR_CARDISSUER_FAILED:
  248. //case LOG_ERR_CARDREADER_FAILED:
  249. //case LOG_ERR_IDCERTIFICATE_FAILED:
  250. case LOG_ERR_PINPAD_FAILED:
  251. case ERROR_MOD_MEDIACONTROLLER_ENVCAMERA_BUG:
  252. case ERROR_MOD_MEDIACONTROLLER_OPECAMERA_BUG:
  253. case ERROR_MOD_MEDIACONTROLLER_ENVCAM_OPEN:
  254. case ERROR_MOD_MEDIACONTROLLER_OPTCAM_OPEN:
  255. case ERROR_MOD_MEDIACONTROLLER_ENVCAM_INITFAIL:
  256. case ERROR_MOD_MEDIACONTROLLER_OPTCAM_INITFAIL:
  257. MsgPushedByAssChannel(ACM_TYPE_DEVICE,ACM_DEVICE_ERROR,pszEntityName,pszMessage);
  258. //LogWarn(Severity_High,Error_Unexpect,dwUserCode,pszMessage);
  259. break;
  260. default:
  261. break;
  262. }
  263. m_fsm.Proc(pszEntityName, ProcType_Warn, dwUserCode, pszMessage);
  264. }
  265. ErrorCodeEnum CSelfCheckerEntity::MsgPushedByAssChannel(const int type,const int sub_type,const char *pszEntityName,const char *pszMessage)
  266. {
  267. if (m_pAssChanClient == NULL)
  268. {
  269. ErrorCodeEnum eConn = ConnectToAssistChannel();
  270. if (eConn != Error_Succeed)
  271. {
  272. Dbg("connect to AssistantChannel failed(%d).",eConn);
  273. return Error_Resource;
  274. }
  275. }
  276. ChannelService_Send_Info Info;
  277. Info.compress = false;
  278. Info.encrypt = false;
  279. Info.type = type;//;
  280. Info.id = 0;
  281. Info.sub_type = sub_type;//;
  282. Info.data.Alloc(sizeof(int));
  283. SpBuffer buf;
  284. buf.OpenWrite();
  285. CSimpleStringA csEntityName(pszEntityName),csBlack(" "),csMsg(pszMessage);
  286. buf & csEntityName & csBlack & csMsg;
  287. Info.data = buf.ToBlob();
  288. m_pAssChanClient->Send(Info);
  289. Dbg("send msg %d %d:%s %s",type,sub_type,pszEntityName,pszMessage);
  290. return Error_Succeed;
  291. }
  292. ErrorCodeEnum CSelfCheckerEntity::GetEntityStatusStr(CSimpleStringA &result)
  293. {
  294. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  295. CEntityRunInfo runInfo;
  296. ErrorCodeEnum eErr;
  297. vector<CSimpleStringA>::iterator it;
  298. for (it = m_vQueryStateEntity.begin(); it != m_vQueryStateEntity.end(); ++it)
  299. {
  300. eErr = pFunc->GetEntityRunInfo(*it,runInfo);
  301. if (eErr == Error_Succeed)
  302. {
  303. Dbg("%s,%d",(LPCTSTR)*it,runInfo.dwUserState);
  304. result += UserDefEntityMsg[runInfo.dwUserState][0];
  305. result += " ;";
  306. }
  307. }
  308. Dbg("state[%s]",(LPCTSTR)result);
  309. return Error_Succeed;
  310. }
  311. ErrorCodeEnum CSelfCheckerEntity::ConnectToAssistChannel()
  312. {
  313. LOG_FUNCTION();
  314. if (m_pAssChanClient == NULL)
  315. {
  316. m_pAssChanClient = new AssistChannelSelfCheckerClient(this);
  317. ErrorCodeEnum ErrorConn = m_pAssChanClient->Connect();
  318. if (ErrorConn != Error_Succeed) {
  319. //m_pAssChanClient->SafeDelete();
  320. m_pAssChanClient = NULL;
  321. return Error_Unexpect;
  322. }
  323. else
  324. {
  325. Dbg("AssistantChannel connected.");
  326. {
  327. ChannelService_BeginState_Sub Sub;
  328. ErrorConn = m_pAssChanClient->BeginState(Sub);
  329. if (ErrorConn != Error_Succeed)
  330. {
  331. Dbg("BeginState biz channel failed!");
  332. m_pAssChanClient->GetFunction()->CloseSession();
  333. //m_pAssChanClient->SafeDelete();
  334. m_pAssChanClient = NULL;
  335. return Error_Unexpect;
  336. //pTransactionContext->SendAnswer(ErrorConn);
  337. //return;
  338. }
  339. else
  340. {
  341. Dbg("BeginState biz channel success!");
  342. }
  343. }
  344. {
  345. ChannelService_BeginRecv_Sub Sub;
  346. Sub.type = ACM_TYPE_DEVICE;
  347. ErrorConn = m_pAssChanClient->BeginRecv(Sub);
  348. if (ErrorConn != Error_Succeed)
  349. {
  350. Dbg("Begin BeginRecv ACM_TYPE_DEVICE failed!");
  351. m_pAssChanClient->GetFunction()->CloseSession();
  352. //m_pAssChanClient->SafeDelete();
  353. m_pAssChanClient = NULL;
  354. return Error_Unexpect;
  355. //pTransactionContext->SendAnswer(Error);
  356. //return;
  357. }
  358. else
  359. {
  360. Dbg("Begin BeginRecv ACM_TYPE_DEVICE success!");
  361. }
  362. }
  363. }
  364. }
  365. return Error_Succeed;
  366. }
  367. ErrorCodeEnum CSelfCheckerEntity::RestartModule(const char* pEntityName)
  368. {
  369. Dbg("to RestartModule:%s",pEntityName);
  370. m_fsm.SetEntityRestarting(pEntityName, true);
  371. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  372. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  373. if (pFuncPrivilege == NULL)
  374. {
  375. Dbg("restart mc NoPrivilege");
  376. m_fsm.SetEntityRestarting(pEntityName, false);
  377. return Error_NoPrivilege;
  378. }
  379. CSmartPointer<IAsynWaitSp> spWait;
  380. ErrorCodeEnum eErrCode = Error_Succeed;
  381. eErrCode = pFuncPrivilege->TerminateEntity(pEntityName, spWait);
  382. if (spWait != NULL)
  383. eErrCode = spWait->WaitAnswer(10000);
  384. if (eErrCode != Error_Succeed)
  385. {
  386. Dbg("kill %s %d", pEntityName, eErrCode);
  387. m_fsm.SetEntityRestarting(pEntityName, false);
  388. return eErrCode;
  389. }
  390. Sleep(1000);
  391. eErrCode = pFuncPrivilege->StartEntity(pEntityName, NULL, spWait);
  392. if (spWait != NULL)
  393. eErrCode = spWait->WaitAnswer(10000);
  394. if (eErrCode != Error_Succeed)
  395. {
  396. Dbg("start %s %d", pEntityName, eErrCode);
  397. m_fsm.SetEntityRestarting(pEntityName, false);
  398. return eErrCode;
  399. }
  400. m_fsm.SetEntityRestarting(pEntityName, false);
  401. return Error_Succeed;
  402. }
  403. void AssistChannelSelfCheckerClient::OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData)
  404. {
  405. }
  406. void AssistChannelSelfCheckerClient::OnMessage(ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData)
  407. {
  408. LOG_FUNCTION();
  409. if (Error == Error_Succeed)
  410. {
  411. CSelfCheckerEntity *pEntity = static_cast<CSelfCheckerEntity*>(m_pEntityBase);
  412. switch(Msg.sub_type)
  413. {
  414. case ACM_ENTITY_STATE_REQ:
  415. {
  416. CSimpleStringA result;
  417. pEntity->GetEntityStatusStr(result);
  418. pEntity->MsgPushedByAssChannel(ACM_TYPE_DEVICE,ACM_ENTITY_STATE_ANS,result);
  419. }
  420. break;
  421. default:
  422. break;
  423. }
  424. }
  425. }
  426. SP_BEGIN_ENTITY_MAP()
  427. SP_ENTITY(CSelfCheckerEntity)
  428. SP_END_ENTITY_MAP()