CModTools.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222
  1. #include "stdafx.h"
  2. #include "uuid4.h"
  3. #if (defined _WIN32 || defined _WIN64)
  4. #include "processControl.h"
  5. #define SPLIT_SLASH_STR "\\"
  6. #else
  7. #include <mutex>
  8. #include <thread>
  9. #include "path.h"
  10. #include "fileutil.h"
  11. #include <boost/process.hpp>
  12. #include <boost/thread.hpp>
  13. #include "CommEntityUtil.hpp"
  14. #endif
  15. #include "baseEx.h"
  16. #include "CModTools.h"
  17. #include "SpIni.h"
  18. #include <vector>
  19. #include <list>
  20. #include <memory>
  21. #include <iostream>
  22. #include "../mod_upload/Upload_client_g.h"
  23. #include "mod_chromium.h"
  24. #include <boost/thread/mutex.hpp>
  25. #include "EventCode.h"
  26. #include "url_encoder.h"
  27. #include "SpUtility.h"
  28. void SystemRunTest(const std::string& systemCmd);
  29. extern std::pair<bool, std::string> DetectActiveHttp(std::vector<std::string> urlArr);
  30. auto GetCefHead = [](CEntityBase* curEntity)->CSimpleStringA {
  31. CSimpleStringA strChromiumPath, basePath;
  32. curEntity->GetFunction()->GetPath("Base", basePath);
  33. strChromiumPath.Append(basePath);
  34. #if defined(_MSC_VER)
  35. strChromiumPath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "bin" + SPLIT_SLASH_STR + "Chromium" + SPLIT_SLASH_STR);
  36. strChromiumPath.Append(CEFCLIENT_NAME);
  37. #else
  38. strChromiumPath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR);
  39. strChromiumPath.Append("startMixBrower.sh");
  40. #endif //_MSC_VER
  41. return strChromiumPath;
  42. };
  43. auto detectUrls = [](std::string urls) -> std::string {
  44. std::vector<std::string> urlArr;
  45. urlArr.emplace_back(urls);
  46. auto checkRet = DetectActiveHttp(urlArr);
  47. LogWarn(Severity_Low, Error_Debug, LOG_SLV_CHROMIUM_URLCHECK,
  48. CSimpleStringA::Format("check chromium url %d, %s", checkRet.first, checkRet.first ? checkRet.second.c_str() : urls.c_str()));
  49. if (checkRet.first)
  50. return checkRet.second.c_str();
  51. else
  52. return urlArr[0];
  53. };
  54. namespace Chromium {
  55. boost::mutex g_mutexFreerdp, m_guardInterruptLock;
  56. void CModTools::lockGuard()
  57. {
  58. m_guardInterruptLock.lock();
  59. }
  60. void CModTools::unlockGuard()
  61. {
  62. m_guardInterruptLock.unlock();
  63. }
  64. void CModTools::InitCModTools(CEntityBase* pEntity) {
  65. this->m_pEntity = pEntity;
  66. m_UseUOSBrowser = 0;
  67. m_isGuardMainBrowser = false;
  68. CSmartPointer<IConfigInfo> spConfig;
  69. ErrorCodeEnum Error = m_pEntity->GetFunction()->OpenConfig(Config_Root, spConfig);
  70. if (Error == Error_Succeed)
  71. {
  72. Error = spConfig->ReadConfigValue("Terminal", "MachineType", m_strMachineType);
  73. if (Error == Error_Succeed)
  74. {
  75. Error = spConfig->ReadConfigValue("Terminal", "Site", m_strSite);
  76. if (Error != Error_Succeed)
  77. {
  78. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get Site value failed");
  79. }
  80. }
  81. else
  82. {
  83. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get MachineType value failed");
  84. }
  85. }
  86. auto configRet = ReadCenterConfigStr();
  87. m_UserMgrUrlStr = std::get<0>(configRet);
  88. m_UserMgrUrlNoSidebarStr = std::get<1>(configRet);
  89. m_UserMgrUrlNoSidebarMutiStr = std::get<2>(configRet);
  90. m_UserMgrUrlFultureStr = std::get<3>(configRet);
  91. m_UserMgrAdStr = std::get<4>(configRet);
  92. notifyExist = breakdownExist = m_isAdOpen = false;
  93. m_magicStr = uuid4_generate(8);
  94. m_withMin = false;
  95. #if defined(RVC_OS_LINUX)
  96. InitBrowserUseMode();
  97. #endif //RVC_OS_LINUX
  98. SetSpecialPageParam("", "", "", 0);
  99. }
  100. bool CModTools::killAllChromium()
  101. {
  102. #if (defined _WIN32 || defined _WIN64)
  103. const char* killCmd = "taskkill /F /IM cefclient.exe /T";
  104. SYSTEM_ON(killCmd);
  105. return true;
  106. #else
  107. do
  108. {
  109. boost::process::child child_process("sudo killall -9 uosbrowser");
  110. child_process.wait();
  111. } while (false);
  112. do
  113. {
  114. boost::process::child child_process("sudo killall -9 cefclient");
  115. child_process.wait();
  116. } while (false);
  117. do {
  118. boost::process::child child_process("sudo killall -9 browser");
  119. child_process.wait();
  120. } while (false);
  121. breakdownExist = m_isAdOpen = notifyExist = false;
  122. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("run killAllChromium success ex");
  123. return true;
  124. #endif
  125. }
  126. void CModTools::killAllChromiumByThread(int seconds)
  127. {
  128. #if (defined _WIN32 || defined _WIN64)
  129. #else
  130. auto cur = std::async([]() {
  131. CModTools::get_mutable_instance().killAllChromium();
  132. });
  133. std::future_status a1 = cur.wait_for(std::chrono::seconds(seconds));
  134. if (a1 == std::future_status::deferred)
  135. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("killAllChromiumByThread run delay");
  136. else
  137. {
  138. if (a1 == std::future_status::ready)
  139. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("killAllChromiumByThread run end");
  140. else
  141. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("killAllChromiumByThread do not end, over than %d seconds", seconds);
  142. }
  143. #endif
  144. }
  145. bool CModTools::killChromiumByName(std::string name)
  146. {
  147. return true;
  148. }
  149. std::pair<bool, std::string> CModTools::getAdUrl()
  150. {
  151. auto AdUrl = m_UserMgrAdStr;
  152. auto strUrl = detectUrls(AdUrl.GetData());
  153. return strUrl.length() > 0 ? std::make_pair(true, strUrl) : std::make_pair(false, strUrl);
  154. }
  155. std::pair<bool, std::string> CModTools::getErrUrl(ERR_PAGE_REASON errType)
  156. {
  157. CSimpleStringA errPagePath;
  158. m_pEntity->GetFunction()->GetPath("Base", errPagePath);
  159. errPagePath.Append(SPLIT_SLASH_STR).Append("res").Append(SPLIT_SLASH_STR);
  160. errPagePath.Append("ManagerDesktop").Append(SPLIT_SLASH_STR);
  161. if (errType._to_integral() == ERR_PAGE_REASON::breakdown)
  162. errPagePath.Append("entityCheck.html");
  163. else if (errType._to_integral() == ERR_PAGE_REASON::warnPrompt)
  164. errPagePath.Append("serverNoAccess.html");
  165. else if (errType._to_integral() == ERR_PAGE_REASON::CardStoreIsBusy)
  166. errPagePath.Append("cardStore.html");
  167. else if (errType._to_integral() == ERR_PAGE_REASON::main)
  168. errPagePath.Append("homePageErr.html");
  169. else
  170. errPagePath.Append("entityCheck.html");
  171. return std::make_pair(true, errPagePath.GetData());
  172. }
  173. std::pair<bool, std::string> CModTools::GenerateErrPage(ERR_PAGE_REASON errType, std::tuple < std::string, std::string> norParam, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam)
  174. {
  175. auto generate_url_prefix = []() -> CSimpleStringA {
  176. #if defined(RVC_OS_WIN)
  177. return CSimpleStringA("");
  178. #else
  179. return CSimpleStringA("\\");
  180. #endif
  181. };
  182. auto errUrlRet = getErrUrl(errType);
  183. CSimpleStringA errPagePathBase = errUrlRet.second.c_str();
  184. CSimpleStringA errPageParams(true);
  185. CSimpleStringA needGuardian = "Y";
  186. auto rc = this->m_pEntity->GetFunction()->GetSysVar("NeedGuardian", needGuardian);
  187. bool showRebootTime = true;
  188. if (rc == Error_Succeed && needGuardian.Compare("Y", false))
  189. showRebootTime = false;
  190. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("NeedGuardian:%s", needGuardian.GetData());
  191. switch (errType)
  192. {
  193. case ERR_PAGE_REASON::CardStoreIsBusy:
  194. break;
  195. case ERR_PAGE_REASON::breakdown:
  196. case ERR_PAGE_REASON::warnPrompt:
  197. {
  198. errPageParams.Append(CSimpleStringA("showlimit=1"));
  199. if (m_withMin) {
  200. errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&showmin=1"));
  201. }
  202. }
  203. break;
  204. default:
  205. return std::make_pair(false, std::string("unknown err_page_reason:").append(errType._to_string()));
  206. }
  207. CSimpleStringA errPageUrl(true);
  208. if (!errPageParams.IsNullOrEmpty()) {
  209. errPageUrl = CSimpleStringA("file:///") + errPagePathBase + "?" + errPageParams;
  210. } else {
  211. errPageUrl = CSimpleStringA("file:///") + errPagePathBase;
  212. }
  213. #if defined(RVC_OS_WIN)
  214. std::string in = errPageUrl.GetData();
  215. errPageUrl = UrlEncoder::Encode(in).c_str();
  216. errPageUrl.Append(" ");
  217. CSimpleStringA cachePath;
  218. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  219. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(errType._to_string());
  220. errPageUrl.Append(" --cache-path=").Append(cachePath);
  221. if (g_useMagic)
  222. errPageUrl.Append(" --magic-str=").Append(m_magicStr.c_str());
  223. if (g_withMedia)
  224. errPageUrl.Append(" --enable-media-stream=1 --enable-speech-input=1");
  225. if (g_withConsole)
  226. errPageUrl.Append(" --with-console");
  227. errPageUrl.Append(" --no-sandbox").Append(" --hide-controls").Append(" --hide-tabs");
  228. errPageUrl.Append(" --top=-1");
  229. switch (errType) {
  230. case ERR_PAGE_REASON::TerminalManagerKickOut:
  231. case ERR_PAGE_REASON::TerminalManagerOff:
  232. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::TerminalManager)._to_string());
  233. break;
  234. case ERR_PAGE_REASON::CardStoreIsBusy:
  235. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::CardStoreIsBusy)._to_string());
  236. break;
  237. case ERR_PAGE_REASON::CameraConfig:
  238. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::CameraConfig)._to_string());
  239. break;
  240. case ERR_PAGE_REASON::disabled:
  241. case ERR_PAGE_REASON::jobuncomplete:
  242. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::TradeManager)._to_string());
  243. break;
  244. case ERR_PAGE_REASON::warnPrompt:
  245. case ERR_PAGE_REASON::breakdown:
  246. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::breakdown)._to_string());
  247. break;
  248. default:
  249. errPageUrl.Append(" --logextend=").Append((+PAGE_TYPE::errPage)._to_string());
  250. break;
  251. }
  252. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity);
  253. CSimpleString dstCmd = strChromiumPath + " --url=" + errPageUrl;
  254. #else
  255. CSimpleString dstCmd = generateBrowserCMDForEverything(errPageUrl.GetData(), 2).c_str();
  256. #endif //RVC_OS_WIN
  257. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GenerateErrPage type=%s, dstPage=%s", errType._to_string(), dstCmd.GetData());
  258. return std::make_pair(true, (const char*)dstCmd.GetData());
  259. }
  260. std::string formatTime(SYSTEMTIME time)
  261. {
  262. char tBuf[1024] = "";
  263. //sprintf(tBuf, "%04u-%02u-%02u %02u:%02u:%02u:%03u", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
  264. sprintf(tBuf, "%04u-%02u-%02u %02u:%02u:%02u", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
  265. return tBuf;
  266. }
  267. std::string CModTools::GetSpShellNextRebootTime()
  268. {
  269. static std::string shellBootTime;
  270. if (0 == shellBootTime.length())
  271. {
  272. CAutoArray<CSimpleStringA> t_names;
  273. CAutoArray<int> t_Idx;
  274. CAutoArray<CEntityStartInfo> t_Infos;
  275. this->m_pEntity->GetFunction()->GetAllEntityStartInfo(t_names, t_Idx, t_Infos);
  276. for (int i = 0; i < t_Infos.GetCount(); i++) {
  277. //if (0 == t_Idx[i])//shell
  278. if (t_names[i].Compare("HealthManager") == 0) {
  279. SYSTEMTIME startTime = t_Infos[i].startTime;
  280. CSmallDateTime dateTime;
  281. dateTime.FromSystemTime(startTime);
  282. /** 十分钟后重启 [Gifur@2022324]*/
  283. CSmallDateTime dateNewTime((DWORD)dateTime + 10 * 60);
  284. shellBootTime = dateNewTime.ToTimeString().GetData();
  285. #if defined(RVC_OS_LINUX)
  286. SP::Utility::replaceInPlace(shellBootTime, " ", "-");
  287. #endif //RVC_OS_LINUX
  288. break;
  289. }
  290. }
  291. }
  292. return shellBootTime;
  293. }
  294. void CModTools::setLimitReason(const char* reason) {
  295. CSimpleStringA m_strLimitReason = reason;
  296. if (m_strLimitReason.Compare("breakdown") != 0 && !m_strLimitReason.IsNullOrEmpty())
  297. {
  298. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("reason:%d, setState:%s", reason, "L");
  299. this->m_pEntity->GetFunction()->SetSysVar("TradeManageState", "L", true);
  300. }
  301. if (m_strLimitReason.Compare("breakdown") == 0) {
  302. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("reason:%d, no setState", reason);
  303. }
  304. if (m_strLimitReason.IsNullOrEmpty())
  305. {
  306. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("reason:%d, setState:%s", reason, "T");
  307. this->m_pEntity->GetFunction()->SetSysVar("TradeManageState", "T", true);
  308. }
  309. }
  310. /** 这个接口将移除,信创不再使用CEFClient [Gifur@2023626]*/
  311. void CModTools::StopChromiumBrowser(ERR_PAGE_REASON reason, bool stopAll)
  312. {
  313. #if defined(_MSC_VER)
  314. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  315. strCmdLine.Append(strChromiumPath).Append(" --kill");
  316. if (!stopAll)
  317. strCmdLine.Append(" --logextend=").Append(reason._to_string());
  318. if (reason._to_integral() == ERR_PAGE_REASON::main)
  319. m_isGuardMainBrowser = false;
  320. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StopChromiumBrowser cmdline:%s, current guardian main browser : %d", strCmdLine.GetData(), m_isGuardMainBrowser);
  321. SYSTEM_ON(strCmdLine.GetData());
  322. if (reason._to_integral() == ERR_PAGE_REASON::breakdown || reason._to_integral() == ERR_PAGE_REASON::warnPrompt)
  323. breakdownExist = false;
  324. if (reason._to_integral() == ERR_PAGE_REASON::ErrNotify)
  325. notifyExist = false;
  326. if (stopAll)
  327. breakdownExist = notifyExist = false;
  328. #else
  329. if (stopAll)
  330. killAllChromium();
  331. else
  332. LogWarn(Severity_Low, Error_NotSupport, LOG_WARN_CHROMIUM_NOT_SUPPORT_TOKILL_SPECIFIED_BROWSER,
  333. CSimpleStringA::Format("StopChromiumBrowser: %s", reason._to_string()));
  334. #endif //_MSC_VER
  335. }
  336. /** 这个接口将移除,信创不再使用CEFClient [Gifur@2023626]*/
  337. void CModTools::StopSingleChromiumBrowserByName(std::string cefName)
  338. {
  339. #if defined(_MSC_VER)
  340. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  341. strCmdLine.Append(strChromiumPath).Append(" --kill");
  342. strCmdLine.Append(" --logextend=").Append(cefName.c_str());
  343. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StopChromiumBrowser cmdline:%s, current guardian main browser : %d", strCmdLine.GetData(), m_isGuardMainBrowser);
  344. SYSTEM_ON(strCmdLine.GetData());
  345. #else
  346. LogWarn(Severity_Low, Error_NotSupport, LOG_WARN_CHROMIUM_NOT_SUPPORT_TOKILL_SPECIFIED_BROWSER,
  347. CSimpleStringA::Format("StopSingleChromiumBrowserByName: %s", cefName.c_str()));
  348. #endif //_MSC_VER
  349. }
  350. std::pair<bool, std::string> CModTools::getMainUrl()
  351. {
  352. CSimpleStringA strUrl;
  353. bool isOpenExtend = false;
  354. auto mainUrl = m_UserMgrUrlFultureStr;
  355. strUrl = detectUrls(mainUrl.GetData()).c_str();
  356. strUrl = mainUrl;
  357. isOpenExtend = false;
  358. return std::make_pair(isOpenExtend, strUrl.GetData());
  359. }
  360. std::pair<bool, std::string> CModTools::getExtendUrl()
  361. {
  362. CSimpleStringA strUrl;
  363. if (m_UserMgrUrlNoSidebarStr.Compare(""))
  364. {
  365. auto mainUrl = m_UserMgrUrlNoSidebarStr;
  366. auto exUrl = m_UserMgrUrlNoSidebarMutiStr;
  367. auto t_Arr = exUrl.Split('|');
  368. std::vector<std::string> urlArr;
  369. urlArr.emplace_back(mainUrl.GetData());
  370. for (int i = 0; i < t_Arr.GetCount(); i++)
  371. urlArr.emplace_back(t_Arr[i].GetData());
  372. auto checkRet = DetectActiveHttp(urlArr);
  373. if (checkRet.first)
  374. strUrl = checkRet.second.c_str();
  375. else
  376. strUrl = mainUrl;
  377. }
  378. else
  379. strUrl = m_UserMgrUrlStr;
  380. return std::make_pair(strUrl.GetLength() > 0, strUrl.GetData());
  381. }
  382. std::string CModTools::generateAdCmd(std::string AdUrl) {
  383. #if defined(RVC_OS_LINUX)
  384. return generateBrowserCMDForEverything(AdUrl, 1);
  385. #else
  386. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  387. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(AdUrl.c_str());
  388. CSimpleStringA cachePath;
  389. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  390. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
  391. strCmdLine.Append(" --cache-path=").Append(cachePath);
  392. if (g_useMagic)
  393. strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
  394. if (g_withMedia)
  395. strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
  396. if (g_withConsole)
  397. strCmdLine.Append(" --with-console");
  398. strCmdLine.Append(" --no-sandbox");
  399. strCmdLine.Append(" --hide-controls");
  400. strCmdLine.Append(" --hide-tabs");
  401. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Ad)._to_string());
  402. strCmdLine.Append(" --top=-1");
  403. strCmdLine.Append(" --run-extend");
  404. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  405. return strCmdLine.GetData();
  406. #endif //RVC_OS_LINUX
  407. }
  408. #if defined(RVC_OS_WIN)
  409. std::string CModTools::generateCefclientCmd(bool isExtend, std::string mainUrl)
  410. {
  411. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  412. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
  413. if (isExtend) {
  414. //not support
  415. }
  416. CSimpleStringA cachePath;
  417. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  418. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "")
  419. .Append(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
  420. //strCmdLine.Append(" --hide-controls=true")
  421. strCmdLine.Append(" --cache-path=").Append(cachePath);
  422. strCmdLine.Append(" --no-sandbox");
  423. strCmdLine.Append(" --hide-controls");
  424. if (g_useMagic)
  425. strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
  426. if (g_withMedia)
  427. strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
  428. if (g_withConsole)
  429. strCmdLine.Append(" --with-console");
  430. strCmdLine.Append(" --hide-tabs");
  431. if (m_withDebugMode)
  432. strCmdLine.Append(" --remote-debugging-port=9222");
  433. if (isExtend) {
  434. strCmdLine.Append(" --with-tab");
  435. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::extend)._to_string());
  436. } else
  437. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::slv)._to_string());
  438. strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl(ERR_PAGE_REASON::main).second.c_str());
  439. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  440. return strCmdLine.GetData();
  441. }
  442. #endif //RVC_OS_WIN
  443. std::string CModTools::generateMainCmd(std::string mainUrl)
  444. {
  445. #if defined(_MSC_VER)
  446. return generateCefclientCmd(false, mainUrl);
  447. #else
  448. return generateBrowserCMDForEverything(mainUrl, 0);
  449. #endif //_MSC_VER
  450. }
  451. std::string CModTools::generateInstallCmd(std::string installUrl)
  452. {
  453. #if defined(RVC_OS_LINUX)
  454. return generateBrowserCMDForEverything(installUrl, 0);
  455. #else
  456. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  457. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
  458. CSimpleStringA cachePath;
  459. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  460. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
  461. strCmdLine.Append(" --cache-path=").Append(cachePath);
  462. strCmdLine.Append(" --no-sandbox");
  463. strCmdLine.Append(" --hide-controls");
  464. strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
  465. strCmdLine.Append(" --hide-tabs");
  466. strCmdLine.Append(" --top=-1");
  467. strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Install)._to_string());
  468. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  469. return strCmdLine.GetData();
  470. #endif //RVC_OS_LINUX
  471. }
  472. std::string CModTools::generateSpecialPageFromOtherEntityCmd(std::string mainUrl)
  473. {
  474. #if defined(RVC_OS_WIN)
  475. CSimpleStringA cachePath;
  476. CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
  477. strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
  478. this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
  479. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(m_specialPage_temp_name.c_str());
  480. //strCmdLine.Append(" --hide-controls=true")
  481. strCmdLine.Append(" --cache-path=").Append(cachePath);
  482. strCmdLine.Append(" --no-sandbox");
  483. strCmdLine.Append(" --hide-controls");
  484. if (g_useMagic)
  485. strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
  486. if (g_withMedia)
  487. strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
  488. if (g_withConsole)
  489. strCmdLine.Append(" --with-console");
  490. strCmdLine.Append(" --hide-tabs");
  491. strCmdLine.Append(" --logextend=").Append(m_specialPage_temp_name.c_str());
  492. if (m_specialPage_temp_size.length() > 0)
  493. strCmdLine.Append(" --center-size=").Append(m_specialPage_temp_size.c_str());
  494. if (m_specialPage_temp_point.length() > 0)
  495. strCmdLine.Append(" --src-pos=").Append(m_specialPage_temp_point.c_str());
  496. strCmdLine.Append(" --top=").Append(std::to_string((unsigned long long)m_specialPage_temp_top).c_str());
  497. strCmdLine.Append(" --errurl=file:\/\/\/").Append(getErrUrl(ERR_PAGE_REASON::main).second.c_str());
  498. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cmdline : %s", strCmdLine.GetData());
  499. return strCmdLine.GetData();
  500. #else
  501. return generateBrowserCMDForEverything(mainUrl, 3);
  502. #endif //RVC_OS_WIN
  503. }
  504. #if defined(RVC_OS_LINUX)
  505. std::string CModTools::generateBrowserCMDForEverything(const std::string& url, int pageType)
  506. {
  507. CSimpleStringA strBasePath(true);
  508. this->m_pEntity->GetFunction()->GetPath("BaseDir", strBasePath);
  509. std::string strPath(strBasePath.GetData());
  510. const std::string execute_newbrowser_path = strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startBrower.sh";
  511. const std::string execute_oldbrowser_path = strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startUOSBrower.sh";
  512. //旧版浏览器(系统自带)
  513. if (m_UseUOSBrowser == 1) {
  514. CSimpleStringA strUOSBrowserPath(execute_oldbrowser_path.c_str());
  515. CSimpleStringA strParams(" --new-window --kiosk --no-first-run --disable-popup-blocking --disable-notifications --disable-desktop-notifications --allow-running-insecure-content --disable-infobars --disable-suggestions-service --disable-save-password-bubble --disable-component-update");
  516. if (pageType == 0 || pageType == 2 || pageType == 3) {
  517. } else if (pageType == 1) {
  518. strParams.Append(" --window-position=1280,1024");
  519. }
  520. CSimpleStringA tempPath;
  521. this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
  522. CSimpleStringA cachePath(tempPath);
  523. if (pageType == 0 || pageType == 2 || pageType == 3) {
  524. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  525. } else if (pageType == 1) {
  526. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  527. } else if (pageType == 2) {
  528. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  529. } else if (pageType == 3) {
  530. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  531. }
  532. strParams.Append(" --disk-cache-dir=").Append(cachePath);
  533. strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
  534. if (g_withMedia)
  535. {
  536. strParams.Append(" --use-fake-ui-for-media-stream");
  537. }
  538. CSimpleStringA usrDataPath(tempPath);
  539. if (pageType == 0) {
  540. usrDataPath.Append(SPLIT_SLASH_STR).Append("UOSBrowserConfigMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  541. } else if (pageType == 1) {
  542. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserConfigVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  543. } else if (pageType == 2) {
  544. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserConfigMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  545. } else if (pageType == 3) {
  546. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowserConfigMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  547. }
  548. strParams.Append(" --user-data-dir=").Append(usrDataPath);
  549. strParams.Append(" ");
  550. strParams.Append(url.c_str());
  551. strUOSBrowserPath.Append(strParams);
  552. if (pageType == 0) {
  553. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_MAIN_WITH_UOS, strUOSBrowserPath);
  554. } else if (pageType == 1) {
  555. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_AD_WITH_UOS, strUOSBrowserPath);
  556. }
  557. return strUOSBrowserPath.GetData();
  558. }
  559. //新版浏览器
  560. if (m_UseUOSBrowser == 2) {
  561. CSimpleStringA strUOSBrowserPath(execute_newbrowser_path.c_str());
  562. CSimpleStringA strParams(" --kiosk --incognito --allow-running-insecure-content --new-window");
  563. if (pageType == 0 || pageType == 2 || pageType == 3) {
  564. } else if (pageType == 1) {
  565. strParams.Append(" --window-position=1280,1024");
  566. }
  567. CSimpleStringA tempPath;
  568. this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
  569. CSimpleStringA cachePath(tempPath);
  570. if (pageType == 0) {
  571. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  572. } else if (pageType == 1) {
  573. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  574. } else if (pageType == 2) {
  575. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  576. } else if (pageType == 3) {
  577. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  578. }
  579. strParams.Append(" --disk-cache-dir=").Append(cachePath);
  580. strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
  581. if (g_withMedia)
  582. {
  583. strParams.Append(" --use-fake-ui-for-media-stream");
  584. }
  585. CSimpleStringA usrDataPath(tempPath);
  586. if (pageType == 0) {
  587. usrDataPath.Append(SPLIT_SLASH_STR).Append("BrowserConfigMain_").Append((+ERR_PAGE_REASON::main)._to_string());
  588. } else if (pageType == 1) {
  589. usrDataPath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserConfigVice_").Append((+ERR_PAGE_REASON::Ad)._to_string());
  590. } else if (pageType == 2) {
  591. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserConfigMain_").Append((+ERR_PAGE_REASON::breakdown)._to_string());
  592. } else if (pageType == 3) {
  593. cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("BrowserConfigMain_").Append((+ERR_PAGE_REASON::OutsideRequest)._to_string());
  594. }
  595. strParams.Append(" --user-data-dir=").Append(usrDataPath);
  596. strParams.Append(" ");
  597. strParams.Append(url.c_str());
  598. strUOSBrowserPath.Append(strParams);
  599. if (pageType == 0) {
  600. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_MAIN_WITH_UOSV2, strUOSBrowserPath);
  601. } else if (pageType == 1) {
  602. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_AD_WITH_UOSV2, strUOSBrowserPath);
  603. }
  604. return strUOSBrowserPath.GetData();
  605. }
  606. return std::string("");
  607. }
  608. #endif //RVC_OS_LINUX
  609. std::pair<bool, std::string> CModTools::openAdPage()
  610. {
  611. if (m_isAdOpen)//only open ad in first time
  612. return std::make_pair(false, "open AdPage failed! Already exist.");
  613. auto AdUrlRet = getAdUrl();
  614. if (AdUrlRet.first)
  615. {
  616. auto strAdCmd = generateAdCmd(AdUrlRet.second);
  617. auto openAdRet = openCef(strAdCmd);
  618. if (Error_Succeed != openAdRet.first)
  619. return std::make_pair(false, "open Ad err!");
  620. else
  621. {
  622. m_isAdOpen = true;
  623. return std::make_pair(true, "");
  624. }
  625. }
  626. else
  627. return std::make_pair(false, "StartChromiumBrowser Ad url err!");
  628. }
  629. std::pair<ErrorCodeEnum, int> CModTools::StartChromiumBrowser(
  630. ERR_PAGE_REASON reason, std::tuple < std::string, std::string> normalParam
  631. , std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam) {
  632. g_mutexFreerdp.lock();
  633. std::shared_ptr<void> delHandleFun((void*)0, [&](void*) {
  634. g_mutexFreerdp.unlock();
  635. });
  636. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start browser %d", reason._to_integral());
  637. if (reason._to_integral() == ERR_PAGE_REASON::main)
  638. {
  639. auto mainUrlRet = getMainUrl();
  640. if (0 == mainUrlRet.second.length())
  641. {
  642. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StartChromiumBrowser get %s url failed!", reason._to_string());
  643. LogWarn(Severity_High, Error_Unexpect, LOG_EVT_CHROMIUM_DETECT_MAIN_URL_EMPTY,
  644. CSimpleStringA::Format("StartChromiumBrowser get %s url failed!", reason._to_string()));
  645. return std::make_pair(Error_Unexpect, 0);
  646. }
  647. auto strCmdLine = generateMainCmd(mainUrlRet.second);
  648. auto openCefRet = openCef(strCmdLine, (m_UseUOSBrowser == 0));//with guard
  649. if (Error_Succeed == openCefRet.first) {
  650. LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_OPEN_MAIN_URL,
  651. CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()));
  652. #ifndef DEVOPS_ON_PRD
  653. LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_MAIN_URL, CSimpleStringA::Format("当前打开的业务链接:%s", mainUrlRet.second.c_str()));
  654. #endif
  655. return std::make_pair(Error_Succeed, openCefRet.second);
  656. }
  657. }
  658. else if (reason._to_integral() == ERR_PAGE_REASON::extend)
  659. {
  660. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do not support freerdp");
  661. }
  662. else if (reason._to_integral() == ERR_PAGE_REASON::Ad)
  663. {
  664. auto AdRet = openAdPage();
  665. if (!AdRet.first) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", AdRet.second.c_str());
  666. return std::make_pair(AdRet.first ? Error_Succeed : Error_Unexpect, 0);
  667. }
  668. else if (reason._to_integral() == ERR_PAGE_REASON::OutsideRequest) {
  669. #if defined(RVC_OS_WIN)
  670. auto strCmdLine = generateCefclientCmd(false, std::get<0>(normalParam));
  671. #else
  672. auto strCmdLine = generateBrowserCMDForEverything(std::get<0>(normalParam), 3);
  673. #endif //RVC_OS_WIN
  674. auto openCefRet = openCef(strCmdLine, false);
  675. if (Error_Succeed == openCefRet.first)
  676. return std::make_pair(Error_Succeed, openCefRet.second);
  677. else
  678. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
  679. }
  680. else if (reason._to_integral() == ERR_PAGE_REASON::SpecialPageFromOtherEntity)
  681. {
  682. auto strCmdLine = generateSpecialPageFromOtherEntityCmd(std::get<0>(normalParam));
  683. auto openCefRet = openCef(strCmdLine, false);
  684. if (Error_Succeed == openCefRet.first)
  685. return std::make_pair(Error_Succeed, openCefRet.second);
  686. else
  687. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
  688. }
  689. else if (reason._to_integral() == ERR_PAGE_REASON::Install)
  690. {
  691. std::vector<std::string> installUrls;
  692. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  693. installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/installRequire");
  694. installUrls.push_back("https://deviceinstallwebdmz.paasst.cmbchina.cn/installRequire");
  695. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  696. installUrls.push_back("https://deviceinstallweb.paasuat.cmbchina.cn/installRequire");
  697. installUrls.push_back("https://deviceinstallwebdmz.paasuat.cmbchina.cn/installRequire");
  698. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  699. installUrls.push_back("https://deviceinstallweb.paas.cmbchina.cn/installRequire");
  700. installUrls.push_back("https://deviceinstallweb.paas.cmbchina.com/installRequire");
  701. #else/*本地编译等非DevOps环境编译的版本*/
  702. installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/installRequire");
  703. #endif
  704. auto checkRet = DetectActiveHttp(installUrls);
  705. if (!checkRet.first)
  706. {
  707. LogWarn(Severity_High, Error_NetBroken, LOG_WARN_CHROMIUM_INSTALL_URLS_CHECK,
  708. CSimpleString::Format("install page check err, can not connect to %s or %s", installUrls[0].c_str(), installUrls[1].c_str()).GetData());
  709. }
  710. std::string dstInstallUrl = checkRet.first ? checkRet.second : installUrls[0];
  711. CSimpleString runningVer = "";
  712. m_pEntity->GetFunction()->GetRunningVersion(runningVer);
  713. dstInstallUrl.append("?terminalVersion=").append(runningVer.GetData());
  714. #if defined(RVC_OS_LINUX)
  715. auto replaceAll = [](std::string& str, const std::string& search, const std::string& replace) {
  716. size_t pos = 0;
  717. while ((pos = str.find(search, pos)) != std::string::npos) {
  718. str.replace(pos, search.length(), replace);
  719. pos += replace.length();
  720. }
  721. };
  722. replaceAll(dstInstallUrl, "&", "\\&");
  723. #endif // RVC_OS_WIN
  724. auto strCmdLine = generateInstallCmd(dstInstallUrl);
  725. auto openCefRet = openCef(strCmdLine, false);
  726. if (Error_Succeed == openCefRet.first)
  727. return std::make_pair(Error_Succeed, openCefRet.second);
  728. else
  729. Dbg("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
  730. }
  731. else
  732. {
  733. //open err page
  734. if (notifyExist)
  735. return std::make_pair(Error_Duplication, 0);
  736. if ((ERR_PAGE_REASON::breakdown == reason._to_integral() || reason._to_integral() == ERR_PAGE_REASON::warnPrompt) && breakdownExist)
  737. return std::make_pair(Error_Duplication, 0);//只打开一个breakdown页面,后续通过cefclient改动,避免打开同种页面
  738. auto errPageUrl = GenerateErrPage(reason, normalParam, exParam);
  739. if (!errPageUrl.first)
  740. {
  741. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("errPage get url failed!");
  742. return std::make_pair(Error_Unexpect, 0);
  743. }
  744. auto errPageRet = openCef(errPageUrl.second);
  745. if (Error_Succeed == errPageRet.first)
  746. {
  747. if (ERR_PAGE_REASON::ErrNotify == reason._to_integral())
  748. notifyExist = true;
  749. else if (ERR_PAGE_REASON::breakdown == reason._to_integral() || reason._to_integral() == ERR_PAGE_REASON::warnPrompt)
  750. breakdownExist = true;
  751. }
  752. return std::make_pair(errPageRet.first, 0);
  753. }
  754. return std::make_pair(Error_Unexpect, 0);
  755. }
  756. void CModTools::cefClientGuardian(std::string cmdline)
  757. {
  758. m_isGuardMainBrowser = true;
  759. while (m_isGuardMainBrowser)
  760. {
  761. try
  762. {
  763. #if (defined _WIN32 || defined _WIN64)
  764. auto startRet = startProcessInJob(cmdline, "");
  765. if (!std::get<0>(startRet))
  766. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cefClientGuardian startProcessInJob failed!");
  767. else
  768. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("cefClientGuardian open cefclient pid:%d, cmd:%s", std::get<1>(startRet), cmdline.c_str());
  769. WaitForSingleObject(std::get<3>(startRet), INFINITE);
  770. boost::mutex::scoped_lock(m_guardInterruptLock);//必须保证unlock被执行,不然就会有问题
  771. #else
  772. boost::process::child child_process(cmdline);
  773. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cefclient pid:%d, cmd:%s", child_process.id(), cmdline.c_str());
  774. child_process.wait();
  775. #endif
  776. }
  777. catch (const std::exception& e)
  778. {
  779. std::cout << e.what() << std::endl;
  780. return;
  781. }
  782. catch (...)
  783. {
  784. return;
  785. }
  786. boost::this_thread::sleep_for(boost::chrono::seconds(1));
  787. }
  788. return;
  789. }
  790. // 输入为北京时间 输出为北京时间戳
  791. int CModTools::StandardToStamp(const char* str_time, bool dateOnly)
  792. {
  793. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StandardToStamp str = %s", str_time);
  794. struct tm stm;
  795. int iY, iM, iD, iH, iMin, iS;
  796. // 检查有效性
  797. if ('-' != str_time[4] || '-' != str_time[7])
  798. {
  799. return 0;
  800. }
  801. memset(&stm, 0, sizeof(stm));
  802. iY = atoi(str_time);
  803. iM = atoi(str_time + 5);
  804. iD = atoi(str_time + 8);
  805. if (dateOnly)
  806. {
  807. iH = 0;
  808. iMin = 0;
  809. iS = 0;
  810. }
  811. else {
  812. iH = atoi(str_time + 11);
  813. iMin = atoi(str_time + 14);
  814. iS = atoi(str_time + 17);
  815. }
  816. stm.tm_year = iY - 1900;
  817. stm.tm_mon = iM - 1;
  818. stm.tm_mday = iD;
  819. stm.tm_hour = iH;
  820. stm.tm_min = iMin;
  821. stm.tm_sec = iS;
  822. /*printf("%d-%0d-%0d %0d:%0d:%0d\n", iY, iM, iD, iH, iMin, iS);*/ //标准时间格式例如:2016:08:02 12:12:30
  823. return (int)mktime(&stm);
  824. }
  825. bool CModTools::isOutsidePad() {
  826. if ((m_strSite.IsEndWith("FLB", true) || m_strSite.IsEndWith("SMM", true)) &&
  827. m_strMachineType.IsEndWith("PAD", true))
  828. {
  829. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("isOutsidePad Yes");
  830. return true;
  831. }
  832. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("isOutsidePad No");
  833. return false;
  834. }
  835. bool CModTools::findRestartCode(DWORD userCode) {
  836. DWORD authArr_noretry_norestart[] = ERRARR_ACCESSAUTH_NORETRY_NORESTART;
  837. DWORD authArr_retry_norestart[] = ERRARR_ACCESSAUTH_RETRY_NORESTART;
  838. std::vector<DWORD> norestartArr;
  839. #if (defined _WIN32 || defined _WIN64)
  840. for each (auto i in authArr_noretry_norestart)
  841. #else
  842. for (auto i : authArr_noretry_norestart)
  843. #endif
  844. norestartArr.emplace_back(i);
  845. #if (defined _WIN32 || defined _WIN64)
  846. for each (auto i in authArr_retry_norestart)
  847. #else
  848. for (auto i : authArr_retry_norestart)
  849. #endif
  850. norestartArr.emplace_back(i);
  851. #if (defined _WIN32 || defined _WIN64)
  852. for each (auto i in norestartArr)
  853. #else
  854. for (auto i : norestartArr)
  855. #endif
  856. {
  857. if (userCode == i) {
  858. return false;
  859. }
  860. }
  861. return true;
  862. }
  863. DWORD CModTools::spiltErrMsg(std::string errMsg)
  864. {
  865. DWORD usercode = 0;
  866. CSimpleString m_sAuthErrMsg = errMsg.c_str();
  867. auto authArr = m_sAuthErrMsg.Split('|');
  868. if (authArr.GetCount() > 1)
  869. {
  870. auto ErrcodeStr = authArr[0];
  871. if (ErrcodeStr[0] == '0' && ErrcodeStr[1] == 'x')
  872. usercode = std::stoi(ErrcodeStr.GetData(), 0, 0);
  873. }
  874. return usercode;
  875. }
  876. bool CModTools::CheckTradeRecord() {
  877. std::list<int> timeList;
  878. using namespace Upload;
  879. UploadService_ClientBase* pClient = new UploadService_ClientBase(m_pEntity);
  880. auto rc = pClient->Connect();
  881. if (rc != Error_Succeed)
  882. {
  883. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("connect to Upload entity fail: %d", rc);
  884. pClient->SafeDelete();
  885. pClient = NULL;
  886. }
  887. else
  888. {
  889. UploadService_UploadDateList_Req req = {};
  890. UploadService_UploadDateList_Ans ans = {};
  891. rc = (*pClient)(EntityResource::getLink().upgradeLink())->UploadDateList(req, ans, 10000);
  892. if (rc != Error_Succeed)
  893. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get CreateProcessRunAs fail from FreeRDPWrap: %d", rc);
  894. else
  895. {
  896. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UploadDateList succeed from Upload");
  897. for (int i = 0; i < ans.uploadDateStr.GetCount(); ++i)
  898. {
  899. CSimpleStringA str = (CSimpleStringA)ans.uploadDateStr[i];
  900. int t = StandardToStamp(ans.uploadDateStr[i], true);
  901. timeList.emplace_back(t);
  902. }
  903. }
  904. pClient->GetFunction()->CloseSession();
  905. pClient = NULL;
  906. }
  907. // 比较时间戳 登记时间 <= 列表时间 < 今天 返回true
  908. time_t now = time(0);
  909. localtime(&now);
  910. now -= now % (3600 * 24);
  911. now -= 3600 * 8; //处理东八区问题
  912. CSmartPointer<IConfigInfo> spConfig;
  913. ErrorCodeEnum BootTimeCfgError = m_pEntity->GetFunction()->OpenConfig(Config_Run, spConfig);
  914. CSimpleStringA strLastRecordTime = "";
  915. ErrorCodeEnum errorRead = Error_Succeed;
  916. errorRead = spConfig->ReadConfigValue("Record", "LastRecordTime", strLastRecordTime);
  917. if (errorRead != Error_Succeed)
  918. {
  919. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Read Record LastRecordTime -> Failed! Maybe LastRecordTime not exist!");
  920. strLastRecordTime = "";
  921. }
  922. int timestamp_lastRecordTime = now;
  923. if (!strLastRecordTime.IsNullOrEmpty())
  924. {
  925. timestamp_lastRecordTime = StandardToStamp(strLastRecordTime, false);
  926. }
  927. for (std::list<int>::iterator it = timeList.begin(); it != timeList.end(); ++it)
  928. {
  929. if (timestamp_lastRecordTime <= *it && *it < now)
  930. {
  931. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CheckTradeRecord lastRecordTime=%d, time_list=%d, now=%d", timestamp_lastRecordTime, *it, now);
  932. return true;
  933. }
  934. }
  935. return false;
  936. }
  937. void CModTools::InitBrowserUseMode()
  938. {
  939. #if (defined _WIN32 || defined _WIN64)
  940. #else
  941. if (m_pEntity != nullptr) {
  942. CSmartPointer<IConfigInfo> spConfig;
  943. m_pEntity->GetFunction()->OpenConfig(Config_Cache, spConfig);
  944. CSimpleStringA value(true);
  945. spConfig->ReadConfigValue("BusinessBrowserType", "FultureEx", value);
  946. if (!(value.IsNullOrEmpty() || (value.Compare("1") != 0))) {
  947. m_UseUOSBrowser = 0;
  948. } else {
  949. m_UseUOSBrowser = ToGetUOSBrowserType();
  950. }
  951. } else {
  952. m_UseUOSBrowser = ToGetUOSBrowserType();
  953. }
  954. #endif
  955. }
  956. int CModTools::ToGetUOSBrowserType()
  957. {
  958. #if (defined _WIN32 || defined _WIN64)
  959. return 0;
  960. #else
  961. const std::string execute_newbrowser_path_check = "/usr/share/browser/browser";
  962. const std::string execute_oldbrowser_path_check = "/usr/share/uosbrowser/uosbrowser";
  963. CSimpleStringA strBasePath(true);
  964. this->m_pEntity->GetFunction()->GetPath("BaseDir", strBasePath);
  965. std::string strPath(strBasePath.GetData());
  966. const std::string execute_newbrowser_path = strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startBrower.sh";
  967. const std::string execute_oldbrowser_path = strPath + SPLIT_SLASH_STR + "res" + SPLIT_SLASH_STR + "RunScript" + SPLIT_SLASH_STR + "startUOSBrower.sh";
  968. int result(0);
  969. std::string additional("");
  970. std::string succStr, errStr;
  971. std::string runStr("dpkg -l | grep org.deepin.browser | awk '{print $3}'");
  972. if (SP::Module::Util::ShellExecute(runStr, succStr, errStr)) {
  973. if (succStr.empty()) {
  974. if (ExistsFileA(execute_oldbrowser_path_check.c_str())) {
  975. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s exists!", execute_oldbrowser_path_check.c_str());
  976. result = 1;
  977. } else {
  978. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s not exists!", execute_oldbrowser_path_check.c_str());
  979. }
  980. LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_LACK_OF_NEWONE, "have not installered new version UOS browser");
  981. } else {
  982. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new browser version: %s", succStr.c_str());
  983. additional = succStr;
  984. if (!ExistsFileA(execute_newbrowser_path.c_str())) {
  985. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s not exists!", execute_newbrowser_path.c_str());
  986. }
  987. result = 2;
  988. }
  989. } else {
  990. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("execute '%s' failed!", runStr.c_str());
  991. }
  992. UploadBrowserInfo(result, additional.c_str());
  993. return result;
  994. #endif
  995. }
  996. void CModTools::UploadBrowserInfo(int usingType, LPCTSTR info)
  997. {
  998. CSmartPointer<IConfigInfo> spConfig;
  999. this->m_pEntity->GetFunction()->OpenConfig(Config_Run, spConfig);
  1000. int oldType(0);
  1001. CSimpleStringA strVersion;
  1002. spConfig->ReadConfigValueInt("BrowserUse", "Type", oldType);
  1003. spConfig->ReadConfigValue("BrowserUse", "Version", strVersion);
  1004. if (oldType != usingType || strVersion.Compare(info) != 0) {
  1005. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_CHROMIUM_BROWSER_USING_TYPE_CHANGE,
  1006. CSimpleStringA::Format("{ \"type\":%d, \"version\":\"%s\"}", usingType, info));
  1007. spConfig->WriteConfigValueInt("BrowserUse", "Type", usingType);
  1008. spConfig->WriteConfigValue("BrowserUse", "Version", info);
  1009. }
  1010. }
  1011. std::pair<ErrorCodeEnum, int> CModTools::openCef(std::string cmdline, bool isGuard, bool usingSystemCmd)
  1012. {
  1013. if (isGuard) {
  1014. //mod_chromium相当于cefclient的守护进程
  1015. boost::thread cefGuardian(boost::bind(&CModTools::cefClientGuardian, this, cmdline));
  1016. cefGuardian.detach();
  1017. }
  1018. else
  1019. {
  1020. #if (defined _WIN32 || defined _WIN64)
  1021. auto startRet = startProcessInJob(cmdline, "");
  1022. if (!std::get<0>(startRet))
  1023. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startProcessInJob failed!");
  1024. return std::make_pair(std::get<0>(startRet) ? Error_Succeed : Error_Unexpect, std::get<1>(startRet));
  1025. #else
  1026. auto systemStartChromium = [](std::string str, bool systemCmd) {
  1027. if (systemCmd) {
  1028. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("system(%s)", str.c_str());
  1029. system(str.c_str());
  1030. } else {
  1031. SystemRunTest(str);
  1032. }
  1033. };
  1034. boost::thread(systemStartChromium, cmdline, usingSystemCmd).detach();
  1035. #endif
  1036. }
  1037. return std::make_pair(Error_Succeed, 0);
  1038. }
  1039. bool CModTools::RestartProxyServer() {
  1040. // start tcp bridge service
  1041. ErrorCodeEnum Error;
  1042. CSmartPointer<IEntityFunction> spEntityFunction = this->m_pEntity->GetFunction();
  1043. Error = spEntityFunction->StopTcpBridgeServer();
  1044. if (Error != Error_Succeed)
  1045. {
  1046. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("stop tcp bridge server failed! error = %d", Error);
  1047. return false;
  1048. }
  1049. Error = spEntityFunction->StartTcpBridgeServer(4504);
  1050. if (Error != Error_Succeed)
  1051. {
  1052. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start tcp bridge server failed! error = %d", Error);
  1053. return false;
  1054. }
  1055. return true;
  1056. }
  1057. std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA> CModTools::ReadCenterConfigStr(CSimpleStringA entityName) {
  1058. CSimpleStringA str = "", strNew = "", strEx = "", strFulture = "", strAd = "", strCacheHead;
  1059. bool forceCleanCache = false;
  1060. CSmartPointer<IConfigInfo> spCerConfig;
  1061. ErrorCodeEnum err = this->m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);
  1062. if (entityName == "")
  1063. entityName = this->m_pEntity->GetEntityName();
  1064. SpIniMappingTable table;
  1065. // clean cache every time
  1066. table.AddEntryString(entityName, "UserMgrUrl", str, "");
  1067. table.AddEntryString(entityName, "UserMgrUrlNoSidebar", strNew, "");
  1068. table.AddEntryString(entityName, "UserMgrUrlNoSidebarMuti", strEx, "");
  1069. table.AddEntryString(entityName, "UserMgrUrlFulture", strFulture, "");
  1070. table.AddEntryString(entityName, "UserMgrAd", strAd, "");
  1071. table.AddEntryString(entityName, "CacheHead", strCacheHead, "");
  1072. if (Error_Succeed == table.Load(spCerConfig))
  1073. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleString::Format("read centersetting config : UserMgrUrl-%s, UserMgrUrlNoSidebar-%s, UserMgrUrlNoSidebarMuti-%s, UserMgrUrlFulture-%s, UserMgrAd-%s",
  1074. str.GetData(), strNew.GetData(), strEx.GetData(), strFulture.GetData(), strAd.GetData()));
  1075. CChromiumEntity* pChromiumEntity = reinterpret_cast<CChromiumEntity*>(m_pEntity);
  1076. if (pChromiumEntity != nullptr && pChromiumEntity->HasCustomMainUrl()) {
  1077. strFulture = pChromiumEntity->GetCustomMainUrl();
  1078. CSimpleStringA strTmp = CSimpleStringA::Format("更新业务中台链接为:[%s]", strFulture.GetData());
  1079. LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_USE_CUSTOM_FULTURE_URL, strTmp);
  1080. }
  1081. m_strCacheHead = strCacheHead.GetData();
  1082. return std::make_tuple(str, strNew, strEx, strFulture, strAd);
  1083. }
  1084. }