HealthManagerFSM.cpp 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516
  1. #include "stdafx.h"
  2. #include <fstream>
  3. #include <string>
  4. #include <algorithm>
  5. #include <regex>
  6. #include "CommEntityUtil.hpp"
  7. #include "SpUtility.h"
  8. #include "iniutil.h"
  9. #if defined(RVC_OS_WIN)
  10. #include <TlHelp32.h>
  11. #include <iphlpapi.h>
  12. #include <ws2tcpip.h>
  13. #include <Winsock2.h>
  14. #include <io.h>
  15. #include "CSystemStatus.h"
  16. #pragma comment(lib, "IPHLPAPI.lib")
  17. #pragma comment(lib, "libpublicFun.lib")
  18. #else
  19. #include <unistd.h>
  20. #include <fcntl.h>
  21. #include <errno.h>
  22. #endif //RVC_OS_WIN
  23. #include "mod_healthmanager.h"
  24. #include "publicFunExport.h"
  25. using namespace std;
  26. const int MAX_AYSNC_TIMEOUT = 60000;
  27. const int MAX_IGNORE_TIMEOUT = 100;
  28. unsigned long long GetLastErrorRVC() {
  29. #if defined(RVC_OS_WIN)
  30. return GetLastError();
  31. #else
  32. return errno;
  33. #endif //RVC_OS_WIN
  34. }
  35. enum EntityOP
  36. {
  37. OP_STOP_ENTITY,
  38. OP_START_ENTITY,
  39. OP_PAUSE_ENTITY,
  40. OP_TERMINATE_ENTITY,
  41. OP_CONTINUE_ENTITY,
  42. };
  43. bool StrEqualNoCase(const char *s1, const char *s2,int len)
  44. {
  45. if (strlen(s1) != strlen(s2))
  46. return false;
  47. for (int i = 0; i < len; ++i)
  48. {
  49. if (toupper(s1[i]) != toupper(s2[i]))
  50. return false;
  51. }
  52. return true;
  53. }
  54. ErrorCodeEnum CHealthManagerFSM::Initial()
  55. {
  56. #if defined(RVC_OS_WIN)
  57. SaveOsVersion();
  58. #endif
  59. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  60. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  61. CSmartPointer<IAsynWaitSp> spWait;
  62. ErrorCodeEnum err;
  63. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  64. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("machinetype[%s],terminalID[%s]", (LPCTSTR)m_sysInfo.strMachineType, (LPCTSTR)m_sysInfo.strTerminalID);
  65. CSmartPointer<IConfigInfo> spConfigCen;
  66. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  67. #if defined(RVC_OS_LINUX)
  68. if (!m_sysInfo.strMachineType.IsNullOrEmpty() && m_sysInfo.strMachineType.Compare("RVC.Stand2S") != 0
  69. && m_sysInfo.strMachineType.Compare("RVC.Stand1SPlus") != 0) {
  70. CSimpleStringA strErrMsg = CSimpleStringA::Format("当前版本不支持此机型:%s", (LPCTSTR)m_sysInfo.strMachineType);
  71. SP::Module::Comm::LogErrorNotiyStruct notifyItem(Error_NotSupport, 0);
  72. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  73. notifyItem.Notify(notifyMsg);
  74. return Error_Succeed;
  75. }
  76. #endif //RVC_OS_LINUX
  77. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "WKUpdatePeriod", m_wkUpdatePeriod);
  78. if (m_wkUpdatePeriod <= 0 || m_wkUpdatePeriod > 365)
  79. m_wkUpdatePeriod = 30;//default
  80. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "DoNotUpdateWKDaily", m_iDoNotUpdateWKDaily);
  81. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxWaitForPinPad", m_maxWaitForPinPad);
  82. if (m_maxWaitForPinPad <= 0 || m_maxWaitForPinPad > 5000)
  83. m_maxWaitForPinPad = 5000;//default
  84. CSimpleStringA csTmpTS("");
  85. GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTmpTS);
  86. if (csTmpTS.Compare("N") != 0)
  87. GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "X");
  88. WaitDeamonFinishTask* task = new WaitDeamonFinishTask(this);
  89. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  90. return Error_Succeed;
  91. }
  92. ErrorCodeEnum CHealthManagerFSM::OnInit(void)
  93. {
  94. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Complied at: %s %s", __DATE__, __TIME__);
  95. return Initial();
  96. }
  97. ErrorCodeEnum CHealthManagerFSM::OnExit(void)
  98. {
  99. return Error_Succeed;
  100. }
  101. void CHealthManagerFSM::s0_on_entry(void)
  102. {
  103. LOG_FUNCTION();
  104. m_fsmState = HM_FSM_INIT;
  105. m_ullElapseFromOSStart = SP::Module::Comm::RVCGetTickCount();
  106. m_elapseTimeFromOSStart = m_ullElapseFromOSStart / 1000;
  107. CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Entity start\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), m_elapseTimeFromOSStart);
  108. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
  109. }
  110. void CHealthManagerFSM::s0_on_exit(void)
  111. {
  112. }
  113. unsigned int CHealthManagerFSM::s0_on_event(FSMEvent* pEvt)
  114. {
  115. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event: %d, %d", pEvt->iEvt, pEvt->param1);
  116. int ret = 0;
  117. switch(pEvt->iEvt)
  118. {
  119. case USER_EVT_WAIT_DEAMON_FINISHED:
  120. ret = pEvt->param1;
  121. pEvt->SetHandled();
  122. break;
  123. default:
  124. break;
  125. }
  126. return ret;
  127. }
  128. //Idle(Operating finished)
  129. void CHealthManagerFSM::s4_on_entry()
  130. {
  131. m_fsmState = HM_FSM_STATE_IDLE;
  132. }
  133. void CHealthManagerFSM::s4_on_exit()
  134. {
  135. LOG_FUNCTION();
  136. }
  137. unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
  138. {
  139. LOG_FUNCTION();
  140. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s4 event %d,%d",pEvt->iEvt,pEvt->param1);
  141. switch(pEvt->iEvt)
  142. {
  143. case USER_EVT_ACCESSAUTH_FINISHED:
  144. {
  145. pEvt->SetHandled();
  146. CSimpleStringA csTermStage;
  147. ErrorCodeEnum eErrCode;
  148. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  149. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("after accessauth to get termstage %s",(LPCTSTR)csTermStage);
  150. //oilyang@20220614 添加密钥更新逻辑
  151. if (csTermStage[0] == 'A')
  152. {
  153. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("after auth suc,to call WKUpdatePeriodTask");
  154. WKUpdatePeriodTask* pTask = new WKUpdatePeriodTask(this);
  155. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  156. }
  157. LogTermInfoTask* task = new LogTermInfoTask(this);
  158. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  159. if (m_iAccessAuth != VtmLoad_AccessAuth_Suc)
  160. PostProcessAfterUpgrade();
  161. }
  162. break;
  163. case USER_EVT_MAITAIN:
  164. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  165. m_stateBeforeMaintain = m_fsmState;
  166. pEvt->SetHandled();
  167. break;
  168. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  169. pEvt->SetHandled();
  170. break;
  171. case USER_EVT_VTMLOADER_FINISHED:
  172. {
  173. pEvt->SetHandled();
  174. if (pEvt->param1 == 1)
  175. {
  176. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("VtmLoader load SIPphone entity failed, to Set TerminalStage M.");
  177. SetVtmLoadResult(VtmLoad_MediaLoadFail);
  178. return pEvt->param1;
  179. }
  180. else if (pEvt->param1 == 2)
  181. {
  182. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("VtmLoader load SYNCSTART(boot cfg = 2) entity failed, to Set TerminalStage C.");
  183. SetVtmLoadResult(VtmLoad_OtherSyncEntityLoadFail);
  184. return pEvt->param1;
  185. }
  186. if (m_iAccessAuth == VtmLoad_AccessAuth_Init)
  187. {
  188. WaitToCallAccessAuthTask* pTask = new WaitToCallAccessAuthTask(this);
  189. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  190. }
  191. }
  192. break;
  193. default:
  194. break;
  195. }
  196. return 0;
  197. }
  198. //Fault
  199. void CHealthManagerFSM::s5_on_entry()
  200. {
  201. LOG_FUNCTION();
  202. LogTermInfoTask* task = new LogTermInfoTask(this);
  203. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  204. m_fsmState = HM_FSM_STATE_FAULT;
  205. PostProcessAfterUpgrade();
  206. }
  207. void CHealthManagerFSM::s5_on_exit()
  208. {
  209. LOG_FUNCTION();
  210. }
  211. unsigned int CHealthManagerFSM::s5_on_event(FSMEvent* pEvt)
  212. {
  213. LOG_FUNCTION();
  214. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s5(Fault) event %d,%d",pEvt->iEvt,pEvt->param1);
  215. switch(pEvt->iEvt)
  216. {
  217. case USER_EVT_MAITAIN:
  218. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  219. m_stateBeforeMaintain = m_fsmState;
  220. pEvt->SetHandled();
  221. break;
  222. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  223. pEvt->SetHandled();
  224. break;
  225. case USER_EVT_ACCESSAUTH_FINISHED:
  226. pEvt->SetHandled();
  227. if (pEvt->param1 == 1)
  228. {
  229. return 1;
  230. }
  231. break;
  232. default:
  233. break;
  234. }
  235. return 0;
  236. }
  237. //Maintaining
  238. void CHealthManagerFSM::s6_on_entry()
  239. {
  240. LOG_FUNCTION();
  241. m_preFsmState = m_fsmState;
  242. m_fsmState = HM_FSM_STATE_MAINTAINING;
  243. ErrorCodeEnum eErrCode;
  244. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","M");
  245. if (eErrCode != Error_Succeed)
  246. {
  247. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState M failed (%d).",eErrCode);
  248. }
  249. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  250. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  251. if (pFuncPrivilege == NULL)
  252. {
  253. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("display screen NoPrivilege");
  254. return;
  255. }
  256. ErrorCodeEnum eErr = pFuncPrivilege->DisplayBlueScreen("暂停服务");
  257. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("display blue screen %d",eErr);
  258. }
  259. void CHealthManagerFSM::s6_on_exit()
  260. {
  261. LOG_FUNCTION();
  262. }
  263. unsigned int CHealthManagerFSM::s6_on_event(FSMEvent* pEvt)
  264. {
  265. LOG_FUNCTION();
  266. int ret = 0;
  267. switch(pEvt->iEvt)
  268. {
  269. case USER_EVT_MAITAIN_FINISHED:
  270. pEvt->SetHandled();
  271. {
  272. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  273. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  274. if (pFuncPrivilege == NULL)
  275. {
  276. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("un-display screen NoPrivilege");
  277. return 1;
  278. }
  279. ErrorCodeEnum eErr = pFuncPrivilege->UndisplayBlueScreen();
  280. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("un-display blue screen %d",eErr);
  281. if (m_stateBeforeMaintain == HM_FSM_STATE_IDLE)
  282. {
  283. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  284. if (eErr != Error_Succeed)
  285. {
  286. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState O failed (%d).",eErr);
  287. }
  288. }
  289. ret = m_preFsmState;
  290. }
  291. break;
  292. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  293. pEvt->SetHandled();
  294. break;
  295. default:
  296. break;
  297. }
  298. return ret;
  299. }
  300. //In Customer Manager System
  301. void CHealthManagerFSM::s11_on_entry()
  302. {
  303. LOG_FUNCTION();
  304. m_preFsmState = m_fsmState;
  305. m_fsmState = HM_FSM_STATE_CMS;
  306. }
  307. void CHealthManagerFSM::s11_on_exit()
  308. {
  309. LOG_FUNCTION();
  310. }
  311. unsigned int CHealthManagerFSM::s11_on_event(FSMEvent* pEvt)
  312. {
  313. LOG_FUNCTION();
  314. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s11(In CMS) event %d",pEvt->iEvt);
  315. int ret = 0;
  316. switch (pEvt->iEvt)
  317. {
  318. case USER_EVT_MAITAIN:
  319. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  320. m_stateBeforeMaintain = m_fsmState;
  321. pEvt->SetHandled();
  322. break;
  323. case USER_EVT_SWITCH_BACK_TO_RVC:
  324. pEvt->SetHandled();
  325. ret = m_preFsmState;
  326. break;
  327. default:
  328. break;
  329. }
  330. return ret;
  331. }
  332. int CHealthManagerFSM::WaitDeamonFinish()
  333. {
  334. int count = 0;
  335. while(1)//max waiting time
  336. {
  337. count++;
  338. //query if update deamon process is started oiltmp
  339. //case custody
  340. //case needreboot
  341. //case rollback
  342. //case timeout
  343. if (count > 2)
  344. break;
  345. //Sleep(5000);
  346. }
  347. return 0;
  348. }
  349. //0:auth suc or have already authed;1:auth failed;
  350. int CHealthManagerFSM::AccessAuthDoWork()
  351. {
  352. LOG_FUNCTION();
  353. CheckIfPinPadOK();
  354. m_bInAccessAuthDoWork = true;
  355. CSimpleStringA csTermStage("");
  356. ErrorCodeEnum eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
  357. if (eErrCode == Error_Succeed)
  358. {
  359. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before accessauth get TerminalStage %s", csTermStage.GetData());
  360. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  361. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  362. CEntityRunInfo acInfo;
  363. eErrCode = pFunc->GetEntityRunInfo("AccessAuthorization", acInfo);
  364. if (eErrCode == Error_Succeed)
  365. {
  366. switch (acInfo.eState)
  367. {
  368. case EntityState_NoStart:
  369. {
  370. CSmartPointer<IAsynWaitSp> spWaitAC;
  371. eErrCode = pFuncPrivilege->StartEntity("AccessAuthorization", NULL, spWaitAC);
  372. eErrCode = spWaitAC->WaitAnswer(MAX_AYSNC_TIMEOUT);
  373. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start accessauth %d.", eErrCode);
  374. }
  375. break;
  376. case EntityState_Idle:
  377. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AccessAuth state idle.");
  378. break;
  379. default:
  380. break;
  381. }
  382. if (m_pACClient == NULL)
  383. {
  384. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  385. eErrCode = m_pACClient->Connect();
  386. if (eErrCode != Error_Succeed) {
  387. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("accessauth connected failed:%s", SpStrError(eErrCode));
  388. m_pACClient->SafeDelete();
  389. m_pACClient = NULL;
  390. m_bInAccessAuthDoWork = false;
  391. return 1;
  392. }
  393. else {
  394. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("accessauth connected.");
  395. }
  396. }
  397. }
  398. else
  399. {
  400. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Get AccessAuth RunInfo failed(%s).", SpStrError(eErrCode));
  401. m_bInAccessAuthDoWork = false;
  402. return 1;
  403. }
  404. if (m_pACClient != NULL)
  405. {
  406. //存在循环刷数据的情况,暂时不记这个,只记失败
  407. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Z10301")("to call AccessAuth's Regist");
  408. m_ullAuthStart = SP::Module::Comm::RVCGetTickCount();
  409. eErrCode = (*m_pACClient)(EntityResource::getLink().upgradeLink())->Regist();
  410. m_bHasAuthEver = true;
  411. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("accessauth regist %d", eErrCode);
  412. if (eErrCode == Error_Succeed)
  413. {
  414. do {
  415. if (m_iAccessAuth != VtmLoad_AccessAuth_Init)
  416. break;
  417. Sleep(1000);
  418. } while (1);//wait for accessauth send result
  419. m_bFirstAccessAuth = false;
  420. m_bInAccessAuthDoWork = false;
  421. return 0;
  422. }
  423. else
  424. {
  425. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501Z10301").setResultCode("RTA5102")("call accessauth Regist failed:%s", SpStrError(eErrCode));
  426. m_bInAccessAuthDoWork = false;
  427. return 1;
  428. }
  429. }
  430. else
  431. {
  432. m_bInAccessAuthDoWork = false;
  433. return 1;
  434. }
  435. }
  436. else {
  437. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Get TerminalStage failed(%s).", SpStrError(eErrCode));
  438. }
  439. m_bInAccessAuthDoWork = false;
  440. return 1;
  441. }
  442. void CHealthManagerFSM::SetVtmLoadResult(int bResult)
  443. {
  444. m_iAccessAuth = bResult;
  445. ErrorCodeEnum eErrCode;
  446. if (bResult == VtmLoad_AccessAuth_Suc)
  447. {
  448. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "A");
  449. m_ullAccessAuthCost = SP::Module::Comm::RVCGetTickCount() - m_ullAuthStart;
  450. }
  451. else if (bResult == VtmLoad_AccessAuth_servFail) //准入服务端返回失败
  452. {
  453. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "S");
  454. m_ullAccessAuthCost = SP::Module::Comm::RVCGetTickCount() - m_ullAuthStart;
  455. }
  456. else if (bResult == VtmLoad_MediaLoadFail) //音视频校验不通过
  457. {
  458. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "M");
  459. }
  460. else //其他失败
  461. {
  462. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  463. if (bResult != VtmLoad_OtherSyncEntityLoadFail)//if haven't call Regist(), no need to calulate the AccessAuth cost
  464. m_ullAccessAuthCost = SP::Module::Comm::RVCGetTickCount() - m_ullAuthStart;
  465. }
  466. if (eErrCode != Error_Succeed)
  467. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("set TerminalStage %d,failed:%s", bResult, SpStrError(eErrCode));
  468. else
  469. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set TerminalStage %d", bResult);
  470. }
  471. void CHealthManagerFSM::ToReAccessAuth(bool bEver)
  472. {
  473. Sleep(1500);//for function "AccessAuthDoWork" to quit while
  474. if (m_bFirstAccessAuth)
  475. return;
  476. ToCallAccessAuthDoWork();
  477. }
  478. ErrorCodeEnum CHealthManagerFSM::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData)
  479. {
  480. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  481. ErrorCodeEnum errCode;
  482. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  483. if (pFuncPrivilege != NULL) {
  484. CSmartPointer<IAsynWaitSp> spWait;
  485. errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  486. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start entity %s,errCode:%s", entity_name, SpStrError(errCode));
  487. if (errCode == Error_Succeed) {
  488. callback_entry *entry = new callback_entry();
  489. entry->pRawData = pData;
  490. entry->EntityName = entity_name;
  491. entry->ErrorResult = Error_Unexpect;
  492. entry->op = OP_START_ENTITY;
  493. if (spWait != NULL)
  494. spWait->SetCallback(this, entry);
  495. }
  496. return errCode;
  497. } else {
  498. return Error_NoPrivilege;
  499. }
  500. }
  501. ErrorCodeEnum CHealthManagerFSM::AsyncStopEntity(const char *entity_name, void *pData)
  502. {
  503. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  504. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  505. if (pFuncPrivilege != NULL) {
  506. CSmartPointer<IAsynWaitSp> spWait;
  507. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  508. if (Error == Error_Succeed) {
  509. callback_entry *entry = new callback_entry();
  510. entry->pRawData = pData;
  511. entry->EntityName = entity_name;
  512. entry->ErrorResult = Error_Unexpect;
  513. entry->op = OP_STOP_ENTITY;
  514. if (spWait != NULL)
  515. spWait->SetCallback(this, entry);
  516. }
  517. return Error;
  518. } else {
  519. return Error_NoPrivilege;
  520. }
  521. }
  522. ErrorCodeEnum CHealthManagerFSM::AsyncPauseEntity(const char *entity_name, void *pData)
  523. {
  524. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  525. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  526. if (pFuncPrivilege != NULL) {
  527. CSmartPointer<IAsynWaitSp> spWait;
  528. ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
  529. if (Error == Error_Succeed) {
  530. callback_entry *entry = new callback_entry();
  531. entry->pRawData = pData;
  532. entry->EntityName = entity_name;
  533. entry->ErrorResult = Error_Unexpect;
  534. entry->op = OP_PAUSE_ENTITY;
  535. if (spWait != NULL)
  536. spWait->SetCallback(this, entry);
  537. }
  538. return Error;
  539. } else {
  540. return Error_NoPrivilege;
  541. }
  542. }
  543. ErrorCodeEnum CHealthManagerFSM::AsyncContinueEntity(const char *entity_name, void *pData)
  544. {
  545. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  546. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  547. if (pFuncPrivilege != NULL) {
  548. CSmartPointer<IAsynWaitSp> spWait;
  549. ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
  550. if (Error == Error_Succeed) {
  551. callback_entry *entry = new callback_entry();
  552. entry->pRawData = pData;
  553. entry->EntityName = entity_name;
  554. entry->ErrorResult = Error_Unexpect;
  555. entry->op = OP_CONTINUE_ENTITY;
  556. if (spWait != NULL)
  557. spWait->SetCallback(this, entry);
  558. }
  559. return Error;
  560. } else {
  561. return Error_NoPrivilege;
  562. }
  563. }
  564. ErrorCodeEnum CHealthManagerFSM::AsyncTerminateEntity(const char *entity_name, void *pData)
  565. {
  566. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  567. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  568. if (pFuncPrivilege != NULL) {
  569. CSmartPointer<IAsynWaitSp> spWait;
  570. ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
  571. if (Error == Error_Succeed) {
  572. callback_entry *entry = new callback_entry();
  573. entry->pRawData = pData;
  574. entry->EntityName = entity_name;
  575. entry->ErrorResult = Error_Unexpect;
  576. entry->op = OP_TERMINATE_ENTITY;
  577. if (spWait != NULL)
  578. spWait->SetCallback(this, entry);
  579. }
  580. return Error;
  581. } else {
  582. return Error_NoPrivilege;
  583. }
  584. }
  585. void CHealthManagerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  586. {
  587. }
  588. int CHealthManagerFSM::QuitFrameworkAndSaveInfo(RebootTriggerEnum eTrigger, RebootWayEnum eWay)
  589. {
  590. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  591. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  592. if (pFuncPrivilege == NULL) {
  593. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("has no privilege");
  594. return (int)(Error_NoPrivilege);
  595. }
  596. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("quit framework and info %d,%d.", eTrigger, eWay);
  597. const auto result = pFuncPrivilege->Reboot(eTrigger, eWay);
  598. return (int)result;
  599. }
  600. void CHealthManagerFSM::PostProcessAfterUpgrade()
  601. {
  602. LOG_FUNCTION();
  603. if (IfInUpgradeProcess())
  604. {
  605. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("exist upgrade flag file,to decide if restart framework.");
  606. //存在升级后的启动文件
  607. CSmartPointer<IConfigInfo> spConfigRun;
  608. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  609. if (eErr == Error_Succeed)
  610. {
  611. int restartOSTime = 0;
  612. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartOSTimes", restartOSTime);
  613. if(restartOSTime==1){
  614. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("升级切换已重启过系统");
  615. //重启过的系统过的升级,在重试一定次数后等guardian 10分钟回退
  616. int xTimes = 0;
  617. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  618. if (xTimes < 3)
  619. {
  620. xTimes++;
  621. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("写入: UpgradeRestartTimes:%d", xTimes);
  622. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  623. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
  624. }
  625. }else{
  626. //未重启过操作系统
  627. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("升级切换未重启过系统");
  628. int xTimes = 0;
  629. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  630. if (xTimes < 3)
  631. {
  632. xTimes++;
  633. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("写入: UpgradeRestartTimes:%d", xTimes);
  634. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  635. //oilyang@20211130 change from 3 to 2
  636. if (xTimes == 2)
  637. {
  638. //重启操作系统前把重启框架次数重置,重启OS次数置为1
  639. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("准备尝试重启系统后再切换升级");
  640. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", 0);
  641. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartOSTimes", 1);
  642. Sleep(2000);
  643. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_OS);
  644. }
  645. else
  646. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
  647. }
  648. }
  649. }
  650. }
  651. }
  652. void CHealthManagerFSM::SaveOsVersion()
  653. {
  654. #if defined(RVC_OS_WIN)
  655. CSimpleStringA runInfoPath;
  656. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
  657. if (eErr != Error_Succeed) {
  658. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", eErr);
  659. return;
  660. }
  661. runInfoPath += "\\runcfg\\osverion";
  662. ifstream is;
  663. is.open(runInfoPath.GetData(), ios::binary);
  664. if (!is.is_open())
  665. {
  666. DWORD dwErr = GetLastError();
  667. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("open runcfg\\osverion file failed. [%d]", dwErr);
  668. CSimpleStringA csCmd;
  669. csCmd = CSimpleStringA::Format("cmd /c ver >%s", runInfoPath);
  670. WinExec((LPCSTR)csCmd, SW_HIDE);
  671. }
  672. #endif
  673. return;
  674. }
  675. CSimpleStringA CHealthManagerFSM::GetOsVersion()
  676. {
  677. #if defined(RVC_OS_WIN)
  678. CSimpleStringA runInfoPath;
  679. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
  680. if (eErr != Error_Succeed) {
  681. DbgWithLink(LOG_LEVEL_ERROR,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetPath runinfo error=%s.", SpStrError(eErr));
  682. return "";
  683. }
  684. runInfoPath += "\\runcfg\\osverion";
  685. ifstream is;
  686. is.open(runInfoPath.GetData(), ios::binary);
  687. if (!is.is_open())
  688. {
  689. DWORD dwErr = GetLastError();
  690. DbgWithLink(LOG_LEVEL_ERROR,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open runcfg\\osverion file failed. [%d]", dwErr);
  691. return "";
  692. }
  693. string line;
  694. while(!is.eof()){
  695. getline(is, line);
  696. int start = line.find("版本");
  697. if (start != string::npos)
  698. //return CSimpleStringA(line.substr(start + 5, line.length() - start - 7).c_str());
  699. return CSimpleStringA(line.c_str());
  700. else
  701. continue;
  702. }
  703. return "";
  704. #else
  705. std::map<std::string, std::string> osInfo;
  706. const char filePath[] = "/etc/os-version";
  707. char tmp[33];
  708. memset(tmp, 0, 33);
  709. inifile_read_str_s("Version", "SystemName", "unknown", tmp, 32, filePath);
  710. osInfo["SystemName"] = tmp;
  711. memset(tmp, 0, 33);
  712. inifile_read_str_s("Version", "ProductType", "unknown", tmp, 32, filePath);
  713. osInfo["ProductType"] = tmp;
  714. memset(tmp, 0, 33);
  715. inifile_read_str_s("Version", "MajorVersion", "unknown", tmp, 32, filePath);
  716. osInfo["MajorVersion"] = tmp;
  717. memset(tmp, 0, 33);
  718. inifile_read_str_s("Version", "MinorVersion", "unknown", tmp, 32, filePath);
  719. osInfo["MinorVersion"] = tmp;
  720. memset(tmp, 0, 33);
  721. inifile_read_str_s("Version", "OsBuild", "unknown", tmp, 32, filePath);
  722. osInfo["OsBuild"] = tmp;
  723. return generateJsonStr(osInfo).second.c_str();
  724. #endif
  725. }
  726. #if defined(RVC_OS_WIN)
  727. const char* dmi_string(const dmi_header* dm, BYTE s)
  728. {
  729. char* bp = (char*)dm;
  730. size_t i, len;
  731. if (s == 0)
  732. return "Not Specified";
  733. bp += dm->length;
  734. while (s > 1 && *bp)
  735. {
  736. bp += strlen(bp);
  737. bp++;
  738. s--;
  739. }
  740. if (!*bp)
  741. return "BAD_INDEX";
  742. /* ASCII filtering */
  743. len = strlen(bp);
  744. for (i = 0; i < len; i++)
  745. if (bp[i] < 32 || bp[i] == 127)
  746. bp[i] = '.';
  747. return bp;
  748. }
  749. void CHealthManagerFSM::QueryComputerInfo()
  750. {
  751. int ret = 0;
  752. RawSMBIOSData* Smbios;
  753. dmi_header* h = NULL;
  754. int flag = 1;
  755. ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
  756. if (!ret)
  757. {
  758. Dbg("Function failed!");
  759. return;
  760. }
  761. DWORD bufsize = ret;
  762. char* buf = new char[bufsize];
  763. memset(buf, 0, bufsize);
  764. ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);
  765. if (!ret)
  766. {
  767. Dbg("Function failed!");
  768. delete[]buf;
  769. return;
  770. }
  771. Smbios = (RawSMBIOSData*)buf;
  772. BYTE* p = Smbios->SMBIOSTableData;
  773. if (Smbios->Length != bufsize - 8)
  774. {
  775. Dbg("Smbios length error");
  776. delete[]buf;
  777. return;
  778. }
  779. for (int i = 0; i < Smbios->Length; i++) {
  780. h = (dmi_header*)p;
  781. if (h->type == 1)
  782. {
  783. m_computerInfo["Manufacturer"] = dmi_string(h, p[0x4]);
  784. m_computerInfo["ComputerName"] = dmi_string(h, p[0x5]);
  785. m_computerInfo["ComputerVersion"] = dmi_string(h, p[0x6]);
  786. m_computerInfo["SerialNumber"] = dmi_string(h, p[0x7]);
  787. break;
  788. }
  789. p += h->length;
  790. while ((*(WORD*)p) != 0) p++;
  791. p += 2;
  792. }
  793. delete[]buf;
  794. }
  795. #endif //RVC_OS_WIN
  796. DWORD GetDualTime(SYSTEMTIME& t1, SYSTEMTIME& t2)
  797. {
  798. //assume t2 > t1...
  799. //oiltest for simple
  800. int s1, s2;
  801. s1 = (t1.wMinute * 60 + t1.wSecond) * 1000 + t1.wMilliseconds;
  802. s2 = (t2.wMinute * 60 + t2.wSecond) * 1000 + t2.wMilliseconds;
  803. return s2 - s1;
  804. }
  805. void CHealthManagerFSM::ToLogWarnTermAboutInfo()
  806. {
  807. LOG_FUNCTION();
  808. bool bTmpEtyNewStart = m_bEntityNewStart;
  809. if (m_bEntityNewStart)
  810. {
  811. SYSTEMTIME shellStartTime;
  812. m_ullTotalCost = 0;
  813. m_bEntityNewStart = false;
  814. CAutoArray<CSimpleStringA> strEntityNames;
  815. CAutoArray<int> strEntityIdx;
  816. CAutoArray<CEntityStartInfo> Infos;
  817. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetAllEntityStartInfo(strEntityNames, strEntityIdx, Infos);
  818. for (int i = 0; i < Infos.GetCount(); ++i)
  819. {
  820. if (strEntityIdx[i] == 0)
  821. {
  822. shellStartTime = Infos[i].startTime;
  823. ULONGLONG dwElapseNow = SP::Module::Comm::RVCGetTickCount();
  824. m_ullTotalCost = dwElapseNow - m_ullElapseFromOSStart;
  825. LogWarn(Severity_Low, Error_Debug, LOG_TRACE_ENTITY_START_TIME,
  826. SP::Module::Util::generateConsumeTimeJson("total", SP::Module::Util::formatTime(shellStartTime).c_str(), m_ullTotalCost).GetData());
  827. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("EntityStartCost")(SP::Module::Util::generateConsumeTimeJson("total", SP::Module::Util::formatTime(shellStartTime).c_str(), m_ullTotalCost).GetData());
  828. //break;
  829. }
  830. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s,%d", strEntityNames[i].GetData(), GetDualTime(Infos[i].startTime, Infos[i].startEndTime));
  831. if (strEntityNames[i].Compare("SIPPhone") == 0)
  832. m_ullSIPPhoneCost = GetDualTime(Infos[i].startTime, Infos[i].startEndTime);
  833. else if (strEntityNames[i].Compare("TokenKeeper") == 0)
  834. m_ullTokenKeeperCost = GetDualTime(Infos[i].startTime, Infos[i].startEndTime);
  835. }
  836. std::map<std::string, std::string> termStartInfo;
  837. termStartInfo["SIPPhoneCost"] = CSimpleStringA::Format("%d", m_ullSIPPhoneCost);
  838. termStartInfo["TokenKeeperCost"] = CSimpleStringA::Format("%d", m_ullTokenKeeperCost);
  839. termStartInfo["WaitForPinPadCost"] = CSimpleStringA::Format("%d", m_ullWaitForPinPad);
  840. termStartInfo["TotalCost"] = CSimpleStringA::Format("%d", m_ullTotalCost);
  841. termStartInfo["AccessAuthCost"] = CSimpleStringA::Format("%d", m_ullAccessAuthCost);
  842. termStartInfo["AccessAuthResult"] = CSimpleStringA::Format("%d", m_iAccessAuth);
  843. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("TerminalStartCost")("%s", generateJsonStr(termStartInfo).second.c_str());
  844. }
  845. QueryAndSaveDNS();
  846. QueryAndSendCPUInfo();
  847. QueryAndSendDisplayInfo();
  848. CSimpleStringA csOSVerion(""), csWarnMsg("");
  849. std::map<std::string, std::string> termInfo;
  850. termInfo["version"] = m_sysInfo.InstallVersion.ToString();
  851. if (m_iAccessAuth == VtmLoad_AccessAuth_Suc)
  852. {
  853. termInfo["AccessAuth"] = "T";
  854. }
  855. else
  856. {
  857. termInfo["AccessAuth"] = "F";
  858. CSimpleStringA tmpAuthErrMsg("");
  859. if (GetEntityBase()->GetFunction()->GetSysVar("AuthErrMsg", tmpAuthErrMsg) == Error_Succeed)
  860. termInfo["AuthErrMsg"] = tmpAuthErrMsg;
  861. }
  862. csOSVerion = GetOsVersion();
  863. if (!csOSVerion.IsNullOrEmpty())
  864. termInfo["OSVersion"] = csOSVerion;
  865. termInfo["Harddisk"] = QueryHarddiskInfo();
  866. #if defined(RVC_OS_WIN)
  867. termInfo["OSType"] = "Windows";
  868. termInfo["AsiaInfo"] = CheckProcessExistByName("NTRtScan.exe") ? "Y" : "N";
  869. termInfo["UniAccess"] = CheckProcessExistByName("UniAccessAgent.exe") ? "Y" : "N";
  870. termInfo["RuiYan"] = CheckProcessExistByName("RuiYan.exe") ? "Y" : "N";
  871. termInfo["Symantec"] = CheckProcessExistByName("SavUI.exe") ? "Y" : "N";
  872. #else
  873. termInfo["OSType"] = "UOS";
  874. #endif
  875. CSmartPointer<IConfigInfo> spConfigRun;
  876. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  877. CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
  878. SP::Module::Net::GetINETMacAddresses(netList);
  879. CSimpleStringA csMac(""), csIP(""), csDNS("");
  880. for (int i = 0; i < netList.GetCount(); i++) {
  881. if (!csMac.IsNullOrEmpty()) {
  882. csMac += ";";
  883. }
  884. csMac += netList[i].mac.c_str();
  885. }
  886. for (int i = 0; i < netList.GetCount(); i++) {
  887. if (!csIP.IsNullOrEmpty()) {
  888. csIP += ";";
  889. }
  890. csIP += netList[i].ip.c_str();
  891. }
  892. for (int i = 0; i < m_dns.GetCount(); i++) {
  893. if (!csDNS.IsNullOrEmpty()) {
  894. csDNS += ";";
  895. }
  896. csDNS += m_dns[i].c_str();
  897. }
  898. termInfo["MACs"] = csMac;
  899. termInfo["IPs"] = csIP;
  900. termInfo["DNSs"] = csDNS;
  901. char xOSTime[64] = {0};
  902. char elapseTime[64] = {0};//使用机器启动时间秒数
  903. ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();
  904. DWORD elapseTimeTemp = dwElapse / 1000;
  905. #if defined(RVC_OS_WIN)
  906. termInfo["OSTime"] = itoa(m_elapseTimeFromOSStart, xOSTime, 10);
  907. termInfo["elapseTime"] = itoa(elapseTimeTemp, elapseTime, 10);
  908. #else
  909. termInfo["OSTime"] = _itoa(m_elapseTimeFromOSStart, xOSTime, 10);
  910. termInfo["elapseTime"] = _itoa(elapseTimeTemp, elapseTime, 10);
  911. #endif
  912. CSimpleStringA csRunPath("");
  913. GetEntityBase()->GetFunction()->GetPath("Run", csRunPath);
  914. termInfo["AppPath"] = csRunPath;
  915. std::pair<bool, std::string> strResult;
  916. strResult = generateJsonStr(termInfo);
  917. spConfigRun->ReadConfigValue("Run", "WarnMsg", csWarnMsg);
  918. //oilyang@20210323 discard the following rule of throwing LogWarn.Always throw LogWarn
  919. //oilyang@20201201 log warn every time if content of msg has changed
  920. if (bTmpEtyNewStart)
  921. {
  922. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, strResult.second.c_str());
  923. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InfoAboutTerm")(strResult.second.c_str());
  924. }
  925. else
  926. {
  927. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, strResult.second.c_str());
  928. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InfoAboutTerm")(strResult.second.c_str());
  929. }
  930. }
  931. void CHealthManagerFSM::ToCallAccessAuthDoWork()
  932. {
  933. if (!m_bInAccessAuthDoWork)
  934. {
  935. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("To Call AccessAuthDoWork");
  936. AccessAuthTask* pTask = new AccessAuthTask(this);
  937. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  938. }
  939. }
  940. bool CHealthManagerFSM::IfInUpgradeProcess()
  941. {
  942. CSimpleStringA csRunCfgPath(""), csFileName("");
  943. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("RunCfg", csRunCfgPath);
  944. csFileName = csRunCfgPath + SPLIT_SLASH_STR + "starttime.dat";
  945. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("csFileName:%s", csFileName.GetData());
  946. #if defined(RVC_OS_WIN)
  947. if (_access((const char*)csFileName, 0) == 0) {
  948. #else
  949. if (access((const char*)csFileName, F_OK) == 0) {
  950. #endif
  951. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("升级切换中");
  952. return true;
  953. }
  954. else
  955. return false;
  956. }
  957. void CHealthManagerFSM::WaitToCallAccessAuthDoWork()
  958. {
  959. //WaitForSingleObject
  960. bool bHaveShowMsg = false;
  961. while (1)
  962. {
  963. CSimpleStringA csHavePath("N");
  964. GetEntityBase()->GetFunction()->GetSysVar("AccessHavePath", csHavePath);
  965. if (csHavePath.Compare("Y") == 0 || csHavePath.Compare("E") == 0)
  966. {
  967. AccessAuthTask* pTask = new AccessAuthTask(this);
  968. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  969. break;
  970. }
  971. else
  972. {
  973. Sleep(5000);
  974. LogWarn(Severity_High, Error_Unexpect, HealthManager_UserErrorCode_WaitForAccessGrayResult, "等待准入实体准备好");
  975. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402501Z10301").setResultCode("RTA5107")("等待准入实体准备好");
  976. }
  977. }
  978. }
  979. void CHealthManagerFSM::WKUpdatePeriod()
  980. {
  981. auto pEntity = ((CHealthManagerEntity*)m_pEntity);
  982. //oilyang@20220413 control update working key by CenterSetting
  983. if (m_iDoNotUpdateWKDaily == 1)
  984. {
  985. // 没有密码键盘 或 集中配置告知无需更新,无需更新
  986. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  987. (CSimpleStringA::Format("DoNotUpdateWKDaily:%d, ignore update wk"
  988. , m_iDoNotUpdateWKDaily));
  989. return;
  990. }
  991. // 检查上次密钥同步时间(一天只同步一次)
  992. CSmartPointer<IConfigInfo> pConfigRun;
  993. m_pEntity->GetFunction()->OpenConfig(Config_Run, pConfigRun);
  994. int nWKLastSyncTime(0);
  995. pConfigRun->ReadConfigValueInt("Main", "WKSyncSuccTime", nWKLastSyncTime);
  996. int nWKSyncFailCount(0);
  997. pConfigRun->ReadConfigValueInt("Main", "WKSyncFailCount", nWKSyncFailCount);
  998. SYSTEMTIME stSyncTime = CSmallDateTime(nWKLastSyncTime).ToSystemTime();
  999. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  1000. ("last WK sync time: %04d-%02d-%02d %02d:%02d:%02d",
  1001. stSyncTime.wYear, stSyncTime.wMonth, stSyncTime.wDay,
  1002. stSyncTime.wHour, stSyncTime.wMinute, stSyncTime.wSecond);
  1003. SYSTEMTIME stNow = {};
  1004. GetLocalTimeRVC(stNow);
  1005. int lastUpdateDays = sumday(stSyncTime.wYear, stSyncTime.wMonth, stSyncTime.wDay);
  1006. int todayDays = sumday(stNow.wYear, stNow.wMonth, stNow.wDay);
  1007. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("lastUpdateDays:%d,todayDays:%d,x:%d", lastUpdateDays,todayDays, todayDays-lastUpdateDays);
  1008. //if ((nWKLastSyncTime > 0 && stSyncTime.wYear == stNow.wYear
  1009. // && stSyncTime.wMonth == stNow.wMonth && stSyncTime.wDay == stNow.wDay
  1010. // && nWKSyncFailCount == 0)) // 最近一次同步成功,才能跳过
  1011. if (todayDays - lastUpdateDays < m_wkUpdatePeriod)
  1012. {
  1013. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  1014. ("WK has been updated, last sync time: %s", (const char*)CSmallDateTime(nWKLastSyncTime).ToTimeString());
  1015. }
  1016. else
  1017. {
  1018. //if have exceed the time,we should update working key in the next peroid
  1019. if (todayDays - lastUpdateDays < m_wkUpdatePeriod * 2)
  1020. {
  1021. int xTerm = atoi(m_sysInfo.strTerminalID.SubString(m_sysInfo.strTerminalID.GetLength() - 7, 7));
  1022. if ((todayDays % m_wkUpdatePeriod) != (xTerm % m_wkUpdatePeriod))
  1023. {
  1024. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("todayDays:%d, xTerm:%d, m_wkUpdatePeriod:%d", todayDays, xTerm, m_wkUpdatePeriod);
  1025. return;
  1026. }
  1027. }
  1028. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin update WK now");
  1029. ErrorCodeEnum eErrCode = Error_Succeed;
  1030. if (m_pACClient == NULL)
  1031. {
  1032. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  1033. eErrCode = m_pACClient->Connect();
  1034. if (eErrCode != Error_Succeed) {
  1035. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("accessauth connected failed.");
  1036. m_pACClient->SafeDelete();
  1037. m_pACClient = NULL;
  1038. m_bInAccessAuthDoWork = false;
  1039. return;
  1040. }
  1041. else {
  1042. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("accessauth connected.");
  1043. }
  1044. }
  1045. eErrCode = (*m_pACClient)(EntityResource::getLink().upgradeLink())->UpdateWK();
  1046. if(Error_Succeed == eErrCode)
  1047. {
  1048. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402501Z0001")("accessauth updatewk succ.");
  1049. pConfigRun->WriteConfigValue("Main", "WKSyncSuccTime",
  1050. (const char*) CSimpleStringA::Format("0x%08X", (DWORD)CSmallDateTime::GetNow()));
  1051. pConfigRun->WriteConfigValueInt("Main", "WKSyncFailCount", 0);
  1052. }
  1053. else
  1054. {
  1055. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402501Z0001").setResultCode("RTA5110")("accessauth updatewk failed.");
  1056. nWKSyncFailCount++;
  1057. pConfigRun->WriteConfigValueInt("Main", "WKSyncFailCount", nWKSyncFailCount);
  1058. }
  1059. }
  1060. }
  1061. int CHealthManagerFSM::sumday(int year, int month, int day)
  1062. {
  1063. int days[2][13] = { {0,31,59,90,120,151,181,212,243,273,304,334,365},{0,31,60,91,121,152,182,213,244,274,305,335,366} };
  1064. int iLeapYear = 0;
  1065. if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  1066. iLeapYear = 1;
  1067. int yearday = year * 365 + year / 4 - year / 100 + year / 400;
  1068. int monthday = days[iLeapYear][month - 1];
  1069. return yearday + monthday + day;
  1070. }
  1071. void CHealthManagerFSM::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx)
  1072. {
  1073. CSystemStaticInfo info;
  1074. GetEntityBase()->GetFunction()->GetSystemStaticInfo(info);
  1075. CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
  1076. SP::Module::Net::GetINETMacAddresses(netList);
  1077. CAutoArray<CSimpleStringA> ipAddrs, macAddrs;
  1078. for (int i = 0; i < netList.GetCount(); i++) {
  1079. CSimpleStringA tmpip = netList[i].ip.c_str();
  1080. CSimpleStringA tmpmac = netList[i].mac.c_str();
  1081. ipAddrs.Append(&tmpip, 0, 1);
  1082. macAddrs.Append(&tmpmac, 0, 1);
  1083. }
  1084. ctx->Ans.ip = ipAddrs;
  1085. ctx->Ans.mac = macAddrs;
  1086. ctx->Ans.machineType = info.strMachineType;
  1087. ctx->Ans.site = info.strSite;
  1088. ctx->Ans.terminalNo = info.strTerminalID;
  1089. ctx->Ans.termLimit = "";
  1090. ctx->Ans.termVersion = info.InstallVersion.ToString();
  1091. #if defined(RVC_OS_WIN)
  1092. //oiltmp 备注reserved3、reserved4这是什么情况下用的?看得莫名其妙,在一个常用调用接口里面每次都取,这是不怕亚信?
  1093. //reserved3, 获取windows系统版本
  1094. DWORD dwMajorVer, dwMinorVer, dwBuildNumber;
  1095. BOOL bRet = FALSE;
  1096. HMODULE hModNtdll = NULL;
  1097. if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))
  1098. {
  1099. typedef void (WINAPI* pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);
  1100. pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
  1101. pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
  1102. if (pfRtlGetNtVersionNumbers)
  1103. {
  1104. pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber);
  1105. dwBuildNumber &= 0x0ffff;
  1106. bRet = TRUE;
  1107. }
  1108. ::FreeLibrary(hModNtdll);
  1109. hModNtdll = NULL;
  1110. }
  1111. //reserved4
  1112. char buffer[1024];
  1113. sprintf(buffer, "%d.%d.%d", dwMajorVer, dwMinorVer, dwBuildNumber);
  1114. string sysVer = "Windows ver[" + string(buffer) + "]";
  1115. ctx->Ans.reserved3 = CSimpleStringA(sysVer.c_str());
  1116. ctx->Ans.reserved4 = "";//oiltmp@20240314 get this(from root.ini "Device.PinPad", "Vendor") for what? the setting have been back saved, no more get from terminal?
  1117. #endif //RVC_OS_WIN
  1118. //reserved1
  1119. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1120. ctx->Ans.reserved1 = 1;
  1121. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1122. ctx->Ans.reserved1 = 2;
  1123. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1124. ctx->Ans.reserved1 = 3;
  1125. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  1126. ctx->Ans.reserved1 = 0;
  1127. #else/*本地编译等非DevOps环境编译的版本*/
  1128. ctx->Ans.reserved1 = 0;
  1129. #endif
  1130. //oilyang@20230518 用来标注支持搜狗输入法新旧模式
  1131. ctx->Ans.reserved2 = 0;
  1132. ResourceWatcherService_ClientBase* pClient = new ResourceWatcherService_ClientBase(m_pEntity);
  1133. ErrorCodeEnum ec = pClient->Connect();
  1134. if (IS_SUCCEED(ec)) {
  1135. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to Connect ResourceWatcher...");
  1136. ResourceWatcherService_GetThirdPartyInstallState_Req req = {};
  1137. ResourceWatcherService_GetThirdPartyInstallState_Ans ans = {};
  1138. req.mode = 1;
  1139. ec = (*pClient)(EntityResource::getLink().upgradeLink())->GetThirdPartyInstallState(req, ans, 15000);
  1140. if (IS_SUCCEED(ec)) {
  1141. DWORD dwUserCode(HealthManager_UserErrorCode_SogouInput_UsingSDK);
  1142. if (ans.reserverd3 == 1) {
  1143. dwUserCode = HealthManager_UserErrorCode_SogouInput_UsingSys;
  1144. ctx->Ans.reserved2 = 1;
  1145. }
  1146. }
  1147. else {
  1148. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("ResourceWatcher::GetThirdPartyInstallState invoked failed: %s", SpStrError(ec));
  1149. }
  1150. pClient->GetFunction()->CloseSession();
  1151. }
  1152. else {
  1153. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("Connet to ResourceWatcher failed: %s", SpStrError(ec));
  1154. pClient->SafeDelete();
  1155. }
  1156. ctx->Answer(Error_Succeed);
  1157. }
  1158. bool CHealthManagerFSM::CheckProcessExistByName(CSimpleStringA procName)
  1159. {
  1160. if (procName.IsNullOrEmpty())
  1161. return false;
  1162. #ifdef RVC_OS_WIN
  1163. HANDLE hSnapshot;
  1164. //find if have "NTRtScan.exe"
  1165. hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  1166. if (hSnapshot)
  1167. {
  1168. PROCESSENTRY32 pe;
  1169. pe.dwSize = sizeof(pe);
  1170. if (Process32First(hSnapshot, &pe))
  1171. {
  1172. do {
  1173. if (_stricmp(&pe.szExeFile[0], procName.GetData()) == 0)
  1174. {
  1175. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("find %s on this machine.", procName.GetData());
  1176. return true;
  1177. }
  1178. } while (Process32Next(hSnapshot, &pe));
  1179. }
  1180. CloseHandle(hSnapshot);
  1181. }
  1182. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("can't find %s on this machine.", procName.GetData());
  1183. return false;
  1184. #else
  1185. return false;
  1186. #endif
  1187. }
  1188. void CHealthManagerFSM::QueryAndSaveDNS()
  1189. {
  1190. for (int i = 0; i < m_dns.GetCount(); ++i)
  1191. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("before to get, the m_dns[%s]", m_dns[i].c_str());
  1192. m_dns.Clear();
  1193. CSimpleStringA runInfoPath, csDNSKeyword;
  1194. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
  1195. if (eErr != Error_Succeed) {
  1196. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", eErr);
  1197. return;
  1198. }
  1199. runInfoPath = runInfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "dns";
  1200. #if defined(RVC_OS_WIN)
  1201. CSimpleStringA csCmd;
  1202. csCmd = CSimpleStringA::Format("cmd /c ipconfig /all >%s", runInfoPath.GetData());
  1203. WinExec((LPCSTR)csCmd, SW_HIDE);
  1204. csDNSKeyword = "DNS 服务器";
  1205. #else
  1206. std::string sucContent, failedContent;
  1207. CSimpleStringA strCmd;
  1208. strCmd = CSimpleStringA::Format("cat /etc/resolv.conf | grep \"nameserver\" >%s", runInfoPath.GetData());
  1209. bool ret = SP::Module::Util::ShellExecute(strCmd.GetData(), sucContent, failedContent);
  1210. csDNSKeyword = "nameserver";
  1211. #endif //RVC_OS_WIN
  1212. ifstream is;
  1213. is.open(runInfoPath.GetData(), ios::binary);
  1214. if (!is.is_open())
  1215. {
  1216. DWORD dwErr = GetLastError();
  1217. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("open %s file failed. [%d]", runInfoPath.GetData(), dwErr);
  1218. return;
  1219. }
  1220. string line;
  1221. while (!is.eof()) {
  1222. getline(is, line);
  1223. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("line:%s", line.c_str());
  1224. size_t start = line.find(csDNSKeyword.GetData());
  1225. if (start != string::npos)
  1226. {
  1227. #if defined(RVC_OS_WIN)
  1228. int dnsStart = line.find(": ");
  1229. if (dnsStart != string::npos)
  1230. {
  1231. string xDns = SP::Utility::ToTrim(line.substr(dnsStart + 1, line.length() - dnsStart - 1));
  1232. m_dns.Append(&xDns, 0, 1);
  1233. }
  1234. #else
  1235. string xDns = SP::Utility::ToTrim(line.substr(start + csDNSKeyword.GetLength() + 1, line.length() - start - csDNSKeyword.GetLength() - 1));
  1236. m_dns.Append(&xDns, 0, 1);
  1237. #endif
  1238. }
  1239. else
  1240. continue;
  1241. }
  1242. return;
  1243. }
  1244. void CHealthManagerFSM::QueryAndSendCPUInfo()
  1245. {
  1246. #if defined(RVC_OS_WIN)
  1247. if (!m_cpuInfo.IsNullOrEmpty())
  1248. {
  1249. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("have queried cpu info, no need to query again, current cpuinfo:%s", m_cpuInfo.GetData());
  1250. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InfoAboutCPU")(m_cpuInfo.GetData());
  1251. return;
  1252. }
  1253. SYSTEM_INFO si;
  1254. GetSystemInfo(&si);
  1255. std::map<std::string, std::string> map_cpuInfo;
  1256. map_cpuInfo.insert(std::make_pair("dwProcessorType", CSimpleStringA::Format("%d", si.dwProcessorType)));
  1257. map_cpuInfo.insert(std::make_pair("wProcessorLevel", CSimpleStringA::Format("%d", si.wProcessorLevel)));
  1258. map_cpuInfo.insert(std::make_pair("wProcessorArchitecture", CSimpleStringA::Format("%d", si.wProcessorArchitecture)));
  1259. map_cpuInfo.insert(std::make_pair("wProcessorRevision", CSimpleStringA::Format("%d", si.wProcessorRevision)));
  1260. map_cpuInfo.insert(std::make_pair("dwNumberOfProcessors", CSimpleStringA::Format("%d", si.dwNumberOfProcessors)));
  1261. m_cpuInfo = generateJsonStr(map_cpuInfo).second.c_str();
  1262. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InfoAboutCPU")(m_cpuInfo.GetData());
  1263. #else
  1264. ifstream cpuinfo("/proc/cpuinfo");
  1265. if (!cpuinfo.is_open()) {
  1266. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("opening /proc/cpuinfo error:%s", strerror(GetLastErrorRVC()));
  1267. return;
  1268. }
  1269. std::map<std::string, std::string> map_cpuInfo;
  1270. string line;
  1271. while (std::getline(cpuinfo, line)) {
  1272. auto elems = SP::Utility::Split(line, ':');
  1273. if (elems.size() > 1) {
  1274. map_cpuInfo[SP::Utility::ToTrim(elems[0])] = SP::Utility::ToTrim(elems[1]);
  1275. if (line.find("CPU revision") != string::npos)
  1276. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InfoAboutCPU")(generateJsonStr(map_cpuInfo).second.c_str());
  1277. }
  1278. }
  1279. #endif //RVC_OS_WIN
  1280. return;
  1281. }
  1282. void CHealthManagerFSM::QueryAndSendDisplayInfo()
  1283. {
  1284. std::map<std::string, std::string> primaryInfo;
  1285. std::map<std::string, std::string> secondaryInfo;
  1286. std::map<std::string, std::string> displayInfo;
  1287. #if defined(RVC_OS_WIN)
  1288. DISPLAY_DEVICE devDevice;
  1289. devDevice.cb = sizeof(DISPLAY_DEVICE);
  1290. //获取系统中的所有显示设备
  1291. EnumDisplayDevices(NULL, ENUM_CURRENT_SETTINGS, &devDevice, 0);
  1292. bool bPrimary = false;
  1293. // 遍历显示设备列表
  1294. for (int i = 0; EnumDisplayDevices(NULL, i, &devDevice, 0) != 0; i++)
  1295. {
  1296. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("devDevice.StateFlags:%d", devDevice.StateFlags);
  1297. bPrimary = false;
  1298. //if connected
  1299. if (devDevice.StateFlags & DISPLAY_DEVICE_ACTIVE)
  1300. {
  1301. if (devDevice.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
  1302. bPrimary = true;
  1303. // 获取显示设备的分辨率
  1304. DEVMODE devMode;
  1305. devMode.dmSize = sizeof(DEVMODE);
  1306. EnumDisplaySettings(devDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode);
  1307. if (bPrimary)
  1308. {
  1309. primaryInfo["dmDeviceName"] = CSimpleStringA::Format("%s", devMode.dmDeviceName);
  1310. primaryInfo["dmPelsWidth"] = CSimpleStringA::Format("%d", devMode.dmPelsWidth);
  1311. primaryInfo["dmPelsHeight"] = CSimpleStringA::Format("%d", devMode.dmPelsHeight);
  1312. primaryInfo["dmDisplayOrientation"] = CSimpleStringA::Format("%d", devMode.dmDisplayOrientation);
  1313. primaryInfo["dmDisplayFixedOutput"] = CSimpleStringA::Format("%d", devMode.dmDisplayFixedOutput);
  1314. primaryInfo["dmPosition.x"] = CSimpleStringA::Format("%d", devMode.dmPosition.x);
  1315. primaryInfo["dmPosition.y"] = CSimpleStringA::Format("%d", devMode.dmPosition.y);
  1316. }
  1317. else
  1318. {
  1319. secondaryInfo["dmDeviceName"] = CSimpleStringA::Format("%s", devMode.dmDeviceName);
  1320. secondaryInfo["dmPelsWidth"] = CSimpleStringA::Format("%d", devMode.dmPelsWidth);
  1321. secondaryInfo["dmPelsHeight"] = CSimpleStringA::Format("%d", devMode.dmPelsHeight);
  1322. secondaryInfo["dmDisplayOrientation"] = CSimpleStringA::Format("%d", devMode.dmDisplayOrientation);
  1323. secondaryInfo["dmDisplayFixedOutput"] = CSimpleStringA::Format("%d", devMode.dmDisplayFixedOutput);
  1324. secondaryInfo["dmPosition.x"] = CSimpleStringA::Format("%d", devMode.dmPosition.x);
  1325. secondaryInfo["dmPosition.y"] = CSimpleStringA::Format("%d", devMode.dmPosition.y);
  1326. }
  1327. }
  1328. }
  1329. displayInfo["PrimaryText"] = generateJsonStr(primaryInfo).second.c_str();
  1330. displayInfo["SecondaryText"] = generateJsonStr(secondaryInfo).second.c_str();
  1331. #else
  1332. CSimpleStringA runInfoPath, csDNSKeyword;
  1333. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
  1334. if (eErr != Error_Succeed) {
  1335. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", eErr);
  1336. return;
  1337. }
  1338. runInfoPath = runInfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "monitor";
  1339. std::string sucContent, failedContent;
  1340. CSimpleStringA strCmd;
  1341. strCmd = CSimpleStringA::Format("xrandr | grep \" connected\" >%s", runInfoPath.GetData());
  1342. bool ret = SP::Module::Util::ShellExecute(strCmd.GetData(), sucContent, failedContent);
  1343. if (!ret)
  1344. {
  1345. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("failedContent:%s", failedContent.c_str());
  1346. return;
  1347. }
  1348. ifstream is;
  1349. is.open(runInfoPath.GetData(), ios::binary);
  1350. if (!is.is_open())
  1351. {
  1352. DWORD dwErr = GetLastError();
  1353. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open %s file failed. [%d]", runInfoPath.GetData(), dwErr);
  1354. return;
  1355. }
  1356. string line;
  1357. while (!is.eof()) {
  1358. getline(is, line);
  1359. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("line:%s", line.c_str());
  1360. if (line.find("connected") != string::npos)
  1361. {
  1362. if (line.find("primary") != string::npos)
  1363. displayInfo["PrimaryText"] = line;
  1364. else
  1365. displayInfo["SecondaryText"] = line;
  1366. }
  1367. }
  1368. #endif
  1369. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InfoAboutDisplay")(generateJsonStr(displayInfo).second.c_str());
  1370. }
  1371. string CHealthManagerFSM::QueryHarddiskInfo()
  1372. {
  1373. CSimpleStringA csRunCfgPath("");
  1374. GetEntityBase()->GetFunction()->GetPath("RunCfg", csRunCfgPath);
  1375. csRunCfgPath = csRunCfgPath + SPLIT_SLASH_STR + "AccessAuthorization.ini";
  1376. char tmp[256];
  1377. memset(tmp, 0, 256);
  1378. inifile_read_str_s("system", "info", "", tmp, 255, csRunCfgPath);
  1379. auto elems = SP::Utility::Split(tmp, '|');
  1380. if (elems.size() > 2) {
  1381. return SP::Utility::ToTrim(elems[2]);
  1382. }
  1383. return "";
  1384. }
  1385. void CHealthManagerFSM::CheckIfPinPadOK()
  1386. {
  1387. //to check if PinPad is ok, wait for 5 seconds,then go on
  1388. //RVC.CardStore have no PinPad
  1389. if (m_sysInfo.strMachineType.Compare("RVC.CardStore", true) == 0)
  1390. return;
  1391. ULONGLONG ullWaitStart, ullWaitEnd;
  1392. ullWaitEnd = ullWaitStart = SP::Module::Comm::RVCGetTickCount();
  1393. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(this->m_pEntity);
  1394. if (pClient != NULL)
  1395. {
  1396. ErrorCodeEnum eErrCode = pClient->Connect();
  1397. if (eErrCode == Error_Succeed)
  1398. {
  1399. do {
  1400. PinPadService_GetDevInfo_Req reqQ;
  1401. PinPadService_GetDevInfo_Ans ansQ;
  1402. eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 1000);
  1403. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
  1404. ullWaitEnd = SP::Module::Comm::RVCGetTickCount();
  1405. if (eErrCode == Error_DevNotAvailable)
  1406. {
  1407. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("pinpad open failed");
  1408. break;
  1409. }
  1410. else if (eErrCode == Error_Succeed)
  1411. break;
  1412. if (ullWaitEnd - ullWaitStart > m_maxWaitForPinPad)
  1413. break;
  1414. Sleep(500);
  1415. } while (true);
  1416. }
  1417. else
  1418. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to pinpad failed.error code:%d", eErrCode);
  1419. }
  1420. else
  1421. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("new PinPadService_ClientBase failed.GetLastError:%d", GetLastErrorRVC());
  1422. m_ullWaitForPinPad = ullWaitEnd - ullWaitStart;
  1423. return;
  1424. }