mod_healthmanager.cpp 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915
  1. // mod_healthmanager.cpp : Defines the exported functions for the DLL application.
  2. #if (defined(_WIN32) || defined(_WIN64))
  3. #include "stdafx.h"
  4. #include <TlHelp32.h>
  5. #include <iphlpapi.h>
  6. #include <ws2tcpip.h>
  7. #include <Winsock2.h>
  8. #include <Windows.h>
  9. #define RVC_OS_WIN//oiltmp???
  10. #else
  11. #include <unistd.h>
  12. #include <time.h>
  13. #include <signal.h>
  14. #include <dlfcn.h>
  15. #include <fcntl.h>
  16. #include <sys/reboot.h>
  17. #endif //RVC_OS_WIN
  18. #include <vector>
  19. #include <iostream>
  20. #include <fstream>
  21. using namespace std;
  22. #include "mod_healthmanager.h"
  23. #include "GetDevInfoHelper.h"
  24. #pragma comment( lib, "advapi32.lib" )
  25. const DWORD HEALTHMANAGER_TIMER_ID = 1;
  26. const DWORD HEALTHMANAGER_WD_TIMER_ID = 2;
  27. const DWORD HEALTHMANAGER_TIMER_INTERVAL = 60000;
  28. const DWORD HEALTHMANAGER_WD_TIMER_INTERVAL = 50000;
  29. const DWORD HEALTHMANAGER_TIMER_INTERVAL_MINUTE = (HEALTHMANAGER_TIMER_INTERVAL/60000)*3;
  30. //the following 20151009
  31. #pragma comment(lib, "IPHLPAPI.lib")
  32. #define WORKING_BUFFER_SIZE 15000
  33. #define MAX_TRIES 3
  34. #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
  35. #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
  36. void GetLocalTimeRVC(SYSTEMTIME &stTime)
  37. {
  38. #ifdef RVC_OS_WIN
  39. GetLocalTime(&stTime);
  40. #else
  41. struct tm* pst = NULL;
  42. time_t t = time(NULL);
  43. pst = localtime(&t);
  44. stTime.wYear = pst->tm_year + 1900;
  45. stTime.wMonth = pst->tm_mon + 1;//because the range of tm_mon is:0-11
  46. stTime.wDay = pst->tm_mday;
  47. stTime.wHour = pst->tm_hour;
  48. stTime.wMinute = pst->tm_min;
  49. stTime.wDayOfWeek = pst->tm_wday;
  50. stTime.wSecond = pst->tm_sec;
  51. stTime.wMilliseconds = 0;
  52. //Dbg("oiltest,time:%d,%d,%d,%d", stTime.wYear, stTime.wHour, stTime.wMinute, stTime.wDayOfWeek);
  53. #endif
  54. }
  55. template<class T>
  56. class TimerOutHelper : public ITimerListener
  57. {
  58. public:
  59. typedef void (T::*FuncTimer)();
  60. TimerOutHelper(T *p, FuncTimer pTimerFunc, bool bDeleteSelf = false)
  61. : m_pObject(p), m_pTimer(pTimerFunc), m_bDeleteSelf(bDeleteSelf) {}
  62. virtual void OnTimeout(DWORD dwTimerID)
  63. {
  64. (m_pObject->*m_pTimer)();
  65. if (m_bDeleteSelf)
  66. delete this;
  67. }
  68. private:
  69. T *m_pObject;
  70. FuncTimer m_pTimer;
  71. bool m_bDeleteSelf;
  72. };
  73. void HealthManagerSession::Handle_EnterState(SpReqAnsContext<HealthManagerService_EnterState_Req, HealthManagerService_EnterState_Ans>::Pointer ctx)
  74. {
  75. LOG_FUNCTION();
  76. m_pEntity->EnterState(ctx);
  77. }
  78. void HealthManagerSession::Handle_ExitState(SpReqAnsContext<HealthManagerService_ExitState_Req, HealthManagerService_ExitState_Ans>::Pointer ctx)
  79. {
  80. LOG_FUNCTION();
  81. m_pEntity->ExitState(ctx);
  82. }
  83. void HealthManagerSession::Handle_DoEvent(SpReqAnsContext<HealthManagerService_DoEvent_Req, HealthManagerService_DoEvent_Ans>::Pointer ctx)
  84. {
  85. LOG_FUNCTION();
  86. m_pEntity->DoEvent(ctx);
  87. }
  88. void HealthManagerSession::Handle_GetEntityCfgInfo(SpReqAnsContext<HealthManagerService_GetEntityCfgInfo_Req, HealthManagerService_GetEntityCfgInfo_Ans>::Pointer ctx)
  89. {
  90. LOG_FUNCTION();
  91. m_pEntity->GetEntityCfgInfo(ctx);
  92. }
  93. void HealthManagerSession::Handle_GetNetworkState(SpReqAnsContext<HealthManagerService_GetNetworkState_Req, HealthManagerService_GetNetworkState_Ans>::Pointer ctx)
  94. {
  95. LOG_FUNCTION();
  96. m_pEntity->GetNetworkState(ctx);
  97. }
  98. void HealthManagerSession::Handle_QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx)
  99. {
  100. LOG_FUNCTION();
  101. m_pEntity->QueryHardwareInfo(ctx);
  102. }
  103. void HealthManagerSession::Handle_ReadCenterConfigStr(SpReqAnsContext<HealthManagerService_ReadCenterConfigStr_Req, HealthManagerService_ReadCenterConfigStr_Ans>::Pointer ctx)
  104. {
  105. LOG_FUNCTION();
  106. }
  107. bool CHealthManagerEntity::DoWatchDog(WatchDogOp eOp)
  108. {
  109. switch(eOp)
  110. {
  111. case WD_OP_START:
  112. {
  113. if (m_pWatchDogClient == NULL)
  114. {
  115. m_pWatchDogClient = new WatchDogService_ClientBase(this);
  116. ErrorCodeEnum eErrConn = m_pWatchDogClient->Connect();
  117. if (eErrConn != Error_Succeed) {
  118. Dbg("WatchDog connected failed.");
  119. //m_pWatchDogClient->SafeDelete();
  120. m_pWatchDogClient = NULL;
  121. break;
  122. }
  123. else
  124. Dbg("WatchDog connected.");
  125. }
  126. WatchDogService_StartWatch_Req req;
  127. req.Delay = 120;//oiltmp
  128. req.Timeout = 60;
  129. WatchDogService_StartWatch_Ans ans;
  130. ErrorCodeEnum eErrStart = m_pWatchDogClient->StartWatch(req,ans,10000);
  131. if (eErrStart == Error_Succeed)
  132. m_bWatchDog = true;
  133. Dbg("start watch %d.",eErrStart);
  134. }
  135. break;
  136. case WD_OP_STOP:
  137. {
  138. if (!m_bWatchDog)
  139. break;
  140. WatchDogService_StopWatch_Req req;
  141. WatchDogService_StopWatch_Ans ans;
  142. ErrorCodeEnum eErrStop = m_pWatchDogClient->StopWatch(req,ans,10000);
  143. if (eErrStop == Error_Succeed)
  144. m_bWatchDog = false;
  145. Dbg("stop watchd %d.",eErrStop);
  146. }
  147. break;
  148. case WD_OP_REFRESH:
  149. {
  150. if (!m_bWatchDog)
  151. break;
  152. WatchDogService_Refresh_Req req;
  153. WatchDogService_Refresh_Ans ans;
  154. ErrorCodeEnum eErrRefresh = m_pWatchDogClient->Refresh(req,ans,10000);
  155. Dbg("refresh watchdog %d.",eErrRefresh);
  156. }
  157. break;
  158. default:
  159. break;
  160. }
  161. return true;
  162. }
  163. void CHealthManagerEntity::OnWatchDogTimeout()
  164. {
  165. xxx++;
  166. if (m_bWatchDog && xxx == 5)
  167. {
  168. DoWatchDog(WD_OP_STOP);
  169. //oiltmp
  170. Sleep(180000);
  171. Dbg("have sleep 18000,wake up.");
  172. //DoWatchDog(WD_OP_START);
  173. }
  174. else if (m_bWatchDog && xxx<5)
  175. {
  176. DoWatchDog(WD_OP_REFRESH);
  177. GetFunction()->ResetTimer(HEALTHMANAGER_WD_TIMER_ID, HEALTHMANAGER_WD_TIMER_INTERVAL);
  178. }
  179. }
  180. int CHealthManagerEntity::SystemRestart(bool bPeriod, bool bImmediately,bool bNow)
  181. {
  182. if (bPeriod)
  183. {
  184. Dbg("restart periodly.");
  185. m_restartTimes = 0;
  186. }
  187. if (bNow)
  188. {
  189. m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger, m_eRebootWay);
  190. int x = SystemShutdown(TRUE);
  191. Dbg("From ie to shutdown %d",x);
  192. return 0;
  193. }
  194. SYSTEMTIME localTime;
  195. GetLocalTimeRVC(localTime);
  196. CSmartPointer<IConfigInfo> spConfigRun;
  197. ErrorCodeEnum err = GetFunction()->OpenConfig(Config_Run, spConfigRun);
  198. if (err != Error_Succeed) {
  199. LOG_TRACE("open cfg file failed!");
  200. return -1;
  201. }
  202. //
  203. //ups restart
  204. if (m_pUpsClient != NULL)
  205. {
  206. if (!m_bToRestart)
  207. {
  208. m_restartTimes++;
  209. if (m_restartTimes > m_maxRestartTimes)
  210. {
  211. Dbg("restart too many times(%d,%d),give up.",m_restartTimes,m_maxRestartTimes);
  212. m_restartTimes--;
  213. return -1;
  214. }
  215. Dbg("the %d restart.",m_restartTimes);
  216. spConfigRun->WriteConfigValueInt("Run","RestartTimes",m_restartTimes);
  217. if (m_lastHour != localTime.wHour)
  218. {
  219. m_lastHour = localTime.wHour;
  220. Dbg("set last hour to %d", m_lastHour);
  221. spConfigRun->WriteConfigValueInt("Run", "LastHour", m_lastHour);
  222. }
  223. }
  224. else
  225. return 0;
  226. UpsService_Shutdown_Req req;
  227. UpsService_Shutdown_Ans ans;
  228. if (bImmediately)
  229. {
  230. req.ShutdownTime = 1;
  231. req.UpTime = 1;
  232. }
  233. else
  234. {
  235. req.ShutdownTime = 1;//oiltmp
  236. req.UpTime = 3; //oiltmp
  237. }
  238. ErrorCodeEnum eErrShutdown = m_pUpsClient->Shutdown(req,ans,10000);
  239. if (eErrShutdown == Error_Succeed)
  240. {
  241. //m_lastHour = localTime.wHour;
  242. Dbg("to shutdown");
  243. m_bToRestart = true;
  244. Sleep(20000);
  245. m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger,m_eRebootWay);
  246. int ret;
  247. if (m_bGetUpsStateFlag)
  248. ret = SystemShutdown();
  249. else
  250. ret = SystemShutdown(TRUE);
  251. Dbg("after ups,SystemShutdown result %d",ret);
  252. }
  253. else
  254. Dbg("shutdown failed(%d)",eErrShutdown);
  255. }
  256. else
  257. {
  258. Dbg("no ups,so to restart directly.");
  259. if (!m_bToRestart)
  260. {
  261. m_restartTimes++;
  262. if (m_restartTimes > m_maxRestartTimes)
  263. {
  264. Dbg("restart too many times(%d,%d),give up.",m_restartTimes,m_maxRestartTimes);
  265. m_restartTimes--;
  266. return -1;
  267. }
  268. Dbg("the %d restart.",m_restartTimes);
  269. spConfigRun->WriteConfigValueInt("Run","RestartTimes",m_restartTimes);
  270. if (m_lastHour != localTime.wHour)
  271. {
  272. m_lastHour = localTime.wHour;
  273. Dbg("set last hour to %d", m_lastHour);
  274. spConfigRun->WriteConfigValueInt("Run", "LastHour", m_lastHour);
  275. }
  276. //oilyang 20140606
  277. //framework to reboot os
  278. //int ret = SystemShutdown(TRUE);
  279. m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger,RebootWay_OS);
  280. //Dbg("no ups,SystemShutdown result %d",ret);
  281. }
  282. }
  283. return 0;
  284. }
  285. //system api shutdown
  286. int CHealthManagerEntity::SystemShutdown(BOOL bReboot)
  287. {
  288. #ifdef RVC_OS_WIN
  289. HANDLE hToken; // handle to process token
  290. TOKEN_PRIVILEGES tkp; // pointer to token structure
  291. BOOL fResult; // system shutdown flag
  292. // Get the current process token handle so we can get shutdown
  293. // privilege.
  294. if (!OpenProcessToken(GetCurrentProcess(),
  295. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  296. return FALSE;
  297. // Get the LUID for shutdown privilege.
  298. LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
  299. &tkp.Privileges[0].Luid);
  300. tkp.PrivilegeCount = 1; // one privilege to set
  301. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  302. // Get shutdown privilege for this process.
  303. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
  304. (PTOKEN_PRIVILEGES) NULL, 0);
  305. // Cannot test the return value of AdjustTokenPrivileges.
  306. if (GetLastError() != ERROR_SUCCESS)
  307. return FALSE;
  308. // Display the shutdown dialog box and start the countdown.
  309. fResult = InitiateSystemShutdown(
  310. NULL, // shut down local computer
  311. NULL, // message for user
  312. 0, // time-out period, in seconds
  313. FALSE, // ask user to close apps
  314. bReboot); // reboot after shutdown
  315. if (!fResult)
  316. return FALSE;
  317. // Disable shutdown privilege.
  318. tkp.Privileges[0].Attributes = 0;
  319. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
  320. (PTOKEN_PRIVILEGES) NULL, 0);
  321. return 0;
  322. #else
  323. sync();
  324. if (bReboot)
  325. system("init 6");
  326. else
  327. system("init 0");
  328. return 0;//oiltestlinux
  329. #endif //RVC_OS_WIN
  330. }
  331. int CHealthManagerEntity::FrameworkShutdown(bool bRestart)
  332. {
  333. #ifdef RVC_OS_WIN
  334. STARTUPINFO si;
  335. PROCESS_INFORMATION pi;
  336. ZeroMemory( &si, sizeof(si) );
  337. si.cb = sizeof(si);
  338. ZeroMemory( &pi, sizeof(pi) );
  339. GetFunction()->FlushLogFile();
  340. // LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S"));
  341. //CreateProcess(NULL, szCmdline, /*...*/);
  342. // Start the child process.
  343. CSimpleStringA csRestart,csVerPath,csAll,csSep("\""),csBlank(" "),csScript("wscript.exe"),csReFlag("r");
  344. csRestart = "sprestart.exe ";
  345. ErrorCodeEnum Error = GetFunction()->GetPath("RootVer", csVerPath);
  346. csVerPath +="\\spexplorerfast.vbs";
  347. if (!bRestart)
  348. csReFlag = "n";
  349. csAll = csSep + csRestart + csSep + csBlank + csSep + csScript+csBlank + csVerPath + csSep
  350. + csBlank + csSep + csReFlag + csSep;
  351. Dbg("allpath[%s]",(LPCTSTR)csAll);
  352. LPTSTR szCmdline = _strdup(csAll);
  353. if( !CreateProcess( NULL,szCmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
  354. {
  355. Dbg("CreateProcess failed (%d).\n", GetLastError());
  356. return -1;
  357. }
  358. m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger, m_eRebootWay);
  359. //MessageBoxA(0,0,0,0);
  360. DWORD dwErr = GetLastError();
  361. // Wait until child process exits.
  362. WaitForSingleObject( pi.hProcess, INFINITE );
  363. // Close process and thread handles.
  364. CloseHandle( pi.hProcess );
  365. CloseHandle( pi.hThread );
  366. return 0;
  367. #else
  368. return 0;//oiltestlinux
  369. #endif
  370. }
  371. //almost disused.
  372. //the function moved to Entity "SelfChecker"
  373. ErrorCodeEnum CHealthManagerEntity::RestartModule(const char* pEntityName)
  374. {
  375. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  376. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  377. if (pFuncPrivilege == NULL)
  378. {
  379. Dbg("restart mc NoPrivilege");
  380. return Error_NoPrivilege;
  381. }
  382. map<CSimpleStringA,ModuleRunInfo>::iterator it;
  383. it = m_modRunInfo.find(pEntityName);
  384. if (it == m_modRunInfo.end())
  385. {
  386. Dbg("add %s to modfuninfo(%d).",pEntityName,m_modRunInfo.size());
  387. m_modRunInfo[pEntityName].count = 1;
  388. m_modRunInfo[pEntityName].dwStart = GetTickCountRVC();
  389. }
  390. else
  391. {
  392. Dbg("modruninfo size %d",m_modRunInfo.size());
  393. Dbg("%d",m_modRunInfo[pEntityName].count);
  394. (m_modRunInfo[pEntityName].count)++;
  395. Dbg("%d",m_modRunInfo[pEntityName].count);
  396. }
  397. CSmartPointer<IAsynWaitSp> spWait;
  398. ErrorCodeEnum eErrCode = Error_Succeed;
  399. eErrCode = pFuncPrivilege->TerminateEntity(pEntityName,spWait);
  400. if (spWait != NULL)
  401. eErrCode = spWait->WaitAnswer(10000);
  402. if (eErrCode != Error_Succeed)
  403. {
  404. Dbg("kill %s %d",pEntityName,eErrCode);
  405. return eErrCode;
  406. }
  407. Sleep(3000);
  408. eErrCode = pFuncPrivilege->StartEntity(pEntityName,NULL,spWait);
  409. if (spWait != NULL)
  410. eErrCode = spWait->WaitAnswer(10000);
  411. if (eErrCode != Error_Succeed)
  412. {
  413. Dbg("start %s %d",pEntityName,eErrCode);
  414. return eErrCode;
  415. }
  416. //m_modRestartCount++;
  417. //if (m_modRestartCount == 1)
  418. // m_MCStart = GetTickCount();
  419. DWORD dwMaxTimes,dwInternal;
  420. if (m_modCfgInfo.find(pEntityName) == m_modCfgInfo.end())
  421. {
  422. dwMaxTimes = m_restartMode[RESTART_MODE_DEFAULT].dwTimes;
  423. dwInternal = m_restartMode[RESTART_MODE_DEFAULT].dwInternal;
  424. }
  425. else
  426. {
  427. dwMaxTimes = m_restartMode[m_modCfgInfo[pEntityName]].dwTimes;
  428. dwInternal = m_restartMode[m_modCfgInfo[pEntityName]].dwInternal;
  429. }
  430. Dbg("%d,%d,%s restart %d times",dwMaxTimes,dwInternal,pEntityName,m_modRunInfo[pEntityName].count);
  431. if (m_modRunInfo[pEntityName].count > dwMaxTimes)
  432. {
  433. m_MCEnd = GetTickCountRVC();
  434. if (m_MCEnd-m_modRunInfo[pEntityName].dwStart < dwInternal)
  435. {
  436. Dbg("wait chance to restart pc.");
  437. if (_strnicmp(pEntityName, "FaceTracking", strlen("FaceTracking")) != 0)
  438. m_bWaitRestartPC = true;
  439. }
  440. else
  441. {
  442. m_modRunInfo[pEntityName].dwStart = m_MCEnd;
  443. m_modRunInfo[pEntityName].count = 0;
  444. LogWarn(Severity_Low,Error_Unexpect,LOG_WARN_HEALTH_MODULE_RESTART_TIMES
  445. ,"restart x times in more than 10mins");
  446. }
  447. }
  448. return eErrCode;
  449. }
  450. void CHealthManagerEntity::AfterWaitRestartPC()
  451. {
  452. ReadMachineDataBySyncSerivce();
  453. Dbg("menu:[%s]",(LPCTSTR)m_menuChoice);
  454. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  455. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  456. if (pFuncPrivilege == NULL)
  457. {
  458. Dbg("restart pc NoPrivilege");
  459. return;
  460. }
  461. ErrorCodeEnum eErr;
  462. CSimpleStringA csCustomerHandle("");
  463. eErr = GetFunction()->GetSysVar("CustomerHandle",csCustomerHandle);
  464. Dbg("cust handle %d,%s",eErr,(LPCTSTR)csCustomerHandle);
  465. if (eErr != Error_Succeed)
  466. {
  467. Dbg("get CustomerHandle failed (%d).",eErr);
  468. }
  469. else if (csCustomerHandle[0] == 'N')
  470. {
  471. m_bWaitRestartPC = false;
  472. pFuncPrivilege->DisplayBlueScreen("暂停服务test");
  473. Dbg("time comes,restart machine");
  474. m_eRebootTrigger = RebootTrigger_RunExcepition;
  475. m_eRebootWay = RebootWay_Power;
  476. SystemRestart(false, true);
  477. }
  478. }
  479. void CHealthManagerEntity::UpsSupplyLockScreen()
  480. {
  481. ErrorCodeEnum eErr;
  482. CSimpleStringA csCustomerHandle("");
  483. eErr = GetFunction()->GetSysVar("CustomerHandle",csCustomerHandle);
  484. Dbg("upslockscreen cust handle %d,%s",eErr,(LPCTSTR)csCustomerHandle);
  485. if (eErr != Error_Succeed)
  486. {
  487. Dbg("get CustomerHandle failed (%d).",eErr);
  488. }
  489. else// if (csCustomerHandle[0] == 'N')
  490. {
  491. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  492. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  493. if (pFuncPrivilege == NULL)
  494. {
  495. Dbg("display screen NoPrivilege");
  496. return;
  497. }
  498. pFuncPrivilege->DisplayBlueScreen("暂停服务");
  499. LogEvent(Severity_High,LOG_EVT_HEALTH_UPS_NO_ELECTOR,"ups no elector,to shutdown machine");
  500. Dbg("ups no elector,display screen.");
  501. //oiltmp eject card and sth else
  502. Sleep(30000);
  503. if (m_bUpsWaitLock)
  504. {
  505. m_bUpsWaitLock = false;
  506. m_bScreenLock = true;
  507. int ret = SystemShutdown();
  508. Dbg("SystemShutdown result %d",ret);
  509. }
  510. else
  511. {
  512. pFuncPrivilege->UndisplayBlueScreen();
  513. m_bUpsWaitLock = false;
  514. m_bScreenLock = false;
  515. }
  516. }
  517. }
  518. void CHealthManagerEntity::OnCheckTimeTimeout()
  519. {
  520. if (m_bNeedToRestartIE)
  521. {
  522. //oilyang 20160704
  523. //to judge in main page & the phone is offline
  524. CSimpleStringA csCustHandle("");
  525. ErrorCodeEnum eErr = Error_Unexpect;
  526. eErr = GetFunction()->GetSysVar("CustomerHandle", csCustHandle);
  527. if (eErr == Error_Succeed)
  528. {
  529. if (csCustHandle.Compare("C") != 0 && csCustHandle.Compare("T") != 0 && csCustHandle.Compare("G") != 0)
  530. {
  531. if (m_bInMainPage)
  532. {
  533. Dbg("to restart iebrowser.");
  534. RestartIE();
  535. }
  536. }
  537. }
  538. }
  539. SYSTEMTIME localTime;
  540. GetLocalTimeRVC(localTime);
  541. //99 is initial value of m_preDay
  542. if (m_preDay != 99 && m_preDay != localTime.wDayOfWeek && m_bNeedToRestartPAD == false)
  543. m_bNeedToRestartPAD = true;
  544. m_preDay = localTime.wDayOfWeek;
  545. CSmartPointer<IConfigInfo> spConfigRun;
  546. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
  547. if (eErr != Error_Succeed)
  548. Dbg("timer open cfg file failed!");
  549. else
  550. {
  551. if (localTime.wHour != m_lastHour)
  552. {
  553. Dbg("hour changed,to set restart times to 0");
  554. spConfigRun->WriteConfigValueInt("Run", "RestartTimes", 0);
  555. }
  556. }
  557. GetNetDeviceState();
  558. if (_strnicmp(m_sysStaticInfo.strMachineType.GetData(), "RVC.PAD", strlen("RVC.PAD")) == 0)
  559. {
  560. if (m_bNeedToRestartPAD)
  561. {
  562. ULONGLONG ull = 0;
  563. ull = GetTickCountRVC();
  564. int osRunHours = 0, osRunDays = 0;
  565. osRunHours = (ull / (1000 * 60 * 60));
  566. osRunDays = osRunHours / 24;
  567. CSmartPointer<IConfigInfo> spConfigRun;
  568. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
  569. if (m_maxRunDays <= 0)
  570. m_maxRunDays = 7;
  571. if (osRunDays >= m_maxRunDays)
  572. {
  573. Dbg("os has run %d hour,to restart os.", osRunHours);
  574. spConfigRun->WriteConfigValueInt("Restart", "DayNum", 0);
  575. m_eRebootTrigger = RebootTrigger_Period;
  576. m_eRebootWay = RebootWay_Power;
  577. SystemRestart(true,true);
  578. }
  579. else if (osRunDays >= 1)
  580. {
  581. if (osRunDays > m_dayNum)
  582. {
  583. Dbg("os has run %d hour,to restart framework.", osRunHours);
  584. spConfigRun->WriteConfigValueInt("Restart", "DayNum", osRunDays);
  585. m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_Period, RebootWay_Framework);
  586. }
  587. }
  588. }
  589. }
  590. else //not RVC.PAD
  591. {
  592. if (m_wDayOfWeek != localTime.wDayOfWeek)
  593. {
  594. if (localTime.wHour == m_restartHour && localTime.wMinute >= m_restartMinute
  595. && localTime.wMinute <= (m_restartMinute + HEALTHMANAGER_TIMER_INTERVAL_MINUTE))
  596. {
  597. m_wDayOfWeek = localTime.wDayOfWeek;
  598. m_eRebootTrigger = RebootTrigger_Period;
  599. m_eRebootWay = RebootWay_Power;
  600. BOOL bRet = SystemRestart(true,true);
  601. Dbg("restart machine[%d][%d] bRet=%d, LastError=%d", localTime.wHour, localTime.wMinute, bRet, GetLastError());
  602. Dbg("not rvc.pad %s,%s", m_sysStaticInfo.strMachineType.GetData(), (const char*)m_sysStaticInfo.strMachineType);
  603. }
  604. }
  605. }
  606. if (m_pUpsClient == NULL)
  607. {
  608. CSimpleStringA csRunState("B");
  609. GetFunction()->GetSysVar("RunState",csRunState);
  610. if (csRunState[0] != 'B' || csRunState[0] != 'I')
  611. {
  612. if (_strnicmp(m_sysStaticInfo.strMachineType.GetData(), "RVC.Stand2S", strlen("RVC.Stand2S") == 0))
  613. {
  614. int ret = ConnectUps();
  615. Dbg("connect ups %d.", ret);
  616. }
  617. }
  618. }
  619. else
  620. {
  621. UpsService_GetStatus_Req req;
  622. UpsService_GetStatus_Ans ans;
  623. ErrorCodeEnum eErrState = m_pUpsClient->GetStatus(req,ans,3000);
  624. if (eErrState == Error_Succeed)
  625. {
  626. m_bGetUpsStateFlag = true;
  627. switch(ans.Status)
  628. {
  629. case UPS_STATUS_NORMAL:
  630. m_bUpsWaitLock = false;
  631. m_upsNoElectorCount = 0;
  632. break;
  633. case UPS_STATUS_ERROR_TO_GET_STATUS:
  634. m_upsStateCount++;
  635. if (m_upsStateCount > 3)
  636. {
  637. //logwarn oiltmp
  638. }
  639. break;
  640. case UPS_STATUS_NO_ELECTOR:
  641. m_bUpsWaitLock = true;
  642. m_upsNoElectorCount++;
  643. if (m_upsNoElectorCount > 2)
  644. {
  645. //logwarn oiltmp
  646. //notify front end
  647. //shutdown pc or not?
  648. }
  649. break;
  650. default:
  651. break;
  652. }
  653. //Dbg("current state %d",ans.Status);
  654. }
  655. else
  656. {
  657. Dbg("get ups state failed(%d).",eErrState);
  658. m_bGetUpsStateFlag = false;
  659. if (eErrState == Error_NetBroken)
  660. {
  661. //m_pUpsClient->SafeDelete();
  662. m_pUpsClient = NULL;
  663. }
  664. }
  665. }
  666. ReadMachineDataBySyncSerivce();
  667. //Dbg("fsm:%d,menu:%s", m_fsm.GetFSMState(),(const char*)m_menuChoice);
  668. bool bCheckGuardian = false;
  669. if (m_fsm.GetFSMState() == HM_FSM_STATE_IDLE || (m_fsm.GetFSMState() == HM_FSM_STATE_CMS))
  670. {
  671. if (m_fsm.GetAccessAuthFlag() && (m_bEnterMainPageEver || (!m_bEnterMainPageEver && m_fsm.IfIEBeforeHealth())))//oilyang 20161219 改成通过是否成功进入主页来判断IE情况
  672. {
  673. bCheckGuardian = CheckGuardianIsRun(true);
  674. if (!m_bSayIdle)
  675. {
  676. m_bSayIdle = true;
  677. if (bCheckGuardian)
  678. {
  679. eErr = m_pfUpgradeRestart(3, 0);
  680. Dbg("healthmanager say idle,so tell the guardian.%d",eErr);
  681. }
  682. CSimpleStringA csRunInfo,csStartTime;
  683. if ((GetFunction()->GetPath("RunInfo",csRunInfo)) != Error_Succeed)
  684. {
  685. Dbg("get runinfo path failed(%d)");
  686. //oillinuxtmp
  687. //remove(csRunInfo + "/runcfg/starttime.dat");
  688. }
  689. else
  690. {
  691. csStartTime = csRunInfo + "/runcfg/starttime.dat";
  692. int ret = remove(csStartTime);
  693. if (ret == 0)
  694. Dbg("delete time file error.[%d]",GetLastError());
  695. }
  696. }
  697. if (bCheckGuardian)
  698. {
  699. WorkStateEnum eShake;
  700. Dbg("to shake...");
  701. ErrorCodeEnum eErrShake = m_pfShake(eShake);
  702. //if (eErrShake != Error_Succeed)
  703. Dbg("shake hand result:%d,work state %d",eErrShake,eShake);
  704. if (!m_bHealthInit)
  705. {
  706. bool bStop = StopGuardian();
  707. if (bStop)
  708. {
  709. m_bHealthInit = true;
  710. bool bGuardian = StartGuardian();
  711. Dbg("restart guardian %d", bGuardian);
  712. }
  713. }
  714. }
  715. else
  716. {
  717. Dbg("to start guardian");
  718. bool bGuardian = StartGuardian();
  719. Dbg("start guardian %d",bGuardian);
  720. }
  721. }
  722. else
  723. {
  724. //oilyang@20190905 add if auth suc,tell guardian,for upgrade
  725. if (m_fsm.GetAccessAuthFlag())
  726. {
  727. if (CheckGuardianIsRun(true))
  728. {
  729. eErr = m_pfUpgradeRestart(5, 0);
  730. Dbg("auth suc,so tell the guardian.%d", eErr);
  731. }
  732. }
  733. }
  734. }
  735. else
  736. {
  737. m_bSayIdle = false;
  738. }
  739. if (m_fsm.GetFSMState() == HM_FSM_STATE_CMS)
  740. {
  741. GetFunction()->ResetTimer(HEALTHMANAGER_TIMER_ID, HEALTHMANAGER_TIMER_INTERVAL);
  742. return;
  743. }
  744. if (m_bWaitRestartPC)
  745. {
  746. Dbg("finally we the restart time come,no wait.");
  747. //m_bWaitRestartPC = false;
  748. AfterWaitRestartPC();
  749. }
  750. if (m_bUpsWaitLock)
  751. {
  752. UpsSupplyLockScreen();
  753. }
  754. else
  755. {
  756. //no need to un-display blue screen? oiltest 20140320
  757. //if (m_bScreenLock)
  758. //{
  759. // CSmartPointer<IEntityFunction> pFunc = GetFunction();
  760. // CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  761. // if (pFuncPrivilege == NULL)
  762. // {
  763. // Dbg("unlock screen NoPrivilege");
  764. // return;
  765. // }
  766. // pFuncPrivilege->UndisplayBlueScreen();
  767. // m_bScreenLock = false;
  768. //}
  769. }
  770. GetFunction()->ResetTimer(HEALTHMANAGER_TIMER_ID, HEALTHMANAGER_TIMER_INTERVAL);
  771. }
  772. #ifdef linux
  773. bool FindGuardianPid(pid_t &pid)
  774. {
  775. FILE* pstr;
  776. char cmd[128], buff[512];
  777. pid_t pID;
  778. int pidnum;
  779. char* name = "guardian.exe";/*进程名*/
  780. char* p = NULL;
  781. int ret = 3;
  782. memset(cmd, 0, sizeof(cmd));
  783. sprintf(cmd, "ps -ef|grep %s|grep -v grep", name);
  784. pstr = popen(cmd, "r");
  785. if (pstr == NULL)
  786. {
  787. return false;
  788. }
  789. memset(buff, 0, sizeof(buff));
  790. fgets(buff, 512, pstr);
  791. Dbg("%s\n", buff);
  792. p = strtok(buff, " ");
  793. p = strtok(NULL, " ");
  794. pclose(pstr); //这句是否去掉,取决于当前系统中ps后,进程ID号是否是第一个字段
  795. if (p == NULL)
  796. {
  797. return false;
  798. }
  799. //printf( "pid:%s\n",p);
  800. if (strlen(p) == 0)
  801. {
  802. return false;
  803. }
  804. if ((pidnum = atoi(p)) == 0)
  805. {
  806. return false;
  807. }
  808. Dbg("pidnum: %d", pidnum);
  809. pid = (pid_t)pidnum;
  810. return pid;
  811. }
  812. #endif
  813. bool CHealthManagerEntity::CheckGuardianIsRun(bool bStart)
  814. {
  815. #ifdef RVC_OS_WIN
  816. //LOG_FUNCTION();
  817. HANDLE hSnapshot;
  818. //find guardian.exe
  819. hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  820. if (hSnapshot)
  821. {
  822. PROCESSENTRY32 pe;
  823. pe.dwSize = sizeof(pe);
  824. if (Process32First(hSnapshot, &pe))
  825. {
  826. do {
  827. if (_stricmp(&pe.szExeFile[0], "guardian.exe") == 0)
  828. {
  829. //Dbg("guardian is running.");
  830. return true;
  831. }
  832. } while (Process32Next(hSnapshot, &pe));
  833. }
  834. CloseHandle(hSnapshot);
  835. }
  836. Sleep(1000);
  837. Dbg("cannot find guardian.");
  838. if (bStart)
  839. return StartGuardian();
  840. else
  841. return false;
  842. #else
  843. pid_t pID;
  844. bool bFind = false;
  845. bFind = FindGuardianPid(pID);
  846. if (bFind)
  847. {
  848. int ret = kill(pID, 0);
  849. Dbg("ret= %d ", ret);
  850. if (0 == ret)
  851. {
  852. Dbg("process: guardian.exe exist!");
  853. return true;
  854. }
  855. else
  856. {
  857. Dbg("process: guardian.exe not exist!");
  858. return false;
  859. }
  860. }
  861. return false;
  862. #endif //RVC_OS_WIN
  863. }
  864. bool CHealthManagerEntity::StopGuardian()
  865. {
  866. #ifdef RVC_OS_WIN
  867. Dbg("to stop guardian");
  868. HANDLE hSnapshot;
  869. int rc = TRUE;
  870. int result;
  871. HANDLE hProcess;
  872. //find and kill guardian.exe
  873. hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  874. if (hSnapshot)
  875. {
  876. PROCESSENTRY32 pe;
  877. pe.dwSize = sizeof(pe);
  878. if (Process32First(hSnapshot, &pe))
  879. {
  880. do {
  881. if (_stricmp(&pe.szExeFile[0], "guardian.exe") == 0)
  882. {
  883. hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID );
  884. if( hProcess == NULL )
  885. {
  886. Dbg("Fail to open process(%d)!",GetLastError());
  887. return false;
  888. }
  889. else
  890. {
  891. result = TerminateProcess(hProcess,-1);
  892. if (result)
  893. {
  894. Dbg("Terminate guardian suc.");
  895. return true;
  896. }
  897. else
  898. {
  899. Dbg("Terminate guardian failed(%d).",GetLastError());
  900. return false;
  901. }
  902. CloseHandle( hProcess );
  903. }
  904. Sleep(3000);
  905. WaitForSingleObject(&pe.th32ProcessID, INFINITE );
  906. break;
  907. }
  908. } while (Process32Next(hSnapshot, &pe));
  909. }
  910. CloseHandle(hSnapshot);
  911. }
  912. Sleep(3000);
  913. return false;
  914. #else
  915. pid_t pID;
  916. bool bFind = false;
  917. bFind = FindGuardianPid(pID);
  918. if (bFind)
  919. {
  920. int ret = kill(pID, 9);
  921. }
  922. #endif //RVC_OS_WIN
  923. }
  924. bool CHealthManagerEntity::StartGuardian()
  925. {
  926. LOG_FUNCTION();
  927. if (m_sysStaticInfo.strMachineType.Compare("RVC.IL") == 0)
  928. {
  929. Dbg("machine type is RVC.IL,no need to start guardian.exe");
  930. return false;
  931. }
  932. Dbg("to start guardian");
  933. #ifdef RVC_OS_WIN
  934. STARTUPINFO si;
  935. PROCESS_INFORMATION pi;
  936. ZeroMemory( &si, sizeof(si) );
  937. si.cb = sizeof(si);
  938. ZeroMemory( &pi, sizeof(pi) );
  939. GetFunction()->FlushLogFile();
  940. // Start the child process.
  941. CSimpleStringA csBinPath,csAll,csSep("\"");
  942. ErrorCodeEnum Error = GetFunction()->GetPath("Bin", csBinPath);
  943. csBinPath +="\\guardian.exe";
  944. csAll = csSep + csBinPath + csSep;
  945. Dbg("guardian path[%s]",(LPCTSTR)csAll);
  946. LPTSTR szCmdline = _strdup(csAll);
  947. if( !CreateProcess( NULL,szCmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
  948. {
  949. Dbg("CreateProcess failed (%d).\n", GetLastError());
  950. return false;
  951. }
  952. DWORD dwErr = GetLastError();
  953. return true;
  954. #else
  955. int i;
  956. pid_t pid;
  957. if (pid = fork() != 0)
  958. {
  959. cout << "parent" << endl;
  960. //_exit(0);
  961. }
  962. if (pid == 0)
  963. {
  964. setsid();
  965. //子进程调用execle
  966. if ((i = execl("/home/yangsy/progtest/guardian/guardian.exe", "guardian.exe", (char*)NULL)) == -1)
  967. {
  968. printf("execle failed_error ID:%d,%s\n", errno, strerror(errno));
  969. }
  970. else
  971. {
  972. printf("execle Successed!");
  973. }
  974. sleep(1);
  975. int fd0, fd1, fd2;
  976. fd0 = open("/dev/null", O_RDWR);
  977. fd1 = dup(0);
  978. fd2 = dup(0);
  979. }
  980. #endif //RVC_OS_WIN
  981. }
  982. bool CHealthManagerEntity::DoRestart()
  983. {
  984. LOG_FUNCTION();
  985. CSmartPointer<IConfigInfo> spConfig;
  986. ErrorCodeEnum err = GetFunction()->OpenConfig(Config_Software, spConfig);
  987. if (err != Error_Succeed) {
  988. LOG_TRACE("open cfg file failed!");
  989. return false;
  990. }
  991. m_restartHour = m_restartMinute = 1;
  992. m_maxRestartTimes = 3;
  993. int defaultTimesMax,defaultInternal,lowTimesMax,lowInternal;
  994. defaultTimesMax = 10;
  995. defaultInternal = 600000;
  996. lowTimesMax = 5;
  997. lowInternal = 600000;
  998. spConfig->ReadConfigValueInt("init","RestartHour",m_restartHour);
  999. spConfig->ReadConfigValueInt("init","RestartMinute",m_restartMinute);
  1000. int testflag;
  1001. spConfig->ReadConfigValueInt("init","TestFlag",testflag);
  1002. m_testFlag = testflag;
  1003. spConfig->ReadConfigValueInt("Run","MaxRestartTimes",m_maxRestartTimes);
  1004. Dbg("m_maxRestartTimes(%d)",m_maxRestartTimes);
  1005. spConfig->ReadConfigValueInt("ModRestartSettings","DefaultTimesMax",defaultTimesMax);
  1006. spConfig->ReadConfigValueInt("ModRestartSettings","DefaultInternal",defaultInternal);
  1007. spConfig->ReadConfigValueInt("ModRestartSettings","LowTimesMax",lowTimesMax);
  1008. spConfig->ReadConfigValueInt("ModRestartSettings","LowInternal",lowInternal);
  1009. m_restartMode[RESTART_MODE_DEFAULT].dwTimes = defaultTimesMax;
  1010. m_restartMode[RESTART_MODE_DEFAULT].dwInternal = defaultInternal;
  1011. m_restartMode[RESTART_MODE_LOW].dwTimes = lowTimesMax;
  1012. m_restartMode[RESTART_MODE_LOW].dwInternal = lowInternal;
  1013. CSimpleStringA csDefaultModule,csLowModule;
  1014. spConfig->ReadConfigValue("ModRestartSettings","DefaultModule",csDefaultModule);
  1015. spConfig->ReadConfigValue("ModRestartSettings","LowModule",csLowModule);
  1016. SplitModuleNames(csDefaultModule,RESTART_MODE_DEFAULT);
  1017. SplitModuleNames(csLowModule,RESTART_MODE_LOW);
  1018. Dbg("%d:%d",m_restartHour,m_restartMinute);
  1019. CSmartPointer<IConfigInfo> spConfigRun;
  1020. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
  1021. spConfigRun->ReadConfigValueInt("Run", "LastHour", m_lastHour);
  1022. m_dayNum = 1;
  1023. spConfigRun->ReadConfigValueInt("Restart", "DayNum", m_dayNum);
  1024. if (m_dayNum == 0)
  1025. {
  1026. spConfigRun->WriteConfigValueInt("Restart", "DayNum", 0);
  1027. }
  1028. spConfigRun->ReadConfigValueInt("Run", "RestartTimes", m_restartTimes);
  1029. CSmartPointer<IConfigInfo> spCerConfig;
  1030. eErr = GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);
  1031. spCerConfig->ReadConfigValueInt(GetEntityName(), "MaxRunDays", m_maxRunDays);
  1032. Dbg("central setting:m_maxRunDays:%d,DayNum:%d", m_maxRunDays,m_dayNum);
  1033. SYSTEMTIME localTime;
  1034. GetLocalTimeRVC(localTime);
  1035. if (m_bInit)
  1036. {
  1037. m_bInit = false;
  1038. m_wDayOfWeek = localTime.wDayOfWeek;
  1039. }
  1040. eErr = GetFunction()->GetSystemStaticInfo(m_sysStaticInfo);
  1041. if (eErr != Error_Succeed)
  1042. {
  1043. Dbg("Get system static info failed(%d).", eErr);
  1044. m_sysStaticInfo.strMachineType = "";
  1045. m_sysStaticInfo.strSite = "";
  1046. m_sysStaticInfo.InstallVersion = CVersion();
  1047. }
  1048. ReadMachineDataBySyncSerivce();
  1049. ITimerListener *pListener = new TimerOutHelper<CHealthManagerEntity>(this, &CHealthManagerEntity::OnCheckTimeTimeout);
  1050. Dbg("set timer");
  1051. GetFunction()->SetTimer(HEALTHMANAGER_TIMER_ID, pListener, HEALTHMANAGER_TIMER_INTERVAL);
  1052. //oiltmp 20131204 commented,the following upline(...)add it
  1053. //DoWatchDog(WD_OP_START);
  1054. //ITimerListener *pWDListener = new TimerOutHelper<CHealthManagerEntity>(this, &CHealthManagerEntity::OnWatchDogTimeout);
  1055. //GetFunction()->SetTimer(HEALTHMANAGER_WD_TIMER_ID, pWDListener, HEALTHMANAGER_WD_TIMER_INTERVAL);
  1056. CSimpleStringA deamonBasePath = "";
  1057. err = GetFunction()->GetPath("bin",deamonBasePath);
  1058. if (err != Error_Succeed)
  1059. {
  1060. Dbg("for wait deamon get bin path failed(%d).",err);
  1061. return Error_IO;
  1062. }
  1063. #ifdef linux
  1064. deamonBasePath += "/GuardianBase.so";
  1065. Dbg("gd path [%s]", (LPCTSTR)deamonBasePath);
  1066. void* handle = dlopen(deamonBasePath, RTLD_LAZY);
  1067. if (handle == NULL)
  1068. {
  1069. Dbg("load GuardianBase.so failed(%d)", errno);
  1070. return Error_IO;
  1071. }
  1072. m_pfShake = (pfShakeHands)dlsym(handle, "ShakeHands");
  1073. if (m_pfShake == NULL)
  1074. {
  1075. Dbg("get ShakeHands failed(%d)", GetLastError());
  1076. return Error_IO;
  1077. }
  1078. m_pfUpgradeRestart = (pfUpgradeRestart)dlsym(handle, "UpgradeRestart");
  1079. if (m_pfUpgradeRestart == NULL)
  1080. {
  1081. Dbg("get UpgradeRestart failed(%d)", GetLastError());
  1082. return Error_IO;
  1083. }
  1084. #else
  1085. deamonBasePath += "\\GuardianBase.dll";
  1086. HMODULE hDll = LoadLibraryA(deamonBasePath);
  1087. Dbg("gd path [%s]", (LPCTSTR)deamonBasePath);
  1088. if (hDll == NULL)
  1089. {
  1090. Dbg("load guardianbase.dll failed(%d)", GetLastError());
  1091. return Error_IO;
  1092. }
  1093. m_pfShake = (pfShakeHands)GetProcAddress(hDll,"ShakeHands");
  1094. if (m_pfShake == NULL)
  1095. {
  1096. Dbg("get shakehands failed(%d)",GetLastError());
  1097. return Error_IO;
  1098. }
  1099. m_pfUpgradeRestart = (pfUpgradeRestart)GetProcAddress(hDll,"UpgradeRestart");
  1100. if (m_pfUpgradeRestart == NULL)
  1101. {
  1102. Dbg("get UpgradeRestart failed(%d)",GetLastError());
  1103. return Error_IO;
  1104. }
  1105. #endif //linux
  1106. Dbg("have load guardian.");
  1107. if (CheckGuardianIsRun(true))
  1108. {
  1109. Sleep(500);
  1110. Dbg("to tell guardian framework is starting.");
  1111. eErr = m_pfUpgradeRestart(4, 0);//tell guardian framework is starting...oilyang 20150514
  1112. Dbg("feedback of framework is starting.%d",eErr);
  1113. }
  1114. m_currentVer = "";
  1115. UpdateSiteToRuncfg();
  1116. return true;
  1117. }
  1118. void CHealthManagerEntity::SplitModuleNames(CSimpleStringA csLine, ModuleReMode eMode)
  1119. {
  1120. string str((const char*)csLine);
  1121. size_t pos = 0,nameEnd = 0;
  1122. size_t len = str.length();
  1123. while(1)
  1124. {
  1125. nameEnd = str.find(',',pos);
  1126. if (nameEnd != string::npos)
  1127. {
  1128. m_modCfgInfo[str.substr(pos,nameEnd-pos).c_str()] = eMode;
  1129. pos = nameEnd + 1;
  1130. }
  1131. else
  1132. {
  1133. if (pos < len)
  1134. m_modCfgInfo[str.substr(pos,nameEnd-pos).c_str()] = eMode;
  1135. break;
  1136. }
  1137. }
  1138. }
  1139. int CHealthManagerEntity::ConnectUps()
  1140. {
  1141. if (m_pUpsClient == NULL)
  1142. {
  1143. m_pUpsClient = new UpsService_ClientBase(this);
  1144. ErrorCodeEnum eErrConn = m_pUpsClient->Connect();
  1145. if (eErrConn != Error_Succeed) {
  1146. Dbg("Ups connected failed(%d).",eErrConn);
  1147. //m_pUpsClient->SafeDelete();
  1148. m_pUpsClient = NULL;
  1149. }
  1150. else
  1151. {
  1152. Dbg("ups entity connected.");
  1153. UpsService_GetStatus_Req req;
  1154. UpsService_GetStatus_Ans ans;
  1155. ErrorCodeEnum eErrState = m_pUpsClient->GetStatus(req,ans,3000);
  1156. if (eErrState == Error_Succeed)
  1157. {
  1158. m_bGetUpsStateFlag = true;
  1159. Dbg("current state %d",ans.Status);
  1160. return 0;
  1161. }
  1162. else
  1163. Dbg("connect get ups state failed(%d).",eErrState);
  1164. }
  1165. }
  1166. return -1;
  1167. }
  1168. bool CHealthManagerEntity::SaveCurrentVersion()
  1169. {
  1170. CSimpleStringA csRootVer,csRunInfo,csBakFile,csVerFile;
  1171. ErrorCodeEnum eErr;
  1172. if ((eErr = GetFunction()->GetPath("RootVer",csRootVer)) != Error_Succeed)
  1173. {
  1174. LOG_TRACE("Get version path failed(%d).",eErr);
  1175. return false;
  1176. }
  1177. if ((eErr = GetFunction()->GetPath("RunInfo",csRunInfo)) != Error_Succeed)
  1178. {
  1179. Dbg("get runinfo path failed(%d)",eErr);
  1180. return false;
  1181. }
  1182. //csVerFile = csRootVer + "\\active.txt";
  1183. csBakFile = csRunInfo + "/runcfg/version.dat";
  1184. //ifstream infile(csVerFile,std::ifstream::binary);
  1185. ofstream outfile (csBakFile,std::ofstream::binary);
  1186. //infile.seekg (0,infile.end);
  1187. //long size = infile.tellg();
  1188. //infile.seekg (0,infile.beg);
  1189. CSimpleStringA csCurrVer = m_sysStaticInfo.InstallVersion.ToString();
  1190. Dbg("get current version [%s]",(LPCTSTR)csCurrVer);
  1191. int size = csCurrVer.GetLength();
  1192. char* buffer = new char[size];
  1193. ZeroMemory(buffer,size);
  1194. //infile.read (buffer,size);
  1195. memcpy(buffer,csCurrVer,size);
  1196. outfile.write (buffer,size);
  1197. delete[] buffer;
  1198. outfile.close();
  1199. //infile.close();
  1200. return true;
  1201. }
  1202. bool CHealthManagerEntity::SaveFrameStartTimeForUpgrade()
  1203. {
  1204. CSimpleStringA csRunInfo,csBakFile;
  1205. ErrorCodeEnum eErr;
  1206. if ((eErr = GetFunction()->GetPath("RunInfo",csRunInfo)) != Error_Succeed)
  1207. {
  1208. Dbg("get runinfo path failed(%d)",eErr);
  1209. return false;
  1210. }
  1211. //csVerFile = csRootVer + "\\active.txt";
  1212. csBakFile = csRunInfo + "/runcfg/starttime.dat";
  1213. //ifstream infile(csVerFile,std::ifstream::binary);
  1214. ofstream outfile (csBakFile,std::ofstream::binary);
  1215. CSystemRunInfo sysRunInfo;
  1216. GetFunction()->GetSystemRunInfo(sysRunInfo);
  1217. if (eErr != Error_Succeed)
  1218. {
  1219. Dbg("Get system run info failed(%d).",eErr);
  1220. return false;
  1221. }
  1222. CSimpleStringA csStartTime = sysRunInfo.tmStart.ToTimeString();
  1223. Dbg("get current time start [%s]",(LPCTSTR)csStartTime);
  1224. int size = csStartTime.GetLength();
  1225. char* buffer = new char[size];
  1226. ZeroMemory(buffer,size);
  1227. //infile.read (buffer,size);
  1228. memcpy(buffer,csStartTime,size);
  1229. outfile.write (buffer,size);
  1230. delete[] buffer;
  1231. outfile.close();
  1232. //infile.close();
  1233. return true;
  1234. }
  1235. bool CHealthManagerEntity::VersionRollBack(const char *pVerion)
  1236. {
  1237. CSimpleStringA csCurrVer = m_sysStaticInfo.InstallVersion.ToString();
  1238. if (_stricmp(csCurrVer,pVerion) == 0)
  1239. {
  1240. Dbg("destination version identified the current version.");
  1241. return false;
  1242. }
  1243. m_pUpgMgr = new UpgradeMgrService_ClientBase(this);
  1244. if (m_pUpgMgr == NULL)
  1245. {
  1246. Dbg("create UpgradeMgr client failed.");
  1247. return false;
  1248. }
  1249. CSmartPointer<IAsynWaitSp> pAsyncWait;
  1250. ErrorCodeEnum eErr = m_pUpgMgr->Connect(pAsyncWait);
  1251. if (eErr != Error_Succeed)
  1252. {
  1253. Dbg("connect to UpgradeMgr failed(%d)",eErr);
  1254. return false;
  1255. }
  1256. else
  1257. eErr = pAsyncWait->WaitAnswer(10000);
  1258. UpgradeMgrService_RollbackUpdate_Req req;
  1259. req.strVersion = pVerion;
  1260. UpgradeMgrService_RollbackUpdate_Ans ans;
  1261. eErr = m_pUpgMgr->RollbackUpdate(req,ans,10000);
  1262. if (eErr == Error_Succeed)
  1263. {
  1264. Dbg("version rollback doing.");
  1265. m_bVerRollback = true;
  1266. return true;
  1267. }
  1268. else
  1269. {
  1270. Dbg("UpgradeMgr rollback failed(%d)",eErr);
  1271. return false;
  1272. }
  1273. }
  1274. void CHealthManagerEntity::ReadMachineDataBySyncSerivce()
  1275. {
  1276. ErrorCodeEnum eSync;
  1277. if (m_pSync == NULL)
  1278. {
  1279. m_pSync = new SyncService_ClientBase(this);
  1280. if (m_pSync != NULL)
  1281. {
  1282. ErrorCodeEnum eSync = m_pSync->Connect();
  1283. if (eSync != Error_Succeed)
  1284. {
  1285. Dbg("connect to SyncService failed %d.",eSync);
  1286. //m_pSync->SafeDelete();
  1287. m_pSync = NULL;
  1288. }
  1289. }
  1290. }
  1291. else
  1292. {
  1293. SyncService_GetMachineData_Req req;
  1294. SyncService_GetMachineData_Ans ans;
  1295. req.key = "MenuChoice";
  1296. eSync = m_pSync->GetMachineData(req,ans,10000);
  1297. if (eSync == Error_Succeed)
  1298. {
  1299. m_menuChoice = ans.value;
  1300. if (m_menuPre.Compare(m_menuChoice) != 0)
  1301. {
  1302. m_menuPre = m_menuChoice;
  1303. Dbg("menu:[%s]", (LPCTSTR)m_menuChoice);
  1304. if (m_menuChoice.Compare("Main") == 0)
  1305. {
  1306. //according to yangzixiong,comment it. by oilyang 20160615
  1307. //LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_OFF, "usb off");//just for Stand2S
  1308. }
  1309. }
  1310. }
  1311. else
  1312. {
  1313. m_menuChoice = "";
  1314. }
  1315. }
  1316. }
  1317. int CHealthManagerEntity::GetNetDeviceState()
  1318. {
  1319. return 0;
  1320. }
  1321. int CHealthManagerEntity::UpdateSiteChangeFlag()
  1322. {
  1323. CSmartPointer<IConfigInfo> spConfig;
  1324. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfig);
  1325. if (eErr != Error_Succeed) {
  1326. Dbg("UpdateSiteChangeFlag open run cfg file failed!");
  1327. return -1;
  1328. }
  1329. eErr = spConfig->WriteConfigValueInt("AboutSite", "SiteChanged", 1);
  1330. Dbg("Write SiteChanged 1.err[%d]",eErr);
  1331. return 0;
  1332. }
  1333. int CHealthManagerEntity::UpdateSiteToRuncfg(bool bWriteSite,bool bClearSiteFlag)
  1334. {
  1335. Dbg("bClearSiteFlag[%d]",bClearSiteFlag);
  1336. CSmartPointer<IConfigInfo> spConfig;
  1337. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfig);
  1338. if (eErr != Error_Succeed) {
  1339. Dbg("UpdateSiteToRuncfg open run cfg file failed!");
  1340. return -1;
  1341. }
  1342. if (!bClearSiteFlag)
  1343. {
  1344. int siteChangedFlag = 0;
  1345. eErr = spConfig->ReadConfigValueInt("AboutSite", "SiteChanged", siteChangedFlag);
  1346. if (eErr == Error_Succeed)
  1347. {
  1348. if (siteChangedFlag != 0)
  1349. {
  1350. bWriteSite = false;
  1351. }
  1352. }
  1353. }
  1354. else
  1355. {
  1356. eErr = spConfig->WriteConfigValueInt("AboutSite", "SiteChanged", 0);
  1357. Dbg("UpdateSiteToRuncfg.Write Site (%d).", eErr);
  1358. }
  1359. if (bWriteSite)
  1360. {
  1361. spConfig->WriteConfigValue("AboutSite", "Site", m_sysStaticInfo.strSite);
  1362. }
  1363. return 0;
  1364. }
  1365. int CHealthManagerEntity::WriteSiteToRootIni()
  1366. {
  1367. LOG_FUNCTION();
  1368. CSmartPointer<IConfigInfo> spConfig;
  1369. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfig);
  1370. if (eErr != Error_Succeed) {
  1371. Dbg("UpdateSiteToRuncfg open run cfg file failed!");
  1372. return -1;
  1373. }
  1374. CSimpleStringA csSite("");
  1375. eErr = spConfig->ReadConfigValue("AboutSite", "Site", csSite);
  1376. if (eErr == Error_Succeed)
  1377. {
  1378. CSimpleStringA path("");
  1379. GetFunction()->GetPath("HardwareCfg", path);
  1380. path.Append("\\");
  1381. path.Append("root.ini");
  1382. Dbg("WriteSiteToRootIni[%s]",(LPCTSTR)path);
  1383. //oiltestlinux comment the following 2 lines
  1384. //BOOL bRet = ::WritePrivateProfileStringA("Terminal", "Site", csSite, path);
  1385. //Dbg("WriteSiteToRootIni:write site bRet = %d", bRet);
  1386. }
  1387. }
  1388. int CHealthManagerEntity::RestartIE()
  1389. {
  1390. m_bNeedToRestartIE = false;
  1391. CSmartPointer<IAsynWaitSp> spWait;
  1392. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = GetFunction().ConvertCase<IEntityFunctionPrivilege>();
  1393. ErrorCodeEnum eErr = pFuncPrivilege->TerminateEntity("IEBrowser", spWait);
  1394. if (eErr == Error_Succeed)
  1395. {
  1396. if (spWait != NULL)
  1397. spWait->WaitAnswer(10000);
  1398. }
  1399. else
  1400. Dbg("TerminateEntity ie failed.%d", eErr);
  1401. Dbg("Url value:%s", (const char*)m_fsm.GetUrlValue());
  1402. eErr = pFuncPrivilege->StartEntity("IEBrowser", m_fsm.GetUrlValue(), spWait);
  1403. if (eErr == Error_Succeed)
  1404. {
  1405. if (spWait != NULL)
  1406. eErr = spWait->WaitAnswer(15000);
  1407. }
  1408. else
  1409. {
  1410. Dbg("Start IEBrowser failed(%d).", eErr);
  1411. }
  1412. return 0;
  1413. }
  1414. void CHealthManagerEntity::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx)
  1415. {
  1416. CSystemStaticInfo info;
  1417. GetFunction()->GetSystemStaticInfo(info);
  1418. NetworkAddressesList macAddrs;
  1419. NetworkAddressesList ipAddrs;
  1420. GetINETMacAddresses(macAddrs, ipAddrs);
  1421. ctx->Ans.ip = ipAddrs;
  1422. ctx->Ans.mac = macAddrs;
  1423. ctx->Ans.machineType = info.strMachineType;
  1424. ctx->Ans.site = info.strSite;
  1425. ctx->Ans.terminalNo = info.strTerminalID;
  1426. ctx->Ans.termLimit = __ReadCenterConfigStr("TermLimitSwitch", "IEBrowser");
  1427. ctx->Ans.termVersion = info.InstallVersion.ToString();
  1428. ctx->Answer(Error_Succeed);
  1429. }
  1430. void CHealthManagerEntity::ReadCenterConfigStr(SpReqAnsContext<HealthManagerService_ReadCenterConfigStr_Req, HealthManagerService_ReadCenterConfigStr_Ans>::Pointer ctx)
  1431. {
  1432. ctx->Ans.value = __ReadCenterConfigStr(ctx->Req.key, ctx->Req.entity);
  1433. ctx->Answer(Error_Succeed);
  1434. }
  1435. CSimpleStringA CHealthManagerEntity::__ReadCenterConfigStr(CSimpleStringA key, CSimpleStringA entityName = "")
  1436. {
  1437. CSimpleStringA str = "";
  1438. CSmartPointer<IConfigInfo> spCerConfig;
  1439. ErrorCodeEnum err = GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);
  1440. if (entityName == "")
  1441. {
  1442. spCerConfig->ReadConfigValue("IEBrowser", key, str);
  1443. }
  1444. else
  1445. {
  1446. spCerConfig->ReadConfigValue(entityName, key, str);
  1447. }
  1448. return str;
  1449. }
  1450. void CHealthManagerEntity::GetINETMacAddresses(NetworkAddressesList &macList, NetworkAddressesList &ipList)
  1451. {
  1452. #ifdef RVC_OS_WIN
  1453. PIP_ADAPTER_ADDRESSES pAddresses = NULL;
  1454. ULONG family = AF_INET;
  1455. ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
  1456. ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
  1457. Dbg("GetINETMacAddresses");
  1458. // Make an initial call to GetAdaptersAddresses to get the
  1459. // size needed into the outBufLen variable
  1460. if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
  1461. {
  1462. pAddresses = static_cast<PIP_ADAPTER_ADDRESSES>(HeapAlloc(GetProcessHeap(), 0, outBufLen));
  1463. }
  1464. Dbg("GetAdaptersAddresses 1");
  1465. if (NULL == pAddresses)
  1466. {
  1467. Dbg("pAddresses = NULL");
  1468. return;
  1469. }
  1470. // _ASSERT( pAddresses );
  1471. // Make a second call to GetAdapters Addresses to get the
  1472. // actual data we want
  1473. DWORD dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
  1474. Dbg("GetAdaptersAddresses 2");
  1475. /* MACAddresses vAddress;*/
  1476. if (dwRetVal != ERROR_SUCCESS)
  1477. {
  1478. Dbg("dwRetVal = %d", dwRetVal);
  1479. return;
  1480. }
  1481. PIP_ADAPTER_ADDRESSES pFirst = pAddresses;
  1482. while (pAddresses)
  1483. {
  1484. if (pAddresses->FirstUnicastAddress->Address.lpSockaddr->sa_family == AF_INET &&
  1485. pAddresses->OperStatus == IfOperStatusUp &&
  1486. pAddresses->IfType != IF_TYPE_SOFTWARE_LOOPBACK)
  1487. {
  1488. Dbg("in while if 1");
  1489. BYTE* pa = pAddresses->PhysicalAddress;
  1490. if (!pa)
  1491. {
  1492. pAddresses = pAddresses->Next ? pAddresses->Next : NULL;
  1493. continue;
  1494. }
  1495. Dbg("in while if 2");
  1496. char bAddressBytes[MACSESION];
  1497. int bAddressInt[MACSESION];
  1498. memset(bAddressBytes, 0, MACSESION);
  1499. size_t nAddressSize = pAddresses->PhysicalAddressLength;
  1500. memcpy(bAddressBytes, pa, (nAddressSize < MACSESION ? nAddressSize : MACSESION));
  1501. char CommarSeperatedAddress[MACSESION * 3] = { 0 };
  1502. for (int i = 0; i < MACSESION; ++i)
  1503. {
  1504. bAddressInt[i] = bAddressBytes[i];
  1505. bAddressInt[i] &= 0x000000ff; // avoid "ff" leading bytes when "char" is lager then 0x7f
  1506. }
  1507. Dbg("in while if 3");
  1508. sprintf(CommarSeperatedAddress, "%02x:%02x:%02x:%02x:%02x:%02x",
  1509. bAddressInt[0],
  1510. bAddressInt[1],
  1511. bAddressInt[2],
  1512. bAddressInt[3],
  1513. bAddressInt[4],
  1514. bAddressInt[5]); // Should use scl::FormatString inside
  1515. CSimpleStringA tmpmac = CSimpleStringA(CommarSeperatedAddress);
  1516. Dbg("in while if 4");
  1517. macList.Append(&tmpmac, 0, 1);
  1518. // macList.push_back( std::string( CommarSeperatedAddress ) );
  1519. Dbg("Description : %s", pAddresses->Description);
  1520. Dbg("OperStatus : %d, IfType = %d, mac = %s", pAddresses->OperStatus, pAddresses->IfType, CommarSeperatedAddress);
  1521. sockaddr_in *sa_in = (sockaddr_in *)pAddresses->FirstUnicastAddress->Address.lpSockaddr;
  1522. char buf_addr[100] = { 0 };
  1523. CSimpleStringA tmpip = CSimpleStringA(inet_ntop(AF_INET, &(sa_in->sin_addr), buf_addr, 100));
  1524. ipList.Append(&tmpip, 0, 1);
  1525. }
  1526. pAddresses = pAddresses->Next ? pAddresses->Next : NULL;
  1527. }
  1528. HeapFree(GetProcessHeap(), 0, pFirst);
  1529. return;
  1530. #else
  1531. return;//oiltestlinux
  1532. #endif //RVC_OS_WIN
  1533. }
  1534. void CHealthManagerEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  1535. const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  1536. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName, const char *pszMessage)
  1537. {
  1538. // MessageBoxA(0,0,0,0);
  1539. //if (dwUserCode != LOG_EVT_HEARTBEAT_UN_CONNECTED)
  1540. // Dbg("user code:%x,from entity:%s",dwUserCode,pszEntityName);
  1541. switch (dwUserCode) {
  1542. case EVENT_RESTART_SHELL:
  1543. case Event_Req_Framework_Restart: //case framework restart after upgrade
  1544. case EVENT_CONSOLE_REQ_RESTART_SHELL:
  1545. case Event_Req_Framework_Rollback://case after rollback
  1546. //according to zl commented the following line 20150828
  1547. //case EVENT_UKEY_CUSTOMER_MANANAGER_SYS_EXIT:
  1548. case LOG_EVT_IEBROWSER_RESET_SITE_RESTART: //重设root.ini的site,重启框架
  1549. case LOG_EVT_HEARTBEAT_UN_CONNECTED: //重设site后框架分行服务连接不上,再次重启回退到前一版本
  1550. {
  1551. bool bCheckGuardian = CheckGuardianIsRun();
  1552. if (!bCheckGuardian)
  1553. {
  1554. bool bStartGuardian = StartGuardian();
  1555. if (!bStartGuardian)
  1556. {
  1557. Dbg("Before restart frame,start guardian failed.");
  1558. break;
  1559. }
  1560. Dbg("Before restart frame,start guardian suc.");
  1561. Sleep(2000);
  1562. }
  1563. if (dwUserCode == Event_Req_Framework_Restart)
  1564. {
  1565. SaveCurrentVersion();
  1566. SaveFrameStartTimeForUpgrade();
  1567. if (CheckGuardianIsRun(true))
  1568. {
  1569. ErrorCodeEnum eErr = Error_Unexpect;
  1570. eErr = m_pfUpgradeRestart(1, 0);
  1571. Dbg("to tell guardian framework is restarting.%d",eErr);
  1572. }
  1573. m_eRebootTrigger = RebootTrigger_FrameUpgrade;
  1574. }
  1575. else if (dwUserCode == Event_Req_Framework_Rollback)
  1576. {
  1577. Dbg("version rollback succeed.to restart framework");
  1578. m_bVerRollback = false;
  1579. m_eRebootTrigger = RebootTrigger_RollBack;
  1580. }
  1581. else if (dwUserCode == LOG_EVT_IEBROWSER_RESET_SITE_RESTART)
  1582. {
  1583. UpdateSiteChangeFlag();
  1584. m_eRebootTrigger = RebootTrigger_Resource;
  1585. }
  1586. else if (dwUserCode == LOG_EVT_HEARTBEAT_UN_CONNECTED)
  1587. {
  1588. CSmartPointer<IConfigInfo> spConfig;
  1589. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfig);
  1590. int tmpFlag = 99;
  1591. spConfig->ReadConfigValueInt("AboutSite", "SiteChanged", tmpFlag);
  1592. if (tmpFlag != 1)
  1593. {
  1594. //Dbg("heartbeat can't connect(normal).no need to rollback.");
  1595. break;
  1596. }
  1597. WriteSiteToRootIni();
  1598. UpdateSiteToRuncfg(false, true);
  1599. }
  1600. m_eRebootWay = RebootWay_Framework;
  1601. BOOL bRet = FrameworkShutdown();
  1602. Dbg("framework shutdown [%d]", bRet);
  1603. }
  1604. break;
  1605. case EVENT_CONSOLE_REQ_SHUTDOWN_SHELL:
  1606. {
  1607. BOOL bRet = FrameworkShutdown(false);
  1608. Dbg("framework shutdown [%d]", bRet);
  1609. }
  1610. break;
  1611. case EVENT_RESTART_MACHINE:
  1612. case Event_Req_OS_Restart://case os restart after outside update
  1613. case EVENT_CONSOLE_REQ_RESTART_POWER:
  1614. {
  1615. if (dwUserCode == Event_Req_OS_Restart)
  1616. m_eRebootTrigger = RebootTrigger_OSUpgrade;
  1617. else
  1618. m_eRebootTrigger = RebootTrigger_Unknown;
  1619. m_eRebootWay = RebootWay_Power;
  1620. BOOL bRet = SystemRestart(false,true);
  1621. Dbg("os restart [%d]", bRet);
  1622. }
  1623. break;
  1624. case LOG_EVT_IEBROWSER_RESTART_MACHINE:
  1625. {
  1626. m_eRebootTrigger = RebootTrigger_Unknown;
  1627. m_eRebootWay = RebootWay_Power;
  1628. BOOL bRet = SystemRestart(false, true,true);
  1629. Dbg("machine restart now [%d]", bRet);
  1630. break;
  1631. }
  1632. case LOG_EVT_IEBROWSER_SHUTDOWN_MACHINE:
  1633. {
  1634. Dbg("User descktop said to shutdown machine now.");
  1635. SystemShutdown();
  1636. break;
  1637. }
  1638. case LOG_EVT_SELFCHECK_OS_RESTART:
  1639. Dbg("selfcheck to wait chance to restart(os) pc.");
  1640. m_eRebootTrigger = RebootTrigger_RunExcepition;
  1641. m_eRebootWay = RebootWay_Power;
  1642. m_bWaitRestartPC = true;
  1643. break;
  1644. case LOG_EVT_SELFCHECK_POWER_RESTART:
  1645. Dbg("selfcheck to wait chance to restart(power) pc.");
  1646. m_eRebootTrigger = RebootTrigger_RunExcepition;
  1647. m_eRebootWay = RebootWay_Power;
  1648. m_bWaitRestartPC = true;
  1649. break;
  1650. //commented the following 4 event oilyang 20140616
  1651. //case ERROR_MOD_MEDIACONTROLLER_ENVCAMERA_BUG://environment camera error
  1652. //case EVENT_MOD_FACE_ENVCAM_ERROR:
  1653. // Dbg("Environment camera restart");
  1654. // RestartModule("MediaController");
  1655. // break;
  1656. //case ERROR_MOD_MEDIACONTROLLER_OPECAMERA_BUG://operation camera error
  1657. //case EVENT_MOD_FACE_OPECAM_ERROR:
  1658. // Dbg("Operation camera restart");
  1659. // RestartModule("MediaController");
  1660. // break;
  1661. case EVENT_ACCESSAUTH_SUCCEED:
  1662. Dbg("access auth succeed.");
  1663. m_fsm.SetAccessAuth();
  1664. m_bAccessSuc = true;
  1665. break;
  1666. case EVENT_ACCESSAUTH_FAILED:
  1667. case EVENT_ACCESSAUTH_TIMEOUT:
  1668. Dbg("access auth failed or timeout(%d).", dwUserCode);
  1669. m_fsm.SetAccessFailedFlag();
  1670. m_bAccessSuc = false;
  1671. break;
  1672. case EVENT_MOD_INITIALIZER_MK_LOADED:
  1673. Dbg("init succeed.");
  1674. m_fsm.SetInitSucFlag();
  1675. break;
  1676. case EVENT_MOD_INITIALIZER_MK_FAILED:
  1677. Dbg("init failed.");
  1678. m_fsm.SetInitFailFlag();
  1679. break;
  1680. case EVENT_MOD_FACE_OPENCV_ERROR:
  1681. RestartModule("FaceTracking");
  1682. break;
  1683. case LOG_EVT_INC_VERSION_ROLLBACK:
  1684. Dbg("version to be rollback to %s", pszMessage);
  1685. if (!m_bVerRollback)
  1686. {
  1687. Dbg("rollbacking");
  1688. VersionRollBack(pszMessage);
  1689. }
  1690. break;
  1691. case LOG_EVT_SELFCHECK_TOKEN_KEEPER_LOST:
  1692. {
  1693. ErrorCodeEnum eErr = RestartModule("TokenKeeper");
  1694. Dbg("to re accessauth");
  1695. m_fsm.ToReAccessAuth();
  1696. }
  1697. break;
  1698. case EVENT_UKEY_CUSTOMER_MANANAGER_SYS_ENTER:
  1699. {
  1700. Dbg("to enter customer manager system.");
  1701. m_fsm.SetCustomerMngerState(CM_ENTER);//set enter state
  1702. FSMEvent *pEvt = new FSMEvent(USER_EVT_ENTER_CUSTOMER_MANAGER);
  1703. m_fsm.PostEventFIFO(pEvt);
  1704. }
  1705. break;
  1706. case LOG_EVT_HEARTBEAT_CONNECTED:
  1707. UpdateSiteToRuncfg(true, true);
  1708. break;
  1709. case EVENT_MOD_CENTERSETTING_RVCWEBVER_CHANGE:
  1710. m_bNeedToRestartIE = true;
  1711. break;
  1712. //case EVENT_UKEY_NOT_ENTER_CUSTOMER_MANANAGER:
  1713. // {
  1714. // Dbg("NOT to enter customer manager system.");
  1715. // m_fsm.SetCustomerMngerState(CM_NOT_ENTER);//set enter state
  1716. // }
  1717. // break;
  1718. case EVENT_MOD_RELEASESIP_TIMEOUT:
  1719. RestartModule("SIPPhone");
  1720. break;
  1721. case LOG_EVT_SELFCHECK_IEBROWSER_IDLE:
  1722. //IE重启之后,重置是否进入主页变量
  1723. m_bFisrtEnterMainPage = true;
  1724. m_bEnterMainPageEver = false;
  1725. break;
  1726. case LOG_EVT_INC_TRADE_MANAGER_NORMAL:
  1727. case LOG_EVT_INC_TRADE_MANAGER_ON:
  1728. case LOG_EVT_INC_TRADE_MANAGER_OFF:
  1729. {
  1730. TradeManage tm;
  1731. if (dwUserCode == LOG_EVT_INC_TRADE_MANAGER_NORMAL)
  1732. tm.op = 0;
  1733. else if (dwUserCode == LOG_EVT_INC_TRADE_MANAGER_ON)
  1734. tm.op = 1;
  1735. else if (dwUserCode == LOG_EVT_INC_TRADE_MANAGER_OFF)
  1736. tm.op = 2;
  1737. tm.time = pszMessage;
  1738. Dbg("trademanager:%d,%s",tm.op,(const char*)tm.time);
  1739. SpSendBroadcast(GetFunction(), SP_MSG_OF(TradeManage), SP_MSG_SIG_OF(TradeManage), tm);
  1740. }
  1741. case LOG_EVT_INC_DEVICE_LOCK_ON:
  1742. case LOG_EVT_INC_DEVICE_UNLOCK:
  1743. case LOG_EVT_INC_DEVICE_KICK_OFF:
  1744. {
  1745. TerminalManager tm;
  1746. if (dwUserCode == LOG_EVT_INC_DEVICE_LOCK_ON)
  1747. tm.op = 0;
  1748. else if (dwUserCode == LOG_EVT_INC_DEVICE_UNLOCK)
  1749. {
  1750. if (m_bAccessSuc)
  1751. tm.op = 1;
  1752. else
  1753. tm.op = 99;//oilyang@20170818 according to xingzichen
  1754. }
  1755. else if (dwUserCode == LOG_EVT_INC_DEVICE_KICK_OFF)
  1756. tm.op = 2;
  1757. Dbg("terminal manager:%d", tm.op);
  1758. SpSendBroadcast(GetFunction(), SP_MSG_OF(TerminalManager), SP_MSG_SIG_OF(TerminalManager), tm);
  1759. }
  1760. break;
  1761. case LOG_EVT_SYSTMECUSTOM_START_ACCESSAUTH:
  1762. Dbg("receive md5 ok event.");
  1763. m_fsm.SetMD5OK(1);
  1764. break;
  1765. default:
  1766. //Dbg("unknown event(%d)...", dwUserCode);
  1767. return;
  1768. }
  1769. }
  1770. void CHealthManagerEntity::OnSysVarEvent(const char *pszKey, const char *pszValue, const char *pszOldValue, const char *pszEntityName)
  1771. {
  1772. if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
  1773. {
  1774. if (_strnicmp(pszValue, "M", strlen("M")) == 0)
  1775. {
  1776. m_bInMainPage = true;
  1777. if (m_bFisrtEnterMainPage)
  1778. {
  1779. Dbg("the first enter main page from healthmanager started.");
  1780. m_bFisrtEnterMainPage = false;
  1781. m_bEnterMainPageEver = true;
  1782. LogEvent(Severity_Middle, LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE, "enter main page");
  1783. CSmartPointer<IConfigInfo> spConfigRun;
  1784. ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
  1785. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", 0);
  1786. Dbg("As have been in main page,reset UpgradeRestartTimes.");
  1787. }
  1788. }
  1789. else
  1790. m_bInMainPage = false;
  1791. }
  1792. }
  1793. void CHealthManagerEntity::OnBroadcastEvent(CUUID SubID, const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer)
  1794. {
  1795. if (_strnicmp(pszEntityName, "CardSwiper", strlen("CardSwiper")) == 0)
  1796. {
  1797. if (dwMessageSignature == eMsgSig_ConnectStatus)
  1798. {
  1799. CSimpleStringA tmpDevSN("");
  1800. GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  1801. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  1802. {
  1803. Dbg("This is fwb device.no need to reconnect here.");
  1804. return;
  1805. }
  1806. CardSwiper::ConnectStatus cs;
  1807. SpBuffer2Object(Buffer, cs);
  1808. if (cs.status == 0)
  1809. {
  1810. if (m_connectStatus == 1)
  1811. {
  1812. m_connectStatus = 0;
  1813. }
  1814. }
  1815. else if (cs.status == 1)
  1816. {
  1817. if (m_connectStatus == 0)
  1818. {
  1819. m_connectStatus = 1;
  1820. m_fsm.DeviceReConnect();
  1821. }
  1822. }
  1823. }
  1824. }
  1825. }
  1826. SP_BEGIN_ENTITY_MAP()
  1827. SP_ENTITY(CHealthManagerEntity)
  1828. SP_END_ENTITY_MAP()