guardian.cpp 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409
  1. // guardian.cpp : Defines the entry point for the console application.
  2. //
  3. //#include "stdafx.h"
  4. #ifdef linux
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <sys/socket.h>
  8. #include <sys/epoll.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <dirent.h>
  12. #include <fcntl.h>
  13. #include <unistd.h>
  14. #include <stdio.h>
  15. #include <errno.h>
  16. #include <string.h>
  17. #include <syslog.h>
  18. #include <signal.h>
  19. #include <pthread.h>
  20. int epfd;
  21. struct epoll_event ev;
  22. #define MAXLINE 128
  23. #define OPEN_MAX 100
  24. #define LISTENQ 20
  25. #define INFTIM 1000
  26. #else
  27. #undef UNICODE
  28. #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
  29. #define WIN32_LEAN_AND_MEAN
  30. #include <windows.h>
  31. #include <winsock2.h>
  32. #include <ws2tcpip.h>
  33. #include <TlHelp32.h>
  34. #include <direct.h>
  35. #include <ctime>
  36. #endif //linux
  37. #include <iostream>
  38. #include <fstream>
  39. #include <string>
  40. #include "GuardianBase.h"
  41. #include "guardian.h"
  42. using namespace std;
  43. #define NET_TYPE_WIRELESS 1
  44. #define NET_TYPE_ETHERNET 2
  45. #define NET_TYPE_3G 3
  46. #define NET_TYPE_4G 4
  47. #define NET_TYPE_BLUETOOTH 5
  48. #define DLL_PATH "C:\\RVC\\SystemInit\\CmbPadDll.dll"
  49. typedef DWORD(*pWlanConnect)(BOOL bConnect, int nType);
  50. typedef DWORD (*pDisableBluetooth)(BOOL bDisable);
  51. #ifdef linux
  52. int g_sListen;
  53. pthread_mutex_t g_cs, g_cs_event, g_cs_log;
  54. #define EnterCriticalSectionRVC(xType) pthread_mutex_lock(&xType)
  55. #define LeaveCriticalSectionRVC(xType) pthread_mutex_unlock(&xType)
  56. #else
  57. SOCKET g_sListen = INVALID_SOCKET;
  58. #pragma comment (lib, "Ws2_32.lib")
  59. unsigned int __stdcall DoNetControl(void *pData);
  60. CRITICAL_SECTION g_cs,g_cs_event,g_cs_log;
  61. #define EnterCriticalSectionRVC(xType) EnterCriticalSection(&xType)
  62. #define LeaveCriticalSectionRVC(xType) LeaveCriticalSection(&xType)
  63. #endif //linux
  64. //unsigned int __stdcall DoLog(void *pData);
  65. const int DEFAULT_BUFLEN = 512;
  66. const int SHAKEHAND_BUFZIE = 32;
  67. #define DEFAULT_PORT "30005"
  68. const int default_port = 30005;
  69. int g_needToRollBack = 0;
  70. bool g_bFrameQuit = false,g_bFrameOnline = false,g_bLogFileOpen = false,g_bAuthSuc = false,g_bInUpgrade = false;
  71. ULONGLONG g_dwTimeBegin = 0;
  72. ULONGLONG g_dwUpgradeRestartTimeBegin = 0;
  73. int cnt = 0;
  74. ofstream logFile;
  75. char currDirBuf[256];
  76. char chDisk[2];
  77. void NetControl();
  78. const int MAX_WAIT_TIME_TO_RESTART = 600000;
  79. const int MAX_WAIT_TIME_TO_RESTART_UPGRADE = 110000;
  80. int g_startDay = 0;
  81. //HANDLE g_logHandle;
  82. char g_allMsg[1024];
  83. #ifdef linux
  84. void* DoWorkLinux(void* arg);
  85. void* DoNetControlLinux(void* arg);
  86. #define FUNCTION_STDCALL
  87. typedef unsigned short WORD;
  88. typedef struct _SYSTEMTIME {
  89. WORD wYear;
  90. WORD wMonth;
  91. WORD wDayOfWeek;
  92. WORD wDay;
  93. WORD wHour;
  94. WORD wMinute;
  95. WORD wSecond;
  96. WORD wMilliseconds;
  97. } SYSTEMTIME;
  98. #else
  99. typedef struct
  100. {
  101. OVERLAPPED Overlapped;
  102. WSABUF DataBuf;
  103. CHAR Buffer[DATA_BUFSIZE];
  104. } PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;
  105. typedef struct
  106. {
  107. SOCKET Socket;
  108. } PER_HANDLE_DATA, * LPPER_HANDLE_DATA;
  109. unsigned int __stdcall DoWork(void* pData);
  110. #define FUNCTION_STDCALL __stdcall
  111. #endif
  112. unsigned long long GetTickCountRVC() {
  113. #ifdef linux
  114. struct timespec ts;
  115. clock_gettime(CLOCK_MONOTONIC, &ts);
  116. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  117. #else
  118. return GetTickCount64();
  119. #endif //RVC_OS_WIN
  120. }
  121. void GetLocalTimeRVC(SYSTEMTIME& stTime)
  122. {
  123. #ifdef linux
  124. struct tm* pst = NULL;
  125. time_t t = time(NULL);
  126. pst = localtime(&t);
  127. stTime.wYear = pst->tm_year + 1900;
  128. stTime.wMonth = pst->tm_mon + 1;//because the range of tm_mon is:0-11
  129. stTime.wDay = pst->tm_mday;
  130. stTime.wHour = pst->tm_hour;
  131. stTime.wMinute = pst->tm_min;
  132. stTime.wDayOfWeek = pst->tm_wday;
  133. stTime.wSecond = pst->tm_sec;
  134. stTime.wMilliseconds = 0;
  135. //("oiltest,time:%d,%d,%d,%d", stTime.wYear, stTime.wHour, stTime.wMinute, stTime.wDayOfWeek);
  136. #else
  137. GetLocalTime(stTime);
  138. #endif
  139. }
  140. int BeginThreadRVC(void* (*pFuncLinux)(void*), unsigned int(FUNCTION_STDCALL* pFuncWin)(void*))
  141. {
  142. #ifdef linux
  143. pthread_t tidp;
  144. if ((pthread_create(&tidp, NULL, pFuncLinux, NULL) == -1))
  145. {
  146. //printf("create error!\n");
  147. return 1;
  148. }
  149. cout << "return of linux thread" << endl;
  150. return 0;
  151. #else
  152. _beginthreadex(NULL, 0, pFuncWin, NULL, 0, NULL);
  153. return 0;
  154. #endif //linux
  155. }
  156. void EndThreadRVC()
  157. {
  158. #ifdef linux
  159. cout << "thread to exit" << endl;
  160. pthread_exit(0);
  161. cout << "return of EndThreadRVC" << endl;
  162. #else
  163. _endthreadex(0);
  164. #endif //linux
  165. }
  166. void StartDoNetControlRVC()
  167. {
  168. #ifdef linux
  169. BeginThreadRVC(DoNetControlLinux, NULL);
  170. cout << "quit StartDoNetRVC linux begin" << endl;
  171. #else
  172. BeginThreadRVC(NULL, DoNetControl);
  173. #endif //linux
  174. }
  175. void StartDoWorkRVC()
  176. {
  177. #ifdef linux
  178. BeginThreadRVC(DoWorkLinux, NULL);
  179. #else
  180. BeginThreadRVC(NULL, DoWork);
  181. #endif //linux
  182. }
  183. void ServerReportEvent(const char* szFunction,const char* szName="guardian")
  184. {
  185. #ifdef linux
  186. cout << "oiltest(SPE):" << szFunction << endl;
  187. openlog("guardian", LOG_CONS | LOG_PID, LOG_LOCAL0);
  188. syslog(LOG_ERR, szFunction);
  189. closelog();
  190. #else
  191. //LogToFile(false,false,false,szFunction);
  192. HANDLE hEventSource;
  193. LPCTSTR lpszStrings[2];
  194. int len = sizeof(szFunction);
  195. //char *Buffer = new char[len];
  196. char Buffer[1024] = {0};
  197. hEventSource = RegisterEventSource(NULL, szName);
  198. if( NULL != hEventSource )
  199. {
  200. //StringCchPrintf(Buffer, 80, TEXT("%s failed with %d"), szFunction, GetLastError());
  201. strcpy_s(Buffer,1024,szFunction);
  202. lpszStrings[0] = szName;
  203. lpszStrings[1] = Buffer;
  204. ReportEvent(hEventSource, // event log handle
  205. EVENTLOG_ERROR_TYPE, // event type
  206. 0, // event category
  207. 0xe0000001, // event identifier
  208. NULL, // no security identifier
  209. 2, // size of lpszStrings array
  210. 0, // no binary data
  211. lpszStrings, // array of strings
  212. NULL); // no binary data
  213. DeregisterEventSource(hEventSource);
  214. }
  215. #endif //linux
  216. }
  217. bool VersionRollback()
  218. {
  219. const int VersionLenMax = 64;
  220. fstream verFile,verBak;//to confirm
  221. string strActiveTxtPath, strVersionDatPath;
  222. #ifdef linux
  223. //todo oiltestlinux
  224. strActiveTxtPath = "/home/vtmsc001/run/version/active.txt";
  225. strVersionDatPath = "/home/vtmsc001/run/runinfo/runcfg/version.dat";
  226. #else
  227. string strDisk(chDisk);
  228. strActiveTxtPath = strDisk + ":\\Run\\version\\active.txt";
  229. strVersionDatPath = strDisk + ":\\Run\\runinfo\\runcfg\\version.dat";
  230. #endif //linux
  231. verFile.open(strActiveTxtPath,std::fstream::in|std::fstream::out|std::fstream::binary);
  232. verBak.open(strVersionDatPath,std::fstream::in|std::fstream::out|std::fstream::binary);
  233. if (!verFile.is_open() || !verBak.is_open())
  234. return false;
  235. char *pVerBak,*pNULL,*pCurrVer;
  236. pVerBak = new char[VersionLenMax];
  237. pNULL = new char[VersionLenMax];
  238. pCurrVer = new char[VersionLenMax];
  239. memset(pVerBak,0,VersionLenMax);
  240. memset(pNULL,0,VersionLenMax);
  241. memset(pCurrVer,0,VersionLenMax);
  242. verBak.seekg(0,verBak.end);
  243. int lenBak = verBak.tellg();
  244. verBak.seekg(0,verBak.beg);
  245. verBak.read(pVerBak,lenBak);
  246. //need to consider atomic op? oilyang
  247. verFile.seekg(0,verFile.end);
  248. int len = verFile.tellg();
  249. verFile.seekg(0,verFile.beg);
  250. verFile.read(pCurrVer,len);
  251. LogSingleMsg(pVerBak);
  252. LogSingleMsg(pCurrVer);
  253. LogSingleMsg(pNULL);
  254. if (strcmp(pVerBak,pCurrVer) == 0)
  255. {
  256. ServerReportEvent(pVerBak);
  257. verFile.close();
  258. verBak.close();
  259. delete []pVerBak;
  260. delete []pNULL;
  261. return false;
  262. }
  263. //verBak.write(pNULL,len);
  264. //verFile.write(pNULL,len);
  265. //how foolish?
  266. verFile.close();
  267. verFile.open(strActiveTxtPath,std::fstream::in|std::fstream::out|std::fstream::binary|std::fstream::trunc);
  268. verFile.seekg(0,verFile.beg);
  269. verFile.write(pVerBak,lenBak);
  270. LogSingleMsg("version will rollback to ");
  271. LogSingleMsg(pVerBak);
  272. verFile.close();
  273. verBak.close();
  274. delete []pVerBak;
  275. delete []pNULL;
  276. return true;
  277. }
  278. int FrameworkShutdown(bool bUpgrade=false,bool bRestart = true)
  279. {
  280. if (!bUpgrade)
  281. g_dwTimeBegin = GetTickCountRVC();
  282. NetControl();
  283. #ifdef linux
  284. //todo oiltestlinux
  285. ServerReportEvent("FrameworkShutdown linux");
  286. #else
  287. STARTUPINFO si;
  288. PROCESS_INFORMATION pi;
  289. ZeroMemory( &si, sizeof(si) );
  290. si.cb = sizeof(si);
  291. ZeroMemory( &pi, sizeof(pi) );
  292. // Start the child process.
  293. CSimpleStringA csRestart,csVerPath,csAll,csSep("\""),csBlank(" "),csScript("wscript.exe"),csReFlag("r");
  294. csRestart = "sprestart.exe ";
  295. csVerPath = chDisk;
  296. csVerPath += ":\\Run\\version";
  297. csVerPath +="\\spexplorerfast.vbs";
  298. if (!bRestart)
  299. csReFlag = "n";
  300. csAll = csSep + csRestart + csSep + csBlank + csSep + csScript+csBlank + csVerPath + csSep
  301. + csBlank + csSep + csReFlag + csSep;
  302. LPTSTR szCmdline = _strdup(csAll);
  303. LogSingleMsg(szCmdline);
  304. //MessageBoxA(0,0,0,0);
  305. if( !CreateProcess( NULL,szCmdline,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi))
  306. {
  307. //Dbg("CreateProcess failed (%d).\n", GetLastError());
  308. return -1;
  309. }
  310. DWORD dwErr = GetLastError();
  311. // Wait until child process exits.
  312. WaitForSingleObject( pi.hProcess, INFINITE );
  313. // Close process and thread handles.
  314. CloseHandle( pi.hProcess );
  315. CloseHandle( pi.hThread );
  316. return 0;
  317. #endif //linux
  318. }
  319. bool FrameworkRollBack()
  320. {
  321. bool bVerRollback = VersionRollback();
  322. LogToFile(false,false,false,"version rollback ");
  323. if (true)
  324. FrameworkShutdown();
  325. return true;
  326. }
  327. bool ReadRuninfoContent(string &strData)
  328. {
  329. fstream runinfo;
  330. string strGdRuninfoPath;
  331. #ifdef linux
  332. //todo oiltestlinux
  333. strGdRuninfoPath = "/home/vtmsc001/run/runinfo/runcfg/gdruninfo";
  334. #else
  335. string strDisk(chDisk);
  336. strGdRuninfoPath = strDisk + ":\\Run\\runinfo\\runcfg\\gdruninfo";
  337. #endif //linux
  338. runinfo.open(strGdRuninfoPath,std::fstream::in|std::fstream::out|std::fstream::binary);
  339. if (!runinfo.is_open())
  340. {
  341. LogToFile(false, false,false, "open gdruninfo(read) failed.");
  342. return false;
  343. }
  344. runinfo.seekg(0,ios::end);
  345. int size = runinfo.tellg();
  346. if (size <= 0)
  347. return false;
  348. char *pData = new char[size+1];
  349. memset(pData,0,size+1);
  350. runinfo.seekg(0,ios::beg);
  351. runinfo.read(pData,size);
  352. strData = string(pData);
  353. LogToFile(true, false,false, "read runinfo ", strData.c_str());
  354. return true;
  355. }
  356. bool WriteRunInfoContent(const char* pData)
  357. {
  358. ofstream runinfo;
  359. string strGdRuninfoPath;
  360. #ifdef linux
  361. //todo oiltestlinux
  362. strGdRuninfoPath = "/home/vtmsc001/run/runinfo/runcfg/gdruninfo";
  363. #else
  364. string strDisk(chDisk);
  365. strGdRuninfoPath = strDisk + ":\\Run\\runinfo\\runcfg\\gdruninfo";
  366. #endif //linux
  367. runinfo.open(strGdRuninfoPath,std::ofstream::in|std::ofstream::binary|std::ofstream::trunc);
  368. if (!runinfo.is_open())
  369. {
  370. ServerReportEvent("open gdruninfo(write) failed.");
  371. return false;
  372. }
  373. runinfo.write(pData,strlen(pData));
  374. runinfo.close();
  375. return true;
  376. }
  377. bool IsStartTimeFileExist()
  378. {
  379. ofstream runinfo;
  380. string strStartTimePath;
  381. #ifdef linux
  382. //todo oiltestlinux
  383. strStartTimePath = "/home/vtmsc001/run/runinfo/runcfg/starttime.dat";
  384. #else
  385. string strDisk(chDisk);
  386. strStartTimePath = strDisk + ":\\Run\\runinfo\\runcfg\\starttime.dat";
  387. #endif //linux
  388. runinfo.open(strStartTimePath, std::fstream::in | std::fstream::out | std::fstream::binary);
  389. if (!runinfo.is_open())
  390. return false;
  391. else
  392. {
  393. runinfo.close();
  394. return true;
  395. }
  396. }
  397. #ifdef linux
  398. void CheckDoWork(int sig)
  399. {
  400. if (SIGALRM == sig)
  401. {
  402. LogSingleMsg("to check value");
  403. EnterCriticalSectionRVC(g_cs);
  404. if (!g_bFrameQuit)
  405. {
  406. ULONGLONG dwTmpBegin = g_dwTimeBegin;
  407. ULONGLONG dwUpgradeTmpBegin = g_dwUpgradeRestartTimeBegin;
  408. LeaveCriticalSectionRVC(g_cs);
  409. ULONGLONG dwTimeEnd = GetTickCountRVC();
  410. //oilyang@20190828 add
  411. //升级重启后,在10分钟内,只要离最后一次交互时间大于2分钟,重启框架
  412. if ((g_bInUpgrade && ((dwTimeEnd - dwUpgradeTmpBegin) < MAX_WAIT_TIME_TO_RESTART))
  413. && (!g_bAuthSuc && ((dwTimeEnd - dwTmpBegin) > MAX_WAIT_TIME_TO_RESTART_UPGRADE)))
  414. {
  415. LogSingleMsg("**in upgrade restart**,to restart framework.");
  416. FrameworkShutdown(true, true);
  417. }
  418. if ((dwTimeEnd - dwTmpBegin) > MAX_WAIT_TIME_TO_RESTART)
  419. {
  420. LogSingleMsg("framework maybe down.");
  421. string strRunInfo;
  422. if (ReadRuninfoContent(strRunInfo))
  423. {
  424. LogSingleMsg("to check if need rollback.");
  425. LogSingleMsg((char*)strRunInfo.c_str());
  426. if (strRunInfo.compare("111") == 0 && IsStartTimeFileExist())
  427. {
  428. EnterCriticalSectionRVC(g_cs);
  429. g_needToRollBack = 1;
  430. LeaveCriticalSectionRVC(g_cs);
  431. }
  432. }
  433. else
  434. LogSingleMsg("read run info failed.");
  435. if (g_needToRollBack)
  436. {
  437. LogSingleMsg("after upgrade,time elapse,but can't wait the shake hands,so rollback.");
  438. FrameworkRollBack();
  439. }
  440. else
  441. {
  442. //framework is down,to restart it! oilyang 20150413
  443. FrameworkShutdown();
  444. }
  445. }
  446. }
  447. else
  448. LeaveCriticalSectionRVC(g_cs);
  449. alarm(2 * 60); //we contimue set the timer
  450. }
  451. return;
  452. }
  453. void* DoWorkLinux(void* arg)
  454. {
  455. LogSingleMsg("to wait.");
  456. signal(SIGALRM, CheckDoWork); //relate the signal and function
  457. alarm(2 * 60); //trigger the timer
  458. //EndThreadRVC();
  459. //return 0;
  460. }
  461. void* DoNetControlLinux(void* arg)
  462. {
  463. }
  464. void DataProcessLinux(int socket,const char*data)
  465. {
  466. GuardianInfo* pInfo = (GuardianInfo*)data;
  467. LogToFile(false, true, false, "eType:", "", pInfo->eType);
  468. cout << "eType:" << pInfo->eType << ",p1:" << pInfo->dwParam1 << ",p2:" << pInfo->dwParam2 << ",dwSize:" << pInfo->dwSize << endl;
  469. //LogToFile(false,true,false,"clientsocket:", "", pPerHandleData->Socket);
  470. switch (pInfo->eType)
  471. {
  472. case GdOpShakeHand:
  473. {
  474. LogToFile(false, false, false, "Shake hand.");
  475. if (!g_bFrameOnline)
  476. {
  477. g_bFrameOnline = true;
  478. StartDoNetControlRVC();
  479. }
  480. int rc, err;
  481. EnterCriticalSectionRVC(g_cs);
  482. g_bFrameQuit = false;
  483. g_dwTimeBegin = GetTickCountRVC();
  484. LeaveCriticalSectionRVC(g_cs);
  485. char* pBuf = new char[8];
  486. memset(pBuf, 0, 8);
  487. //get guardian state
  488. //ex:u(update),g(guardian),r(reboot),b(rollback)
  489. if (cnt % 2 == 0)
  490. memcpy(pBuf, "g", 1);
  491. else
  492. memcpy(pBuf, "u", 1);
  493. cnt++;
  494. rc = send(socket, pBuf, 8, 0);
  495. delete[]pBuf;
  496. close(socket);
  497. }
  498. break;
  499. case GdOpUpdateTask:
  500. {
  501. if (!g_bFrameOnline)
  502. {
  503. g_bFrameOnline = true;
  504. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  505. StartDoNetControlRVC();
  506. }
  507. }
  508. break;
  509. case GdOpQueryInstall:
  510. {
  511. if (!g_bFrameOnline)
  512. {
  513. g_bFrameOnline = true;
  514. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  515. StartDoNetControlRVC();
  516. }
  517. int rc, err;
  518. char* pBuf = new char[8];
  519. memset(pBuf, 0, 8);
  520. if (cnt % 2 == 0)
  521. memcpy(pBuf, "y", 1);
  522. else
  523. memcpy(pBuf, "n", 1);
  524. cnt++;
  525. rc = send(socket, pBuf, 8, 0);
  526. delete[]pBuf;
  527. close(socket);
  528. }
  529. break;
  530. case GdOpUpgradeRestart:
  531. {
  532. if (pInfo->dwParam1 == 4)//just know framework is starting...
  533. {
  534. LogSingleMsg("framework is starting...");
  535. cout << "framework is starting..." << endl;
  536. g_bFrameOnline = true;
  537. g_bAuthSuc = false;
  538. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  539. StartDoNetControlRVC();
  540. cout << "to break upgrade..." << endl;
  541. close(socket);
  542. break;
  543. }
  544. if (pInfo->dwParam1 == 5)
  545. {
  546. LogSingleMsg("framework auth ok.");
  547. g_bInUpgrade = false;
  548. g_bAuthSuc = true;
  549. }
  550. if (!g_bFrameOnline)
  551. {
  552. g_bFrameOnline = true;
  553. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  554. StartDoNetControlRVC();
  555. }
  556. if (pInfo->dwParam1 == 1 || pInfo->dwParam1 == 3)
  557. g_dwTimeBegin = GetTickCountRVC();
  558. ServerReportEvent("upgrade restart");
  559. LogToFile(false, true, false, "upgrade restart ", "", pInfo->dwParam1);
  560. if (pInfo->dwParam1 == 1)//framework to restart after upgrade
  561. {
  562. g_bInUpgrade = true;
  563. WriteRunInfoContent("111");
  564. g_dwUpgradeRestartTimeBegin = GetTickCountRVC();
  565. //Sleep(5000);
  566. //FrameworkShutdown();
  567. }
  568. else if (pInfo->dwParam1 == 2)//need rollback after upgrade
  569. {
  570. LogSingleMsg("upgrade restart 222");
  571. WriteRunInfoContent("222");
  572. //rollback
  573. EnterCriticalSectionRVC(g_cs);
  574. g_needToRollBack = 0;
  575. LeaveCriticalSectionRVC(g_cs);
  576. LogSingleMsg("healthmanager said to rollback");
  577. FrameworkRollBack();
  578. }
  579. else if (pInfo->dwParam1 == 3)//upgrade succeeded
  580. {
  581. LogSingleMsg("upgrade restart ok");
  582. WriteRunInfoContent("333");
  583. EnterCriticalSectionRVC(g_cs);
  584. g_needToRollBack = 0;
  585. LeaveCriticalSectionRVC(g_cs);
  586. }
  587. //runinfo.close();
  588. close(socket);
  589. }
  590. break;
  591. case GdOpFrameQuit:
  592. if (!g_bFrameOnline)
  593. {
  594. g_bFrameOnline = true;
  595. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  596. StartDoNetControlRVC();
  597. }
  598. EnterCriticalSectionRVC(g_cs);
  599. g_bFrameQuit = true;
  600. LeaveCriticalSectionRVC(g_cs);
  601. close(socket);
  602. break;
  603. default:
  604. break;
  605. }
  606. cout << "quit of DataProcessLinux" << endl;
  607. }
  608. #else
  609. void DataProcess(LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIoData)
  610. {
  611. GuardianInfo* pInfo = (GuardianInfo*)pPerIoData->Buffer;
  612. LogToFile(false, true, false,"eType:", "", pInfo->eType);
  613. //LogToFile(false,true,false,"clientsocket:", "", pPerHandleData->Socket);
  614. switch(pInfo->eType)
  615. {
  616. case GdOpShakeHand:
  617. {
  618. LogToFile(false, false,false, "Shake hand.");
  619. if (!g_bFrameOnline)
  620. {
  621. g_bFrameOnline = true;
  622. StartDoNetControlRVC();
  623. }
  624. int rc,err;
  625. EnterCriticalSectionRVC(g_cs);
  626. g_bFrameQuit = false;
  627. g_dwTimeBegin = GetTickCountRVC();
  628. LeaveCriticalSectionRVC(g_cs);
  629. char* pBuf = new char[8];
  630. memset(pBuf,0,8);
  631. //get guardian state
  632. //ex:u(update),g(guardian),r(reboot),b(rollback)
  633. if (cnt%2 == 0)
  634. memcpy(pBuf,"g",1);
  635. else
  636. memcpy(pBuf,"u",1);
  637. cnt++;
  638. rc = send(pPerHandleData->Socket,pBuf,8,0);
  639. delete []pBuf;
  640. closesocket(pPerHandleData->Socket);
  641. }
  642. break;
  643. case GdOpUpdateTask:
  644. {
  645. if (!g_bFrameOnline)
  646. {
  647. g_bFrameOnline = true;
  648. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  649. StartDoNetControlRVC();
  650. }
  651. }
  652. break;
  653. case GdOpQueryInstall:
  654. {
  655. if (!g_bFrameOnline)
  656. {
  657. g_bFrameOnline = true;
  658. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  659. StartDoNetControlRVC();
  660. }
  661. int rc,err;
  662. char* pBuf = new char[8];
  663. memset(pBuf,0,8);
  664. if (cnt%2 == 0)
  665. memcpy(pBuf,"y",1);
  666. else
  667. memcpy(pBuf,"n",1);
  668. cnt++;
  669. rc = send(pPerHandleData->Socket,pBuf,8,0);
  670. delete []pBuf;
  671. closesocket(pPerHandleData->Socket);
  672. }
  673. break;
  674. case GdOpUpgradeRestart:
  675. {
  676. if (pInfo->dwParam1 == 4)//just know framework is starting...
  677. {
  678. LogSingleMsg("framework is starting...");
  679. g_bFrameOnline = true;
  680. g_bAuthSuc = false;
  681. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  682. StartDoNetControlRVC();
  683. break;
  684. }
  685. if (pInfo->dwParam1 == 5)
  686. {
  687. LogSingleMsg("framework auth ok.");
  688. g_bInUpgrade = false;
  689. g_bAuthSuc = true;
  690. }
  691. if (!g_bFrameOnline)
  692. {
  693. g_bFrameOnline = true;
  694. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  695. StartDoNetControlRVC();
  696. }
  697. if (pInfo->dwParam1 == 1 || pInfo->dwParam1 == 3)
  698. g_dwTimeBegin = GetTickCountRVC();
  699. ServerReportEvent("upgrade restart");
  700. LogToFile(false, true,false, "upgrade restart ", "", pInfo->dwParam1);
  701. if (pInfo->dwParam1 == 1)//framework to restart after upgrade
  702. {
  703. g_bInUpgrade = true;
  704. WriteRunInfoContent("111");
  705. g_dwUpgradeRestartTimeBegin = GetTickCountRVC();
  706. //Sleep(5000);
  707. //FrameworkShutdown();
  708. }
  709. else if (pInfo->dwParam1 == 2)//need rollback after upgrade
  710. {
  711. LogSingleMsg("upgrade restart 222");
  712. WriteRunInfoContent("222");
  713. //rollback
  714. EnterCriticalSectionRVC(g_cs);
  715. g_needToRollBack = 0;
  716. LeaveCriticalSectionRVC(g_cs);
  717. LogSingleMsg("healthmanager said to rollback");
  718. FrameworkRollBack();
  719. }else if (pInfo->dwParam1 == 3)//upgrade succeeded
  720. {
  721. LogSingleMsg("upgrade restart ok");
  722. WriteRunInfoContent("333");
  723. EnterCriticalSectionRVC(g_cs);
  724. g_needToRollBack = 0;
  725. LeaveCriticalSectionRVC(g_cs);
  726. }
  727. //runinfo.close();
  728. closesocket(pPerHandleData->Socket);
  729. }
  730. break;
  731. case GdOpFrameQuit:
  732. if (!g_bFrameOnline)
  733. {
  734. g_bFrameOnline = true;
  735. //_beginthreadex(NULL,0,DoNetControl,NULL,0,NULL);
  736. StartDoNetControlRVC();
  737. }
  738. EnterCriticalSectionRVC(g_cs);
  739. g_bFrameQuit = true;
  740. LeaveCriticalSectionRVC(g_cs);
  741. closesocket(pPerHandleData->Socket);
  742. break;
  743. default:
  744. break;
  745. }
  746. }
  747. DWORD WINAPI ProcessIO(LPVOID lpParam)
  748. {
  749. HANDLE CompletionPort = (HANDLE)lpParam;
  750. DWORD BytesTransferred;
  751. LPPER_HANDLE_DATA PerHandleData;
  752. LPPER_IO_OPERATION_DATA PerIoData;
  753. while(true)
  754. {
  755. if(0 == GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (LPDWORD)&PerHandleData, (LPOVERLAPPED*)&PerIoData, INFINITE))
  756. {
  757. if( (GetLastError() == WAIT_TIMEOUT) || (GetLastError() == ERROR_NETNAME_DELETED) )
  758. {
  759. LogToFile(false, true,false, "closing socket(1)", "", PerHandleData->Socket);
  760. closesocket(PerHandleData->Socket);
  761. delete PerIoData;
  762. delete PerHandleData;
  763. continue;
  764. }
  765. else
  766. {
  767. //OutErr("GetQueuedCompletionStatus failed!");
  768. }
  769. return 0;
  770. }
  771. // client quit
  772. if(BytesTransferred == 0)
  773. {
  774. LogToFile(false, true,false, "closing socket(2)", "", PerHandleData->Socket);
  775. closesocket(PerHandleData->Socket);
  776. delete PerIoData;
  777. delete PerHandleData;
  778. continue;
  779. }
  780. //MessageBoxA(0,0,0,0);
  781. //LogToFile(false, true,false, "socket", "", PerHandleData->Socket);
  782. // receiving data process
  783. DataProcess(PerHandleData,PerIoData);
  784. // socket WSARecv
  785. DWORD Flags = 0;
  786. DWORD dwRecv = 0;
  787. ZeroMemory(PerIoData, sizeof(PER_IO_OPERATION_DATA));
  788. PerIoData->DataBuf.buf = PerIoData->Buffer;
  789. PerIoData->DataBuf.len = DATA_BUFSIZE;
  790. WSARecv(PerHandleData->Socket, &PerIoData->DataBuf, 1, &dwRecv, &Flags, &PerIoData->Overlapped, NULL);
  791. }
  792. return 0;
  793. }
  794. unsigned int __stdcall DoWork(void* pData)
  795. {
  796. LogSingleMsg("to wait.");
  797. HANDLE hTimer;
  798. LARGE_INTEGER li;
  799. hTimer = CreateWaitableTimer(NULL,FALSE,NULL);
  800. const int nTimerUnitsPerSecond = 10000000;
  801. li.QuadPart = -(1*60*nTimerUnitsPerSecond);//oiltmp 1 minute
  802. SetWaitableTimer(hTimer,&li,2*60*1000,NULL,NULL,FALSE);
  803. while(1)
  804. {
  805. WaitForSingleObject(hTimer,INFINITE);
  806. LogSingleMsg("to check value");
  807. EnterCriticalSectionRVC(g_cs);
  808. if (!g_bFrameQuit)
  809. {
  810. ULONGLONG dwTmpBegin = g_dwTimeBegin;
  811. ULONGLONG dwUpgradeTmpBegin = g_dwUpgradeRestartTimeBegin;
  812. LeaveCriticalSectionRVC(g_cs);
  813. ULONGLONG dwTimeEnd = GetTickCountRVC();
  814. //oilyang@20190828 add
  815. //升级重启后,在10分钟内,只要离最后一次交互时间大于2分钟,重启框架
  816. if ((g_bInUpgrade && ((dwTimeEnd - dwUpgradeTmpBegin) < MAX_WAIT_TIME_TO_RESTART))
  817. && (!g_bAuthSuc && ((dwTimeEnd - dwTmpBegin) > MAX_WAIT_TIME_TO_RESTART_UPGRADE)))
  818. {
  819. LogSingleMsg("**in upgrade restart**,to restart framework.");
  820. FrameworkShutdown(true,true);
  821. }
  822. if ((dwTimeEnd-dwTmpBegin) > MAX_WAIT_TIME_TO_RESTART)
  823. {
  824. LogSingleMsg("framework maybe down.");
  825. string strRunInfo;
  826. if (ReadRuninfoContent(strRunInfo))
  827. {
  828. LogSingleMsg("to check if need rollback.");
  829. LogSingleMsg((char*)strRunInfo.c_str());
  830. if (strRunInfo.compare("111") == 0 && IsStartTimeFileExist())
  831. {
  832. EnterCriticalSectionRVC(g_cs);
  833. g_needToRollBack = 1;
  834. LeaveCriticalSectionRVC(g_cs);
  835. }
  836. }
  837. else
  838. LogSingleMsg("read run info failed.");
  839. if (g_needToRollBack)
  840. {
  841. LogSingleMsg("after upgrade,time elapse,but can't wait the shake hands,so rollback.");
  842. FrameworkRollBack();
  843. }
  844. else
  845. {
  846. //framework is down,to restart it! oilyang 20150413
  847. FrameworkShutdown();
  848. }
  849. }
  850. }
  851. else
  852. LeaveCriticalSectionRVC(g_cs);
  853. }
  854. //_endthreadex(0);
  855. EndThreadRVC();
  856. return 0;
  857. }
  858. unsigned int __stdcall DoNetControl(void *pData)
  859. {
  860. ServerReportEvent("DoNetControl start");
  861. HANDLE hSnapshot;
  862. //find spshell.exe
  863. hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  864. if (hSnapshot)
  865. {
  866. PROCESSENTRY32 pe;
  867. pe.dwSize = sizeof(pe);
  868. if (Process32First(hSnapshot, &pe))
  869. {
  870. do {
  871. if (_stricmp(&pe.szExeFile[0], "spshell.exe") == 0)
  872. {
  873. //ServerReportEvent("find spshell.exe");
  874. LogToFile(false, false, false, "find spshell.exe");
  875. //DWORD dwExit = 0;
  876. //do
  877. //{
  878. // GetExitCodeProcess(&pe.th32ProcessID,&dwExit);
  879. // if (dwExit != STILL_ACTIVE)
  880. // break;
  881. //}while(1);
  882. HANDLE hP = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID );
  883. WaitForSingleObject(hP, INFINITE );
  884. LogToFile(false, false, false, "spshell.exe quit");
  885. //ServerReportEvent("spshell.exe quit");
  886. NetControl();
  887. break;
  888. }
  889. } while (Process32Next(hSnapshot, &pe));
  890. }
  891. CloseHandle(hSnapshot);
  892. }
  893. else
  894. ServerReportEvent("create snapshot failed.");
  895. //_endthreadex(0);
  896. EndThreadRVC();
  897. return 0;
  898. }
  899. #endif //linux
  900. unsigned int InitListenSocketRVC()
  901. {
  902. #ifdef linux
  903. socklen_t clilen;
  904. epfd = epoll_create(256);
  905. struct sockaddr_in clientaddr;
  906. struct sockaddr_in serveraddr;
  907. g_sListen = socket(AF_INET, SOCK_STREAM, 0);
  908. //setnonblocking(listenfd);
  909. ev.data.fd = g_sListen;
  910. ev.events = EPOLLIN | EPOLLET;
  911. epoll_ctl(epfd, EPOLL_CTL_ADD, g_sListen, &ev);
  912. memset(&serveraddr, 0, sizeof(serveraddr));
  913. serveraddr.sin_family = AF_INET;
  914. char* local_addr = "127.0.0.1";
  915. inet_aton(local_addr, &(serveraddr.sin_addr));
  916. serveraddr.sin_port = htons(default_port);
  917. bind(g_sListen, (sockaddr*)& serveraddr, sizeof(serveraddr));
  918. listen(g_sListen, LISTENQ);
  919. return g_sListen;
  920. #else
  921. WSADATA wsaData;
  922. int iResult;
  923. struct addrinfo* result = NULL;
  924. struct addrinfo hints;
  925. int iSendResult;
  926. char recvbuf[DEFAULT_BUFLEN];
  927. int recvbuflen = DEFAULT_BUFLEN;
  928. // Initialize Winsock
  929. iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  930. if (iResult != 0) {
  931. LogToFile(false, true, false, "WSAStartup failed with error:", "", iResult);
  932. return 1;
  933. }
  934. ZeroMemory(&hints, sizeof(hints));
  935. hints.ai_family = AF_INET;
  936. hints.ai_socktype = SOCK_STREAM;
  937. hints.ai_protocol = IPPROTO_TCP;
  938. hints.ai_flags = AI_PASSIVE;
  939. // Resolve the server address and port
  940. iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
  941. if (iResult != 0) {
  942. LogToFile(false, true, false, "getaddrinfo failed with error:", "", iResult);
  943. WSACleanup();
  944. return 1;
  945. }
  946. // get system info to create work thread
  947. SYSTEM_INFO SystemInfo;
  948. GetSystemInfo(&SystemInfo);
  949. // Create a SOCKET for connecting to server
  950. g_sListen = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
  951. if (g_sListen == INVALID_SOCKET) {
  952. LogToFile(false, true, false, "socket failed with error:", "", WSAGetLastError());
  953. freeaddrinfo(result);
  954. WSACleanup();
  955. return 1;
  956. }
  957. // Setup the TCP listening socket
  958. struct sockaddr_in* sockaddr_ipv4 = (struct sockaddr_in*) result->ai_addr;
  959. LogToFile(true, false, false, "ip:", inet_ntoa(sockaddr_ipv4->sin_addr));
  960. iResult = bind(g_sListen, result->ai_addr, (int)result->ai_addrlen);
  961. if (iResult == SOCKET_ERROR) {
  962. printf("bind failed with error: %d\n", WSAGetLastError());
  963. freeaddrinfo(result);
  964. closesocket(g_sListen);
  965. WSACleanup();
  966. return 1;
  967. }
  968. freeaddrinfo(result);
  969. LogToFile(false, false, false, "to listen.");
  970. iResult = listen(g_sListen, SOMAXCONN);
  971. if (iResult == SOCKET_ERROR) {
  972. printf("listen failed with error: %d\n", WSAGetLastError());
  973. closesocket(g_sListen);
  974. WSACleanup();
  975. return 1;
  976. }
  977. LogToFile(false, false, false, "listen ok.");
  978. return g_sListen;
  979. #endif //linux
  980. }
  981. void AcceptReqRVC()
  982. {
  983. #ifdef linux
  984. StartDoWorkRVC();
  985. int maxi, connfd, sockfd, nfds;
  986. struct epoll_event events[20];
  987. struct sockaddr_in clientaddr;
  988. socklen_t clilen;
  989. ssize_t n;
  990. maxi = 0;
  991. char line[MAXLINE];
  992. for (; ; ) {
  993. //等待epoll事件的发生
  994. nfds = epoll_wait(epfd, events, 20, 500);
  995. //处理所发生的所有事件
  996. for (int i = 0; i < nfds; ++i)
  997. {
  998. if (events[i].data.fd == g_sListen)//new connection
  999. {
  1000. connfd = accept(g_sListen, (sockaddr*)& clientaddr, &clilen);
  1001. if (connfd < 0) {
  1002. perror("connfd<0");
  1003. exit(1);
  1004. }
  1005. //setnonblocking(connfd);
  1006. char* str = inet_ntoa(clientaddr.sin_addr);
  1007. cout << "accapt a connection from " << str << endl;
  1008. ev.data.fd = connfd;
  1009. ev.events = EPOLLIN | EPOLLET;
  1010. //ev.events=EPOLLIN;
  1011. epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &ev);
  1012. }
  1013. else if (events[i].events & EPOLLIN)
  1014. {
  1015. cout << "EPOLLIN,i:" << i << ",sock:" << events[i].data.fd << endl;
  1016. if ((sockfd = events[i].data.fd) < 0)
  1017. continue;
  1018. if ((n = read(sockfd, line, MAXLINE)) < 0) {
  1019. if (errno == ECONNRESET) {
  1020. close(sockfd);
  1021. events[i].data.fd = -1;
  1022. }
  1023. else
  1024. std::cout << "readline error" << strerror(errno) << std::endl;
  1025. }
  1026. else if (n == 0) {
  1027. close(sockfd);
  1028. events[i].data.fd = -1;
  1029. }
  1030. DataProcessLinux(sockfd,line);
  1031. line[n] = '\0';
  1032. cout << "read " << line << endl;
  1033. ev.data.fd = sockfd;
  1034. ev.events = EPOLLOUT | EPOLLET;
  1035. epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
  1036. }
  1037. else if (events[i].events & EPOLLOUT)
  1038. {
  1039. cout << "epoll out" << endl;
  1040. sockfd = events[i].data.fd;
  1041. write(sockfd, line, n);
  1042. ev.data.fd = sockfd;
  1043. ev.events = EPOLLIN | EPOLLET;
  1044. epoll_ctl(epfd, EPOLL_CTL_MOD, sockfd, &ev);
  1045. }
  1046. }
  1047. }
  1048. #else
  1049. HANDLE hCompletionPort;
  1050. hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
  1051. // get system info to create work thread
  1052. SYSTEM_INFO SystemInfo;
  1053. GetSystemInfo(&SystemInfo);
  1054. for (int i = 0; i < SystemInfo.dwNumberOfProcessors * 2; i++)
  1055. {
  1056. HANDLE hProcessIO = CreateThread(NULL, 0, ProcessIO, hCompletionPort, 0, NULL);
  1057. if (hProcessIO)
  1058. CloseHandle(hProcessIO);
  1059. }
  1060. //waiting thread
  1061. //_beginthreadex(NULL,0,DoWork,NULL,0,NULL);
  1062. StartDoWorkRVC();
  1063. SOCKET sClient;
  1064. LPPER_HANDLE_DATA PerHandleData;
  1065. LPPER_IO_OPERATION_DATA PerIoData;
  1066. while (true)
  1067. {
  1068. //sClient = WSAAccept(sListen, NULL, NULL, NULL, 0);
  1069. sClient = accept(g_sListen, NULL, NULL);
  1070. //cout << "Socket " << sClient << "connect" << endl;
  1071. PerHandleData = new PER_HANDLE_DATA();
  1072. PerHandleData->Socket = sClient;
  1073. // client completion port
  1074. CreateIoCompletionPort((HANDLE)sClient, hCompletionPort, (DWORD)PerHandleData, 0);
  1075. //
  1076. PerIoData = new PER_IO_OPERATION_DATA();
  1077. ZeroMemory(PerIoData, sizeof(PER_IO_OPERATION_DATA));
  1078. PerIoData->DataBuf.buf = PerIoData->Buffer;
  1079. PerIoData->DataBuf.len = DATA_BUFSIZE;
  1080. // WSARecv
  1081. DWORD Flags = 0;
  1082. DWORD dwRecv = 0;
  1083. WSARecv(sClient, &PerIoData->DataBuf, 1, &dwRecv, &Flags, &PerIoData->Overlapped, NULL);
  1084. LogToFile(false, false, false, "hold");
  1085. }
  1086. DWORD dwByteTrans;
  1087. PostQueuedCompletionStatus(hCompletionPort, dwByteTrans, 0, 0);
  1088. closesocket(g_sListen);
  1089. #endif //linux
  1090. }
  1091. void CheckGuardianDbgDirAndCreateDbgFile(bool bChangeDay = false)
  1092. {
  1093. #ifdef linux
  1094. //todo oiltestlinux
  1095. string guardianLogDir("/home/rvc/dbg/guardian");
  1096. if (opendir(guardianLogDir.c_str()) == NULL)
  1097. {
  1098. ServerReportEvent("Can't find guardian dbg dir,to create it.");
  1099. mkdir(guardianLogDir.c_str(), 0775);
  1100. }
  1101. #else
  1102. ZeroMemory(currDirBuf, sizeof(currDirBuf));
  1103. ZeroMemory(chDisk, sizeof(chDisk));
  1104. GetCurrentDirectory(256, currDirBuf);
  1105. chDisk[0] = currDirBuf[0];
  1106. // C:\Run\version\1.7.0.1
  1107. string strDir(chDisk), guardianLogDir(""), strGuardian("\\rvc\\dbg\\guardian");
  1108. guardianLogDir = strDir + ":" + strGuardian;
  1109. WIN32_FIND_DATA wfd;
  1110. bool rValue = false;
  1111. HANDLE hFind = FindFirstFile(guardianLogDir.c_str(), &wfd);
  1112. if ((hFind != INVALID_HANDLE_VALUE) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  1113. {
  1114. ServerReportEvent("find guardian log dir.");
  1115. }
  1116. else
  1117. {
  1118. ServerReportEvent("can't find guardian log dir:");
  1119. int ret = _mkdir(guardianLogDir.c_str());
  1120. if (ret != 0)
  1121. {
  1122. ServerReportEvent("Create guardian log dir failed.");
  1123. ServerReportEvent(guardianLogDir.c_str());
  1124. }
  1125. else
  1126. ServerReportEvent("Create guardian log dir suc.");
  1127. }
  1128. FindClose(hFind);
  1129. #endif //linux
  1130. SYSTEMTIME st;
  1131. GetLocalTimeRVC(st);
  1132. g_startDay = st.wDay;
  1133. char date[12];
  1134. memset(date,0,12);
  1135. sprintf(date, "%.4d%.2d%.2d", st.wYear, st.wMonth, st.wDay);
  1136. string strLogFile(""), strDate(date);
  1137. strLogFile = guardianLogDir + "/" + date + ".log";
  1138. if (!bChangeDay)
  1139. LogSingleMsg(strLogFile.c_str());
  1140. logFile.open(strLogFile.c_str(), std::ofstream::binary | ios::app);
  1141. if (logFile.is_open())
  1142. {
  1143. LogSingleMsg("open guardian dbg file suc.");
  1144. g_bLogFileOpen = true;
  1145. if (!bChangeDay){
  1146. LogToFile(false, false, false, "==============guardian start==============");
  1147. LogToFile(false, false, false, strLogFile.c_str());
  1148. }
  1149. }
  1150. else
  1151. {
  1152. if (!bChangeDay){
  1153. LogSingleMsg("open guardian dbg file failed.",errno);
  1154. LogSingleMsg(strerror(errno));
  1155. }
  1156. }
  1157. }
  1158. int main()
  1159. {
  1160. g_bFrameOnline = true;
  1161. #ifdef linux
  1162. pthread_mutex_init(&g_cs_event,NULL);
  1163. pthread_mutex_init(&g_cs_log,NULL);
  1164. pthread_mutex_init(&g_cs,NULL);
  1165. #else
  1166. InitializeCriticalSectionAndSpinCount(&g_cs_event, 100);
  1167. InitializeCriticalSectionAndSpinCount(&g_cs_log, 100);
  1168. InitializeCriticalSectionAndSpinCount(&g_cs, 100);
  1169. g_logHandle = CreateEventA(NULL, FALSE, FALSE, NULL);
  1170. #endif
  1171. g_dwTimeBegin = GetTickCountRVC();
  1172. int i=1000;
  1173. CheckGuardianDbgDirAndCreateDbgFile();
  1174. StartDoNetControlRVC();
  1175. LogSingleMsg(currDirBuf);
  1176. InitListenSocketRVC();
  1177. AcceptReqRVC();
  1178. }
  1179. void NetControl()
  1180. {
  1181. return;//oiltmp 20150724 for zl don't forbid net for now
  1182. #ifdef linux
  1183. //todo oiltestlinux
  1184. #else
  1185. HINSTANCE hmod = ::LoadLibrary(DLL_PATH);
  1186. if(hmod != NULL)
  1187. {
  1188. LogSingleMsg("NetControl start");
  1189. pWlanConnect WlanConnect = (pWlanConnect)GetProcAddress(hmod, "WlanConnect");
  1190. pDisableBluetooth BluetoothConnect = (pDisableBluetooth)GetProcAddress(hmod, "DisableBluetooth");
  1191. if (WlanConnect != NULL && BluetoothConnect != NULL)
  1192. {
  1193. DWORD dwRetWire,dwRetEther,dwRet3G,dwRet4G,dwRetBT;
  1194. dwRetWire = dwRetEther = dwRet3G = dwRet4G = dwRetBT = 0;
  1195. dwRetWire = WlanConnect(FALSE, NET_TYPE_WIRELESS);
  1196. LogSingleMsg("after wireless");
  1197. dwRetEther = WlanConnect(FALSE, NET_TYPE_ETHERNET);
  1198. LogSingleMsg("after ether");
  1199. dwRet3G = WlanConnect(FALSE, NET_TYPE_3G);
  1200. LogSingleMsg("after 3g");
  1201. dwRet4G = WlanConnect(FALSE, NET_TYPE_4G);
  1202. LogSingleMsg("after 4g");
  1203. dwRetBT = BluetoothConnect(TRUE);
  1204. LogSingleMsg("after bluetooth");
  1205. char buf[128];
  1206. ZeroMemory(buf,sizeof(buf));
  1207. sprintf(buf,"Wire Net open state:Wireless[%d],Ethernet[%d],3G[%d],4G[%d],Blue tooth[%d]",dwRetWire,dwRetEther,dwRet3G,dwRet4G,dwRetBT);
  1208. LogSingleMsg(buf);
  1209. }
  1210. else
  1211. LogSingleMsg("Get function from CmbPadDll failed!");
  1212. }
  1213. else
  1214. LogSingleMsg("load CmbPadDll failed!");
  1215. #endif //linux
  1216. }
  1217. void LogDebug(bool bRevMsg, bool bCode1,bool bCode2,const char *msg, const char *revmsg, int code1, int code2)
  1218. {
  1219. SYSTEMTIME st;
  1220. GetLocalTimeRVC(st);
  1221. memset(g_allMsg,0,1024);
  1222. if (bRevMsg)
  1223. {
  1224. if (bCode1)
  1225. {
  1226. if (bCode2)
  1227. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s,%s,%d,%d\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, revmsg, code1, code2);
  1228. else
  1229. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s,%s %d\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, revmsg, code1);
  1230. }
  1231. else
  1232. {
  1233. if (bCode2)
  1234. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s,%s %d\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, revmsg,code2);
  1235. else
  1236. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s,%s\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, revmsg);
  1237. }
  1238. }
  1239. else
  1240. {
  1241. if (bCode1)
  1242. {
  1243. if (bCode2)
  1244. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s,%d,%d\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, code1, code2);
  1245. else
  1246. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s %d\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, code1);
  1247. }
  1248. else
  1249. {
  1250. if (bCode2)
  1251. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s %d\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg, code2);
  1252. else
  1253. sprintf(g_allMsg, "[%.2d:%.2d:%.2d.%.3d][DEBUG]%s\r\n", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, msg);
  1254. }
  1255. }
  1256. if (g_bLogFileOpen)
  1257. {
  1258. logFile.write(g_allMsg, strlen(g_allMsg));
  1259. logFile.flush();
  1260. }
  1261. }
  1262. void LogSingleMsg(const char *msg, int type)
  1263. {
  1264. #ifdef linux
  1265. SYSTEMTIME st;
  1266. GetLocalTimeRVC(st);
  1267. #endif
  1268. LogToFile(false, false, false, msg,"",0,0,type);
  1269. }
  1270. void LogToFile(bool bRevMsg, bool bCode1,bool bCode2,const char *msg, const char *revmsg, int code1, int code2, int type)
  1271. {
  1272. SYSTEMTIME st;
  1273. GetLocalTimeRVC(st);
  1274. EnterCriticalSectionRVC(g_cs_event);
  1275. //LogDebug(true, true, true, "oil", "test", g_startDay, st.wDay);
  1276. if (g_startDay != st.wDay)//switch to new day log
  1277. {
  1278. ServerReportEvent("change date");
  1279. logFile.close();
  1280. CheckGuardianDbgDirAndCreateDbgFile(true);
  1281. }
  1282. switch (type)
  1283. {
  1284. case 0:
  1285. default:
  1286. LogDebug(bRevMsg, bCode1,bCode2,msg, revmsg, code1, code2);
  1287. break;
  1288. }
  1289. LeaveCriticalSectionRVC(g_cs_event);
  1290. }
  1291. //unsigned int __stdcall DoLog(void *pData)
  1292. //{
  1293. // while (1)
  1294. // {
  1295. // cout << "wait..." << endl;
  1296. // WaitForSingleObject(g_logHandle, INFINITE);
  1297. // if (g_bLogFileOpen)
  1298. // {
  1299. // EnterCriticalSection(&g_cs_log);
  1300. // logFile.write(g_allMsg, strlen(g_allMsg));
  1301. // logFile.flush();
  1302. // LeaveCriticalSection(&g_cs_log);
  1303. // }
  1304. // }
  1305. //
  1306. // //_endthreadex(0);
  1307. // EndThreadRVC();
  1308. // return 0;
  1309. //}