SelfCheckerFSM.cpp 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  1. #include "stdafx.h"
  2. #define WIN32_LEAN_AND_MEAN
  3. #include "SelfCheckerFSM.h"
  4. #include "EventCode.h"
  5. #pragma comment(lib,"user32.lib")
  6. class CSelfCheckerEntity;
  7. const int MAX_AYSNC_TIMEOUT = 60000;
  8. const int MAX_CHECK_TIME = 60000;
  9. const int MAX_CPU_CHECK_TIME = 5000;
  10. const int TIMER_ID_CHECK = 0;
  11. const int TIMER_CPU_CHECK = 1;
  12. const int THOUSAND = 1024;
  13. const int MILLION = 1048576;
  14. int ActionStrToInt(const char* pAction)
  15. {
  16. int ret = 0;
  17. char x = *pAction;
  18. if (x >= '0' && x <= '9')
  19. return x - '0';
  20. else
  21. return 0;
  22. }
  23. DWORD GetRadixProduct(int times, int radix)
  24. {
  25. DWORD dwRet = 1;
  26. if (times < 0 || (radix != 10 && radix != 16))
  27. return 0;
  28. else
  29. {
  30. for (int i = 0; i < times; i++)
  31. dwRet *= radix;
  32. }
  33. return dwRet;
  34. }
  35. DWORD CodeStrToInt(const char* pCode)
  36. {
  37. CSimpleStringA csCode(pCode);
  38. csCode = csCode.Trim();
  39. int len = csCode.GetLength();
  40. if (len < 0 || len > 10)
  41. {
  42. return 0;
  43. }
  44. DWORD dwRet = 0;
  45. if (len > 2 && csCode[0] == '0' && (csCode[1] == 'x' || csCode[1] == 'X'))//"0x1234,0X12FF"
  46. {
  47. for (int i = 2; i < len; i++)
  48. {
  49. if (csCode[i] <= '9' && csCode[i] >= '0')
  50. dwRet += (csCode[i] - '0') * GetRadixProduct(len - i - 1, 16);
  51. else if (csCode[i] <= 'f' && csCode[i] >= 'a')
  52. dwRet += (csCode[i] - 'a' + 10) * GetRadixProduct(len - i - 1, 16);
  53. else if (csCode[i] <= 'F' && csCode[i] >= 'A')
  54. dwRet += (csCode[i] - 'A' + 10) * GetRadixProduct(len - i - 1, 16);
  55. else
  56. return 0;//because there is a invalid char,break process and return 0
  57. }
  58. }
  59. else//"768"
  60. {
  61. for (int i = 0; i < len; i++)
  62. {
  63. if (csCode[i] <= '9' && csCode[i] >= '0')
  64. dwRet += (csCode[i] - '0') * GetRadixProduct(len - i - 1, 10);
  65. else
  66. return 0;//because there is a invalid char,break process and return 0
  67. }
  68. }
  69. return dwRet;
  70. }
  71. ErrorCodeEnum CSelfCheckerFSM::OnInit()
  72. {
  73. m_xIdlePre = m_xKernelPre = m_xUserPre = 0;
  74. ErrorCodeEnum errCode = Initial();
  75. if (errCode != Error_Succeed)
  76. return Error_IO;
  77. return Error_Succeed;
  78. }
  79. ErrorCodeEnum CSelfCheckerFSM::OnExit()
  80. {
  81. return Error_Succeed;
  82. }
  83. void CSelfCheckerFSM::s0_on_entry()
  84. {
  85. LOG_FUNCTION();
  86. ErrorCodeEnum errCode;
  87. CAutoArray<WORD> tmpInstIDs;
  88. CAutoArray<CSimpleStringA> tmpNames;
  89. errCode = GetEntityBase()->GetFunction()->GetAllRegistedEntity(tmpNames, tmpInstIDs);
  90. if (errCode != Error_Succeed)
  91. {
  92. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get started entity failed.[%d]",errCode);
  93. }
  94. for (int i = 0; i < tmpNames.GetCount(); ++i)
  95. {
  96. ErrorCodeEnum eErr;
  97. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  98. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  99. CEntityRunInfo runInfo;
  100. eErr = pFunc->GetEntityRunInfo(tmpNames[i], runInfo);
  101. if (runInfo.eState != EntityState_NoStart
  102. || tmpNames[i] == "Download" || tmpNames[i] == "UpgradeRun" || tmpNames[i] == "UpgradeManager")
  103. {
  104. m_allEntity.push_back(tmpNames[i]);
  105. m_activeEntity.push_back(tmpNames[i]);
  106. }
  107. }
  108. FSMEvent* pEvt = new FSMEvent(USER_EVT_INIT);
  109. PostEventFIFO(pEvt);
  110. }
  111. void CSelfCheckerFSM::s0_on_exit()
  112. {
  113. }
  114. unsigned int CSelfCheckerFSM::s0_on_event(FSMEvent* pEvt)
  115. {
  116. LOG_FUNCTION();
  117. switch (pEvt->iEvt)
  118. {
  119. case USER_EVT_INIT:
  120. pEvt->SetHandled();
  121. break;
  122. default:
  123. break;
  124. }
  125. return 0;
  126. }
  127. void CSelfCheckerFSM::s1_on_entry()
  128. {
  129. LOG_FUNCTION();
  130. void* pTmpData = NULL;
  131. ITimerListener* pListener = new TimerOutHelper<CSelfCheckerFSM>(this, &CSelfCheckerFSM::OnNormalWorkTimerout, pTmpData);
  132. GetEntityBase()->GetFunction()->SetTimer(TIMER_ID_CHECK, pListener, MAX_CHECK_TIME);
  133. }
  134. void CSelfCheckerFSM::s1_on_exit()
  135. {
  136. LOG_FUNCTION();
  137. }
  138. unsigned int CSelfCheckerFSM::s1_on_event(FSMEvent* evt)
  139. {
  140. LOG_FUNCTION();
  141. return 0;
  142. }
  143. void CSelfCheckerFSM::s2_on_entry()
  144. {
  145. LOG_FUNCTION();
  146. }
  147. void CSelfCheckerFSM::s2_on_exit()
  148. {
  149. LOG_FUNCTION();
  150. }
  151. unsigned int CSelfCheckerFSM::s2_on_event(FSMEvent* evt)
  152. {
  153. LOG_FUNCTION();
  154. return 0;
  155. }
  156. void CSelfCheckerFSM::s3_on_entry()
  157. {
  158. LOG_FUNCTION();
  159. }
  160. void CSelfCheckerFSM::s3_on_exit()
  161. {
  162. LOG_FUNCTION();
  163. }
  164. unsigned int CSelfCheckerFSM::s3_on_event(FSMEvent* evt)
  165. {
  166. LOG_FUNCTION();
  167. return 0;
  168. }
  169. int ch2int(char ch)
  170. {
  171. if (ch >= '0' && ch <= '9')
  172. return ch - '0';
  173. else if (ch >= 'a' && ch <= 'f')
  174. return ch - 'a' + 10;
  175. else if (ch >= 'A' && ch <= 'F')
  176. return ch - 'A' + 10;
  177. return 0;
  178. }
  179. long hexstr2int(const char* str, int len)
  180. {
  181. long result = 0;
  182. for (int i = 0; i < len; ++i)
  183. {
  184. result += (ch2int(str[i]) << ((len - i - 1) * 4));
  185. }
  186. return result;
  187. }
  188. bool StrEqualNoCase(const char* s1, const char* s2, int len)
  189. {
  190. if (strlen(s1) != strlen(s2))
  191. return false;
  192. for (int i = 0; i < len; ++i)
  193. {
  194. if (toupper(s1[i]) != toupper(s2[i]))
  195. return false;
  196. }
  197. return true;
  198. }
  199. ErrorCodeEnum CSelfCheckerFSM::Initial()
  200. {
  201. ErrorCodeEnum err;
  202. CSmartPointer<IConfigInfo> spCenConfig;
  203. err = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCenConfig);
  204. if (err != Error_Succeed) {
  205. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open cfg file failed!");
  206. return Error_IO;
  207. }
  208. m_restartNormal = 2;
  209. m_restartSpecial = 5;
  210. m_maxOsRestart = 5;
  211. m_maxPowerRestart = 5;
  212. do {
  213. int value(0);
  214. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "RestartNormal", value);
  215. if (value != 0) m_restartNormal = value;
  216. } while (false);
  217. do {
  218. int value(0);
  219. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "RestartSpecial", value);
  220. if (value != 0) m_restartSpecial = value;
  221. } while (false);
  222. do {
  223. int value(0);
  224. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxOsRestart", value);
  225. if (value != 0) m_maxOsRestart = value;
  226. } while (false);
  227. do {
  228. int value(0);
  229. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxPowerRestart", value);
  230. if (value != 0) m_maxPowerRestart = value;
  231. } while (false);
  232. //m_csKeyEntity = "PinPad";
  233. //do {
  234. // CSimpleStringA value(true);
  235. // spCenConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "KeyEntity", value);
  236. // if (!value.IsNullOrEmpty()) m_csKeyEntity = value;
  237. //} while (false);
  238. ifstream is;
  239. CSimpleStringA cfgPath(""), cfgXml("");
  240. err = GetEntityBase()->GetFunction()->GetPath("cfg", cfgPath);
  241. cfgXml = cfgPath + SPLIT_SLASH_STR + "SelfCheckerProc.xml";
  242. ReadXmlFile(cfgXml);
  243. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cfgxml[%s]", cfgXml);
  244. //auto list = m_csKeyEntity.Split(',');
  245. //for (int i = 0; i < list.GetCount(); ++i)
  246. //{
  247. // CSimpleStringA entity = list[i];
  248. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", LPCTSTR(entity));
  249. // m_vKeyEntity.push_back(entity);
  250. //}
  251. err = GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  252. if (err != Error_Succeed)
  253. {
  254. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get System Static info failed(%d).",err);
  255. return Error_Unexpect;
  256. }
  257. CSmartPointer<IConfigInfo> spConfigRun;
  258. err = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  259. if (err == Error_Succeed) {
  260. spConfigRun->ReadConfigValueInt("WarnRecord", "disk", m_diskLastWarnHour);
  261. }
  262. return Error_Succeed;
  263. }
  264. ErrorCodeEnum CSelfCheckerFSM::ExceptionErrorProcess(const char* pszEntityName, ErrorCodeEnum eCode)
  265. {
  266. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  267. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  268. CSmartPointer<IAsynWaitSp> spWait;
  269. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("proc:%s,%d", pszEntityName, eCode);
  270. //do nothing
  271. if (eCode == Error_Cancel)
  272. return Error_Succeed;
  273. bool bUpgrade = false;
  274. //need to do something
  275. ErrorCodeEnum eErrCode = Error_Succeed;
  276. if ((m_entCfgInfo.find(pszEntityName) != m_entCfgInfo.end())
  277. && ((m_entCfgInfo[pszEntityName]).hsInfo.find(eCode) != (m_entCfgInfo[pszEntityName]).hsInfo.end()))
  278. {
  279. TestActionEnum eAction = (m_entCfgInfo[pszEntityName]).hsInfo.find(eCode)->second;
  280. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("action:%d", eAction);
  281. switch (eAction)
  282. {
  283. case ACTION_EXAMINE:
  284. break;
  285. case ACTION_RESET:
  286. break;
  287. case ACTION_CLOSE:
  288. eErrCode = pFuncPrivilege->CloseEntity(pszEntityName, spWait);
  289. if (eErrCode == Error_Succeed)
  290. {
  291. }
  292. break;
  293. case ACTION_ENTITY_RESTART:
  294. {
  295. if (m_entCfgInfo[pszEntityName].bWaitRestart)
  296. {
  297. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("waiting restart...");
  298. break;
  299. }
  300. //if (m_entRunInfo[pszEntityName].loadOpt == 99)
  301. //{
  302. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
  303. // break;
  304. //}
  305. //LogErrInfo("restart ",pszEntityName,eCode);
  306. m_entCfgInfo[pszEntityName].entityRestartCount++;
  307. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("normalcount:%d,count:%d", m_restartNormal, m_entCfgInfo[pszEntityName].entityRestartCount);
  308. if (m_entCfgInfo[pszEntityName].entityRestartCount > m_restartNormal)
  309. {
  310. if ((!strnicmp(m_sysInfo.strMachineType.GetData(), "RVC.Pad", strlen("RVC.Pad")) && !strnicmp(m_sysInfo.strSite.GetData(), "cmb.FLB", strlen("cmb.FLB")))
  311. || (!strnicmp(m_sysInfo.strMachineType.GetData(), "RPM.Stand1S", strlen("RPM.Stand1S"))))
  312. {
  313. if (m_entRunInfo[pszEntityName].loadOpt == 0)
  314. m_entCfgInfo[pszEntityName].entityRestartCount = 0;
  315. }
  316. else
  317. {
  318. LogErrInfo(pszEntityName, " restart too many,upgrade process.", eCode);
  319. bUpgrade = true;
  320. m_entCfgInfo[pszEntityName].bWaitRestart = true;
  321. }
  322. eErrCode = Error_Succeed;
  323. break;
  324. }
  325. eErrCode = pFuncPrivilege->StopEntity(pszEntityName, spWait);
  326. if (eErrCode == Error_Succeed)
  327. {
  328. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  329. if (eErrCode != Error_Succeed)
  330. {
  331. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait stop %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  332. eErrCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  333. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  334. if (eErrCode != Error_Succeed)
  335. {
  336. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait terminate %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  337. break;
  338. }
  339. }
  340. }
  341. else
  342. {
  343. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Stop %s failed(%d).", pszEntityName, eErrCode);
  344. break;
  345. }
  346. Sleep(2000);
  347. eErrCode = pFuncPrivilege->StartEntity(pszEntityName, NULL, spWait);
  348. if (eErrCode == Error_Succeed)
  349. {
  350. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  351. if (eErrCode != Error_Succeed)
  352. {
  353. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait start %s failed(%d).", pszEntityName, eErrCode);
  354. break;
  355. }
  356. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start entity %s suc.", pszEntityName);
  357. }
  358. else
  359. {
  360. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("(re)Start %s failed(%d).", pszEntityName, eErrCode);
  361. break;
  362. }
  363. }
  364. break;
  365. case ACTION_OS_RESTART:
  366. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("test os restart");
  367. if (m_entRunInfo[pszEntityName].loadOpt == 1 || m_entRunInfo[pszEntityName].loadOpt == 2)
  368. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_OS_RESTART, pszEntityName);
  369. break;
  370. case ACTION_POWER_RESTART:
  371. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("test power restart");
  372. if (m_entRunInfo[pszEntityName].loadOpt == 1 || m_entRunInfo[pszEntityName].loadOpt == 2)
  373. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_POWER_RESTART, pszEntityName);
  374. break;
  375. default:
  376. break;
  377. }
  378. if (bUpgrade)
  379. {
  380. LogActionProcess(pszEntityName, eCode, eAction);
  381. }
  382. }
  383. else
  384. {
  385. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s not configured,use default setting(%d)", LPCTSTR(pszEntityName), eCode);
  386. switch (eCode)
  387. {
  388. case Error_TimeOut:
  389. case Error_Unexpect:
  390. case Error_InvalidState:
  391. {
  392. eErrCode = pFuncPrivilege->StopEntity(pszEntityName, spWait);
  393. if (eErrCode == Error_Succeed)
  394. {
  395. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  396. if (eErrCode != Error_Succeed)
  397. {
  398. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait stop %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  399. eErrCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  400. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  401. if (eErrCode != Error_Succeed)
  402. {
  403. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait terminate %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  404. break;
  405. }
  406. }
  407. }
  408. else
  409. {
  410. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Stop %s failed(%d).", pszEntityName, eErrCode);
  411. break;
  412. }
  413. Sleep(5000);
  414. eErrCode = pFuncPrivilege->StartEntity(pszEntityName, NULL, spWait);
  415. if (eErrCode == Error_Succeed)
  416. {
  417. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  418. if (eErrCode != Error_Succeed)
  419. {
  420. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait start %s failed(%d).", pszEntityName, eErrCode);
  421. break;
  422. }
  423. }
  424. else
  425. {
  426. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("(re)Start %s failed(%d).", pszEntityName, eErrCode);
  427. break;
  428. }
  429. }
  430. break;
  431. default:
  432. break;
  433. }
  434. }
  435. return eErrCode;
  436. }
  437. ErrorCodeEnum CSelfCheckerFSM::CheckEntity(const char* pszEntityName, EntityTestEnum eTestType, bool bNormalCheck)
  438. {
  439. if (bNormalCheck)
  440. {
  441. //oilyang@20230426 ,常规自检时,针对"TerminalStage"做对应处理(自检分常规自检和即时自检)
  442. //"S":准入服务告知准入不过,不再进行实体自检
  443. //非"A":其他启动失败导致进关门页,不再对硬件以及其他没必要自检的实体进行自检
  444. CSimpleStringA tmpTerminalStage("");
  445. GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", tmpTerminalStage);
  446. if (tmpTerminalStage.Compare("S") == 0)
  447. return Error_Succeed;
  448. else if (tmpTerminalStage.Compare("A") != 0)
  449. {
  450. //the hardward entity and some other entity no need to test
  451. if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0 || _strnicmp("CardIssuer", pszEntityName, strlen("CardIssuer")) == 0
  452. || _strnicmp("CardSwiper", pszEntityName, strlen("CardSwiper")) == 0 || _strnicmp("ContactlessCard", pszEntityName, strlen("ContactlessCard")) == 0
  453. || _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0 || _strnicmp("ups", pszEntityName, strlen("ups")) == 0
  454. || _strnicmp("gpio", pszEntityName, strlen("gpio")) == 0 || _strnicmp("HSPScanner", pszEntityName, strlen("HSPScanner")) == 0
  455. || _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0
  456. )
  457. return Error_Succeed;
  458. }
  459. }
  460. //oilyang@20170926 no need to check by self.Let the HealthManager entity to do it.
  461. if (pszEntityName != NULL && strnicmp(pszEntityName, GetEntityBase()->GetEntityName(), strlen(GetEntityBase()->GetEntityName())) == 0)
  462. return Error_Succeed;
  463. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  464. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  465. CSmartPointer<IAsynWaitSp> spWait;
  466. ErrorCodeEnum errCode;
  467. errCode = pFuncPrivilege->TestEntity(pszEntityName, eTestType, spWait);
  468. if (errCode == Error_Succeed)
  469. {
  470. callback_entry* entry = new callback_entry();
  471. entry->pRawData = NULL;
  472. entry->EntityName = pszEntityName;
  473. entry->ErrorResult = Error_Unexpect;
  474. entry->op = Test_ShakeHand;
  475. spWait->SetCallback(this, entry);
  476. }
  477. else
  478. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Test %s,%d", pszEntityName, errCode);
  479. return errCode;
  480. }
  481. void CSelfCheckerFSM::OnNormalWorkTimerout(void* pData)
  482. {
  483. if (!m_bFWBEntityAdd)
  484. {
  485. //oilyang@20220415 special process of RVC.PAD with FWB
  486. CSimpleStringA tmpFWBDevSN("");
  487. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpFWBDevSN);
  488. if (m_sysInfo.strMachineType.Compare("RVC.PAD", true) == 0 && !tmpFWBDevSN.IsNullOrEmpty())
  489. {
  490. AddFWBEntityToList();
  491. m_bFWBEntityAdd = true;
  492. }
  493. }
  494. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  495. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  496. CSmartPointer<IAsynWaitSp> spWait;
  497. ErrorCodeEnum errCode;
  498. int activeEnCount = m_activeEntity.size();
  499. vector<CSimpleStringA>::iterator it;
  500. //oiltmp 20131219
  501. //GetSystemCPUStatus();
  502. //GetSystemMemoryStatus();
  503. //GetSystemDiskStatus();
  504. for (it = m_activeEntity.begin(); it != m_activeEntity.end(); ++it)
  505. {
  506. errCode = CheckEntity(*it, Test_ShakeHand);
  507. CEntityRunInfo runInfo;
  508. pFunc->GetEntityRunInfo(*it, runInfo);
  509. //CheckEntityResouce(*it, runInfo);
  510. }
  511. GetEntityBase()->GetFunction()->ResetTimer(TIMER_ID_CHECK, MAX_CHECK_TIME);
  512. }
  513. ErrorCodeEnum CSelfCheckerFSM::GetAllLiveEntity(CAutoArray<CSimpleString>& allEntitys)
  514. {
  515. allEntitys.Clear();
  516. vector<CSimpleStringA>::iterator it;
  517. int start = 0;
  518. int size = m_allEntity.size();
  519. allEntitys.Init(size);
  520. CSimpleStringA testStr = "";
  521. for (it = m_allEntity.begin(); it != m_allEntity.end(); ++it, ++start)
  522. {
  523. CSimpleStringA tmpName = *it;
  524. allEntitys[start] = tmpName;
  525. testStr += tmpName;
  526. testStr += ";";
  527. }
  528. return Error_Succeed;
  529. }
  530. void CSelfCheckerFSM::DoOnCreated(const char* pszEntityName, ErrorCodeEnum eOnStartErrorCode, const char* pszCallerEntity)
  531. {
  532. if (eOnStartErrorCode == Error_Succeed)
  533. {
  534. vector<CSimpleStringA>::iterator it, itAct;
  535. bool bFound = false, bActFound = false;
  536. for (it = m_allEntity.begin(); it != m_allEntity.end(); ++it)
  537. {
  538. if (!strncmp(pszEntityName, *it, it->GetLength()))
  539. {
  540. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("already exist %s", pszEntityName);
  541. bFound = true;
  542. break;
  543. }
  544. }
  545. if (!bFound)
  546. m_allEntity.push_back(pszEntityName);
  547. for (itAct = m_activeEntity.begin(); itAct != m_activeEntity.end(); ++itAct)
  548. {
  549. if (!strncmp(pszEntityName, *itAct, itAct->GetLength()))
  550. {
  551. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("active entity already exist %s", pszEntityName);
  552. bActFound = true;
  553. break;
  554. }
  555. }
  556. if (!bActFound)
  557. {
  558. m_activeEntity.push_back(pszEntityName);
  559. }
  560. m_entCfgInfo[pszEntityName].entityRestartCount = 0;
  561. }
  562. }
  563. void CSelfCheckerFSM::DoOnClosed(const char* pszEntityName, EntityCloseCauseEnum eCloseCause, ErrorCodeEnum eOnCloseErrorCode, const char* pszCallerEntity)
  564. {
  565. //not close by selfchecker
  566. if (strncmp(pszCallerEntity, GetEntityBase()->GetEntityName(), strlen(pszCallerEntity)))
  567. {
  568. if (eCloseCause == CloseCause_Self || eCloseCause == CloseCause_Other)
  569. {
  570. vector<CSimpleStringA>::iterator it;
  571. for (it = m_activeEntity.begin(); it != m_activeEntity.end(); ++it)
  572. {
  573. if (!strncmp(pszEntityName, *it, it->GetLength()))
  574. {
  575. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("onclosed %s", pszEntityName);
  576. //oilyang@20210425 as almost all entity's start configure have been set to 0(can be ignored)
  577. //no need to erase the m_activeEntity any more
  578. //m_activeEntity.erase(it);
  579. break;
  580. }
  581. }
  582. }
  583. }
  584. CAutoArray<CSimpleString> testAutoArray;
  585. GetAllLiveEntity(testAutoArray);
  586. }
  587. void CSelfCheckerFSM::DoOnException(const char* pszEntityName, const char* pszFunctionName, EntityStateEnum eState, EntityStateEnum eLastState, ErrorCodeEnum eErrorCode)
  588. {
  589. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnException:%s,%s,%d,%d,%d", pszEntityName, pszFunctionName, eState, eLastState, eErrorCode);
  590. }
  591. void CSelfCheckerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  592. {
  593. CSmartPointer<ICallbackListener> spCallback;
  594. CSmartPointer<IReleasable> pData;
  595. pAsynWaitSp->GetCallback(spCallback, pData);
  596. //LOG_ASSERT(pData);
  597. callback_entry* entry = dynamic_cast<callback_entry*>((IReleasable*)pData.GetRawPointer());
  598. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  599. callback_entry* new_entry = new callback_entry();
  600. new_entry->EntityName = entry->EntityName;
  601. new_entry->ErrorResult = entry->ErrorResult;
  602. new_entry->op = entry->op;
  603. new_entry->state = entry->state;
  604. m_entRunInfo[new_entry->EntityName].eTest = new_entry->ErrorResult; //add test result oilyang 20150616
  605. if (new_entry->op == Test_ShakeHand && new_entry->ErrorResult != Error_Succeed) {
  606. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("oiltmp shakehand %s turns out %s, entity state: %s", (LPCTSTR)new_entry->EntityName, SpStrError(new_entry->ErrorResult), SpStrEntityState((EntityStateEnum)new_entry->state));
  607. }
  608. if (new_entry->ErrorResult != Error_Succeed)
  609. {
  610. ErrorCodeEnum eErr;
  611. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  612. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  613. if (_strnicmp("MediaController", (const char*)new_entry->EntityName, strlen("MediaController")) == 0
  614. && !m_bEverInMainPage)
  615. {
  616. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("On loading stage,don't process MediaController exception.");
  617. }
  618. else
  619. Proc((const char*)new_entry->EntityName, ProcType_Shake, new_entry->ErrorResult);
  620. }
  621. else
  622. {
  623. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  624. CSmartPointer<IConfigInfo> spConfig;
  625. ErrorCodeEnum eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  626. if (eErr != Error_Succeed) {
  627. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open run cfg file failed!");
  628. return;
  629. }
  630. spConfig->WriteConfigValueInt(new_entry->EntityName, "OsRestart", 0);
  631. spConfig->WriteConfigValueInt(new_entry->EntityName, "PowerRestart", 0);
  632. }
  633. }
  634. void CSelfCheckerFSM::LogErrInfo(const char* msgHead, const char* msgBody, const int errCode)
  635. {
  636. //oiltest to redifine this
  637. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%s,%d", msgHead, msgBody, errCode);
  638. }
  639. void CSelfCheckerFSM::LogActionProcess(const char* pszEntityName, ErrorCodeEnum errCode, TestActionEnum eAct)
  640. {
  641. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("LogActionProcess:entity[%s],errCode[%d],eAction[%d]", pszEntityName, errCode, eAct);
  642. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  643. CSmartPointer<IConfigInfo> spConfig;
  644. ErrorCodeEnum eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  645. if (eErr != Error_Succeed) {
  646. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open run cfg file failed!");
  647. return;
  648. }
  649. int osTimes, powerTimes;
  650. osTimes = powerTimes = 0;
  651. spConfig->ReadConfigValueInt(pszEntityName, "OsRestart", osTimes);
  652. spConfig->ReadConfigValueInt(pszEntityName, "PowerRestart", powerTimes);
  653. switch (eAct)
  654. {
  655. case ACTION_ENTITY_RESTART:
  656. if (osTimes > m_maxOsRestart || powerTimes > m_maxPowerRestart)
  657. {
  658. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restart too much,give up[%d][%d].", osTimes, powerTimes);
  659. break;
  660. }
  661. break;
  662. osTimes++;
  663. powerTimes++;
  664. spConfig->WriteConfigValueInt(pszEntityName, "OsRestart", osTimes);
  665. spConfig->WriteConfigValueInt(pszEntityName, "PowerRestart", powerTimes);
  666. //for simple and effective,use power restart only
  667. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_POWER_RESTART, pszEntityName);
  668. m_entCfgInfo[pszEntityName].bWaitRestart = true;
  669. break;
  670. default:
  671. break;
  672. }
  673. }
  674. void CSelfCheckerFSM::CheckEntityResouce(const char* pszEntityName, CEntityRunInfo& info)
  675. {
  676. if (info.eState != EntityState_Idle){
  677. return;
  678. }
  679. #ifdef RVC_OS_WIN
  680. //HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_QUERY_LIMITED_INFORMATION, FALSE, info.dwProcessID);
  681. //if (hProcess == NULL)
  682. //{
  683. // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("OpenProcess %s failed %d.", pszEntityName, GetLastError());
  684. // return;
  685. //}
  686. ////GetSystemInfo
  687. //PIO_COUNTERS pIOCounters = new IO_COUNTERS;
  688. //BOOL ret = GetProcessIoCounters(hProcess, pIOCounters);
  689. //if (ret == 0)
  690. //{
  691. // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetProcessIoCounters %s failed %d.", pszEntityName, GetLastError());
  692. //}
  693. //PROCESS_MEMORY_COUNTERS pmc;
  694. //const int showSize = 20;
  695. //if (GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)))
  696. //{
  697. // if ((pmc.WorkingSetSize / MILLION > showSize) && (pmc.PeakWorkingSetSize / MILLION > showSize)
  698. // && (pmc.PagefileUsage / MILLION > showSize) && (pmc.PeakPagefileUsage / MILLION > showSize))
  699. // {
  700. // m_entRunInfo[pszEntityName].memoryHighCount++;
  701. // if (m_entRunInfo[pszEntityName].memoryHighCount > ((60000 / MAX_CPU_CHECK_TIME)) * 2)//more than 2 minutes
  702. // {
  703. // m_entRunInfo[pszEntityName].memoryHighCount = 0;
  704. // Dbg("%s,WorkingSetSize %u, Peak %u,PageFileUsage %u, Peak %u", (LPCTSTR)pszEntityName, pmc.WorkingSetSize / MILLION, pmc.PeakWorkingSetSize / MILLION, pmc.PagefileUsage / MILLION, pmc.PeakPagefileUsage / MILLION);
  705. // }
  706. // }
  707. //}
  708. //CloseHandle(hProcess);
  709. #else
  710. return;//oiltestlinux
  711. #endif //RVC_OS_WIN
  712. }
  713. //bool CSelfCheckerFSM::IsKeyEntity(const char* pszEntityName)
  714. //{
  715. // vector<CSimpleStringA>::iterator it;
  716. // for (it = m_vKeyEntity.begin(); it != m_vKeyEntity.end(); ++it)
  717. // {
  718. // if (!_strnicmp(pszEntityName, *it, strlen(pszEntityName)))
  719. // return true;
  720. // }
  721. // return false;
  722. //}
  723. int CSelfCheckerFSM::AddEntityState(const char* pszEntityName, EntityStateEnum eState)
  724. {
  725. if (eState == EntityState_Starting)
  726. {
  727. m_entRunInfo[pszEntityName].bGetLoadOpt = false;
  728. m_entRunInfo[pszEntityName].bRestarting = false;
  729. m_entRunInfo[pszEntityName].loadOpt = 99;
  730. m_entRunInfo[pszEntityName].eState = eState;
  731. m_entRunInfo[pszEntityName].eTest = Error_Succeed;
  732. }
  733. else
  734. m_entRunInfo[pszEntityName].eState = eState;
  735. if (eState == EntityState_Idle)
  736. {
  737. m_entRunInfo[pszEntityName].eTest = Error_Succeed;
  738. m_entRunInfo[pszEntityName].memoryHighCount = 0;
  739. }
  740. m_entRunInfo[pszEntityName].cpuRatio = 0;
  741. return 0;
  742. }
  743. ErrorCodeEnum CSelfCheckerFSM::GetEntityErrorList(int& warmLevel, CSimpleStringA& strList)
  744. {
  745. map<CSimpleStringA, EntityRunInfo>::iterator it;
  746. CSimpleStringA tmpStr("");
  747. bool bLost = false;
  748. for (it = m_entRunInfo.begin(); it != m_entRunInfo.end(); ++it)
  749. {
  750. if (m_entRunInfo[it->first].eState == EntityState_Lost)
  751. bLost = true;
  752. char buf[16], bufTest[16];
  753. ZeroMemory(buf, 16);
  754. ZeroMemory(bufTest, 16);
  755. if (m_entRunInfo[it->first].eState == EntityState_Lost || m_entRunInfo[it->first].eState == EntityState_Close
  756. || m_entRunInfo[it->first].eState == EntityState_Killed || m_entRunInfo[it->first].eTest != Error_Succeed)
  757. {
  758. tmpStr += it->first;
  759. tmpStr += "=";
  760. if (m_entRunInfo[it->first].eState == EntityState_Lost || m_entRunInfo[it->first].eState == EntityState_Close
  761. || m_entRunInfo[it->first].eState == EntityState_Killed)
  762. {
  763. _itoa(m_entRunInfo[it->first].eState, buf, 10);
  764. tmpStr += buf;
  765. }
  766. if (m_entRunInfo[it->first].eTest != Error_Succeed)
  767. {
  768. _itoa(m_entRunInfo[it->first].eTest, bufTest, 10);
  769. tmpStr += ",(selfcheck code):";
  770. tmpStr += bufTest;
  771. }
  772. tmpStr += ";";
  773. }
  774. }
  775. if (tmpStr.GetLength() < 2)
  776. m_warmLevel = warmLevel = 0;
  777. if (bLost)
  778. m_warmLevel = warmLevel = 3;
  779. m_warmLevel = warmLevel = 1;//for temp set 20150617
  780. strList = tmpStr;
  781. if (strList.GetLength() > 2)
  782. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("warnlevel:%d,ErrorList [%s]", m_warmLevel, (LPCTSTR)strList);
  783. return Error_Succeed;
  784. }
  785. int CSelfCheckerFSM::Proc(string entity, ProcType eType, DWORD dwCode, const char* pszMessage)
  786. {
  787. ConnectToHealthManager();
  788. if (!m_entRunInfo[entity.c_str()].bGetLoadOpt)
  789. {
  790. if (m_pHealthClient != NULL)
  791. {
  792. HealthManagerService_GetEntityCfgInfo_Req req;
  793. HealthManagerService_GetEntityCfgInfo_Ans ans;
  794. req.name = entity.c_str();
  795. ErrorCodeEnum errCode = (*m_pHealthClient)(EntityResource::getLink().upgradeLink())->GetEntityCfgInfo(req, ans, 10000);
  796. if (errCode == Error_Succeed)
  797. {
  798. m_entRunInfo[entity.c_str()].bGetLoadOpt = true;
  799. SetEntityCfgInfo(entity.c_str(), ans.loadOpt);
  800. }
  801. }
  802. }
  803. map<string, EntityCfg, EntityNameCompare>::iterator it;
  804. if ((it = m_mapEntity.find(entity.c_str())) == m_mapEntity.end())
  805. {
  806. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("can't find entity %s configure setting,using default setting.", entity.c_str());
  807. //Error_TimeOut:
  808. //Error_Unexpect:
  809. //Error_InvalidState:
  810. if (eType == ProcType_Shake && (dwCode == Error_TimeOut || dwCode == Error_Unexpect || dwCode == Error_InvalidState))
  811. ExceptionErrorProcessXml(eType, entity.c_str(), ACTION_ENTITY_RESTART, true);
  812. else if (eType == ProcType_Warn)
  813. ExceptionErrorProcessXml(eType, entity.c_str(), dwCode, true, pszMessage);
  814. else
  815. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("What's this:type:%d,receive code:%x,msg:%s, from entity %s.", eType, dwCode, pszMessage, entity.c_str());
  816. return -1;
  817. }
  818. vector<ProcItem>::iterator vIt, vEnd;
  819. if (eType == ProcType_Shake)
  820. {
  821. vIt = it->second.vShake.begin();
  822. vEnd = it->second.vShake.end();
  823. }
  824. else if (eType == ProcType_Warn)
  825. {
  826. vIt = it->second.vWarn.begin();
  827. vEnd = it->second.vWarn.end();
  828. }
  829. for (; vIt != vEnd; vIt++)
  830. {
  831. if (vIt->code == dwCode)
  832. {
  833. if (vIt->upgradecount > 0)
  834. {
  835. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("action size:%d,upgradecount:%d", vIt->proctime.size(), vIt->upgradecount);
  836. UINT64 happentime = GetTickCountRVC();
  837. if (vIt->proctime.size() < vIt->upgradecount - 1)//just add record,do nothing
  838. {
  839. vIt->proctime.push_back(happentime);
  840. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("just add record");
  841. return 0;
  842. }
  843. else
  844. {
  845. //to find the 1st record happened in last upgradetime minute
  846. //and remove the record happened far ago(upgradetime minutes before)
  847. vector<UINT64>::iterator ittime, itFisrtInPeriod, xxxIt;
  848. bool bFar = false;
  849. int count = 0;
  850. for (ittime = vIt->proctime.begin(); ittime != vIt->proctime.end(); ittime++)
  851. {
  852. itFisrtInPeriod = ittime;
  853. UINT64 difftime = happentime - *ittime;
  854. if (difftime / (1000 * 60) < vIt->upgradetime)
  855. break;
  856. else
  857. {
  858. count++;
  859. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("the %d th action", count);
  860. bFar = true;
  861. }
  862. }
  863. if (!bFar)
  864. {
  865. //to do upgrade action
  866. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to do upgrade action");
  867. ExceptionErrorProcessXml(eType, entity.c_str(), vIt->upgradeaction);
  868. vIt->proctime.clear();
  869. return 0;
  870. }
  871. else
  872. {
  873. if (count == 1 && vIt->proctime.size() == 1)
  874. vIt->proctime.clear();
  875. else
  876. vIt->proctime.erase(vIt->proctime.begin(), itFisrtInPeriod);
  877. for (xxxIt = vIt->proctime.begin(); xxxIt != vIt->proctime.end(); xxxIt++)
  878. {
  879. cout << *xxxIt << " # ";
  880. }
  881. cout << endl;
  882. vIt->proctime.push_back(happentime);
  883. for (xxxIt = vIt->proctime.begin(); xxxIt != vIt->proctime.end(); xxxIt++)
  884. {
  885. cout << *xxxIt << " * ";
  886. }
  887. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("after clear,add record");
  888. return 0;
  889. }
  890. }
  891. }
  892. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Entity %s receive %d,to do action:%d", entity.c_str(), dwCode, vIt->action);
  893. ExceptionErrorProcessXml(eType, entity.c_str(), vIt->action, true, pszMessage);
  894. return 0;
  895. }
  896. }
  897. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("can't find corresponding action of entity %s,type:%d,code:%x", entity.c_str(), eType, dwCode);
  898. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use default process...");
  899. if (eType == ProcType_Shake && (dwCode == Error_TimeOut || dwCode == Error_Unexpect || dwCode == Error_InvalidState))
  900. ExceptionErrorProcessXml(eType, entity.c_str(), ACTION_ENTITY_RESTART, true);
  901. else if (eType == ProcType_Warn)
  902. ExceptionErrorProcessXml(eType, entity.c_str(), dwCode, true, pszMessage);
  903. return -1;
  904. }
  905. bool CSelfCheckerFSM::ReadXmlFile(const char* szFileName)
  906. {//读取Xml文件,并遍历
  907. //MessageBox(0, 0, 0, 0);
  908. LOG_FUNCTION();
  909. tinyxml2::XMLDocument* doc = new tinyxml2::XMLDocument();
  910. XMLError err = doc->LoadFile(szFileName);
  911. if (err != XML_SUCCESS)
  912. {
  913. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open file %s failed.GetLastError:%d", szFileName, GetLastError());
  914. return false;
  915. }
  916. //doc->GetDocument();
  917. string out = "";
  918. XMLNode* pF = doc->FirstChild();
  919. XMLElement* pRoot = doc->RootElement();
  920. //pF->FirstChildElement();
  921. if (pRoot == NULL)
  922. {
  923. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get root element failed.");
  924. return false;
  925. }
  926. else
  927. pF = pRoot->FirstChild();
  928. while (pF != NULL)
  929. {
  930. if (pF->ToElement() == NULL)
  931. {
  932. pF = pF->FirstChild();
  933. continue;
  934. }
  935. const char* pName = pF->ToElement()->Name();
  936. if (!strncmp(pName, "SelfCheckerConfig", strlen("SelfCheckerConfig")))
  937. {
  938. pF = pF->FirstChild();
  939. continue;
  940. }
  941. else if (!strncmp(pName, "Entity", strlen("Entity")))
  942. {
  943. EntityCfg entity;
  944. const char* attrName = pF->ToElement()->Attribute("name");
  945. out += const_cast<char*>(attrName);
  946. out += "\r\n";
  947. XMLNode* pChild = pF->FirstChild();
  948. while (pChild != NULL)
  949. {
  950. if (!strncmp(pChild->Value(), "shakehandproc", strlen("shakehandproc")))
  951. {
  952. XMLNode* pProc = pChild->FirstChild();
  953. while (pProc != NULL)
  954. {
  955. ProcItem item;
  956. const char* code, * action, * upgradeaction, * upgradetime, * upgradecount;
  957. code = action = upgradeaction = upgradetime = upgradecount = NULL;
  958. if (pProc->ToElement() != NULL)
  959. {
  960. code = pProc->ToElement()->Attribute("code");
  961. action = pProc->ToElement()->Attribute("action");
  962. upgradeaction = pProc->ToElement()->Attribute("upgradeaction");
  963. upgradetime = pProc->ToElement()->Attribute("upgradetime");
  964. upgradecount = pProc->ToElement()->Attribute("upgradecount");
  965. }
  966. if (code != NULL)
  967. {
  968. item.code = CodeStrToInt(code);
  969. out += const_cast<char*>(code);
  970. out += " , ";
  971. }
  972. if (action != NULL)
  973. {
  974. item.action = ActionStrToInt(action);
  975. out += const_cast<char*>(action);
  976. out += " , ";
  977. }
  978. if (upgradeaction != NULL)
  979. {
  980. item.upgradeaction = ActionStrToInt(upgradeaction);
  981. out += const_cast<char*>(upgradeaction);
  982. }
  983. if (upgradetime != NULL)
  984. {
  985. item.upgradetime = atoi(upgradetime);
  986. }
  987. if (upgradecount != NULL)
  988. {
  989. item.upgradecount = atoi(upgradecount);
  990. }
  991. else
  992. item.upgradecount = 0;
  993. entity.vShake.push_back(item);
  994. out += "; ";
  995. pProc = pProc->NextSibling();
  996. }
  997. }
  998. else if (!strncmp(pChild->Value(), "eventproc", strlen("eventproc")))
  999. {
  1000. XMLNode* pProc = pChild->FirstChild();
  1001. while (pProc != NULL)
  1002. {
  1003. ProcItem item;
  1004. const char* code, * action, * upgradeaction, * upgradetime, * upgradecount;
  1005. code = action = upgradeaction = upgradetime = upgradecount = NULL;
  1006. if (pProc->ToElement() != NULL)
  1007. {
  1008. code = pProc->ToElement()->Attribute("code");
  1009. action = pProc->ToElement()->Attribute("action");
  1010. upgradeaction = pProc->ToElement()->Attribute("upgradeaction");
  1011. upgradetime = pProc->ToElement()->Attribute("upgradetime");
  1012. upgradecount = pProc->ToElement()->Attribute("upgradecount");
  1013. }
  1014. if (code != NULL)
  1015. {
  1016. item.code = CodeStrToInt(code);
  1017. out += const_cast<char*>(code);
  1018. out += ",";
  1019. }
  1020. if (action != NULL)
  1021. {
  1022. item.action = ActionStrToInt(action);
  1023. out += const_cast<char*>(action);
  1024. out += ",";
  1025. }
  1026. if (upgradeaction != NULL)
  1027. {
  1028. item.upgradeaction = ActionStrToInt(upgradeaction);
  1029. out += const_cast<char*>(upgradeaction);
  1030. }
  1031. if (upgradetime != NULL)
  1032. {
  1033. item.upgradetime = atoi(upgradetime);
  1034. }
  1035. if (upgradecount != NULL)
  1036. {
  1037. item.upgradecount = atoi(upgradecount);
  1038. }
  1039. else
  1040. item.upgradecount = 0;
  1041. entity.vWarn.push_back(item);
  1042. out += "; ";
  1043. pProc = pProc->NextSibling();
  1044. }
  1045. }
  1046. pChild = pChild->NextSibling();
  1047. }
  1048. m_mapEntity[attrName] = entity;
  1049. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("add %s,vShake size:%d,vWarn size:%d", attrName, entity.vShake.size(), entity.vWarn.size());
  1050. }
  1051. out += "\r\n";
  1052. pF = pF->NextSibling();
  1053. }
  1054. return true;
  1055. }
  1056. ErrorCodeEnum CSelfCheckerFSM::ExceptionErrorProcessXml(ProcType eType, const char* pszEntityName, DWORD dwAction, bool bDefault, const char* pszMessage)
  1057. {
  1058. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1059. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1060. CSmartPointer<IAsynWaitSp> spWait;
  1061. ErrorCodeEnum eErrCode = Error_Unexpect;
  1062. switch (dwAction)
  1063. {
  1064. case ACTION_EXAMINE:
  1065. break;
  1066. case ACTION_RESET:
  1067. break;
  1068. case ACTION_CLOSE:
  1069. eErrCode = pFuncPrivilege->CloseEntity(pszEntityName, spWait);
  1070. if (eErrCode == Error_Succeed)
  1071. {
  1072. }
  1073. break;
  1074. case ACTION_ENTITY_RESTART:
  1075. {
  1076. if (m_entCfgInfo[pszEntityName].bWaitRestart)
  1077. {
  1078. if (!bDefault)
  1079. {
  1080. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("waiting restart...");
  1081. break;
  1082. }
  1083. }
  1084. //if (m_entRunInfo[pszEntityName].loadOpt == 99)
  1085. //{
  1086. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
  1087. // break;
  1088. //}
  1089. //oilyang@20200407 if being restarted by selfchecker,break
  1090. if (m_entRunInfo[pszEntityName].bRestarting)
  1091. {
  1092. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s is being restarted by selfchecker.", pszEntityName);
  1093. break;
  1094. }
  1095. //oilyang@20200403
  1096. //for fwb test,PinPad&CardSwiper can't be stop immediately
  1097. //huchen@20210220,SIPPhone can't be stop immediately
  1098. if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0
  1099. || _strnicmp("CardSwiper", pszEntityName, strlen("CardSwiper")) == 0
  1100. //oilyang@20210220 for huchen add SIPPhone
  1101. || _strnicmp("SIPPhone", pszEntityName, strlen("SIPPhone")) == 0
  1102. || _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0
  1103. || _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0
  1104. || _strnicmp("DeviceControl", pszEntityName, strlen("DeviceControl")) == 0)
  1105. eErrCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  1106. else
  1107. eErrCode = pFuncPrivilege->StopEntity(pszEntityName, spWait);
  1108. if (eErrCode == Error_Succeed)
  1109. {
  1110. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1111. if (eErrCode != Error_Succeed)
  1112. {
  1113. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait stop %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  1114. eErrCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  1115. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1116. if (eErrCode != Error_Succeed)
  1117. {
  1118. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait terminate %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  1119. break;
  1120. }
  1121. }
  1122. }
  1123. else
  1124. {
  1125. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Stop %s failed(%d).", pszEntityName, eErrCode);
  1126. break;
  1127. }
  1128. Sleep(2000);
  1129. eErrCode = pFuncPrivilege->StartEntity(pszEntityName, NULL, spWait);
  1130. if (eErrCode == Error_Succeed)
  1131. {
  1132. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1133. if (eErrCode != Error_Succeed)
  1134. {
  1135. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait start %s failed(%d).", pszEntityName, eErrCode);
  1136. break;
  1137. }
  1138. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start entity %s suc.", pszEntityName);
  1139. }
  1140. else
  1141. {
  1142. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("(re)Start %s failed(%d).", pszEntityName, eErrCode);
  1143. break;
  1144. }
  1145. }
  1146. break;
  1147. case ACTION_OS_RESTART:
  1148. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("test os restart");
  1149. if (m_entRunInfo[pszEntityName].loadOpt == 1 || m_entRunInfo[pszEntityName].loadOpt == 2)
  1150. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_OS_RESTART, pszEntityName);
  1151. break;
  1152. case ACTION_POWER_RESTART:
  1153. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("test power restart");
  1154. if (m_entRunInfo[pszEntityName].loadOpt == 1 || m_entRunInfo[pszEntityName].loadOpt == 2)
  1155. LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_POWER_RESTART, pszEntityName);
  1156. break;
  1157. default:
  1158. break;
  1159. }
  1160. return eErrCode;
  1161. }
  1162. void CSelfCheckerFSM::UpgradeActionProcess(const char* pszEntityName, const char* pAction)
  1163. {
  1164. return;
  1165. }
  1166. ErrorCodeEnum CSelfCheckerFSM::ConnectToHealthManager()
  1167. {
  1168. if (m_pHealthClient == NULL || m_pHealthClient->QuerySessionClosed())
  1169. {
  1170. m_pHealthClient = new HealthManagerService_ClientBase(GetEntityBase());
  1171. ErrorCodeEnum ErrorConn = m_pHealthClient->Connect();
  1172. if (ErrorConn != Error_Succeed) {
  1173. m_pHealthClient->SafeDelete();
  1174. m_pHealthClient = NULL;
  1175. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to Healthmanager failed.%d", ErrorConn);
  1176. return Error_Unexpect;
  1177. }
  1178. else
  1179. {
  1180. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HealthManager connected.");
  1181. }
  1182. }
  1183. return Error_Succeed;
  1184. }
  1185. void CSelfCheckerFSM::SetEverEnterMainPageFlag(bool bValue)
  1186. {
  1187. m_bEverInMainPage = bValue;
  1188. if (!m_bHaveGetEntityList)
  1189. {
  1190. ConnectToHealthManager();
  1191. if (m_pHealthClient != NULL)
  1192. {
  1193. HealthManagerService_GetEntityCfgInfo_Req req;
  1194. HealthManagerService_GetEntityCfgInfo_Ans ans;
  1195. req.name = "AllConfiguredEntity";
  1196. ErrorCodeEnum errCode = (*m_pHealthClient)(EntityResource::getLink().upgradeLink())->GetEntityCfgInfo(req, ans, 5000);
  1197. if (errCode == Error_Succeed)
  1198. {
  1199. m_bHaveGetEntityList = true;
  1200. CAutoArray<CSimpleStringA> allCfgEntity = ans.reserved2.Split(',');
  1201. m_activeEntity.clear();
  1202. for (int i = 0; i < allCfgEntity.GetCount(); i++)
  1203. {
  1204. if (allCfgEntity[i].Trim().GetLength() > 1)//except for empty entity name
  1205. m_activeEntity.push_back(allCfgEntity[i]);
  1206. }
  1207. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to get all entity list:%s", ans.reserved2);
  1208. }
  1209. }
  1210. }
  1211. }
  1212. void CSelfCheckerFSM::AddFWBEntityToList()
  1213. {
  1214. vector<CSimpleStringA>::iterator it, itAct;
  1215. bool bPinPadFound(false),bIDCertFound(false),bFingerPrintFound(false)
  1216. ,bActPinPadFound(false), bActIDCertFound(false), bActFingerPrintFound(false);
  1217. //template ?
  1218. for (it = m_allEntity.begin(); it != m_allEntity.end(); ++it)
  1219. {
  1220. if (!strnicmp("PinPad", *it, it->GetLength()))
  1221. bPinPadFound = true;
  1222. else if (!strnicmp("IDCertificate", *it, it->GetLength()))
  1223. bIDCertFound = true;
  1224. else if (!strnicmp("FingerPrint", *it, it->GetLength()))
  1225. bFingerPrintFound = true;
  1226. }
  1227. if (!bPinPadFound)
  1228. m_allEntity.push_back("PinPad");
  1229. if (!bIDCertFound)
  1230. m_allEntity.push_back("IDCertificate");
  1231. if (!bPinPadFound)
  1232. m_allEntity.push_back("FingerPrint");
  1233. for (itAct = m_activeEntity.begin(); itAct != m_activeEntity.end(); ++itAct)
  1234. {
  1235. if (!strnicmp("PinPad", *itAct, itAct->GetLength()))
  1236. bActPinPadFound = true;
  1237. else if (!strnicmp("IDCertificate", *itAct, itAct->GetLength()))
  1238. bActIDCertFound = true;
  1239. else if (!strnicmp("FingerPrint", *itAct, itAct->GetLength()))
  1240. bActFingerPrintFound = true;
  1241. }
  1242. if (!bActPinPadFound)
  1243. m_activeEntity.push_back("PinPad");
  1244. if (!bActIDCertFound)
  1245. m_activeEntity.push_back("IDCertificate");
  1246. if (!bActFingerPrintFound)
  1247. m_activeEntity.push_back("FingerPrint");
  1248. }