VtmLoaderFSM.cpp 54 KB

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