mod_ResourceWatcher.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #pragma once
  2. #include "modVer.h"
  3. #include "ResourceWatcherFSM.h"
  4. #include "UOSTools.hpp"
  5. #include "fileutil.h"
  6. #include "UpgradeManager_msg_g.h"
  7. class ResourceWatcherEntity;
  8. #define ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE 1
  9. #define ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_INSTALLED_STATE 60 * 1000
  10. #define ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE 3
  11. #define ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE 30 * 1000
  12. #define ENT_TIMERID_PROCESS_CHECK 66
  13. #define ENT_TIMERINTERVAL_PROCESS_CHECK 10 * 1000
  14. #define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
  15. class ResourceWatcherServiceSession : public ResourceWatcherService_ServerSessionBase
  16. {
  17. public:
  18. ResourceWatcherServiceSession(ResourceWatcherEntity* pEntity) : m_pEntity(pEntity) {}
  19. virtual ~ResourceWatcherServiceSession() {}
  20. virtual void Handle_GetDevInfo(SpReqAnsContext<ResourceWatcherService_GetDevInfo_Req,
  21. ResourceWatcherService_GetDevInfo_Ans>::Pointer ctx);
  22. virtual void Handle_OperateFile(SpReqAnsContext<ResourceWatcherService_OperateFile_Req, ResourceWatcherService_OperateFile_Ans>::Pointer ctx);
  23. virtual void Handle_BizLinkDetect(SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req, ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx);
  24. virtual void Handle_CheckNetType(SpReqAnsContext<ResourceWatcherService_CheckNetType_Req, ResourceWatcherService_CheckNetType_Ans>::Pointer ctx);
  25. virtual void Handle_GetBizLinks(SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req, ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx);
  26. virtual void Handle_GetThirdPartyInstallState(SpReqAnsContext<ResourceWatcherService_GetThirdPartyInstallState_Req, ResourceWatcherService_GetThirdPartyInstallState_Ans>::Pointer ctx);
  27. virtual void Handle_InstallThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_InstallThirdPartyProgram_Req, ResourceWatcherService_InstallThirdPartyProgram_Ans>::Pointer ctx);
  28. virtual void Handle_UninstallThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_UninstallThirdPartyProgram_Req, ResourceWatcherService_UninstallThirdPartyProgram_Ans>::Pointer ctx);
  29. virtual void Handle_RestartThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_RestartThirdPartyProgram_Req, ResourceWatcherService_RestartThirdPartyProgram_Ans>::Pointer ctx);
  30. virtual void Handle_ProcessDetectThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_ProcessDetectThirdPartyProgram_Req, ResourceWatcherService_ProcessDetectThirdPartyProgram_Ans>::Pointer ctx);
  31. virtual void Handle_FilesClean(SpReqAnsContext<ResourceWatcherService_FilesClean_Req, ResourceWatcherService_FilesClean_Ans>::Pointer ctx);
  32. virtual void Handle_FetchSystemSnapshot(SpReqAnsContext<ResourceWatcherService_FetchSystemSnapshot_Req, ResourceWatcherService_FetchSystemSnapshot_Ans>::Pointer ctx);
  33. private:
  34. ResourceWatcherEntity* m_pEntity;
  35. };
  36. class ResourceWatcherEntity : public CEntityBase, public IBroadcastListener, public ITimerListener, public ISysVarListener
  37. {
  38. public:
  39. ResourceWatcherEntity():m_bInitMode(FALSE) {}
  40. virtual ~ResourceWatcherEntity() {}
  41. virtual const char* GetEntityName() const { return "ResourceWatcher"; }
  42. const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  43. virtual CServerSessionBase* OnNewSession(const char*, const char*)
  44. {
  45. LOG_FUNCTION();
  46. return new ResourceWatcherServiceSession(this);
  47. }
  48. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,
  49. CSmartPointer<ITransactionContext> pTransactionContext)
  50. {
  51. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Version %s; Complied at: %s %s", MOD_VERSION, __DATE__, __TIME__);
  52. ErrorCodeEnum errorCode = Error_Succeed;
  53. CSimpleStringA strtermState;
  54. GetFunction()->GetSysVar("TerminalStage", strtermState);
  55. if (strtermState.IsStartWith("Z=")) {
  56. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("entity in config mode");
  57. m_bInitMode = TRUE;
  58. }
  59. errorCode = m_fsm.Init(this);
  60. if (errorCode == Error_Succeed) {
  61. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  62. CSystemStaticInfo staticInfo;
  63. spEntityFunction->GetSystemStaticInfo(staticInfo);
  64. updateShowFlag = false;
  65. newestSogouInstall = false;
  66. lastUpgradeInstallTime = 0; //上次升级安装时间
  67. lastUpgradeSwitchTime = 0; //上次升级切换时间
  68. lastSogouChangeEndTime = 0; //上一次切换结束判定的时间
  69. lastSogouChangeWarn = ""; //上一次搜狗告警信息
  70. sogouProcessRun = 0; //搜狗进程是否启动
  71. errorCode = spEntityFunction->SubscribeBroadcast("UpgradeManager", NULL, this, m_uuidUpgradeStateEventListener);
  72. if (errorCode != Error_Succeed)
  73. {
  74. LOG_TRACE("Subscribe UpgradeManager evt failed 0x%x", errorCode);
  75. pTransactionContext->SendAnswer(errorCode);
  76. return;
  77. }
  78. }
  79. pTransactionContext->SendAnswer(errorCode);
  80. }
  81. void OnStarted()
  82. {
  83. m_fsm.AfterInit();
  84. if (!m_bInitMode) {
  85. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  86. spEntityFunction->SetTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE,
  87. this, ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_INSTALLED_STATE);
  88. CSimpleStringA uiState;
  89. spEntityFunction->GetSysVar("UIState", uiState);
  90. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("NETWORK_PROBE Timer GetUIState %s", (LPCTSTR)uiState);
  91. if (uiState[0] == 'M') {
  92. m_fsm.TriggerAtStatusChanged(true);
  93. }
  94. spEntityFunction->RegistSysVarEvent("UIState", this);
  95. ///**TODO(Gifur@10/9/2023): */
  96. ClearVersionTask* task = new ClearVersionTask(&m_fsm);
  97. GetFunction()->PostThreadPoolTask(task);
  98. CSmartPointer<IConfigInfo> spCtSettingConfig;
  99. GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  100. int procFlag = 0;
  101. #if defined(RVC_OS_WIN)
  102. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "ProcDetectFlag", procFlag);
  103. #else
  104. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "ProcDetectFlag4UOS", procFlag);
  105. #endif //RVC_OS_WIN
  106. if (procFlag > 0)
  107. {
  108. int tTime = 0;
  109. spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "ProcCheckTime", tTime);
  110. int fTime = ENT_TIMERINTERVAL_PROCESS_CHECK;
  111. if (tTime > ENT_TIMERINTERVAL_PROCESS_CHECK)
  112. {
  113. fTime = tTime;
  114. }
  115. spEntityFunction->SetTimer(ENT_TIMERID_PROCESS_CHECK, this, fTime);
  116. }
  117. #if defined(RVC_OS_WIN)
  118. m_fsm.DetectAutoStartupCover();
  119. m_fsm.DetectVersionHasChangedAndWarnCover();
  120. ReadFileContent();
  121. ReadFileInfo();
  122. DeleteFileTask* task2 = new DeleteFileTask(&m_fsm);
  123. GetFunction()->PostThreadPoolTask(task2);
  124. CleaDumpFilesTask* task3 = new CleaDumpFilesTask(&m_fsm);
  125. GetFunction()->PostThreadPoolTask(task3);
  126. CheckDiskFileSpaceTask* task4 = new CheckDiskFileSpaceTask(&m_fsm);
  127. GetFunction()->PostThreadPoolTask(task4);
  128. #endif //RVC_OS_WIN
  129. }
  130. }
  131. /*ignore*/
  132. virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
  133. {
  134. OnTimeout(ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE);
  135. pTransactionContext->SendAnswer(Error_Succeed);
  136. }
  137. /*ignore*/
  138. virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)
  139. {
  140. pTransactionContext->SendAnswer(Error_Succeed);
  141. }
  142. /*invoke fsm.onExit(), invoked when entity will be closed*/
  143. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext>pTransactionContext)
  144. {
  145. ErrorCodeEnum errorCode = m_fsm.OnExit();
  146. pTransactionContext->SendAnswer(errorCode);
  147. }
  148. virtual void OnSelfTest(EntityTestEnum eTestType,
  149. CSmartPointer<ITransactionContext>pTransactionContext)
  150. {
  151. m_fsm.SelfTest(eTestType, pTransactionContext);
  152. }
  153. virtual bool IsService() const
  154. {
  155. return true;
  156. }
  157. virtual bool IsMultiThread() const
  158. {
  159. return false;
  160. }
  161. void GetDevInfo(SpReqAnsContext<ResourceWatcherService_GetDevInfo_Req,
  162. ResourceWatcherService_GetDevInfo_Ans>::Pointer ctx)
  163. {
  164. LOG_FUNCTION();
  165. SystemBasicInfo info;
  166. ErrorCodeEnum result = m_fsm.CatchSystemBasicInfo(info);
  167. if (Error_Succeed == result) {
  168. ctx->Ans.type = info.strProductName;
  169. ctx->Ans.model = info.strManufacturer;
  170. ctx->Ans.version = info.strSerialNumber;
  171. ctx->Ans.state = 0;
  172. }
  173. ctx->Answer(result);
  174. }
  175. void BizLinkDetect(SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req,
  176. ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx)
  177. {
  178. m_fsm.BizLinkDetect(ctx);
  179. }
  180. void CheckNetType(SpReqAnsContext<ResourceWatcherService_CheckNetType_Req,
  181. ResourceWatcherService_CheckNetType_Ans>::Pointer ctx)
  182. {
  183. m_fsm.CheckNetType(ctx);
  184. }
  185. void GetBizLinks(SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req,
  186. ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx)
  187. {
  188. m_fsm.GetBizLinks(ctx);
  189. }
  190. void OperateFile(
  191. SpReqAnsContext<ResourceWatcherService_OperateFile_Req,
  192. ResourceWatcherService_OperateFile_Ans>::Pointer ctx)
  193. {
  194. ctx->Answer(Error_NotSupport);
  195. }
  196. void GetThirdPartyInstallState(SpReqAnsContext<ResourceWatcherService_GetThirdPartyInstallState_Req,
  197. ResourceWatcherService_GetThirdPartyInstallState_Ans>::Pointer ctx);
  198. void InstallThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_InstallThirdPartyProgram_Req,
  199. ResourceWatcherService_InstallThirdPartyProgram_Ans>::Pointer ctx);
  200. void UninstallThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_UninstallThirdPartyProgram_Req,
  201. ResourceWatcherService_UninstallThirdPartyProgram_Ans>::Pointer ctx);
  202. void RestartThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_RestartThirdPartyProgram_Req,
  203. ResourceWatcherService_RestartThirdPartyProgram_Ans>::Pointer ctx);
  204. void ProcessDetectThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_ProcessDetectThirdPartyProgram_Req,
  205. ResourceWatcherService_ProcessDetectThirdPartyProgram_Ans>::Pointer ctx);
  206. void FilesClean(SpReqAnsContext<ResourceWatcherService_FilesClean_Req,
  207. ResourceWatcherService_FilesClean_Ans>::Pointer ctx);
  208. void FetchSystemSnapshot(SpReqAnsContext<ResourceWatcherService_FetchSystemSnapshot_Req, ResourceWatcherService_FetchSystemSnapshot_Ans>::Pointer ctx);
  209. void InstallSogou(SpReqAnsContext<ResourceWatcherService_InstallThirdPartyProgram_Req,
  210. ResourceWatcherService_InstallThirdPartyProgram_Ans>::Pointer ctx);
  211. void UninstallSogou(SpReqAnsContext<ResourceWatcherService_UninstallThirdPartyProgram_Req,
  212. ResourceWatcherService_UninstallThirdPartyProgram_Ans>::Pointer ctx);
  213. #if defined(_MSC_VER)
  214. SP_BEGIN_MSG_DISPATCH_MAP(ResourceWatcherEntity)
  215. SP_BEGIN_ENTITY_MSG("UpgradeManager")
  216. SP_MSG_HANDLE_NS(UpgradeManager, UpgradeStateEvent, OnUpgradeStateEvent)
  217. SP_END_ENTITY_MSG()
  218. SP_END_MSG_DISPATCH_MAP()
  219. #else
  220. virtual void OnBroadcastEvent(CUUID SubID, const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer) \
  221. {
  222. if (!pszEntityName) {
  223. LOG_TRACE("pszEntityName cannot empty!");
  224. }
  225. else if (_stricmp("UpgradeManager", pszEntityName) == 0) {
  226. switch (dwMessageId) {
  227. case eMsg_UpgradeStateEvent:
  228. if (eMsgSig_UpgradeStateEvent == dwMessageSignature) {
  229. UpgradeManager::UpgradeStateEvent t;
  230. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t);
  231. if (Error == Error_Succeed)
  232. OnUpgradeStateEvent(pszEntityName, dwMessageId, dwMessageSignature, t);
  233. }
  234. else {
  235. LOG_TRACE("%s signature mismatched!", "UpgradeStateEvent");
  236. }
  237. break;
  238. default:
  239. LOG_TRACE("msg id %d ignored!", dwMessageId);
  240. break;
  241. }
  242. }
  243. else {
  244. LOG_TRACE("ignore pszEntityName");
  245. }
  246. }
  247. #endif //_MSC_VER
  248. void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
  249. {
  250. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent pszKey = %s, pszValue = %s", pszKey, pszValue);
  251. if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0)) {
  252. m_fsm.TriggerAtStatusChanged(_strnicmp(pszValue, "M", strlen("M")) == 0);
  253. }
  254. }
  255. private:
  256. void OnUpgradeStateEvent(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, UpgradeManager::UpgradeStateEvent& evt);
  257. //report sogou input software install state and installed information
  258. ErrorCodeEnum ReportSogouInstallState();
  259. void OnTimeout(DWORD dwTimerID)
  260. {
  261. if (dwTimerID == ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE) {
  262. CSimpleStringA strState;
  263. auto err = GetFunction()->GetSysVar("UIState", strState);
  264. if (err == Error_Succeed && strState == "M") {
  265. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to check Sogou input install state...");
  266. if (Error_Succeed == ReportSogouInstallState()) {//如果安装了搜狗输入法,就去除检测搜狗输入法安装的定时器,并设置进程检测的定时器。
  267. GetFunction()->KillTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE);
  268. GetFunction()->SetTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE,
  269. this, ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE);
  270. ///**TODO(Gifur@10/9/2023): 等普通调用版本的输入法全行推广后,这块很多功能逻辑可以下线了 */
  271. #if defined(_MSC_VER)
  272. //进入主页面后,检测安装状态,安装成功则执行一次启动脚本
  273. ///**TODO(Gifur@10/9/2023): 这段逻辑有点奇怪,上面的接口并不是安装输入法的功能,只是检测输入法的状态,这里每次都运行一次启动逻辑??*/
  274. //答:这段定时器在检测到安装了输入法之后就只会执行一次,定时器被KILL掉了,之后只会检测搜狗进程的变化
  275. CSimpleStringA csBinPath;
  276. ErrorCodeEnum eErrPath = GetFunction()->GetPath("Bin", csBinPath);
  277. if (eErrPath != Error_Succeed) {
  278. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetBasePath failed.");
  279. }
  280. else {
  281. CSimpleStringA startPath = csBinPath + SPLIT_SLASH_STR + "spScript" + SPLIT_SLASH_STR + "SogouServStarter.bat";
  282. int startFlag = WinExec(startPath.GetData(), SW_HIDE);
  283. if (startFlag > 31) {
  284. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("检测到已安装搜狗输入法,执行搜狗启动脚本!路径:%s。", startPath.GetData());
  285. }
  286. else {
  287. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("执行启动脚本异常!路径:%s。", startPath.GetData());
  288. }
  289. }
  290. #endif //_MSC_VER
  291. }
  292. }
  293. else {
  294. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get UIState result: %s, %s", SpStrError(err), strState.GetData());
  295. }
  296. }
  297. else if (dwTimerID == ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE) {
  298. DoCheckSogouProcessStatus();
  299. }
  300. else if (dwTimerID == ENT_TIMERID_PROCESS_CHECK) {
  301. CheckProcessStatus();
  302. }
  303. else {
  304. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unkonwn timer id: %u", dwTimerID);
  305. }
  306. }
  307. void DoCheckSogouProcessStatus();
  308. std::string DoCheckCertainProcessStatus(const CAutoArray<CSimpleStringA>& pName);
  309. ErrorCodeEnum UnzipPack(const char* unZipPackName);//解压文件
  310. std::vector<std::string> GetUserNameList(bool bExcludeRoot = false);
  311. ErrorCodeEnum RunShellScript(LPCTSTR cmdline);
  312. ErrorCodeEnum DeleteUnzipDir();//清理临时解压包文件
  313. BOOL KillProcessFromName(const CSimpleStringA& strProcessName);
  314. bool is_str_utf8(const char* str);
  315. /// <summary>
  316. /// 通过集中配置检测指定进程是否存在
  317. /// </summary>
  318. void CheckProcessStatus();
  319. #if defined(RVC_OS_WIN)
  320. void ReadFileContent();
  321. void ReadFileInfo();
  322. void ChcekDiskFileSpace();
  323. #else
  324. ErrorCodeEnum GetSogouPkgDirPath(CSimpleStringA& strPkgPath);
  325. #endif //RVC_OS_WIN
  326. private:
  327. ResourceWatcherFSM m_fsm;
  328. CUUID m_uuidUpgradeStateEventListener;
  329. BOOL updateShowFlag;
  330. BOOL newestSogouInstall; //最近一次安装的标志
  331. time_t lastUpgradeInstallTime; //上次升级安装时间
  332. time_t lastUpgradeSwitchTime; //上次升级切换时间
  333. time_t lastSogouChangeEndTime; //上一次进程切换时间
  334. CSimpleStringA lastSogouChangeWarn; //上一次搜狗告警信息
  335. BOOL isSogouUpdateChange;
  336. int sogouProcessRun;
  337. vector<CSimpleStringA> sogouChangeWarn;
  338. vector<time_t> sogouChangeTime;
  339. BOOL m_bInitMode;
  340. };
  341. struct InstallSogouTask : public ITaskSp
  342. {
  343. SpReqAnsContext<ResourceWatcherService_InstallThirdPartyProgram_Req,
  344. ResourceWatcherService_InstallThirdPartyProgram_Ans>::Pointer ctx;
  345. ResourceWatcherEntity* m_pEntity;
  346. InstallSogouTask(ResourceWatcherEntity* entity) :m_pEntity(entity) {}
  347. void Process()
  348. {
  349. m_pEntity->InstallSogou(ctx);
  350. }
  351. };
  352. struct UninstallSogouTask : public ITaskSp
  353. {
  354. SpReqAnsContext<ResourceWatcherService_UninstallThirdPartyProgram_Req,
  355. ResourceWatcherService_UninstallThirdPartyProgram_Ans>::Pointer ctx;
  356. ResourceWatcherEntity* m_pEntity;
  357. UninstallSogouTask(ResourceWatcherEntity* entity) :m_pEntity(entity) {}
  358. void Process()
  359. {
  360. m_pEntity->UninstallSogou(ctx);
  361. }
  362. };