mod_guiconsole.cpp 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325
  1. #include "mod_GuiConsole.h"
  2. #include "publicFunExport.h"
  3. #include <EventCode.h>
  4. #include "GUIConsole_msg_g.h"
  5. #include <chrono>
  6. #include <fstream>
  7. #include "modp_b64.h"
  8. #ifdef RVC_OS_WIN
  9. #include "..\mod_chromium\Chromium_client_g.h"
  10. #include <Windows.h>
  11. void openProcess(std::string cmdline)
  12. {
  13. PROCESS_INFORMATION processInfo;
  14. STARTUPINFO startupInfo;
  15. ::ZeroMemory(&startupInfo, sizeof(startupInfo));
  16. startupInfo.cb = sizeof(startupInfo);
  17. startupInfo.dwFlags = STARTF_USESHOWWINDOW;
  18. startupInfo.wShowWindow = SW_SHOW;
  19. ::CreateProcess(NULL, const_cast<char*>(cmdline.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo);
  20. }
  21. #else
  22. #include "../mod_chromium/Chromium_client_g.h" //启动浏览器接口
  23. #include <unistd.h>
  24. #include <cstdlib>
  25. #endif // RVC_OS_WIN
  26. #include <regex>
  27. void CGUIConsoleEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
  28. {
  29. pTransactionContext->SendAnswer(Error_Succeed);
  30. }
  31. void CGUIConsoleEntity::OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext)
  32. {
  33. pTransactionContext->SendAnswer(Error_Succeed);
  34. }
  35. void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  36. const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  37. const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
  38. {
  39. // 忽略GPIO事件
  40. if (dwUserCode == 0x2090000A || dwUserCode == 0x20900009)
  41. return;
  42. //did not open log sender
  43. if (!m_isOpenLogSender)
  44. return;
  45. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("OnLog %s %s", pszEntityName, pszMessage);
  46. if (pszMessage != NULL && strlen(pszMessage) > 2)
  47. {
  48. CSimpleStringA str = pszMessage;
  49. LogInfo msg;
  50. msg.sysError = dwSysError;
  51. msg.userCode = dwUserCode;
  52. msg.timeStr = GenerateTimeStr().c_str();
  53. msg.entityName = pszEntityName;
  54. msg.LogType = LogTypeEnumToString(eLogType).c_str();
  55. msg.message = str;
  56. msg.logLevel = eLevel;
  57. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnLog %x from entity %s, msg : %s", dwUserCode, NULL == pszEntityName ? "" : pszEntityName, NULL == pszMessage ? "" : pszMessage);
  58. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  59. }
  60. }
  61. void CGUIConsoleEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState)
  62. {
  63. //did not open log sender
  64. if (m_isOpenLogSender)
  65. {
  66. LogInfo msg;
  67. if (eLastState == EntityState_Idle && eState != EntityState_Idle)
  68. {
  69. msg.sysError = ErrorCodeEnum::Error_Closed;
  70. msg.userCode = ErrorCodeEnum::Error_Closed;
  71. msg.message = CSimpleString::Format("%s实体异常,重新启动...", pszEntityName);
  72. }
  73. else
  74. {
  75. msg.sysError = ErrorCodeEnum::Error_Succeed;
  76. msg.userCode = ErrorCodeEnum::Error_Succeed;
  77. if (eState == EntityState_Starting)
  78. msg.message = CSimpleString::Format("正在启动实体%s...", pszEntityName);
  79. else if (eState == EntityState_Idle)
  80. msg.message = CSimpleString::Format("%s 实体启动成功", pszEntityName);
  81. }
  82. msg.logLevel = 1;
  83. msg.timeStr = GenerateTimeStr().c_str();
  84. msg.entityName = pszEntityName;
  85. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  86. }
  87. if (m_isOpenEntityMonitor)
  88. PostEntityVary(pszEntityName);//if registered, while entity status changed, send to web
  89. }
  90. void CGUIConsoleEntity::OnTimeout(DWORD dwTimerID)
  91. {
  92. }
  93. std::pair<DWORD, std::string> CGUIConsoleEntity::openLogSender(SpReqAnsContext<GUIConsoleService_OpenLogSender_Req, GUIConsoleService_OpenLogSender_Ans>::Pointer ctx)
  94. {
  95. if ((__int64)m_logSubID != 0 && m_isOpenLogSender == true)
  96. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");//should not open again
  97. if ((__int64)m_logSubID != 0)
  98. {
  99. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_LOG_ALREADY_REGISTER, "openLogSender: already register");
  100. m_isOpenLogSender = true;
  101. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_LOG_ALREADY_REGISTER, "openLogSender: already register");
  102. }
  103. else
  104. {
  105. auto logType = StringToLogTypeEnum(ctx->Req.LogType.GetData());
  106. //check valid input for this function
  107. if (logType != LogTypeEnum::Log_Ignore && logType != LogTypeEnum::Log_Event && logType != LogTypeEnum::Log_Warning && logType != LogTypeEnum::Log_Error)
  108. {
  109. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NotSupport, WARN_GUICONSOLE_LOGSENDER_UNVAILD_INPUT,
  110. CSimpleString::Format("openLogSender: not valid input: %s, use default warning", ctx->Req.LogType.GetData()).GetData());
  111. m_sendLogType = LogTypeEnum::Log_Warning;
  112. }
  113. else
  114. m_sendLogType = logType;
  115. auto rc = GetFunction()->SubscribeLog(m_logSubID, this, (LogTypeEnum)m_sendLogType, Severity_None, Error_IgnoreAll, -1, NULL, false);
  116. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("openLogSender SubscribeLog %s %s", ctx->Req.LogType.GetData(),
  117. (rc == ErrorCodeEnum::Error_Succeed ? "success" : "failed"));
  118. m_isOpenLogSender = (rc == ErrorCodeEnum::Error_Succeed);
  119. return std::pair<DWORD, std::string>(rc, "");
  120. }
  121. }
  122. std::pair<DWORD, std::string> CGUIConsoleEntity::closeLogSender()
  123. {
  124. if ((__int64)m_logSubID == 0 && m_isOpenLogSender == false)
  125. {
  126. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");//should not close again
  127. }
  128. if ((__int64)m_logSubID == 0)
  129. {
  130. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_LOG_ALREADY_UNREGISTER, "closeLogSender: already unregister");
  131. m_isOpenLogSender = false;
  132. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_LOG_ALREADY_UNREGISTER, "closeLogSender: already unregister");
  133. }
  134. else
  135. {
  136. auto rc = GetFunction()->UnsubscribeLog(m_logSubID);
  137. if(rc == ErrorCodeEnum::Error_Succeed)
  138. m_logSubID = 0;
  139. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("closeLogSender UnsubscribeLog %s", (rc == ErrorCodeEnum::Error_Succeed ? "success" : "failed"));
  140. m_isOpenLogSender = !(rc == ErrorCodeEnum::Error_Succeed);
  141. return std::pair<DWORD, std::string>(rc, "");
  142. }
  143. }
  144. std::pair<DWORD, std::string> CGUIConsoleEntity::openEntityMonitor(SpReqAnsContext<GUIConsoleService_OpenEntityMonitor_Req, GUIConsoleService_OpenEntityMonitor_Ans>::Pointer ctx)
  145. {
  146. if (m_isOpenEntityMonitor && thread_entityMonitor != NULL)
  147. {
  148. m_entityMonitor_shouldwork = true;//broadcast entity arr immediately
  149. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");//should not open again
  150. }
  151. m_isOpenEntityMonitor = true;
  152. if (ctx->Req.longestFrequence <= 1)
  153. m_longestEntityMonitor = 1;
  154. else
  155. m_longestEntityMonitor = ctx->Req.longestFrequence;
  156. if (ctx->Req.leastFrequence <= 1)
  157. m_leastEntityMonitor = 1;
  158. else
  159. m_leastEntityMonitor = ctx->Req.leastFrequence;
  160. m_entityMonitor_shouldwork = true;
  161. int rc_errorenum = ErrorCodeEnum::Error_Succeed;
  162. if (!GetFunction()->HasPrivilege())
  163. {
  164. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NoPrivilege, WARN_GUICONSOLE_ENTITYMONITOR_NO_PRIVILEGE, "openEntityMonitor no privilige");
  165. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_ENTITYMONITOR_NO_PRIVILEGE, "");
  166. }
  167. auto entityMonitorSender = [this] {
  168. int rc_errorenum = ErrorCodeEnum::Error_Succeed;
  169. if (ErrorCodeEnum::Error_Succeed != (rc_errorenum = GetFunction()->GetPrivilegeFunction()->RegistEntityStateEvent(NULL, this)))
  170. {
  171. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NoPrivilege, WARN_GUICONSOLE_ENTITYMONITOR_REGISTER,
  172. CSimpleStringA::Format("openEntityMonitor RegistEntityStateEvent failed, %d", rc_errorenum));
  173. }
  174. while (m_isOpenEntityMonitor)
  175. {
  176. if(m_entityMonitor_shouldwork || (std::chrono::steady_clock::now() - m_entityMonitorlast_notify_time >= std::chrono::seconds(m_longestEntityMonitor)))
  177. {
  178. m_entityMonitorlast_notify_time = std::chrono::steady_clock::now();
  179. m_entityMonitor_shouldwork = false;
  180. EntityStatus cur;
  181. CAutoArray<EntityEntry> Entities;
  182. auto ret = GetAllEntity(Entities);
  183. if (ret.first != ErrorCodeEnum::Error_Succeed)
  184. {
  185. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_ENTITYMONITOR_GETINFO_FAILED,
  186. CSimpleStringA::Format("openEntityMonitor - GetAllEntity failed, %d", ret.first));
  187. continue;
  188. }
  189. cur.entityName.Init(Entities.GetCount());
  190. cur.status.Init(Entities.GetCount());
  191. cur.processId.Init(Entities.GetCount());
  192. cur.versionNo.Init(Entities.GetCount());
  193. cur.lastStartTime.Init(Entities.GetCount());
  194. for (int i = 0; i < Entities.GetCount(); ++i) {
  195. cur.entityName[i] = Entities[i].Name;
  196. cur.status[i] = EntityEntry::GetStateName(Entities[i].State);
  197. cur.processId[i] = std::to_string(Entities[i].Pid).c_str();
  198. cur.versionNo[i] = getRunVersion();
  199. cur.lastStartTime[i] = Entities[i].lastStartTime.ToTimeString();
  200. }
  201. SpSendBroadcast(GetFunction(), eMsg_EntityStatus, eMsgSig_EntityStatus, cur);
  202. }
  203. for (auto cur = std::chrono::milliseconds(0); cur < std::chrono::seconds(m_leastEntityMonitor); cur = cur + std::chrono::milliseconds(50))
  204. {
  205. std::this_thread::sleep_for(std::chrono::milliseconds(50));
  206. if (!m_isOpenEntityMonitor)
  207. return;
  208. }
  209. }
  210. };
  211. if (thread_entityMonitor != NULL)
  212. {
  213. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_ENTITYMONITOR_EXISTED,
  214. "openEntityMonitor, thread_entityMonitor already existed");
  215. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_ENTITYMONITOR_EXISTED, "");
  216. }
  217. thread_entityMonitor = new std::thread(entityMonitorSender);
  218. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("openEntityMonitor create entityMonitor sender thread %s, leastFrequence:%d, m_longestEntityMonitor:%d",
  219. (thread_entityMonitor != NULL ? "success" : "failed"), m_leastEntityMonitor, m_longestEntityMonitor);
  220. return std::pair<DWORD, std::string>(Error_Succeed, "");
  221. }
  222. std::pair<DWORD, std::string> CGUIConsoleEntity::closeEntityMonitor()
  223. {
  224. if (m_isOpenEntityMonitor == false && thread_entityMonitor == NULL)
  225. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");//should not close again
  226. m_isOpenEntityMonitor = false;
  227. int rc_errorenum = ErrorCodeEnum::Error_Succeed;
  228. if (!GetFunction()->HasPrivilege())
  229. {
  230. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NoPrivilege, WARN_GUICONSOLE_ENTITYMONITOR_NO_PRIVILEGE, "closeEntityMonitor no privilige");
  231. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_ENTITYMONITOR_NO_PRIVILEGE, "");
  232. }
  233. if (ErrorCodeEnum::Error_Succeed != (rc_errorenum = GetFunction()->GetPrivilegeFunction()->UnregistEntityStateEvent(NULL)))
  234. {
  235. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NoPrivilege, WARN_GUICONSOLE_ENTITYMONITOR_UNREGISTER,
  236. CSimpleStringA::Format("closeEntityMonitor unRegistEntityStateEvent failed, %d", rc_errorenum));
  237. }
  238. if (thread_entityMonitor == NULL)
  239. {
  240. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NotExist, WARN_GUICONSOLE_ENTITYMONITOR_NOTEXISTED,
  241. "closeEntityMonitor, thread_entityMonitor not exist");
  242. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_ENTITYMONITOR_NOTEXISTED, "");
  243. }
  244. thread_entityMonitor->join();
  245. delete thread_entityMonitor;
  246. thread_entityMonitor = NULL;
  247. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("closeEntityMonitor close entityMonitor sender thread success");
  248. return std::pair<DWORD, std::string>(Error_Succeed, "");
  249. }
  250. std::pair<DWORD, std::string> CGUIConsoleEntity::openPerformanceSender(SpReqAnsContext<GUIConsoleService_OpenPerformanceSender_Req, GUIConsoleService_OpenPerformanceSender_Ans>::Pointer ctx)
  251. {
  252. if (m_isOpenPerformanceSender && thread_performanceSend != NULL)
  253. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");//should not open again
  254. m_isOpenPerformanceSender = true;
  255. if (ctx->Req.sendFrequence <= 1)
  256. m_performanceSenderFrequence = 1;
  257. else
  258. m_performanceSenderFrequence = ctx->Req.sendFrequence;
  259. auto performanceSender = [this] {
  260. while (m_isOpenPerformanceSender)
  261. {
  262. system_monitor_status curStatus;
  263. auto pullret = PollProcessList(m_performanceSenderFrequence, curStatus);
  264. PerformanceList dst;
  265. dst.NameArr.Init(curStatus.processList.size());
  266. dst.pidArr.Init(curStatus.processList.size());
  267. dst.cpuArr.Init(curStatus.processList.size());
  268. dst.memoryArr.Init(curStatus.processList.size());
  269. dst.cmdlineArr.Init(curStatus.processList.size());
  270. dst.handleNumArr.Init(curStatus.processList.size());
  271. for (int i = 0; i < curStatus.processList.size(); i++)
  272. {
  273. dst.NameArr[i] = curStatus.processList[i].ExeName;
  274. dst.pidArr[i] = curStatus.processList[i].ID;
  275. dst.cpuArr[i] = curStatus.processList[i].PercentProcessorTime;
  276. dst.memoryArr[i] = curStatus.processList[i].PercentMemory;
  277. dst.cmdlineArr[i] = "";
  278. dst.handleNumArr[i] = curStatus.processList[i].ThreadCount;
  279. }
  280. SpSendBroadcast(GetFunction(), eMsg_PerformanceList, eMsgSig_PerformanceList, dst);
  281. for (auto cur = std::chrono::milliseconds(0); cur < std::chrono::seconds(m_performanceSenderFrequence); cur = cur + std::chrono::milliseconds(50))
  282. {
  283. std::this_thread::sleep_for(std::chrono::milliseconds(50));
  284. if (!m_isOpenPerformanceSender)
  285. return;
  286. }
  287. }
  288. };
  289. if (thread_performanceSend != NULL)
  290. {
  291. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_AlreadyExist, WARN_GUICONSOLE_PERFORMANCE_EXISTED,
  292. "openPerformanceSender, thread_performanceSend already existed");
  293. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_PERFORMANCE_EXISTED, "");
  294. }
  295. thread_performanceSend = new std::thread(performanceSender);
  296. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("openPerformanceSender create performance sender thread %s, sendFrequence:%d",
  297. (thread_performanceSend != NULL ? "success" : "failed"), m_performanceSenderFrequence);
  298. return std::pair<DWORD, std::string>(Error_Succeed, "");
  299. }
  300. std::pair<DWORD, std::string> CGUIConsoleEntity::closePerformanceSender()
  301. {
  302. if (m_isOpenPerformanceSender == false && thread_performanceSend == NULL)
  303. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");//should not close again
  304. m_isOpenPerformanceSender = false;
  305. if(thread_performanceSend == NULL)
  306. {
  307. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NotExist, WARN_GUICONSOLE_PERFORMANCE_NOTEXISTED,
  308. "closePerformanceSender, thread_performanceSend not exist");
  309. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_PERFORMANCE_NOTEXISTED, "");
  310. }
  311. thread_performanceSend->join();
  312. delete thread_performanceSend;
  313. thread_performanceSend = NULL;
  314. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("closePerformanceSender close performance sender thread success");
  315. return std::pair<DWORD, std::string>(Error_Succeed, "");
  316. }
  317. std::pair<DWORD, std::string> CGUIConsoleEntity::VTMSystemControl(SpReqAnsContext<GUIConsoleService_VTMSystemControl_Req, GUIConsoleService_VTMSystemControl_Ans>::Pointer ctx)
  318. {
  319. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  320. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  321. if (pFuncPrivilege == NULL)
  322. {
  323. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NoPrivilege, WARN_GUICONSOLE_NO_PRIVILIGE, "VTMSystemControl no privilige");
  324. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_NO_PRIVILIGE, "");
  325. }
  326. LogInfo msg;
  327. msg.sysError = Error_Succeed;
  328. msg.userCode = Error_Succeed;
  329. msg.timeStr = GenerateTimeStr().c_str();
  330. msg.entityName = GetEntityName();
  331. msg.LogType = 1;
  332. DWORD rc = Error_Succeed;
  333. if (!ctx->Req.rebootFunction.Compare("RestartApp", true))
  334. {
  335. msg.message = "正在重启应用";
  336. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  337. rc = pFuncPrivilege->Reboot(RebootTrigger_ManualLocal, RebootWayEnum::RebootWay_Framework);
  338. }
  339. else if (!ctx->Req.rebootFunction.Compare("RestartOS", true))
  340. {
  341. msg.message = "正在重启系统";
  342. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  343. #ifdef RVC_OS_WIN
  344. rc = pFuncPrivilege->Reboot(RebootTrigger_ManualLocal, RebootWayEnum::RebootWay_OS);
  345. #else
  346. std::string cmdline = "sudo reboot";
  347. system(cmdline.c_str());
  348. #endif
  349. }
  350. else if (!ctx->Req.rebootFunction.Compare("ShutdownOS", true))
  351. {
  352. msg.message = "正在关闭系统";
  353. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  354. #ifdef RVC_OS_WIN
  355. std::string cmdline = "shutdown -f -s -t 00";
  356. openProcess(cmdline);
  357. #else
  358. std::string cmdline = "sudo shutdown --poweroff now";
  359. system(cmdline.c_str());
  360. #endif
  361. }
  362. else if (!ctx->Req.rebootFunction.Compare("ExitApp", true))
  363. {
  364. msg.message = "正在退出应用";
  365. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  366. rc = pFuncPrivilege->Reboot(RebootTrigger_ManualLocal, RebootWayEnum::RebootWay_Framework);
  367. }
  368. else
  369. {
  370. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_NoDefine, WARN_GUICONSOLE_REBOOT_UNKNOWN_REASON,
  371. CSimpleStringA::Format("VTMSystemControl receive unknown param %s, do nothing", ctx->Req.rebootFunction.GetData()).GetData());
  372. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_REBOOT_UNKNOWN_REASON, "");
  373. }
  374. return std::pair<DWORD, std::string>(rc, "");
  375. }
  376. std::pair<DWORD, std::string> CGUIConsoleEntity::VTM_controlEntity(SpReqAnsContext<GUIConsoleService_VTM_controlEntity_Req, GUIConsoleService_VTM_controlEntity_Ans>::Pointer ctx)
  377. {
  378. auto control_thread = [this](SpReqAnsContext<GUIConsoleService_VTM_controlEntity_Req, GUIConsoleService_VTM_controlEntity_Ans>::Pointer ctx)
  379. {
  380. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VTM_controlEntity operate %s to %s", ctx->Req.operation.GetData(), ctx->Req.entityName.GetData());
  381. int ret = ErrorCodeEnum::Error_Succeed;
  382. if (!ctx->Req.operation.Compare("Start", true))
  383. ret = sync_StartEntity(ctx->Req.entityName, NULL, NULL);
  384. else if (!ctx->Req.operation.Compare("Stop", true))
  385. ret = sync_StopEntity(ctx->Req.entityName, NULL);
  386. else if (!ctx->Req.operation.Compare("Pause", true))
  387. ret = sync_PauseEntity(ctx->Req.entityName, NULL);
  388. else if (!ctx->Req.operation.Compare("Continue", true))
  389. ret = sync_ContinueEntity(ctx->Req.entityName, NULL);
  390. else if (!ctx->Req.operation.Compare("Terminate", true))
  391. ret = sync_TerminateEntity(ctx->Req.entityName, NULL);
  392. else if (!ctx->Req.operation.Compare("OpenLog", true))
  393. ret = sync_OpenLog(ctx->Req.entityName, NULL);
  394. if (m_isOpenLogSender)
  395. {
  396. LogInfo msg;
  397. msg.sysError = ret;
  398. msg.userCode = ret;
  399. msg.timeStr = GenerateTimeStr().c_str();
  400. msg.entityName = ctx->Req.entityName;
  401. if (ret == ErrorCodeEnum::Error_Succeed)
  402. msg.LogType = "Info";
  403. else
  404. msg.LogType = "Warning";
  405. msg.logLevel = 3;
  406. msg.message = CSimpleString::Format("%s %s %s, reason:%d", ctx->Req.entityName, ctx->Req.operation
  407. , (ret == ErrorCodeEnum::Error_Succeed ? "Success" : "Failed"), ret);
  408. SpSendBroadcast(GetFunction(), eMsg_LogInfo, eMsgSig_LogInfo, msg);
  409. }
  410. if (m_isOpenEntityMonitor && ctx->Req.operation.Compare("OpenLog", true))
  411. {
  412. PostEntityVary(ctx->Req.entityName);//if registered, while entity status changed, send to web
  413. ctx->Answer(ErrorCodeEnum::Error_Succeed);
  414. }
  415. if (ret == ErrorCodeEnum::Error_Succeed)
  416. ctx->Answer(ErrorCodeEnum::Error_Succeed);
  417. else
  418. ctx->Answer(ErrorCodeEnum::Error_Unexpect, ret);
  419. };
  420. std::thread(control_thread, ctx).detach();
  421. return std::pair<DWORD, std::string>(ErrorCodeEnum::Error_Succeed, "");
  422. }
  423. void CGUIConsoleEntity::updateStartupEntity()
  424. {
  425. if (m_startupEntityArr.size() != 0)
  426. return;
  427. CSystemRunInfo sysRunInfo;
  428. if (ErrorCodeEnum::Error_Succeed != GetFunction()->GetSystemRunInfo(sysRunInfo))
  429. return;
  430. if (!sysRunInfo.bBasicCfgWork)
  431. return;
  432. CSystemStaticInfo m_terminalInfo;
  433. if (ErrorCodeEnum::Error_Succeed != GetFunction()->GetSystemStaticInfo(m_terminalInfo))
  434. return;
  435. CSmartPointer<IConfigInfo> spConfigCen, spRunCfg;
  436. GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  437. CSimpleStringA csCoreBootList(true), csSafeLoadList(true), csOperatingList(true), csKeyCB("CoreBootList."), csKeySL("SafeLoadList."), csKeyOp("OperatingList.");
  438. spConfigCen->ReadConfigValue("VtmLoader", (csKeyCB + m_terminalInfo.strMachineType).GetData(), csCoreBootList);
  439. spConfigCen->ReadConfigValue("VtmLoader", (csKeySL + m_terminalInfo.strMachineType).GetData(), csSafeLoadList);
  440. spConfigCen->ReadConfigValue("VtmLoader", (csKeyOp + m_terminalInfo.strMachineType).GetData(), csOperatingList);
  441. //"GuiConsole|Chromium|VtmLoader|";
  442. int nEntityCount = 3;
  443. auto booList = csCoreBootList.Split('|');
  444. booList.Append(csSafeLoadList.Split('|'));
  445. booList.Append(csOperatingList.Split('|'));
  446. if (booList.GetCount() < 8)
  447. return;
  448. m_startupEntityArr.push_back("VtmLoader");
  449. m_startupEntityArr.push_back("Chromium");
  450. m_startupEntityArr.push_back("GUIConsole");
  451. for (int i = 0; i < booList.GetCount(); i++)
  452. {
  453. m_startupEntityArr.push_back(booList[i].SubString(0, booList[i].GetLength() - 2).GetData());
  454. }
  455. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get effect entityNum:%d", m_startupEntityArr.size());
  456. }
  457. std::pair<DWORD, std::string> CGUIConsoleEntity::GetBasicInformation(SpReqAnsContext<GUIConsoleService_GetBasicInformation_Req, GUIConsoleService_GetBasicInformation_Ans>::Pointer ctx)
  458. {
  459. //get idle entityNum;
  460. int idleNum = 0, totalNum = 0;
  461. CAutoArray<EntityEntry> Entities;
  462. auto ret = ErrorCodeEnum::Error_Succeed;
  463. auto entity_ret = GetAllEntity(Entities);
  464. if (ErrorCodeEnum::Error_Succeed != entity_ret.first)
  465. {
  466. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_Unexpect, WARN_GUICONSOLE_BASICINFO_GETENTITY
  467. , CSimpleString::Format("GetBasicInformation-GetAllEntity get entity failed, %d", entity_ret.first).GetData());
  468. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_BASICINFO_GETENTITY, "");
  469. }
  470. totalNum = Entities.GetCount();
  471. for (int i = 0; i < Entities.GetCount(); i++)
  472. {
  473. CSimpleString curState = EntityEntry::GetStateName(Entities[i].State);
  474. if (!curState.Compare("Idle", true))
  475. idleNum++;
  476. }
  477. ctx->Ans.total_entityNum = totalNum;
  478. ctx->Ans.Idle_entityNum = idleNum;
  479. CSystemStaticInfo m_terminalInfo;
  480. if (ErrorCodeEnum::Error_Succeed != (ret = GetFunction()->GetSystemStaticInfo(m_terminalInfo)))
  481. {
  482. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_Unexpect, WARN_GUICONSOLE_BASICINFO_SYSTEMINFO_FAILED
  483. , CSimpleString::Format("GetBasicInformation-GetSystemStaticInfo failed, %d", ret).GetData());
  484. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_BASICINFO_SYSTEMINFO_FAILED, "");
  485. }
  486. ctx->Ans.terminalNo = m_terminalInfo.strTerminalID;
  487. ctx->Ans.machineType = m_terminalInfo.strMachineType;
  488. ctx->Ans.manufacturer = m_terminalInfo.strManufacturer;
  489. ctx->Ans.machineModel = m_terminalInfo.strMachineModel;
  490. ctx->Ans.versionNo = getRunVersion();
  491. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  492. ctx->Ans.Env = "ST";
  493. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  494. ctx->Ans.Env = "UAT";
  495. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  496. ctx->Ans.Env = "PRD";
  497. #else/*本地编译等非DevOps环境编译的版本*/
  498. ctx->Ans.Env = "DEV";
  499. #endif
  500. CSystemRunInfo sysRunInfo;
  501. if (ErrorCodeEnum::Error_Succeed != (ret = GetFunction()->GetSystemRunInfo(sysRunInfo)))
  502. {
  503. LogWarn(SeverityLevelEnum::Severity_Middle, ErrorCodeEnum::Error_Unexpect, WARN_GUICONSOLE_BASICINFO_RUNINFO_FAILED
  504. , CSimpleString::Format("GetBasicInformation-GetSystemRunInfo failed, %d", ret).GetData());
  505. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_BASICINFO_RUNINFO_FAILED, "");
  506. }
  507. ctx->Ans.vtm_startupTime = sysRunInfo.tmStart.ToTimeString();
  508. ctx->Ans.basicconfig_status = sysRunInfo.bBasicCfgWork;
  509. ctx->Ans.errmsg_status = sysRunInfo.bErrCfgWork;
  510. if (m_startupEntityArr.size() > 0)
  511. ctx->Ans.total_entityNum = m_startupEntityArr.size();
  512. return std::pair<DWORD, std::string>(ErrorCodeEnum::Error_Succeed, "");
  513. }
  514. std::pair<DWORD, std::string> CGUIConsoleEntity::GetHelpInformationArr(SpReqAnsContext<GUIConsoleService_GetHelpInformationArr_Req, GUIConsoleService_GetHelpInformationArr_Ans>::Pointer ctx)
  515. {
  516. std::map<std::string, std::string> helpArr;
  517. helpArr.insert(std::make_pair("runcfg", "root配置"));
  518. helpArr.insert(std::make_pair("centercfg", "集中配置"));
  519. helpArr.insert(std::make_pair("shellcfg", "shell配置"));
  520. ctx->Ans.titleArr.Init(helpArr.size());
  521. ctx->Ans.cn_titleArr.Init(helpArr.size());
  522. int pos = 0;
  523. for(auto it : helpArr)
  524. {
  525. ctx->Ans.titleArr[pos] = it.first.c_str();
  526. ctx->Ans.cn_titleArr[pos] = it.second.c_str();
  527. pos++;
  528. }
  529. return std::pair<DWORD, std::string>(ErrorCodeEnum::Error_Succeed, "");
  530. }
  531. #if(defined _WIN32 || defined _WIN64)
  532. std::string string_to_utf8(const std::string& str) {
  533. int wcLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
  534. if (wcLen > 0) {
  535. wchar_t* pwBuf = new wchar_t[wcLen + 1];
  536. if (pwBuf == NULL) {
  537. return std::string();
  538. }
  539. memset(pwBuf, 0, sizeof(wchar_t) * (wcLen + 1));
  540. wcLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, pwBuf, wcLen);
  541. if (wcLen <= 0) {
  542. delete[] pwBuf;
  543. return std::string();
  544. }
  545. std::wstring modifyStr = pwBuf;
  546. int ucLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, 0, NULL, NULL);
  547. //DbgEx("ucLen = %d", ucLen);
  548. if (ucLen < 0) {
  549. delete[] pwBuf;
  550. return std::string();
  551. }
  552. char* pBuf = new char[ucLen + 1];
  553. if (pBuf == NULL) {
  554. delete[]pwBuf;
  555. return std::string();
  556. }
  557. memset(pBuf, 0, sizeof(char) * (ucLen + 1));
  558. ucLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, pBuf, ucLen, NULL, NULL);
  559. if (ucLen <= 0) {
  560. delete[] pwBuf;
  561. delete[] pBuf;
  562. return std::string();
  563. }
  564. std::string retStr(pBuf);
  565. //DbgEx("string_to_utf8 return: %s", retStr.c_str());
  566. if (pwBuf) {
  567. delete[] pwBuf;
  568. pwBuf = NULL;
  569. }
  570. if (pBuf) {
  571. delete[] pBuf;
  572. pBuf = NULL;
  573. }
  574. return retStr;
  575. }
  576. return std::string();
  577. }
  578. #endif
  579. std::pair<DWORD, std::string> CGUIConsoleEntity::GetHelpDetail(SpReqAnsContext<GUIConsoleService_GetHelpDetail_Req, GUIConsoleService_GetHelpDetail_Ans>::Pointer ctx)
  580. {
  581. CSimpleString tilte = ctx->Req.title;
  582. CSmartPointer<IConfigInfo> spConfig;
  583. if (tilte.Compare("runcfg", true) == 0)
  584. {
  585. ctx->Ans.subtitle = "root配置";
  586. ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_Root, spConfig);
  587. if (!IS_SUCCEED(erroCode))
  588. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_HELP_ROOT_FAILED, "");
  589. }
  590. else if (tilte.Compare("centercfg", true) == 0)
  591. {
  592. ctx->Ans.subtitle = "集中配置";
  593. ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
  594. if (!IS_SUCCEED(erroCode))
  595. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_HELP_CENTER_FAILED, "");
  596. }
  597. else if (tilte.Compare("shellcfg", true) == 0)
  598. {
  599. ctx->Ans.subtitle = "shell配置";
  600. ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_Shell, spConfig);
  601. if (!IS_SUCCEED(erroCode))
  602. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_HELP_SHELL_FAILED, "");
  603. }
  604. CAutoArray<CSimpleStringA> arrSections, arrKeys;
  605. CSimpleStringA dstStr;
  606. dstStr.Append("# ").Append(ctx->Ans.subtitle).Append("\n");
  607. dstStr += "| moudle | name | value |\n";//table header
  608. dstStr += "-----|------|-----\n";//sperate
  609. if (Error_Succeed != spConfig->ReadAllSections(arrSections))
  610. {
  611. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Read all sections failed.");
  612. return std::pair<DWORD, std::string>(WARN_GUICONSOLE_HELP_GETSECTION_FAILED, "");
  613. }
  614. for (int i = 0; i < arrSections.GetCount(); ++i)
  615. {
  616. spConfig->ReadAllKeys(arrSections[i].GetData(), arrKeys);
  617. for (int j = 0; j < arrKeys.GetCount(); ++j)
  618. {
  619. CSimpleStringA value, tmp;
  620. spConfig->ReadConfigValue(arrSections[i].GetData(), arrKeys[j].GetData(), value);
  621. tmp = CSimpleStringA::Format("{\"moudle\":\"%s\", \"name\":\"%s\", \"value\":\"%s\"}",
  622. arrSections[i].GetData(), arrKeys[j].GetData(), value.GetData());
  623. std::string result = value.GetData();
  624. std::string::size_type pos = 0;
  625. while ((pos = result.find("|", pos)) != std::string::npos) {
  626. result.replace(pos, 1, "\\|");
  627. pos += 2; // 跳过新插入的"\\"
  628. }
  629. dstStr.Append("| ").Append(arrSections[i]).Append(" | ").Append(arrKeys[j]).Append(" | ").Append(result.c_str()).Append(" |\n");
  630. }
  631. }
  632. #if(defined _WIN32 || defined _WIN64)
  633. dstStr = string_to_utf8(dstStr.GetData()).c_str();
  634. #endif
  635. int base64Len = modp_b64_encode_len(dstStr.GetLength());
  636. char *base64Data = (char*)malloc(sizeof(char) * base64Len);
  637. modp_b64_encode(base64Data, (const char*)dstStr.GetData(), dstStr.GetLength());
  638. ctx->Ans.detail = base64Data;
  639. if (base64Data)
  640. free(base64Data);
  641. return std::pair<DWORD, std::string>(ErrorCodeEnum::Error_Succeed, "");
  642. }
  643. CGUIConsoleEntity::CGUIConsoleEntity()
  644. :m_isOpenLogSender(false), m_isOpenEntityMonitor(false), m_isOpenPerformanceSender(false),
  645. m_sendLogType(LogTypeEnum::Log_Warning), thread_performanceSend(NULL), thread_entityMonitor(NULL),
  646. m_longestEntityMonitor(60), m_leastEntityMonitor(2)
  647. {
  648. }
  649. CGUIConsoleEntity::~CGUIConsoleEntity()
  650. {
  651. m_isOpenPerformanceSender = false;
  652. m_isOpenEntityMonitor = false;
  653. m_isOpenLogSender = false;
  654. if (thread_performanceSend)
  655. {
  656. thread_performanceSend->detach();
  657. delete thread_performanceSend;
  658. thread_performanceSend = NULL;
  659. }
  660. if (thread_entityMonitor)
  661. {
  662. thread_entityMonitor->detach();
  663. delete thread_entityMonitor;
  664. thread_entityMonitor = NULL;
  665. }
  666. }
  667. void CGUIConsoleSession::Handle_OpenLogSender(SpReqAnsContext<GUIConsoleService_OpenLogSender_Req, GUIConsoleService_OpenLogSender_Ans>::Pointer ctx)
  668. {
  669. LOG_FUNCTION();
  670. DbgToBeidou(ctx->link, __FUNCTION__)();
  671. auto ret = m_pEntity->openLogSender(ctx);
  672. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  673. }
  674. void CGUIConsoleSession::Handle_CloseLogSender(SpReqAnsContext<GUIConsoleService_CloseLogSender_Req, GUIConsoleService_CloseLogSender_Ans>::Pointer ctx)
  675. {
  676. LOG_FUNCTION();
  677. DbgToBeidou(ctx->link, __FUNCTION__)();
  678. auto ret = m_pEntity->closeLogSender();
  679. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  680. }
  681. void CGUIConsoleSession::Handle_OpenEntityMonitor(SpReqAnsContext<GUIConsoleService_OpenEntityMonitor_Req, GUIConsoleService_OpenEntityMonitor_Ans>::Pointer ctx)
  682. {
  683. LOG_FUNCTION();
  684. DbgToBeidou(ctx->link, __FUNCTION__)();
  685. auto ret = m_pEntity->openEntityMonitor(ctx);
  686. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  687. }
  688. void CGUIConsoleSession::Handle_CloseEntityMonitor(SpReqAnsContext<GUIConsoleService_CloseEntityMonitor_Req, GUIConsoleService_CloseEntityMonitor_Ans>::Pointer ctx)
  689. {
  690. LOG_FUNCTION();
  691. DbgToBeidou(ctx->link, __FUNCTION__)();
  692. auto ret = m_pEntity->closeEntityMonitor();
  693. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  694. }
  695. void CGUIConsoleSession::Handle_OpenPerformanceSender(SpReqAnsContext<GUIConsoleService_OpenPerformanceSender_Req, GUIConsoleService_OpenPerformanceSender_Ans>::Pointer ctx)
  696. {
  697. LOG_FUNCTION();
  698. DbgToBeidou(ctx->link, __FUNCTION__)();
  699. auto ret = m_pEntity->openPerformanceSender(ctx);
  700. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  701. }
  702. void CGUIConsoleSession::Handle_ClosePerformanceSender(SpReqAnsContext<GUIConsoleService_ClosePerformanceSender_Req, GUIConsoleService_ClosePerformanceSender_Ans>::Pointer ctx)
  703. {
  704. LOG_FUNCTION();
  705. DbgToBeidou(ctx->link, __FUNCTION__)();
  706. auto ret = m_pEntity->closePerformanceSender();
  707. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  708. }
  709. void CGUIConsoleSession::Handle_VTMSystemControl(SpReqAnsContext<GUIConsoleService_VTMSystemControl_Req, GUIConsoleService_VTMSystemControl_Ans>::Pointer ctx)
  710. {
  711. LOG_FUNCTION();
  712. DbgToBeidou(ctx->link, __FUNCTION__)();
  713. auto ret = m_pEntity->VTMSystemControl(ctx);
  714. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  715. }
  716. void CGUIConsoleSession::Handle_VTM_controlEntity(SpReqAnsContext<GUIConsoleService_VTM_controlEntity_Req, GUIConsoleService_VTM_controlEntity_Ans>::Pointer ctx)
  717. {
  718. LOG_FUNCTION();
  719. DbgToBeidou(ctx->link, __FUNCTION__)();
  720. auto ret = m_pEntity->VTM_controlEntity(ctx);
  721. }
  722. void CGUIConsoleSession::Handle_GetAllEntityList(SpReqAnsContext<GUIConsoleService_GetAllEntityList_Req, GUIConsoleService_GetAllEntityList_Ans>::Pointer ctx)
  723. {
  724. LOG_FUNCTION();
  725. DbgToBeidou(ctx->link, __FUNCTION__)();
  726. CAutoArray<EntityEntry> Entities;
  727. auto ret = m_pEntity->GetAllEntity(Entities);
  728. if (ret.first != ErrorCodeEnum::Error_Succeed)
  729. {
  730. ctx->Answer((ErrorCodeEnum)ret.first, (ErrorCodeEnum)ret.first);
  731. return;
  732. }
  733. ctx->Ans.entityName.Init(Entities.GetCount());
  734. ctx->Ans.status.Init(Entities.GetCount());
  735. ctx->Ans.processId.Init(Entities.GetCount());
  736. ctx->Ans.versionNo.Init(Entities.GetCount());
  737. ctx->Ans.lastStartTime.Init(Entities.GetCount());
  738. for (int i = 0; i < Entities.GetCount(); ++i) {
  739. ctx->Ans.entityName[i] = Entities[i].Name;
  740. ctx->Ans.status[i] = EntityEntry::GetStateName(Entities[i].State);
  741. ctx->Ans.processId[i] = std::to_string(Entities[i].Pid).c_str();
  742. ctx->Ans.versionNo[i] = m_pEntity->getRunVersion();
  743. ctx->Ans.lastStartTime[i] = Entities[i].lastStartTime.ToTimeString();
  744. }
  745. ctx->Answer(Error_Succeed);
  746. }
  747. void CGUIConsoleSession::Handle_GetBasicInformation(SpReqAnsContext<GUIConsoleService_GetBasicInformation_Req, GUIConsoleService_GetBasicInformation_Ans>::Pointer ctx)
  748. {
  749. LOG_FUNCTION();
  750. DbgToBeidou(ctx->link, __FUNCTION__)();
  751. auto ret = m_pEntity->GetBasicInformation(ctx);
  752. ctx->Answer((ErrorCodeEnum)ret.first, ret.first);
  753. }
  754. void CGUIConsoleSession::Handle_GetHelpInformationArr(SpReqAnsContext<GUIConsoleService_GetHelpInformationArr_Req, GUIConsoleService_GetHelpInformationArr_Ans>::Pointer ctx)
  755. {
  756. LOG_FUNCTION();
  757. DbgToBeidou(ctx->link, __FUNCTION__)();
  758. m_pEntity->GetHelpInformationArr(ctx);
  759. ctx->Answer(ErrorCodeEnum::Error_Succeed);
  760. }
  761. void CGUIConsoleSession::Handle_GetHelpDetail(SpReqAnsContext<GUIConsoleService_GetHelpDetail_Req, GUIConsoleService_GetHelpDetail_Ans>::Pointer ctx)
  762. {
  763. LOG_FUNCTION();
  764. DbgToBeidou(ctx->link, __FUNCTION__)();
  765. m_pEntity->GetHelpDetail(ctx);
  766. ctx->Answer(ErrorCodeEnum::Error_Succeed);
  767. }
  768. void CGUIConsoleSession::Handle_OpenCommonPage(SpReqAnsContext<GUIConsoleService_OpenCommonPage_Req, GUIConsoleService_OpenCommonPage_Ans>::Pointer ctx)
  769. {
  770. LOG_FUNCTION();
  771. DbgToBeidou(ctx->link, __FUNCTION__)();
  772. Chromium::ChromiumSrv_ClientBase* chromiumClient = new Chromium::ChromiumSrv_ClientBase(m_pEntity);
  773. ErrorCodeEnum error = chromiumClient->Connect();
  774. if (error == Error_Succeed)
  775. {
  776. Chromium::ChromiumSrv_OpenCommonPage_Req req;
  777. Chromium::ChromiumSrv_OpenCommonPage_Ans ans;
  778. req.title = ctx->Req.title;
  779. req.url = ctx->Req.url;
  780. req.width = ctx->Req.width;
  781. req.height = ctx->Req.height;
  782. req.point_x = ctx->Req.point_x;
  783. req.point_y = ctx->Req.point_y;
  784. req.top = ctx->Req.top;
  785. error = (*chromiumClient)(EntityResource::getLink().upgradeLink())->OpenCommonPage(req, ans, 10000);
  786. chromiumClient->GetFunction()->CloseSession();
  787. if (error != Error_Succeed)
  788. {
  789. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start common chromium page [%s] failed.", ctx->Req.url.GetData());
  790. ctx->Answer(error, error);
  791. }
  792. else
  793. {
  794. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start common chromium page [%s] success.", ctx->Req.url.GetData());
  795. ctx->Answer(ErrorCodeEnum::Error_Succeed);
  796. }
  797. }
  798. else
  799. ctx->Answer(ErrorCodeEnum::Error_Unexpect);
  800. }
  801. void CGUIConsoleSession::Handle_CloseCommonPage(SpReqAnsContext<GUIConsoleService_CloseCommonPage_Req, GUIConsoleService_CloseCommonPage_Ans>::Pointer ctx)
  802. {
  803. LOG_FUNCTION();
  804. DbgToBeidou(ctx->link, __FUNCTION__)();
  805. Chromium::ChromiumSrv_ClientBase* chromiumClient = new Chromium::ChromiumSrv_ClientBase(m_pEntity);
  806. ErrorCodeEnum error = chromiumClient->Connect();
  807. if (error == Error_Succeed)
  808. {
  809. Chromium::ChromiumSrv_CloseCommonPage_Req req;
  810. Chromium::ChromiumSrv_CloseCommonPage_Ans ans;
  811. req.title = ctx->Req.title;
  812. error = (*chromiumClient)(EntityResource::getLink().upgradeLink())->CloseCommonPage(req, ans, 10000);
  813. chromiumClient->GetFunction()->CloseSession();
  814. if (error != Error_Succeed)
  815. {
  816. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("close common chromium page [%s] failed.", ctx->Req.title.GetData());
  817. ctx->Answer(error, error);
  818. }
  819. else
  820. {
  821. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("close common chromium page [%s] success.", ctx->Req.title.GetData());
  822. ctx->Answer(ErrorCodeEnum::Error_Succeed);
  823. }
  824. }
  825. else
  826. ctx->Answer(ErrorCodeEnum::Error_Unexpect);
  827. }
  828. CSimpleString CGUIConsoleEntity::getRunVersion()
  829. {
  830. static CSimpleStringA activeVer;
  831. if(activeVer.GetLength() == 0)
  832. GetFunction()->GetRunningVersion(activeVer);
  833. return activeVer;
  834. }
  835. ErrorCodeEnum CGUIConsoleEntity::AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData)
  836. {
  837. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  838. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  839. if (pFuncPrivilege != NULL) {
  840. CSmartPointer<IAsynWaitSp> spWait;
  841. ErrorCodeEnum Error = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  842. if (Error == Error_Succeed) {
  843. callback_entry* entry = new callback_entry();
  844. entry->pRawData = pData;
  845. entry->EntityName = entity_name;
  846. entry->ErrorResult = Error_Unexpect;
  847. entry->op = OP_START_ENTITY;
  848. spWait->SetCallback(this, entry);
  849. }
  850. return Error;
  851. }
  852. else {
  853. return Error_NoPrivilege;
  854. }
  855. }
  856. ErrorCodeEnum CGUIConsoleEntity::AsyncStopEntity(const char* entity_name, void* pData)
  857. {
  858. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  859. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  860. if (pFuncPrivilege != NULL) {
  861. CSmartPointer<IAsynWaitSp> spWait;
  862. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  863. if (Error == Error_Succeed) {
  864. callback_entry* entry = new callback_entry();
  865. entry->pRawData = pData;
  866. entry->EntityName = entity_name;
  867. entry->ErrorResult = Error_Unexpect;
  868. entry->op = OP_STOP_ENTITY;
  869. spWait->SetCallback(this, entry);
  870. }
  871. return Error;
  872. }
  873. else {
  874. return Error_NoPrivilege;
  875. }
  876. }
  877. ErrorCodeEnum CGUIConsoleEntity::AsyncPauseEntity(const char* entity_name, void* pData)
  878. {
  879. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  880. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  881. if (pFuncPrivilege != NULL) {
  882. CSmartPointer<IAsynWaitSp> spWait;
  883. ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
  884. if (Error == Error_Succeed) {
  885. callback_entry* entry = new callback_entry();
  886. entry->pRawData = pData;
  887. entry->EntityName = entity_name;
  888. entry->ErrorResult = Error_Unexpect;
  889. entry->op = OP_PAUSE_ENTITY;
  890. spWait->SetCallback(this, entry);
  891. }
  892. return Error;
  893. }
  894. else {
  895. return Error_NoPrivilege;
  896. }
  897. }
  898. ErrorCodeEnum CGUIConsoleEntity::AsyncContinueEntity(const char* entity_name, void* pData)
  899. {
  900. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  901. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  902. if (pFuncPrivilege != NULL) {
  903. CSmartPointer<IAsynWaitSp> spWait;
  904. ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
  905. if (Error == Error_Succeed) {
  906. callback_entry* entry = new callback_entry();
  907. entry->pRawData = pData;
  908. entry->EntityName = entity_name;
  909. entry->ErrorResult = Error_Unexpect;
  910. entry->op = OP_CONTINUE_ENTITY;
  911. spWait->SetCallback(this, entry);
  912. }
  913. return Error;
  914. }
  915. else {
  916. return Error_NoPrivilege;
  917. }
  918. }
  919. ErrorCodeEnum CGUIConsoleEntity::AsyncTerminateEntity(const char* entity_name, void* pData)
  920. {
  921. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  922. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  923. if (pFuncPrivilege != NULL) {
  924. CSmartPointer<IAsynWaitSp> spWait;
  925. ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
  926. if (Error == Error_Succeed) {
  927. callback_entry* entry = new callback_entry();
  928. entry->pRawData = pData;
  929. entry->EntityName = entity_name;
  930. entry->ErrorResult = Error_Unexpect;
  931. entry->op = OP_TERMINATE_ENTITY;
  932. spWait->SetCallback(this, entry);
  933. }
  934. return Error;
  935. }
  936. else {
  937. return Error_NoPrivilege;
  938. }
  939. }
  940. #define MAX_SYNC_TIMEOUT 20000
  941. int CGUIConsoleEntity::sync_StartEntity(const char* entity_name, const char* cmdline, void* pData)
  942. {
  943. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  944. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  945. if (pFuncPrivilege != NULL) {
  946. CSmartPointer<IAsynWaitSp> spWait;
  947. ErrorCodeEnum Error = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  948. if (Error == Error_Succeed)
  949. Error = spWait->WaitAnswer(MAX_SYNC_TIMEOUT);
  950. return Error;
  951. }
  952. else {
  953. return Error_NoPrivilege;
  954. }
  955. }
  956. int CGUIConsoleEntity::sync_StopEntity(const char* entity_name, void* pData)
  957. {
  958. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  959. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  960. if (pFuncPrivilege != NULL) {
  961. CSmartPointer<IAsynWaitSp> spWait;
  962. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  963. if (Error == Error_Succeed)
  964. Error = spWait->WaitAnswer(MAX_SYNC_TIMEOUT);
  965. return Error;
  966. }
  967. else {
  968. return Error_NoPrivilege;
  969. }
  970. }
  971. int CGUIConsoleEntity::sync_PauseEntity(const char* entity_name, void* pData)
  972. {
  973. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  974. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  975. if (pFuncPrivilege != NULL) {
  976. CSmartPointer<IAsynWaitSp> spWait;
  977. ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
  978. if (Error == Error_Succeed)
  979. Error = spWait->WaitAnswer(MAX_SYNC_TIMEOUT);
  980. return Error;
  981. }
  982. else {
  983. return Error_NoPrivilege;
  984. }
  985. }
  986. int CGUIConsoleEntity::sync_ContinueEntity(const char* entity_name, void* pData)
  987. {
  988. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  989. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  990. if (pFuncPrivilege != NULL) {
  991. CSmartPointer<IAsynWaitSp> spWait;
  992. ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
  993. if (Error == Error_Succeed)
  994. Error = spWait->WaitAnswer(MAX_SYNC_TIMEOUT);
  995. return Error;
  996. }
  997. else {
  998. return Error_NoPrivilege;
  999. }
  1000. }
  1001. int CGUIConsoleEntity::sync_TerminateEntity(const char* entity_name, void* pData)
  1002. {
  1003. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  1004. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1005. if (pFuncPrivilege != NULL) {
  1006. CSmartPointer<IAsynWaitSp> spWait;
  1007. ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
  1008. if (Error == Error_Succeed)
  1009. Error = spWait->WaitAnswer(MAX_SYNC_TIMEOUT);
  1010. return Error;
  1011. }
  1012. else {
  1013. return Error_NoPrivilege;
  1014. }
  1015. }
  1016. int CGUIConsoleEntity::sync_OpenLog(const char* entity_name, void* pData)
  1017. {
  1018. auto fileExist = [](const char* path) ->bool {
  1019. fstream f2;
  1020. f2.open(path);
  1021. if (!f2)
  1022. {
  1023. f2.close();
  1024. return false;
  1025. }
  1026. else
  1027. {
  1028. f2.close();
  1029. return true;
  1030. }
  1031. };
  1032. ErrorCodeEnum ret = ErrorCodeEnum::Error_Succeed;
  1033. CEntityLogInfo cur;
  1034. if (ErrorCodeEnum::Error_Succeed != (ret = GetFunction()->GetEntityLogPath(entity_name, cur)))
  1035. return ret;
  1036. if(!fileExist(cur.strLogPath))
  1037. {
  1038. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s not exist", cur.strLogPath.GetData());
  1039. return WARN_GUICONSOLE_ENTITYCONTROL_LOG_NOTEXIST;
  1040. }
  1041. // 使用记事本打开文件
  1042. #ifdef _WIN32
  1043. // Windows 上使用 ShellExecute 打开文件
  1044. std::string command = std::string("notepad.exe ") + cur.strLogPath.GetData();
  1045. openProcess(command);
  1046. #else
  1047. // Linux 上使用 xdg-open 打开文件
  1048. //std::string command = std::string("gedit ") + cur.strLogPath.GetData();
  1049. //std::string command = std::string("sudo xdg-open ") + cur.strLogPath.GetData();
  1050. std::string command = std::string("sudo deepin-editor ") + cur.strLogPath.GetData() + std::string(" &");
  1051. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s ", command.c_str());
  1052. system(command.c_str());
  1053. #endif
  1054. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s ", command.c_str());
  1055. return ErrorCodeEnum::Error_Succeed;
  1056. }
  1057. ErrorCodeEnum CGUIConsoleEntity::GetEntity(const char* entity_name, EntityEntry& e)
  1058. {
  1059. CSmartPointer<IEntityFunction> spFunc = GetFunction();
  1060. LOG_ASSERT(spFunc != NULL);
  1061. CEntityStaticInfo StaticInfo;
  1062. CEntityRunInfo RunInfo;
  1063. ErrorCodeEnum Error = spFunc->GetEntityStaticInfo(entity_name, StaticInfo);
  1064. if (Error == Error_Succeed) {
  1065. Error = spFunc->GetEntityRunInfo(entity_name, RunInfo);
  1066. if (Error == Error_Succeed) {
  1067. e.Name = entity_name;
  1068. e.Id = RunInfo.dwEntityInstanceID;
  1069. e.ModuleName = _GetFileName(StaticInfo.strSpFileName);
  1070. e.State = RunInfo.eState;
  1071. e.Type = StaticInfo.bStartedByShell ? 0 : 1;
  1072. e.Pid = (int)RunInfo.dwProcessID;
  1073. e.DevelopID = (int)StaticInfo.wEntityDevelopID;
  1074. e.DebugLevel = RunInfo.eDebugLevel;
  1075. e.lastStartTime = RunInfo.tmLastStart;
  1076. }
  1077. }
  1078. return Error;
  1079. }
  1080. void CGUIConsoleEntity::PostEntityVary(const char* entity_name)
  1081. {
  1082. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("PostEntityVary %s ", entity_name);
  1083. m_entityMonitor_shouldwork = true;
  1084. /*
  1085. EntityStatus cur;
  1086. cur.entityName = entity_name;
  1087. cur.status = EntityEntry::GetStateName(ret.State);
  1088. cur.processId = std::to_string(ret.Pid).c_str();
  1089. cur.versionNo = getRunVersion();
  1090. cur.lastStartTime = ret.lastStartTime.ToTimeString();
  1091. SpSendBroadcast(GetFunction(), eMsg_EntityStatus, eMsgSig_EntityStatus, cur);
  1092. */
  1093. }
  1094. std::pair<DWORD, std::string> CGUIConsoleEntity::GetAllEntity(CAutoArray<EntityEntry>& Entities)
  1095. {
  1096. CSimpleString ErrInfo;
  1097. ErrorCodeEnum Error = ErrorCodeEnum::Error_Succeed;
  1098. updateStartupEntity();
  1099. if (m_startupEntityArr.size() != 0)
  1100. {
  1101. ErrInfo = CSimpleStringA::Format("From EntityArr size:%d, ", m_startupEntityArr.size());
  1102. Entities.Init(m_startupEntityArr.size());
  1103. for (int i = 0; i < m_startupEntityArr.size(); i++)
  1104. {
  1105. Error = GetEntity(m_startupEntityArr[i].c_str(), Entities[i]);
  1106. if (Error != Error_Succeed)
  1107. ErrInfo += CSimpleString::Format("|%s %d|", m_startupEntityArr[i].c_str(), Error);
  1108. }
  1109. }
  1110. else
  1111. {
  1112. CSmartPointer<IEntityFunction> spFunc = GetFunction();
  1113. CAutoArray<CSimpleStringA> strEntityNames;
  1114. CAutoArray<WORD> wDevelopIDs;
  1115. Error = spFunc->GetAllRegistedEntity(strEntityNames, wDevelopIDs);
  1116. ErrInfo = CSimpleStringA::Format("From GetAllRegistedEntity size:%d, ", strEntityNames.GetCount());
  1117. if (Error_Succeed != Error)
  1118. {
  1119. LogWarn(SeverityLevelEnum::Severity_Middle, Error, WARN_GUICONSOLE_GETALLENTITY_REGISTERED, "GetAllEntity-GetAllRegistedEntity failed");
  1120. return std::make_pair(WARN_GUICONSOLE_GETALLENTITY_REGISTERED, "");
  1121. }
  1122. Entities.Init(strEntityNames.GetCount());
  1123. for (int i = 0; i < strEntityNames.GetCount(); ++i) {
  1124. Error = GetEntity(strEntityNames[i], Entities[i]);
  1125. if (Error != Error_Succeed)
  1126. ErrInfo += CSimpleString::Format("|%s %d|", strEntityNames[i].GetData(), Error);
  1127. }
  1128. }
  1129. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(ErrInfo.GetData());
  1130. /*
  1131. if (ErrInfo.GetLength() > 0)
  1132. {
  1133. LogWarn(SeverityLevelEnum::Severity_Middle, Error, WARN_GUICONSOLE_GETALLENTITY_GETENTITY, ErrInfo.GetData());
  1134. return std::make_pair(WARN_GUICONSOLE_GETALLENTITY_GETENTITY, "");
  1135. }
  1136. */
  1137. return std::make_pair(ErrorCodeEnum::Error_Succeed, "");
  1138. }
  1139. void CGUIConsoleEntity::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  1140. {
  1141. CSmartPointer<ICallbackListener> spCallback;
  1142. CSmartPointer<IReleasable> pData;
  1143. pAsynWaitSp->GetCallback(spCallback, pData);
  1144. LOG_ASSERT(pData.GetRawPointer() != NULL);
  1145. callback_entry* entry = static_cast<callback_entry*>((IReleasable*)pData.GetRawPointer());
  1146. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  1147. if(m_isOpenEntityMonitor)
  1148. PostEntityVary(entry->EntityName);//if registered, while entity status changed, send to web
  1149. }
  1150. SP_BEGIN_ENTITY_MAP()
  1151. SP_ENTITY(CGUIConsoleEntity)
  1152. SP_END_ENTITY_MAP()