VtmLoaderFSM.cpp 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504
  1. #include "stdafx.h"
  2. #include <algorithm>
  3. #include "VtmLoaderFSM.h"
  4. #include "VtmLoader_UserCode.h"
  5. #include "EventCode.h"
  6. #if defined(RVC_OS_WIN)
  7. #include <io.h>
  8. #else
  9. #include <unistd.h>
  10. #include <fcntl.h>
  11. #include <errno.h>
  12. #endif //RVC_OS_WIN
  13. #include "../mod_healthmanager/HealthManager_client_g.h"
  14. using namespace HealthManager;
  15. #define ALLOW_MULTI_NETWORKD_CARDS
  16. const int MAX_AYSNC_TIMEOUT = 60000;
  17. const int MAX_IGNORE_TIMEOUT = 100;
  18. enum EntityOP
  19. {
  20. OP_STOP_ENTITY,
  21. OP_START_ENTITY,
  22. OP_PAUSE_ENTITY,
  23. OP_TERMINATE_ENTITY,
  24. OP_CONTINUE_ENTITY,
  25. };
  26. extern struct callback_entry : public IReleasable
  27. {
  28. virtual ~callback_entry() {}
  29. CSimpleStringA EntityName;
  30. union {
  31. void* pRawData;
  32. int state;
  33. };
  34. int op;
  35. ErrorCodeEnum ErrorResult;
  36. };
  37. DWORD tokenUpdate(void* param)
  38. {
  39. CVtmLoaderFSM* t_entity = (CVtmLoaderFSM*)param;
  40. while (true)
  41. {
  42. if (t_entity->refreshToken())
  43. Sleep(t_entity->m_refreshWaitSec * 1000);
  44. else
  45. Sleep(20 * 1000);
  46. }
  47. return 0;
  48. }
  49. DWORD checkUrlActive(LPVOID param)
  50. {
  51. CVtmLoaderFSM* entityInfo = (CVtmLoaderFSM*)param;
  52. CSmartPointer<IConfigInfo> pConfig;
  53. CSimpleString t_endpoint, t_materialUrl;
  54. CSimpleString errMsg;
  55. Sleep(60 * 1000);
  56. long srcClo = clock();
  57. entityInfo->GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
  58. do {
  59. if (Error_Succeed != pConfig->ReadConfigValue("Common", "SendEndpoint", t_endpoint))
  60. {
  61. errMsg = "checkUrlActive read Common::SendEndpoint err";
  62. break;
  63. }
  64. if (t_endpoint.GetLength() == 0)
  65. {
  66. errMsg = "checkUrlActive endpoint len=0 err";
  67. break;
  68. }
  69. //if (!checkHttpActive(t_endpoint.GetData()))
  70. // errMsg.Append(CSimpleString::Format("checkHttpActive endpoint err:%s !", t_endpoint.GetData()));
  71. //else if((clock() - srcClo) > 3000)
  72. // errMsg.Append(CSimpleString::Format("checkHttpActive endpoint too long:%d !", clock() - srcClo));
  73. srcClo = clock();
  74. } while (false);
  75. if (errMsg.GetLength() > 0)
  76. LogWarn(SeverityLevelEnum::Severity_Middle, Error_Unexpect, WARN_SendEndpoint_URL_ERR, errMsg.GetData());
  77. //do get upload log Info for a while
  78. while (true)
  79. {
  80. if (entityInfo->m_uploadLogInfo_waitSec <= 0)
  81. break;
  82. Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
  83. unsigned long t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc;
  84. unsigned long t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err;
  85. entityInfo->GetEntityBase()->GetFunction()->GetPrivilegeFunction()->GetSendLogInfo(&t_upload_TerminalSys_Suc, &t_upload_TerminalUser_Suc,
  86. &t_upload_BussinessSys_Suc, &t_upload_BussinessUser_Suc, &t_upload_beidou_Suc,
  87. &t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err);
  88. LogWarn(SeverityLevelEnum::Severity_Low, Error_Trace, WARN_SendEndpoint_LOG_INFO,
  89. CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d"
  90. , t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
  91. t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err).GetData());
  92. }
  93. return 0;
  94. }
  95. bool CVtmLoaderFSM::refreshToken()
  96. {
  97. CSimpleString oldToken, newToken;
  98. ErrorCodeEnum eErr = Error_Succeed;
  99. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateToken(oldToken, newToken)))
  100. {
  101. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F02")("Get center setting, TryUpdateToken failed:0x%x", eErr);
  102. return false;
  103. }
  104. return true;
  105. }
  106. CVtmLoaderFSM::CVtmLoaderFSM()
  107. {
  108. m_refreshWaitSec = 1200;
  109. m_uploadLogInfo_waitSec = 3600;
  110. m_defaultSystemId = "LR04.02_Terminal";
  111. m_iCanIgnoreAddrDetect = 0;
  112. m_ullMaxAddrDetectTime = 10*60*1000;//10 minutes
  113. m_iDetectInterval = 5000;
  114. }
  115. CVtmLoaderFSM::~CVtmLoaderFSM()
  116. {
  117. }
  118. ErrorCodeEnum CVtmLoaderFSM::OnInit()
  119. {
  120. AddStateHooker(this);
  121. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  122. return Error_Succeed;
  123. }
  124. ErrorCodeEnum CVtmLoaderFSM::OnExit()
  125. {
  126. RemoveStateHooker(this);
  127. return Error_Succeed;
  128. }
  129. void CVtmLoaderFSM::OnStateTrans(int iSrcState, int iDstState)
  130. {
  131. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("state change from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  132. }
  133. void CVtmLoaderFSM::s0_on_entry()
  134. {
  135. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始网卡、网络连通性检查");
  136. NetWorkCheckAndGetSettingTask* task = new NetWorkCheckAndGetSettingTask(this);
  137. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  138. }
  139. void CVtmLoaderFSM::s0_on_exit()
  140. {
  141. }
  142. unsigned int CVtmLoaderFSM::s0_on_event(FSMEvent* pEvt)
  143. {
  144. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event,pEvt:%d,pEvt->param1", pEvt->iEvt, pEvt->param1);
  145. switch (pEvt->iEvt)
  146. {
  147. case Event_NetworkCheck_Passed:
  148. break;
  149. default:
  150. break;
  151. }
  152. return 0;
  153. }
  154. void CVtmLoaderFSM::ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock)
  155. {
  156. #if defined(RVC_OS_LINUX)
  157. CEntityLastErrorInfo errInfo = {};
  158. ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetEntityLastError(lpcszEntityName, errInfo);
  159. CSimpleStringA strErrMsg(true);
  160. if (!errInfo.strErrMsg.IsNullOrEmpty()) {
  161. strErrMsg = CSimpleStringA::Format("%s:%s", lpcszEntityName, (LPCTSTR)errInfo.strErrMsg);
  162. }
  163. else {
  164. strErrMsg = CSimpleStringA::Format("%s模块初始化失败: %s", lpcszEntityName, (LPCTSTR)SpStrError(bootFailedResult));
  165. }
  166. if (CSimpleStringA(lpcszEntityName).Compare("SIPPhone", true) == 0)
  167. {
  168. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", strErrMsg.GetData());//实体启动失败保存到错误页字段
  169. }
  170. if (isBlock) {
  171. SP::Module::Comm::LogErrorNotiyStruct notifyItem(bootFailedResult, 0);
  172. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  173. notifyItem.Notify(notifyMsg);
  174. }
  175. else {
  176. LogError(Severity_High, bootFailedResult, 0, strErrMsg);
  177. }
  178. #endif //RVC_OS_LINUX
  179. }
  180. //CoreBoot
  181. void CVtmLoaderFSM::s1_on_entry()
  182. {
  183. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_on_entry");
  184. ErrorCodeEnum eErrCode;
  185. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  186. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  187. bool bAsync = false;
  188. m_eStage = LOADSTAGE_COREBOOT;
  189. int ret = 0;
  190. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  191. //start entity
  192. vector<CSimpleStringA>::iterator vIt;
  193. if (m_coreBootOpt.size() == 0)
  194. goto COREBOOT_FINISH;
  195. char startMsg[128];
  196. for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++vIt)
  197. {
  198. CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
  199. it = m_coreBootOpt.find(*vIt);
  200. if (it == m_coreBootOpt.end())
  201. {
  202. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  203. continue;
  204. }
  205. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start,%s,%d", (LPCSTR)it->first, it->second.loadOpt);
  206. CEntityRunInfo entRunInfo;
  207. ErrorCodeEnum errCode = spEntityFunction->GetEntityRunInfo(it->first, entRunInfo);
  208. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  209. {
  210. it->second.eResult = LOADING_SUCCEED;
  211. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  212. if (ret == 0 || ret == 2)
  213. goto COREBOOT_FINISH;
  214. else
  215. continue;
  216. }
  217. ZeroMemory(startMsg, 128);
  218. //sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  219. //GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  220. switch (it->second.loadOpt)
  221. {
  222. case LOADOPT_IGNORE:
  223. {
  224. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  225. if (spWait != NULL)
  226. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
  227. it->second.eResult = LOADING_SUCCEED;
  228. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  229. if (ret == 0 || ret == 2)
  230. goto COREBOOT_FINISH;
  231. }
  232. break;
  233. case LOADOPT_ASYNC_VERIFY:
  234. errCode = AsyncStartEntity(it->first, NULL, NULL);
  235. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AsyncStartEntity:%d", errCode);
  236. bAsync = true;
  237. break;
  238. case LOADOPT_SYNC_VERIFY:
  239. {
  240. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  241. if (spWait != NULL)
  242. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  243. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(coreboot)sync...%d", errCode);
  244. if (errCode == Error_Succeed)
  245. it->second.eResult = LOADING_SUCCEED;
  246. else if (errCode == Error_TimeOut)
  247. it->second.eResult = LOADING_TIMEOUT;
  248. else
  249. it->second.eResult = LOADING_FAILED;
  250. if (errCode != Error_Succeed) {
  251. return;
  252. #if defined(RVC_OS_LINUX)
  253. ShowEntityBootFailedAtFront(it->first, errCode);
  254. return;
  255. #endif //RVC_OS_LINUX
  256. }
  257. else
  258. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  259. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 check ret %d", ret);
  260. if (ret == 0 || ret == 2)
  261. goto COREBOOT_FINISH;
  262. }
  263. break;
  264. default:
  265. break;
  266. }
  267. }
  268. COREBOOT_FINISH:
  269. if (!bAsync)
  270. {
  271. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  272. e->param1 = ret;
  273. PostEventFIFO(e);
  274. }
  275. else
  276. {
  277. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  278. if (ret == 0 || ret == 2)
  279. {
  280. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  281. e->param1 = ret;
  282. PostEventFIFO(e);
  283. }
  284. }
  285. return;
  286. }
  287. void CVtmLoaderFSM::s1_on_exit()
  288. {
  289. LOG_FUNCTION();
  290. }
  291. unsigned int CVtmLoaderFSM::s1_on_event(FSMEvent* pEvt)
  292. {
  293. LOG_FUNCTION();
  294. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 evt %d", pEvt->iEvt);
  295. switch (pEvt->iEvt)
  296. {
  297. case USER_EVT_COREBOOT_FINISHED:
  298. pEvt->SetHandled();
  299. if (pEvt->param1 == 2) {
  300. #if defined(RVC_OS_LINUX)
  301. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  302. #endif
  303. }
  304. return pEvt->param1;
  305. break;
  306. default:
  307. break;
  308. }
  309. return 0;
  310. }
  311. //SafeLoad
  312. void CVtmLoaderFSM::s2_on_entry()
  313. {
  314. LOG_FUNCTION();
  315. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "CoreBoot 阶段实体加载完成");
  316. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F14")("Stage Coreboot have done.");
  317. ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();//使用机器启动时间秒数
  318. DWORD elapseTimeTemp = dwElapse / 1000;
  319. CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Enter safeload state.\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), elapseTimeTemp);
  320. //LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
  321. bool bAsync = false;
  322. m_eStage = LOADSTAGE_SAFELOAD;
  323. int ret = 0;
  324. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  325. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  326. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  327. ErrorCodeEnum errCode;
  328. vector<CSimpleStringA>::iterator vIt;
  329. if (m_safeLoadOpt.size() == 0)
  330. goto SAFELOAD_FINISH;
  331. char startMsg[128];
  332. for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
  333. {
  334. CSmartPointer<IAsynWaitSp> spWait;
  335. it = m_safeLoadOpt.find(*vIt);
  336. if (it == m_safeLoadOpt.end())
  337. {
  338. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  339. continue;
  340. }
  341. CEntityRunInfo entRunInfo;
  342. errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
  343. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  344. {
  345. it->second.eResult = LOADING_SUCCEED;
  346. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  347. if (ret == 0 || ret == 2)
  348. goto SAFELOAD_FINISH;
  349. else
  350. continue;
  351. }
  352. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
  353. switch (it->second.loadOpt)
  354. {
  355. case LOADOPT_IGNORE:
  356. {
  357. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  358. if (spWait != NULL)
  359. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  360. it->second.eResult = LOADING_SUCCEED;
  361. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  362. if (ret == 0 || ret == 2)
  363. goto SAFELOAD_FINISH;
  364. }
  365. break;
  366. case LOADOPT_ASYNC_VERIFY:
  367. AsyncStartEntity(it->first, NULL, NULL);
  368. bAsync = true;
  369. break;
  370. case LOADOPT_SYNC_VERIFY:
  371. {
  372. ZeroMemory(startMsg, 128);
  373. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  374. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  375. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  376. if (spWait != NULL)
  377. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  378. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sync...%d", errCode);
  379. if (errCode == Error_Succeed) {
  380. it->second.eResult = LOADING_SUCCEED;
  381. }
  382. else if (errCode == Error_TimeOut)
  383. it->second.eResult = LOADING_TIMEOUT;
  384. else
  385. it->second.eResult = LOADING_FAILED;
  386. if (it->second.eResult != Error_Succeed)
  387. {
  388. char tmp[128] = { 0 };
  389. if (it->first.Compare("SIPPhone", true) == 0) {
  390. if (LOADING_TIMEOUT == it->second.eResult) {
  391. sprintf(tmp, "实体 %s 启动超时(%d),请尝试重启应用解决", it->first.GetData(), it->second.eResult);
  392. }
  393. else {
  394. sprintf(tmp, "实体 %s 启动失败(%d),识别不到声卡,请尝试重启计算机解决,多次无效后请联系厂商处理", it->first.GetData(), it->second.eResult);
  395. }
  396. }
  397. else {
  398. sprintf(tmp, "实体 %s 启动失败 %d", it->first.GetData(), it->second.eResult);
  399. }
  400. #if defined(RVC_OS_WIN)
  401. GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  402. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmp);//实体启动失败保存到错误页字段
  403. #else
  404. ShowEntityBootFailedAtFront(it->first, errCode);
  405. #endif
  406. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("启动失败:%s", tmp);
  407. m_csErrEntity = m_csErrEntity + "|" + it->first;
  408. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  409. e->param1 = 2;//"SYNC START" enity started failed.
  410. PostEventFIFO(e);
  411. return;
  412. }
  413. //if (errCode != Error_Succeed)
  414. // return;
  415. //else
  416. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  417. if (ret == 0 || ret == 2)
  418. goto SAFELOAD_FINISH;
  419. }
  420. break;
  421. default:
  422. break;
  423. }
  424. }
  425. SAFELOAD_FINISH:
  426. if (!bAsync)
  427. {
  428. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  429. e->param1 = ret;
  430. PostEventFIFO(e);
  431. }
  432. else
  433. {
  434. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  435. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 %d", ret);
  436. if (ret == 0 || ret == 2)
  437. {
  438. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  439. e->param1 = ret;
  440. PostEventFIFO(e);
  441. }
  442. }
  443. SAFELOAD_END:
  444. return;
  445. }
  446. void CVtmLoaderFSM::s2_on_exit()
  447. {
  448. LOG_FUNCTION();
  449. }
  450. unsigned int CVtmLoaderFSM::s2_on_event(FSMEvent* pEvt)
  451. {
  452. LOG_FUNCTION();
  453. int ret = 0;
  454. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 event %d,%d", pEvt->iEvt, pEvt->param1);
  455. switch (pEvt->iEvt)
  456. {
  457. case USER_EVT_SAFELOAD_FINISHED:
  458. {
  459. pEvt->SetHandled();
  460. //ToCheckUPS();
  461. //oiltmp
  462. //according to the system varible TerminalState to do sth.
  463. //Configed
  464. //Breakdown
  465. //Blocking
  466. //Authentication
  467. {
  468. if (pEvt->param1 == 0)
  469. {
  470. //initializer if configured
  471. CSimpleStringA csTermStage("");
  472. ErrorCodeEnum eErrCode;
  473. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
  474. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("after safeload to get termstage %s", (LPCTSTR)csTermStage);
  475. if (csTermStage == "B" || csTermStage == "N")
  476. return 1;
  477. }
  478. else if (pEvt->param1 == 2)
  479. {
  480. #if defined(RVC_OS_LINUX)
  481. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  482. #endif
  483. ret = 2;
  484. }
  485. }
  486. //Unsubscrible
  487. }
  488. break;
  489. case USER_EVT_SAFELOAD_EXMINE_FINISHED:
  490. if (pEvt->param1 == 0)
  491. ret = 0;
  492. //do something else oiltmp
  493. pEvt->SetHandled();
  494. break;
  495. case USER_EVT_ACCESSAUTH_FINISHED:
  496. pEvt->SetHandled();
  497. ret = pEvt->param1;
  498. break;
  499. default:
  500. break;
  501. }
  502. return ret;
  503. }
  504. //Operating
  505. void CVtmLoaderFSM::s3_on_entry()
  506. {
  507. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "SafeLoad 阶段实体加载完成");
  508. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F15")("Stage Safeload have done.");
  509. Sleep(m_sleepEnterOpMS);
  510. bool bAsync = false;
  511. m_eStage = LOADSTAGE_OPERATING;
  512. int ret = 0;
  513. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  514. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  515. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  516. //start entity
  517. ErrorCodeEnum errCode;
  518. vector<CSimpleStringA>::iterator vIt;
  519. if (m_operatingOpt.size() == 0)
  520. goto OPERATING_FINISH;
  521. char startMsg[128];
  522. for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
  523. {
  524. CSmartPointer<IAsynWaitSp> spWait;
  525. it = m_operatingOpt.find(*vIt);
  526. if (it == m_operatingOpt.end())
  527. {
  528. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  529. continue;
  530. }
  531. CEntityRunInfo entRunInfo;
  532. errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
  533. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  534. {
  535. it->second.eResult = LOADING_SUCCEED;
  536. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  537. if (ret == 0 || ret == 2)
  538. goto OPERATING_FINISH;
  539. else
  540. continue;
  541. }
  542. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("op start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
  543. switch (it->second.loadOpt)
  544. {
  545. case LOADOPT_IGNORE:
  546. {
  547. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  548. if (spWait != NULL)
  549. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  550. it->second.eResult = LOADING_SUCCEED;
  551. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  552. if (ret == 0 || ret == 2)
  553. goto OPERATING_FINISH;
  554. }
  555. break;
  556. case LOADOPT_ASYNC_VERIFY:
  557. errCode = AsyncStartEntity(it->first, NULL, NULL);
  558. bAsync = true;
  559. break;
  560. case LOADOPT_SYNC_VERIFY:
  561. {
  562. ZeroMemory(startMsg, 128);
  563. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  564. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  565. errCode = pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  566. if (errCode == Error_Succeed)
  567. {
  568. if (spWait != NULL)
  569. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  570. }
  571. else
  572. {
  573. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", (LPCSTR)it->first, errCode);
  574. break;
  575. }
  576. if (errCode == Error_Succeed)
  577. it->second.eResult = LOADING_SUCCEED;
  578. else if (errCode == Error_TimeOut)
  579. it->second.eResult = LOADING_TIMEOUT;
  580. else
  581. it->second.eResult = LOADING_FAILED;
  582. if (it->second.eResult != Error_Succeed)
  583. {
  584. char tmp[128] = { 0 };
  585. if (it->first.Compare("SIPPhone", true) == 0) {
  586. if (LOADING_TIMEOUT == it->second.eResult) {
  587. sprintf(tmp, "实体 %s 启动超时(%d),请尝试重启应用解决", it->first.GetData(), it->second.eResult);
  588. }
  589. else {
  590. sprintf(tmp, "实体 %s 启动失败(%d),识别不到声卡,请尝试重启计算机解决,多次无效后请联系厂商处理", it->first.GetData(), it->second.eResult);
  591. }
  592. }
  593. else {
  594. sprintf(tmp, "实体 %s 启动失败 %d", it->first.GetData(), it->second.eResult);
  595. }
  596. #if defined(RVC_OS_WIN)
  597. GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  598. #else
  599. ShowEntityBootFailedAtFront(it->first, errCode);
  600. #endif
  601. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("启动失败:%s", tmp);
  602. m_csErrEntity = m_csErrEntity + "|" + it->first;
  603. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  604. e->param1 = 2;//"SYNC START" enity started failed.
  605. PostEventFIFO(e);
  606. return;
  607. }
  608. if (errCode != Error_Succeed)
  609. return;
  610. else
  611. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  612. if (ret == 0 || ret == 2)
  613. goto OPERATING_FINISH;
  614. }
  615. break;
  616. default:
  617. break;
  618. }
  619. }
  620. OPERATING_FINISH:
  621. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 ret %d", ret);
  622. if (!bAsync)
  623. {
  624. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  625. e->param1 = ret;
  626. PostEventFIFO(e);
  627. }
  628. else
  629. {
  630. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  631. if (ret == 0 || ret == 2)
  632. {
  633. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  634. e->param1 = ret;
  635. PostEventFIFO(e);
  636. }
  637. }
  638. return;
  639. }
  640. void CVtmLoaderFSM::s3_on_exit()
  641. {
  642. LOG_FUNCTION();
  643. }
  644. unsigned int CVtmLoaderFSM::s3_on_event(FSMEvent* pEvt)
  645. {
  646. LOG_FUNCTION();
  647. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3(Operating) event %d,%d", pEvt->iEvt, pEvt->param1);
  648. int ret = 0;
  649. switch (pEvt->iEvt)
  650. {
  651. case USER_EVT_OPERATING_FINISHED:
  652. ret = pEvt->param1;
  653. if (ret == 2) {
  654. #if defined(RVC_OS_LINUX)
  655. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  656. #endif
  657. }
  658. pEvt->SetHandled();
  659. break;
  660. default:
  661. break;
  662. }
  663. return ret;
  664. }
  665. //Idle(Operating finished)
  666. void CVtmLoaderFSM::s4_on_entry()
  667. {
  668. LOG_FUNCTION();
  669. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "Operating 阶段实体加载完成");
  670. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F16")("Stage Operating have done.");
  671. NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this,Event_VtmLoader_EntityLoad_Finished);
  672. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  673. //LogEvent(Severity_Middle, Event_VtmLoader_EntityLoad_Finished, "实体启动完成");
  674. }
  675. void CVtmLoaderFSM::s4_on_exit()
  676. {
  677. LOG_FUNCTION();
  678. }
  679. unsigned int CVtmLoaderFSM::s4_on_event(FSMEvent* pEvt)
  680. {
  681. LOG_FUNCTION();
  682. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s4 event %d,%d", pEvt->iEvt, pEvt->param1);
  683. switch (pEvt->iEvt)
  684. {
  685. default:
  686. break;
  687. }
  688. return 0;
  689. }
  690. //Fault
  691. void CVtmLoaderFSM::s5_on_entry()
  692. {
  693. LOG_FUNCTION();
  694. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "实体加载失败,启动终止。请排查启动失败实体或重启应用");
  695. NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this, Event_VtmLoader_EntityLoad_Failed);
  696. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  697. CSmartPointer<IConfigInfo> spConfigCen, spConfigRun;
  698. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  699. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  700. int failTimes = 0, maxFailTimes = 2;
  701. do {
  702. int value(0);
  703. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxFailTimes", value);
  704. if (value > 0) {
  705. maxFailTimes = value;
  706. }
  707. } while (false);
  708. spConfigRun->ReadConfigValueInt("Run", "FailTimes", failTimes);
  709. failTimes++;
  710. //LogWarn(Severity_High, Error_Unexpect, LOG_ERR_HEALTH_FAILED, "HealthManager failed.");
  711. //oilyang@20210930 add to call for Close Page
  712. //GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  713. //if (failTimes > maxFailTimes)
  714. //{
  715. // //LogEvent(Severity_Middle, LOG_EVT_HEADLIGHT_RED_ON, "设备故障");
  716. // eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "D");
  717. // if (eErr != Error_Succeed) {
  718. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set termstage D failed (%d).", eErr);
  719. // }
  720. // else {
  721. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Set TerminalStage D.");
  722. // }
  723. //}
  724. //else
  725. //{
  726. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("have failed %d times.", failTimes);
  727. // spConfigRun->WriteConfigValueInt("Run", "FailTimes", failTimes);
  728. // eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState", "F");
  729. // if (eErr != Error_Succeed)
  730. // {
  731. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set RunState failed (%d).", eErr);
  732. // }
  733. //}
  734. }
  735. void CVtmLoaderFSM::s5_on_exit()
  736. {
  737. LOG_FUNCTION();
  738. }
  739. unsigned int CVtmLoaderFSM::s5_on_event(FSMEvent* pEvt)
  740. {
  741. LOG_FUNCTION();
  742. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s5(Fault) event %d,%d", pEvt->iEvt, pEvt->param1);
  743. switch (pEvt->iEvt)
  744. {
  745. case USER_EVT_ACCESSAUTH_FINISHED:
  746. pEvt->SetHandled();
  747. if (pEvt->param1 == 1)
  748. {
  749. return 1;
  750. }
  751. break;
  752. default:
  753. break;
  754. }
  755. return 0;
  756. }
  757. BOOL CVtmLoaderFSM::DetectNetworkLegality(CSimpleStringA& strInfo)
  758. {
  759. BOOL result(TRUE);
  760. CSystemStaticInfo sysInfo;
  761. CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
  762. strInfo.Clear();
  763. ErrorCodeEnum eErr = spFunction->GetSystemStaticInfo(sysInfo);
  764. if (eErr != Error_Succeed) {
  765. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetSystemStaticInfo failed: %d", eErr);
  766. strInfo = CSimpleStringA::Format("获取终端基本信息失败:0x%X", eErr);
  767. return result;
  768. }
  769. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Detect network legality...");
  770. if (0 != sysInfo.strMachineType.Compare("RVC.Pad", true) || 0 != sysInfo.strSite.Compare("cmb.FLB", true)) {
  771. BOOL fLocalLANConnected(FALSE);
  772. unsigned int curTimes = 1;
  773. const unsigned int maxTimes = 3;
  774. fLocalLANConnected = SP::Module::Net::CheckLANConnectStatus();
  775. while (curTimes < maxTimes && !fLocalLANConnected) {
  776. Sleep(500);
  777. fLocalLANConnected = SP::Module::Net::CheckLANConnectStatus();
  778. curTimes++;
  779. }
  780. if (!fLocalLANConnected) {
  781. strInfo = "未检查到有网卡连接";
  782. result = FALSE;
  783. }
  784. }
  785. else {
  786. BOOL fLocalLANConnected(FALSE);
  787. unsigned int curTimes = 1;
  788. const unsigned int maxTimes = 3;
  789. fLocalLANConnected = SP::Module::Net::CheckLANConnectStatus();
  790. while (curTimes < maxTimes && !fLocalLANConnected) {
  791. Sleep(500);
  792. fLocalLANConnected = SP::Module::Net::CheckLANConnectStatus();
  793. curTimes++;
  794. }
  795. if (!fLocalLANConnected) {
  796. strInfo = "未检查到有网卡连接,请检查网络连接";
  797. result = FALSE;
  798. }
  799. }
  800. return result;
  801. }
  802. int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
  803. {
  804. //检查网卡状态
  805. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to check network status");
  806. CSimpleStringA strMsg(true),tmpTS("X");
  807. //GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", tmpTS);
  808. int netcheckCount = 1;
  809. while (true)
  810. {
  811. if (!DetectNetworkLegality(strMsg)) {
  812. //LogWarn(Severity_High, Error_Unexpect, VtmLoader_UserCode_NetCard_UnAvaible, strMsg.GetData());
  813. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, strMsg.GetData());
  814. LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("%d 秒后自动重试(第%d次重试)。请检查网线是否插好、网络是否正常", m_iDetectInterval/1000, netcheckCount));
  815. //if (tmpTS.Compare("E") != 0)
  816. //{
  817. // GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "E");
  818. // tmpTS = "E";
  819. //}
  820. Sleep(5000);
  821. netcheckCount++;
  822. }
  823. else
  824. {
  825. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "网卡状态正常");
  826. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F10")("network interface ok.");
  827. break;
  828. }
  829. }
  830. //for rvc.pad only
  831. if (!m_sysInfo.strTerminalID.IsNullOrEmpty() && m_sysInfo.strTerminalID.SubString(m_sysInfo.strTerminalID.GetLength() - 4, 1).Compare("5") == 0)
  832. {
  833. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s is pad,no network connection detect.", m_sysInfo.strTerminalID.GetData());
  834. }
  835. else
  836. {
  837. //检查网络连通性(网络连通性是否作为关键路径走配置,默认不是关键路径)
  838. if (!DetectHttpActive())
  839. {
  840. //网络连通性检查未通过,提示确认网络后重启应用?界面加一个重启按钮?
  841. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "网络连通性检查失败,请检查网络");
  842. return -1;
  843. }
  844. }
  845. //拉取配置并通知提前启动的实体(Chromium)
  846. if (!GetCenterSetting())
  847. return -2;
  848. //加载实体列表
  849. EntityLoad();
  850. return 0;
  851. }
  852. int CVtmLoaderFSM::EntityLoad()
  853. {
  854. //前提:收到了配置拉取完成的指令,才会进入到这里
  855. //为了测试,假装已经拿到了集中配置
  856. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始加载实体");
  857. CSmartPointer<IConfigInfo> spConfigCen,spRunCfg;
  858. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  859. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunCfg);
  860. CSimpleStringA csCoreBootList(true), csSafeLoadList(true), csOperatingList(true),csKeyCB("CoreBootList."),csKeySL("SafeLoadList."),csKeyOp("OperatingList.");
  861. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeyCB + m_sysInfo.strMachineType).GetData(), csCoreBootList);
  862. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeySL + m_sysInfo.strMachineType).GetData(), csSafeLoadList);
  863. spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeyOp + m_sysInfo.strMachineType).GetData(), csOperatingList);
  864. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CoreBoot.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csCoreBootList.GetData());
  865. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SafeLoad.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csSafeLoadList.GetData());
  866. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Operating.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csOperatingList.GetData());
  867. //oiltmp 如果没有配置,则走默认配置
  868. if (csCoreBootList.IsNullOrEmpty())
  869. {
  870. LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, "CoreBoot配置为空,走默认配置");
  871. csCoreBootList = "HealthManager=0|TokenKeeper=0|Alarm=0|Ups=0|DeviceControl=0|CardReadAdapter=0|CustMngrAuth=0|PinPad=0|ResourceWatcher=0|AccessAuthorization=0|CenterSetting=0|SelfChecker=0|HeartBeat=0|EventConverter=0|FaceTracking=0";
  872. }
  873. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SleepEnterOpMS", m_sleepEnterOpMS);
  874. if (m_sleepEnterOpMS <= 0 || m_sleepEnterOpMS > 20000)
  875. m_sleepEnterOpMS = 1000;//default
  876. //save centersetting to runcfg for vtmloader. using it before download centersetting
  877. int iTmp = 0;
  878. if (spConfigCen->ReadConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp) == Error_Succeed && iTmp > 0)
  879. spRunCfg->WriteConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp);
  880. iTmp = 0;
  881. if (spConfigCen->ReadConfigValueInt("Common", "MaxAddrDetectTimes", iTmp) == Error_Succeed && iTmp > 0)
  882. spRunCfg->WriteConfigValueInt("Common", "MaxAddrDetectTimes", iTmp);
  883. iTmp = 0;
  884. if (spConfigCen->ReadConfigValueInt("Common", "AddrDetectInterval", iTmp) == Error_Succeed && iTmp > 0)
  885. spRunCfg->WriteConfigValueInt("Common", "AddrDetectInterval", iTmp);
  886. CSimpleStringA csTmpAddr(true);
  887. if (spConfigCen->ReadConfigValue("Common", "SettingDetectAddr", csTmpAddr) == Error_Succeed && !csTmpAddr.IsNullOrEmpty())
  888. spRunCfg->WriteConfigValue("Common", "SettingDetectAddr", csTmpAddr.GetData());
  889. csTmpAddr = "";
  890. if (spConfigCen->ReadConfigValue("Common", "AccessAuthDetectAddr", csTmpAddr) == Error_Succeed && !csTmpAddr.IsNullOrEmpty())
  891. spRunCfg->WriteConfigValue("Common", "AccessAuthDetectAddr", csTmpAddr.GetData());
  892. //int count, cbNum, slNum, opNum;
  893. //count = cbNum = slNum = opNum = 0;
  894. CAutoArray<CSimpleStringA> arrCoreBoot;
  895. arrCoreBoot.Init(64);
  896. arrCoreBoot = csCoreBootList.Split('|');
  897. for (int i = 0; i < arrCoreBoot.GetCount(); ++i)
  898. {
  899. CAutoArray<CSimpleStringA> arrEntity;
  900. arrEntity.Init(2);
  901. arrEntity = arrCoreBoot[i].Split('=');
  902. if (arrEntity.GetCount() < 2)
  903. break;
  904. if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
  905. || arrEntity[0].Compare("GuiConsole", true) == 0)
  906. continue;
  907. m_vCoreBoot.push_back(arrEntity[0]);
  908. if (arrEntity[1].Compare("1") == 0)
  909. m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
  910. else if (arrEntity[1].Compare("2") == 0)
  911. m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
  912. else
  913. m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
  914. m_coreBootOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
  915. //m_entityBootOpt[arrEntity[0].GetData()].initSn = cbNum;
  916. //cbNum++;
  917. }
  918. CAutoArray<CSimpleStringA> arrSafeLoad;
  919. arrSafeLoad.Init(64);
  920. arrSafeLoad = csSafeLoadList.Split('|');
  921. for (int i = 0; i < arrSafeLoad.GetCount(); ++i)
  922. {
  923. CAutoArray<CSimpleStringA> arrEntity;
  924. arrEntity.Init(2);
  925. arrEntity = arrSafeLoad[i].Split('=');
  926. if (arrEntity.GetCount() < 2)
  927. break;
  928. if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
  929. || arrEntity[0].Compare("GuiConsole", true) == 0)
  930. continue;
  931. //去重,防止前面已经加载了
  932. if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end())
  933. continue;
  934. m_vSafeLoad.push_back(arrEntity[0].GetData());
  935. if (arrEntity[1].Compare("1") == 0)
  936. m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
  937. else if (arrEntity[1].Compare("2") == 0)
  938. m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
  939. else
  940. m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
  941. m_safeLoadOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
  942. //m_safeLoadOpt[arrEntity[0].GetData()].initSn = slNum;
  943. //slNum++;
  944. }
  945. CAutoArray<CSimpleStringA> arrOperating;
  946. arrOperating.Init(64);
  947. arrOperating = csOperatingList.Split('|');
  948. for (int i = 0; i < arrOperating.GetCount(); ++i)
  949. {
  950. CAutoArray<CSimpleStringA> arrEntity;
  951. arrEntity.Init(2);
  952. arrEntity = arrOperating[i].Split('=');
  953. if (arrEntity.GetCount() < 2)
  954. break;
  955. if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
  956. || arrEntity[0].Compare("GuiConsole", true) == 0)
  957. continue;
  958. //去重,防止前面已经加载了
  959. if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end()
  960. || find(m_vSafeLoad.begin(), m_vSafeLoad.end(), arrEntity[0].GetData()) != m_vSafeLoad.end())
  961. continue;
  962. m_vOperating.push_back(arrEntity[0].GetData());
  963. if (arrEntity[1].Compare("1") == 0)
  964. m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
  965. else if (arrEntity[1].Compare("2") == 0)
  966. m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
  967. else
  968. m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
  969. m_operatingOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
  970. //m_operatingOpt[arrEntity[0].GetData()].initSn = opNum;
  971. //opNum++;
  972. }
  973. return 0;
  974. }
  975. int CVtmLoaderFSM::CheckLoadResult(LoadStage eStage)
  976. {
  977. int ret = 0;
  978. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  979. if (eStage == LOADSTAGE_COREBOOT)
  980. it = m_coreBootOpt.begin();
  981. else if (eStage == LOADSTAGE_SAFELOAD)
  982. it = m_safeLoadOpt.begin();
  983. else
  984. it = m_operatingOpt.begin();
  985. while (1)
  986. {
  987. switch (it->second.loadOpt)
  988. {
  989. case LOADOPT_IGNORE:
  990. if (it->second.eResult == LOADING_INIT)
  991. return 1;
  992. break;
  993. case LOADOPT_ASYNC_VERIFY:
  994. case LOADOPT_SYNC_VERIFY:
  995. default:
  996. if (it->second.eResult == LOADING_INIT)
  997. return 3;
  998. else if (it->second.eResult != LOADING_SUCCEED)
  999. {
  1000. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501Z10201").setResultCode("RTA5101")("%s start failed", m_csErrEntity);
  1001. m_csErrEntity = m_csErrEntity + "|" + it->first;
  1002. ret = 2;
  1003. }
  1004. break;
  1005. }
  1006. it++;
  1007. if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
  1008. break;
  1009. else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
  1010. break;
  1011. else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
  1012. break;
  1013. }
  1014. return ret;
  1015. }
  1016. ErrorCodeEnum CVtmLoaderFSM::AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData)
  1017. {
  1018. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1019. ErrorCodeEnum errCode;
  1020. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1021. if (pFuncPrivilege != NULL) {
  1022. CSmartPointer<IAsynWaitSp> spWait;
  1023. errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  1024. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AsyncStartEntity")("start entity %s", entity_name);
  1025. if (errCode == Error_Succeed) {
  1026. callback_entry* entry = new callback_entry();
  1027. entry->pRawData = pData;
  1028. entry->EntityName = entity_name;
  1029. entry->ErrorResult = Error_Unexpect;
  1030. entry->op = OP_START_ENTITY;
  1031. if (spWait != NULL)
  1032. spWait->SetCallback(this, entry);
  1033. }
  1034. return errCode;
  1035. }
  1036. else {
  1037. return Error_NoPrivilege;
  1038. }
  1039. }
  1040. void CVtmLoaderFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  1041. {
  1042. CSmartPointer<ICallbackListener> spCallback;
  1043. CSmartPointer<IReleasable> pData;
  1044. pAsynWaitSp->GetCallback(spCallback, pData);
  1045. callback_entry* entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
  1046. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  1047. callback_entry* new_entry = new callback_entry();
  1048. new_entry->EntityName = entry->EntityName;
  1049. new_entry->ErrorResult = entry->ErrorResult;
  1050. new_entry->op = entry->op;
  1051. new_entry->state = entry->state;
  1052. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  1053. int ret;
  1054. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("stage %d,%s,result %d", m_eStage, (LPCSTR)new_entry->EntityName, new_entry->ErrorResult);
  1055. switch (m_eStage)
  1056. {
  1057. case LOADSTAGE_COREBOOT:
  1058. it = m_coreBootOpt.find(new_entry->EntityName);
  1059. if (it != m_coreBootOpt.end())
  1060. {
  1061. if (new_entry->ErrorResult == Error_Succeed)
  1062. it->second.eResult = LOADING_SUCCEED;
  1063. else if (new_entry->ErrorResult == Error_TimeOut)
  1064. it->second.eResult = LOADING_TIMEOUT;
  1065. else
  1066. it->second.eResult = LOADING_FAILED;
  1067. if (it->second.eResult != Error_Succeed)
  1068. {
  1069. char tmp[64] = { 0 };
  1070. sprintf(tmp, "实体 %s 启动失败-----", it->first.GetData());
  1071. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("启动失败:%s -----", tmp);
  1072. }
  1073. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  1074. if (ret == 0 || ret == 2)
  1075. {
  1076. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  1077. e->param1 = ret;
  1078. PostEventFIFO(e);
  1079. }
  1080. }
  1081. break;
  1082. case LOADSTAGE_SAFELOAD:
  1083. it = m_safeLoadOpt.find(new_entry->EntityName);
  1084. if (it != m_safeLoadOpt.end())
  1085. {
  1086. if (new_entry->ErrorResult == Error_Succeed)
  1087. it->second.eResult = LOADING_SUCCEED;
  1088. else if (new_entry->ErrorResult == Error_TimeOut)
  1089. it->second.eResult = LOADING_TIMEOUT;
  1090. else
  1091. it->second.eResult = LOADING_FAILED;
  1092. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  1093. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("safeload answer %d", ret);
  1094. if (ret == 0 || ret == 2)
  1095. {
  1096. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  1097. e->param1 = ret;
  1098. PostEventFIFO(e);
  1099. }
  1100. }
  1101. else {
  1102. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("cannot find %s", (LPCTSTR)new_entry->EntityName);
  1103. }
  1104. break;
  1105. case LOADSTAGE_OPERATING:
  1106. it = m_operatingOpt.find(new_entry->EntityName);
  1107. if (it != m_operatingOpt.end())
  1108. {
  1109. if (new_entry->ErrorResult == Error_Succeed)
  1110. it->second.eResult = LOADING_SUCCEED;
  1111. else if (new_entry->ErrorResult == Error_TimeOut)
  1112. it->second.eResult = LOADING_TIMEOUT;
  1113. else
  1114. it->second.eResult = LOADING_FAILED;
  1115. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  1116. if (ret == 0 || ret == 2)
  1117. {
  1118. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  1119. e->param1 = ret;
  1120. PostEventFIFO(e);
  1121. }
  1122. }
  1123. break;
  1124. default:
  1125. break;
  1126. }
  1127. }
  1128. void CVtmLoaderFSM::NoticeEntityLoad(int evtCode)
  1129. {
  1130. HealthManagerService_ClientBase* pHMClient = new HealthManagerService_ClientBase(m_pEntity);
  1131. int count = 0;
  1132. bool bConnected = false;
  1133. do
  1134. {
  1135. ErrorCodeEnum eErrConn = Error_Unexpect;
  1136. ErrorCodeEnum eErrCall = Error_Unexpect;
  1137. if (!bConnected)
  1138. {
  1139. eErrConn = pHMClient->Connect();
  1140. if (eErrConn == Error_Succeed)
  1141. bConnected = true;
  1142. }
  1143. if (bConnected)
  1144. {
  1145. HealthManagerService_DoEvent_Req req;
  1146. HealthManagerService_DoEvent_Ans ans;
  1147. req.code = evtCode;
  1148. eErrCall = pHMClient->DoEvent(req, ans, 5000);
  1149. if (eErrCall == Error_Succeed)
  1150. break;
  1151. }
  1152. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Notice HealthManager failed,eErrConn:%d,eErrCall:%d", eErrConn, eErrCall);
  1153. count++;
  1154. } while (count < 3);
  1155. }
  1156. bool CVtmLoaderFSM::DetectHttpActive()
  1157. {
  1158. memset(m_httpCheckResult, 0, sizeof(m_httpCheckResult));
  1159. CSmartPointer<IConfigInfo> pConfigRun;
  1160. CSimpleStringA strSettingAddr(true),strAccessAuthAddr(true);
  1161. CSimpleStringA errMsg;
  1162. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
  1163. if (eErr == Error_Succeed)
  1164. {
  1165. int iTmp = 0;
  1166. if (pConfigRun->ReadConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp) == Error_Succeed && iTmp > 0)
  1167. m_iCanIgnoreAddrDetect = iTmp;
  1168. iTmp = 0;
  1169. if (pConfigRun->ReadConfigValueInt("Common", "MaxAddrDetectTime", iTmp) == Error_Succeed && iTmp > 0)
  1170. m_ullMaxAddrDetectTime = iTmp;
  1171. iTmp = 0;
  1172. if (pConfigRun->ReadConfigValueInt("Common", "AddrDetectInterval", iTmp) == Error_Succeed && iTmp > 0)
  1173. m_iDetectInterval = iTmp;
  1174. }
  1175. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErr:%d, iDetectInterval:%d", eErr, m_iDetectInterval);
  1176. //oiltmp 由于行外pad即将下线,暂时不考虑行外地址探测
  1177. CSimpleStringA csTmpAddr(true);
  1178. //集中配置探测地址
  1179. pConfigRun->ReadConfigValue("Common", "SettingDetectAddr", csTmpAddr);
  1180. if (csTmpAddr.IsNullOrEmpty())
  1181. {
  1182. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1183. strSettingAddr = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig/rvc/detect";
  1184. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1185. strSettingAddr = "https://accessproxy-service.paas.cmbchina.cn/centerconfig/rvc/detect";
  1186. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1187. strSettingAddr = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig/rvc/detect";
  1188. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  1189. strSettingAddr = "https://accessproxy-service.paas.cmbchina.cn/centerconfig/rvc/detect";
  1190. #else/*本地编译等非DevOps环境编译的版本*/
  1191. strSettingAddr = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig/rvc/detect";
  1192. #endif
  1193. }
  1194. else
  1195. strSettingAddr = csTmpAddr;
  1196. csTmpAddr = "";
  1197. pConfigRun->ReadConfigValue("Common", "AccessAuthDetectAddr", strAccessAuthAddr);
  1198. //准入探测地址
  1199. if (strAccessAuthAddr.IsNullOrEmpty())
  1200. {
  1201. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1202. strAccessAuthAddr = "https://terminalaccess.paasst.cmbchina.cn/tsas/detect";
  1203. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1204. strAccessAuthAddr = "https://accessproxy-service.paas.cmbchina.cn/tsaccess/tsas/detect";
  1205. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1206. strAccessAuthAddr = "https://terminalaccess.paasuat.cmbchina.cn/tsas/detect";
  1207. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  1208. strAccessAuthAddr = "https://terminalaccess.paas.cmbchina.cn/tsas/detect";
  1209. #else/*本地编译等非DevOps环境编译的版本*/
  1210. strAccessAuthAddr = "https://terminalaccess.paasst.cmbchina.cn/tsas/detect";
  1211. #endif
  1212. }
  1213. else
  1214. strAccessAuthAddr = csTmpAddr;
  1215. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CenterSetting addr:%s, strAccessAuthAddr:%s", strSettingAddr.GetData(), strAccessAuthAddr.GetData());
  1216. HttpConnCheckTask* pCSTask = new HttpConnCheckTask(this, strSettingAddr, HttpAddr_CenterSetting);
  1217. GetEntityBase()->GetFunction()->PostThreadPoolTask(pCSTask);
  1218. HttpConnCheckTask* pAATask = new HttpConnCheckTask(this, strAccessAuthAddr, HttpAddr_AccessAuth);
  1219. GetEntityBase()->GetFunction()->PostThreadPoolTask(pAATask);
  1220. ULLINT beginTick, endTick;
  1221. beginTick = SP::Module::Comm::RVCGetTickCount();
  1222. do {
  1223. Sleep(2000);
  1224. if (m_httpCheckResult[HttpAddr_CenterSetting] == HttpConnResult_OK || m_httpCheckResult[HttpAddr_AccessAuth] == HttpConnResult_OK)
  1225. return true;
  1226. else
  1227. {
  1228. endTick = SP::Module::Comm::RVCGetTickCount();
  1229. }
  1230. } while (endTick - beginTick < m_ullMaxAddrDetectTime);
  1231. if (m_iCanIgnoreAddrDetect > 0)
  1232. return true;
  1233. else
  1234. return false;
  1235. }
  1236. bool CVtmLoaderFSM::IsRootINIExist()
  1237. {
  1238. CSimpleStringA csHardwareCfg(true);
  1239. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("HardwareCfg", csHardwareCfg);
  1240. if (eErr != Error_Succeed)
  1241. {
  1242. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
  1243. return true;//return true in default
  1244. }
  1245. CSimpleStringA csRootINIPath = csHardwareCfg + SPLIT_SLASH_STR + "root.ini";
  1246. #if defined(RVC_OS_WIN)
  1247. if (_access(csRootINIPath.GetData(), 0) == 0) {
  1248. #else
  1249. if (access(csRootINIPath.GetData(), F_OK) == 0) {
  1250. #endif
  1251. return true;
  1252. }
  1253. else
  1254. {
  1255. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("root.ini(%s) is not exist.", csRootINIPath.GetData());
  1256. return false;
  1257. }
  1258. }
  1259. bool CVtmLoaderFSM::GetCenterSetting()
  1260. {
  1261. //TODO 获取配置
  1262. ErrorCodeEnum eErr = Error_Succeed;
  1263. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  1264. CSimpleString channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
  1265. CSimpleString tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
  1266. CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn|https://rvc-gateway-out.paasst.cmbchina.cn";
  1267. CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
  1268. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  1269. CSimpleString channelId = "7eb748cb71744c87b5c126e05af8cce7";
  1270. CSimpleString tokenSecret = "eca529c78967c640561bd844229391c8a78af3";
  1271. CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasuat.cmbchina.cn|https://rvc-gateway-out.paasuat.cmbchina.cn";
  1272. CSimpleString CenterConfigTotal = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig|https://accessproxy-service.paasuat.cmbchina.cn/centerconfigdmz";
  1273. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  1274. CSimpleString channelId = "572f7577fa9f425c8475a8d77db4ae31";
  1275. CSimpleString tokenSecret = "eca129c78767c670561bd844629361c8a78af3";
  1276. CSimpleString CommonLaunchUrl = "https://rvc-gateway.paas.cmbchina.cn|https://vtmunify.paas.cmbchina.com/gateway";
  1277. CSimpleString CenterConfigTotal = "https://accessproxy-service.paas.cmbchina.cn/centerconfig|https://vtmunify.paas.cmbchina.com/centerconfig";
  1278. #else/*本地编译等非DevOps环境编译的版本*/
  1279. CSimpleString channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
  1280. CSimpleString tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
  1281. CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn";
  1282. CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
  1283. #endif
  1284. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始拉取配置");
  1285. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->InitCfgUrl(channelId, tokenSecret, CommonLaunchUrl, CenterConfigTotal)))
  1286. {
  1287. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("拉取配置,初始化配置地址失败:0x%x(%s)", eErr, SpStrError(eErr)));
  1288. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F01")("Get center setting,InitCfgUrl failed.");
  1289. LogEvent(Severity_High, Event_VtmLoader_GetCenterSetting_Fail, "拉取配置,初始化配置地址失败");
  1290. return false;
  1291. }
  1292. else
  1293. {
  1294. CSimpleString oldToken, newToken;
  1295. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateToken(oldToken, newToken)))
  1296. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F02")("Get center setting, TryUpdateToken failed:0x%x", eErr);
  1297. //if token update failed,we can also update cfg suc
  1298. if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateCfg()))
  1299. {
  1300. LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("拉取配置失败:0x%x(%s)", eErr, SpStrError(eErr)));
  1301. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F03")("Get center setting, TryUpdateCfg failed:0x%x", eErr);
  1302. LogEvent(Severity_High, Event_VtmLoader_GetCenterSetting_Fail, "拉取配置失败");
  1303. return false;
  1304. }
  1305. }
  1306. //all cfg is ready, then init the entity
  1307. eErr = SubscribeEntitysEvents();
  1308. if (eErr != Error_Succeed)
  1309. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe event fail, 0x%x", eErr);
  1310. else
  1311. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe event succeed");
  1312. CSmartPointer<IConfigInfo> pConfig;
  1313. CSimpleString t_endpoint, t_topicSys, t_topicUser, t_topicBeidou, t_bussSys, t_bussUser;
  1314. bool readSender = false;
  1315. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
  1316. if (eErr == Error_Succeed && Error_Succeed == pConfig->ReadConfigValue("Common", "SendEndpoint", t_endpoint)
  1317. && Error_Succeed == pConfig->ReadConfigValue("Common", "SendSys", t_topicSys)
  1318. && Error_Succeed == pConfig->ReadConfigValue("Common", "SendUser", t_topicUser)
  1319. && Error_Succeed == pConfig->ReadConfigValue("Common", "SendBeidou", t_topicBeidou)
  1320. && Error_Succeed == pConfig->ReadConfigValue("Common", "BusinessSys", t_bussSys)
  1321. && Error_Succeed == pConfig->ReadConfigValue("Common", "BusinessUser", t_bussUser)
  1322. && 0 != t_topicSys.GetLength()
  1323. && 0 != t_topicUser.GetLength()
  1324. && 0 != t_topicBeidou.GetLength()
  1325. && 0 != t_bussSys.GetLength()
  1326. && 0 != t_bussUser.GetLength())
  1327. {
  1328. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("endpoint:%s, topicSys:%s, topicUser:%s, topicBeidou:%s, bussSys:%s, bussUser:%s", t_endpoint.GetData(), t_topicSys.GetData(), t_topicUser.GetData(), t_topicBeidou.GetData(), t_bussSys.GetData(), t_bussUser.GetData());
  1329. if (0 != t_endpoint.GetLength())
  1330. {
  1331. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(t_endpoint.GetData(), t_topicSys.GetData(), t_topicUser.GetData(), t_topicBeidou.GetData(), t_bussSys.GetData(), t_bussUser.GetData());
  1332. }
  1333. else
  1334. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("endpoint is empty, do not begin send log");
  1335. }
  1336. else
  1337. {
  1338. const char* default_endpoint = "https://kafkaproxy.paas.cmbchina.cn/api/kafka/log/send";
  1339. const char* topicSys = "LR18_23_VTMTerminalLogService_L_sys_VTMTerminalSysLog_SRC_SZ";
  1340. const char* topicUser = "LR18_23_VTMTerminalLogService_L_biz_VTMTerminalUserLog_SRC_SZ";
  1341. const char* topicBeidou = "LR18_23_VTMTerminalLogService_L_trace_VTMTerminalTraceLog_SRC_SZ";
  1342. const char* topicBussSys = "LR18_23_VTMTerminalLogService_L_sys_VTMBusiness_SRC_SZ";
  1343. const char* topicBussUser = "LR18_23_VTMTerminalLogService_L_biz_VTMBusiness_SRC_SZ";
  1344. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read endpoint and topic err, need check centersetting, use default %s-%s-%s-%s-%s-%s", default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
  1345. GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
  1346. }
  1347. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  1348. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("terminalNo:%s, MachineType:%s, MachineVersion:%s, Site:%s, Screen:%d, EnrolGPS:%f.%f, EnrolAddr:%s"
  1349. , m_sysInfo.strTerminalID.GetData(), m_sysInfo.strMachineType.GetData(), m_sysInfo.MachineVersion.ToString().GetData()
  1350. , m_sysInfo.strSite.GetData(), m_sysInfo.eScreen, m_sysInfo.EnrolGPS.GetLatitude(), m_sysInfo.EnrolGPS.GetLongitude(), m_sysInfo.strEnrolAddr);
  1351. int tmpSec = 0;
  1352. if (Error_Succeed == pConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "refreshTokenWaitSec", tmpSec) && tmpSec > 0)
  1353. m_refreshWaitSec = tmpSec;
  1354. int t_sec = 0;
  1355. pConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UploadLogWaitSec", t_sec);
  1356. if (t_sec > 0)
  1357. m_uploadLogInfo_waitSec = t_sec;
  1358. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& checkUrlActive, this, 0, NULL));
  1359. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& tokenUpdate, this, 0, NULL));
  1360. //通知Chromium实体
  1361. LogEvent(Severity_High, Event_VtmLoader_GetCenterSetting_Suc, "Get center setting succeed.");
  1362. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F13")("Get center setting succeed.");
  1363. return true;
  1364. }
  1365. ErrorCodeEnum CVtmLoaderFSM::SubscribeEntitysEvents()
  1366. {
  1367. //want to do what?
  1368. auto rc = Error_Succeed;
  1369. //auto pFunc = GetEntityBase()->GetFunction();
  1370. //auto rc = pFunc->SubscribeLog(m_SubLogID2, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "Gpio");
  1371. //// 准入成功事件
  1372. //rc = pFunc->SubscribeLog(m_SubLogID3, this, Log_Event, Severity_None, Error_IgnoreAll, 0x50200001, "AccessAuthorization");
  1373. // 业务首页加载事件
  1374. //rc = pFunc->SubscribeLog(m_SubLogID3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE, "HealthManager");
  1375. return rc;
  1376. }
  1377. int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)
  1378. {
  1379. ULLINT beginTick = SP::Module::Comm::RVCGetTickCount();
  1380. int httpcheckCount = 1;
  1381. while(true){
  1382. if (!checkHttpActive(csHttAddr.GetData()))
  1383. {
  1384. LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("尝试连接总行服务失败(%s),%d 秒后自动重试(第%d次重试)。请确认终端到总行服务网络是否正常", csHttAddr.GetData(), m_iDetectInterval/1000, httpcheckCount));
  1385. m_httpCheckResult[eType] = HttpConnResult_Failed;
  1386. Sleep(m_iDetectInterval);
  1387. httpcheckCount++;
  1388. NetworkAddressesList interNames;
  1389. NetworkAddressesList macAddrs;
  1390. NetworkAddressesList ipAddrs;
  1391. if (SP::Module::Net::GetINETMacAddresses(interNames, macAddrs, ipAddrs) == Error_Succeed)
  1392. {
  1393. for (int i = 0; i < min(ipAddrs.GetCount(),macAddrs.GetCount()); i++) {
  1394. LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("interface(%d):%s", i, interNames[i].GetData()));
  1395. LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("ip(%d):%s", i, ipAddrs[i].GetData()));
  1396. LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("mac(%d):%s", i, macAddrs[i].GetData()));
  1397. }
  1398. }
  1399. }
  1400. else
  1401. {
  1402. m_httpCheckResult[eType] = HttpConnResult_OK;
  1403. if ((SP::Module::Comm::RVCGetTickCount() - beginTick) > 3000)
  1404. {
  1405. LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("第(%d)次尝试连接总行服务成功(%s),但是网络偏慢,连接花了(%d)秒,请检查网络!"
  1406. , httpcheckCount, csHttAddr.GetData(), (SP::Module::Comm::RVCGetTickCount() - beginTick)/1000));
  1407. }
  1408. LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, CSimpleStringA::Format("尝试连接总行服务成功(%s)", csHttAddr.GetData()));
  1409. return 0;
  1410. }
  1411. }
  1412. return -1;
  1413. }