CenterSettingConn.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. #include "stdafx.h"
  2. #include "CenterSettingConn.h"
  3. #include "Event.h"
  4. #include <map>
  5. #include <regex>
  6. using namespace std;
  7. using std::regex;
  8. #include "mod_centersetting.h"
  9. #include <iostream>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <fstream>
  13. #include "fileutil.h"
  14. #pragma comment(lib, "crypt32.lib")
  15. #ifdef RVC_OS_LINUX
  16. #include "CommEntityUtil.hpp"
  17. #include "iniutil.h"
  18. #include "json/json.h"
  19. #include "CommEntityRestful.hpp"
  20. #include "SpUtility.h"
  21. #include "RVCComm.h"
  22. #endif //RVC_OS_WIN
  23. #ifdef RVC_OS_WIN
  24. char* ConvertUtf8ToGBK(const char* strUtf8)
  25. {
  26. int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
  27. WCHAR* wszGBK = new WCHAR[len + 1];
  28. memset(wszGBK, 0, len * 2 + 2);
  29. MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
  30. len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  31. char* szGBK = new char[len + 1];
  32. memset(szGBK, 0, len + 1);
  33. WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
  34. delete[] wszGBK;
  35. return szGBK;
  36. }
  37. void ConvertUtf8ToGBK(std::string& str)
  38. {
  39. char* dst = ConvertUtf8ToGBK(str.c_str());
  40. str = dst;
  41. delete[] dst;
  42. }
  43. char* ConvertGBKToUtf8(const char* gbk, int* n)
  44. {
  45. int len = MultiByteToWideChar(CP_ACP, 0, gbk, -1, NULL, 0);
  46. WCHAR* wszGBK = new WCHAR[len + 1];
  47. memset(wszGBK, 0, len * 2 + 2);
  48. MultiByteToWideChar(CP_ACP, 0, gbk, -1, wszGBK, len);
  49. len = WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  50. char* szUtf8 = new char[len + 1];
  51. memset(szUtf8, 0, len + 1);
  52. WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, szUtf8, len, NULL, NULL);
  53. delete[] wszGBK;
  54. *n = len - 1;
  55. return szUtf8;
  56. }
  57. void ConvertGBKToUtf8(std::string& str)
  58. {
  59. //char *src = new char[str.length() + 1];
  60. //strncpy(src, str.c_str(), str.length() + 1);
  61. int len = 0;
  62. char* dst = ConvertGBKToUtf8(str.c_str(), &len);
  63. str = dst;
  64. //delete[] src;
  65. delete[] dst;
  66. }
  67. static char* ConvertBytesToHexStr(BYTE *pBuf, int nLen)
  68. {
  69. char *pRet = (char*)malloc(nLen * 2 + 1);
  70. memset(pRet, 0, nLen * 2 + 1);
  71. char *p = pRet;
  72. for (int i = 0; i < nLen; i++)
  73. {
  74. BYTE b = pBuf[i];
  75. BYTE l = (b >> 4) & 0x0F;
  76. if (l >= 10)
  77. *p = l - 10 + 'a';
  78. else
  79. *p = l + '0';
  80. p++;
  81. BYTE r = b & 0x0F;
  82. if (r >= 10)
  83. *p = r - 10 + 'a';
  84. else
  85. *p = r + '0';
  86. p++;
  87. }
  88. return pRet;
  89. }
  90. #endif //RVC_OS_WIN
  91. void convert(string& str)
  92. {
  93. //将单斜杠转为双斜杠
  94. for (size_t i = 0; i < str.size(); i++) {
  95. if (str[i] == '\\') {
  96. str.insert(i, string("\\"));
  97. i++;
  98. }
  99. }
  100. }
  101. void transferblank(string& str)
  102. {
  103. int oldLen = str.length();
  104. int cnt = 0;
  105. for(int idx = 0; idx < oldLen; idx++)
  106. {
  107. if(str[idx] == ' ')
  108. cnt++;
  109. }
  110. str.resize(oldLen + cnt * 2);
  111. int j = oldLen - 1;
  112. int i = str.length() - 1;
  113. while( i >= 0 )
  114. {
  115. if(str[j] == ' ')
  116. {
  117. str[i--] = '0';
  118. str[i--] = '2';
  119. str[i--] = '%';
  120. j--;
  121. }
  122. else
  123. {
  124. str[i--] = str[j--];
  125. }
  126. }
  127. }
  128. #ifndef WITH_CPPRESTSDK_IN_CENTER
  129. bool CenterSettingResponse::Parse(string strData)
  130. {
  131. Json::Value root;
  132. Json::Reader reader;
  133. Json::Value arrConfig;
  134. reader.parse(strData, root, false);
  135. m_success = root["success"].asBool();
  136. if(m_success)
  137. {
  138. m_message = root["message"].asString();
  139. m_is_update = root["data"]["is_update"].asBool();
  140. m_is_reset = root["data"]["is_reset"].asBool();
  141. m_version_no = root["data"]["version_no"].asString();
  142. transferblank(m_version_no);
  143. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_version_no:%s", m_version_no.c_str());
  144. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_is_reset:%d", m_is_reset ? 1 : 0);
  145. m_sm3 = root["data"]["sm3"].asString();
  146. m_strConfig = root["data"]["config"].asString();
  147. if(m_is_update)
  148. {
  149. reader.parse(m_strConfig, arrConfig, false);
  150. if(arrConfig.isArray())
  151. {
  152. for(int j = 0; j < arrConfig.size(); j++)
  153. {
  154. ConfigItem configItem;
  155. configItem.m_moudle = arrConfig[j]["moudle"].asString();
  156. configItem.m_name = arrConfig[j]["name"].asString();
  157. configItem.m_value = arrConfig[j]["value"].asString();
  158. m_config.push_back(configItem);
  159. }
  160. }
  161. }
  162. }
  163. return true;
  164. }
  165. #endif
  166. bool AddVersionResponse::Parse(string strData)
  167. {
  168. Json::Value root;
  169. Json::Reader reader;
  170. reader.parse(strData, root, false);
  171. m_success = root["success"].asBool();
  172. return m_success;
  173. }
  174. CenterSettingsMicroServiceHelper::CenterSettingsMicroServiceHelper(CEntityBase* pEntity)
  175. :m_pEntity(pEntity), m_strLastTime(true), m_strCurSite(true), m_arrKeys(NULL), m_arrURLs(NULL), m_isFirst(true)
  176. {
  177. m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig);
  178. m_pEntity->GetFunction()->OpenConfig(Config_Run, m_pRunConfig);
  179. m_pEntity->GetFunction()->GetSystemStaticInfo(m_terminalInfo);
  180. m_pHttpFunc = create_http(HTTPLogCallback);
  181. InitCenterSettingInfo();
  182. }
  183. #ifdef RVC_OS_WIN
  184. int CenterSettingsMicroServiceHelper::GetCenterSetting()
  185. {
  186. #else
  187. int CenterSettingsMicroServiceHelper::GetCenterSetting(bool byHand)
  188. {
  189. #endif
  190. LOG_FUNCTION();
  191. if(m_strUrl.IsNullOrEmpty() && m_urlsFromShell.size() <= 0)
  192. {
  193. m_strErrMsg = "集中配置服务地址不存在";
  194. return AllAddressNull;
  195. }
  196. CenterSettingReq req;
  197. CenterSettingResponse res;
  198. req.m_terminal_no = m_terminalInfo.strTerminalID.GetData();
  199. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_strFilePath:%s", m_strFilePath.GetData());
  200. #ifdef RVC_OS_WIN
  201. if(!ExistsFile(m_strFilePath))
  202. {
  203. Dbg("!ExistsFile(m_strFilePath)");
  204. #else
  205. if ((byHand && !m_isFirst) || !ExistsFile(m_strFilePath))
  206. {
  207. if (byHand && !m_isFirst && ExistsFileA(m_strFilePath)) {
  208. LogWarn(Severity_Low, Error_Debug, EVENT_MOD_CENTERSETTING_UPDATE_CENTER_FORCE, "尝试强制重新下载集中配置");
  209. }
  210. #endif
  211. req.m_version = "";
  212. req.m_config = "";
  213. }
  214. else
  215. {
  216. #ifdef RVC_OS_LINUX
  217. if (m_isFirst) //如果是第一次更新则强制下载集中配置
  218. {
  219. req.m_version = "";
  220. req.m_config = "";
  221. }
  222. else
  223. #endif
  224. {
  225. req.m_version = m_strVersion.GetData();
  226. req.m_config = GetLocalConfig();
  227. }
  228. }
  229. if(m_isFirst) m_isFirst = false;
  230. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_strVersion:%s", req.m_version.c_str());
  231. req.m_update_time = GetUpdateTime();
  232. GetTimeoutValue(req.m_timeOut);
  233. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")(CSimpleStringA::Format("timeout:%d", req.m_timeOut));
  234. int ret1 = MANUAL, ret2 = MANUAL;
  235. if(!m_strUrl.IsNullOrEmpty())
  236. {
  237. req.m_url = m_strUrl;
  238. m_strCurUrl = req.m_url;
  239. req.m_url += "?update_time=" + req.m_update_time + "&terminal_no=" + req.m_terminal_no + "&version=" + req.m_version;
  240. #ifdef RVC_OS_WIN
  241. ret1 = OnRequest(req, res, m_strErrMsg);
  242. #else
  243. ret1 = GetCenterSettingsFromHttp(req, m_strErrMsg);
  244. #endif
  245. }
  246. else
  247. {
  248. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("集中配置文件中地址为空,使用默认地址");
  249. }
  250. if(SUCC != ret1 && ret1 != EXIST)
  251. {
  252. if(m_urlsFromShell.size() <= 0)
  253. {
  254. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("shell.ini中找不到集中配置地址");
  255. return ret1;
  256. }
  257. for(int i = 0; i < m_urlsFromShell.size(); i++)
  258. {
  259. req.m_url = m_urlsFromShell[i].GetData();
  260. m_strCurUrl = m_urlsFromShell[i].GetData();
  261. req.m_url += "?update_time=" + req.m_update_time + "&terminal_no=" + req.m_terminal_no + "&version=" + req.m_version;
  262. #ifdef RVC_OS_WIN
  263. ret2 = OnRequest(req, res);
  264. if(ret2 == SUCC)
  265. break;
  266. #else
  267. ret1 = GetCenterSettingsFromHttp(req, m_strErrMsg);
  268. if (ret1 == SUCC || ret1 == EXIST)
  269. break;
  270. #endif
  271. }
  272. }
  273. #ifdef RVC_OS_WIN
  274. if(SUCC == ret1 || SUCC == ret2)
  275. {
  276. if(!res.m_is_update)
  277. {
  278. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed.");
  279. m_strErrMsg = "集中配置已是最新版本";
  280. return EXIST;
  281. }
  282. if(WriteToConfig(res))
  283. {
  284. m_strVersion = res.m_version_no.c_str();
  285. Dbg("WriteToConfig m_strVersion:%s", m_strVersion.GetData());
  286. m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig, true);
  287. m_pRunConfig->WriteConfigValue("CenterSetting", "version", m_strVersion);
  288. UpdateVersion();
  289. if(res.m_is_reset)
  290. LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "Update centersetting with critical items.");
  291. return SUCC;
  292. }
  293. }
  294. #endif
  295. return ret1;
  296. }
  297. void CenterSettingsMicroServiceHelper::InitCenterSettingInfo()
  298. {
  299. CSmartPointer<IConfigInfo> shellConfig;
  300. m_pEntity->GetFunction()->OpenConfig(Config_Shell, shellConfig);
  301. m_pCenterConfig->ReadConfigValue("CenterSetting", "LastUpdateTime", m_strLastTime);
  302. m_pRunConfig->ReadConfigValue("CenterSetting", "version", m_strVersion);
  303. #ifdef RVC_OS_LINUX
  304. if (!m_strVersion.IsNullOrEmpty()) {
  305. std::string tmp = m_strVersion.GetData();
  306. transferblank(tmp);
  307. m_strVersion = tmp.c_str();
  308. }
  309. #endif
  310. //从集中配置和shell.ini获取url
  311. m_pCenterConfig->ReadConfigValue("CenterSetting", "CenterConfigUrlNew", m_strUrl);
  312. if(m_strUrl.IsNullOrEmpty())
  313. {
  314. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitCenterSettingInfo")("集中配置中的服务链接为空,使用默认链接");
  315. }
  316. else
  317. {
  318. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CenterConfigUrlNew:%s", m_strUrl.GetData());
  319. }
  320. CSimpleStringA strMicroServiceURLSection = "MicroServiceURL";
  321. #ifdef RVC_OS_WIN /** UOS配置后置后没这堆玩意,至少现在的配置中没有 但是windows还有[Gifur@202397]*/
  322. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  323. strMicroServiceURLSection = "MicroServiceURL-ST";
  324. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  325. strMicroServiceURLSection = "MicroServiceURL-UAT";
  326. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  327. //strMicroServiceURLSection = "MicroServiceURL-PRD";
  328. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  329. strMicroServiceURLSection = "MicroServiceURL-Dev";
  330. #else/*本地编译等非DevOps环境编译的版本*/
  331. strMicroServiceURLSection = "MicroServiceURL-Dev";
  332. #endif
  333. #endif //RVC_OS_WIN
  334. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitCenterSettingInfo")("获取集中配置服务地址 Section name:%s", strMicroServiceURLSection.GetData());
  335. shellConfig->ReadAllKeys(strMicroServiceURLSection, m_arrKeys);
  336. CSimpleStringA strUrl;
  337. for(int i = 0; i < m_arrKeys.GetCount() && m_arrKeys[i].IsStartWith("CenterConfigUrl", true); i++)
  338. {
  339. shellConfig->ReadConfigValue(strMicroServiceURLSection, m_arrKeys[i].GetData(), strUrl);
  340. if(!strUrl.IsNullOrEmpty())
  341. {
  342. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("add CenterURL:%s", strUrl.GetData());
  343. m_urlsFromShell.push_back(strUrl);
  344. }
  345. }
  346. //获取集中配置路径、文件名、场所
  347. m_pEntity->GetFunction()->GetPath("CenterSetting", m_strFilePath);
  348. m_pEntity->GetFunction()->GetPath("RunInfo", m_strBakPath);
  349. #ifdef RVC_OS_WIN
  350. m_strBakPath += "\\runcfg\\CenterSetting.ini";
  351. #else
  352. m_strBakPath += SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "CenterSetting.ini";
  353. #endif
  354. }
  355. bool CenterSettingsMicroServiceHelper::WriteToConfig(const CenterSettingResponse& sResponse)
  356. {
  357. CSimpleStringA newPath = m_strBakPath + ".new";
  358. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("config size: %d", sResponse.m_config.size());
  359. for(int i = 0; i < sResponse.m_config.size(); i++)
  360. {
  361. string module = sResponse.m_config[i].m_moudle;
  362. string name = sResponse.m_config[i].m_name;
  363. string value = sResponse.m_config[i].m_value;
  364. #ifdef RVC_OS_WIN
  365. if(!WritePrivateProfileStringA(module.c_str(), name.c_str(), value.c_str(), newPath))
  366. {
  367. #else
  368. if (inifile_write_str(newPath.GetData(), module.c_str(), name.c_str(), value.c_str()) == -1)
  369. {
  370. #endif
  371. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WriteToConfig")
  372. ("write %s:%s:%s fail", module.c_str(), name.c_str(), value.c_str());
  373. m_strErrMsg = "集中配置写入失败";
  374. LogWarn(Severity_Middle, Error_Unexpect, ERR_MOD_CENTERSETTING_WRITE_FAILED,
  375. CSimpleStringA::Format("集中配置写入失败:%s:%s:%s", module.c_str(), name.c_str(), value.c_str()));
  376. return false;
  377. }
  378. }
  379. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WriteToConfig")("集中配置写入成功");
  380. #ifdef RVC_OS_WIN
  381. CopyFileA(newPath, m_strFilePath, FALSE);
  382. DeleteFileA(newPath);
  383. #else
  384. fileutil_copy_file(m_strFilePath, newPath);
  385. fileutil_delete_file(newPath);
  386. #endif
  387. return true;
  388. }
  389. string CenterSettingsMicroServiceHelper::GetLocalConfig()
  390. {
  391. CAutoArray<CSimpleStringA> arrSections, arrKeys;
  392. CSimpleStringA strItem;
  393. if(Error_Succeed != m_pCenterConfig->ReadAllSections(arrSections))
  394. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetLocalConfig")("Read all sections failed.");
  395. if(arrSections.GetCount() == 0)
  396. return "";
  397. for(int i = 0; i < arrSections.GetCount(); ++i)
  398. {
  399. m_pCenterConfig->ReadAllKeys(arrSections[i].GetData(), arrKeys);
  400. for(int j = 0; j < arrKeys.GetCount(); ++j)
  401. {
  402. CSimpleStringA value, tmp;
  403. m_pCenterConfig->ReadConfigValue(arrSections[i].GetData(), arrKeys[j].GetData(), value);
  404. tmp = CSimpleStringA::Format("{\"moudle\":\"%s\", \"name\":\"%s\", \"value\":\"%s\"}",
  405. arrSections[i].GetData(), arrKeys[j].GetData(), value.GetData());
  406. strItem += tmp + ",";
  407. }
  408. }
  409. string strConfig = strItem.SubString(0, strItem.GetLength() - 1).GetData();
  410. convert(strConfig);
  411. return strConfig;
  412. }
  413. void CenterSettingsMicroServiceHelper::UpdateVersion()
  414. {
  415. AddVersionReq sReq;
  416. AddVersionResponse sResponse;
  417. #ifdef RVC_OS_WIN
  418. CSimpleStringA url;
  419. m_pCenterConfig->ReadConfigValue("CenterSetting", "UpdateVersionUrl", url);
  420. sReq.m_url = url.GetData();
  421. sReq.m_terminal_no = m_terminalInfo.strTerminalID.GetData();
  422. sReq.m_version = m_strVersion;
  423. sReq.m_update_time = GetUpdateTime();
  424. GetTimeoutValue(sReq.m_timeOut);
  425. //IHttpFunc* m_pHttpFunc = create_http(HTTPLogCallback);
  426. PROCESS_LINK_CONTEXT("LR0402101UploadVersion")
  427. bool ret = m_pHttpFunc->Post(sReq, sResponse, &nextLink);
  428. if(ret && sResponse.m_success)
  429. {
  430. CSimpleStringA msg = CSimpleStringA::Format("上传版本号成功:{version : %s, update_time : %s}",
  431. sReq.m_version.c_str(), sReq.m_update_time.c_str());
  432. LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC, msg.GetData());
  433. }
  434. else
  435. {
  436. CSimpleStringA msg = CSimpleStringA::Format("上传版本号失败:%s", sResponse.m_errMsg.c_str());
  437. LogWarn(Severity_Middle, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED, msg.GetData());
  438. }
  439. #else
  440. struct UpdateVersionReq //Req和Ans的变量名必须和服务端json要求的一致,切记!
  441. {
  442. string terminal_no;
  443. string version_no;
  444. string terminal_update_time;
  445. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminal_no, version_no, terminal_update_time)
  446. } updateVersionReq;
  447. CSimpleStringA url;
  448. m_pCenterConfig->ReadConfigValue("CenterSetting", "UpdateVersionUrl", url);
  449. HttpClientResponseResult result;
  450. HttpClientRequestConfig config(HttpRequestMethod::POST, url.GetData(), &SpGetToken);
  451. updateVersionReq.terminal_no = m_terminalInfo.strTerminalID.GetData();
  452. updateVersionReq.version_no = m_strVersion;
  453. updateVersionReq.terminal_update_time = GetUpdateTime();
  454. SP::Module::Restful::FulfillRequestJsonBody(&config, updateVersionReq);
  455. RestfulClient client = RestfulClient::getInstance();
  456. PROCESS_LINK_CONTEXT("LR0402101UpdateVersion");
  457. config.PreDo();
  458. client.Do(&config, &result, &nextLink);
  459. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("返回内容为 %s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
  460. if (!result.ResponseOK()) {
  461. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Do failed: %s", result.WhatError().c_str());
  462. return;
  463. }
  464. SP::Module::Restful::CommResponseJson responseStatus;
  465. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  466. if (responseStatus.success) {
  467. CSimpleStringA msg = CSimpleStringA::Format("上传版本号成功:{version : %s, update_time : %s}",
  468. updateVersionReq.version_no.c_str(), updateVersionReq.terminal_update_time.c_str());
  469. LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC, msg.GetData());
  470. } else {
  471. CSimpleStringA msg = CSimpleStringA::Format("上传版本号失败:%s", result.content.c_str());
  472. LogWarn(Severity_Middle, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED, msg.GetData());
  473. }
  474. #endif
  475. }
  476. SYSTEMTIME GetModifyTime(const string& strFilename)
  477. {
  478. #if defined(_MSC_VER)
  479. struct _stat64i32 statbuf;
  480. _stat64i32(strFilename.c_str(), &statbuf);
  481. struct tm* temptm = _localtime64(&statbuf.st_mtime);
  482. #else
  483. struct stat statbuf;
  484. ZeroMemory(&statbuf, sizeof(statbuf));
  485. stat(strFilename.c_str(), &statbuf);
  486. struct tm* temptm = localtime(&statbuf.st_mtime);
  487. #endif //_MSC_VER
  488. SYSTEMTIME st = { 1900 + temptm->tm_year,
  489. 1 + temptm->tm_mon,
  490. temptm->tm_wday,
  491. temptm->tm_mday,
  492. temptm->tm_hour,
  493. temptm->tm_min,
  494. temptm->tm_sec,
  495. 0 };
  496. return st;
  497. }
  498. string CenterSettingsMicroServiceHelper::GetUpdateTime()
  499. {
  500. CSimpleStringA strUpdateTime;
  501. /** 配置后置后本地没有这个实体文件,都被框架放到运行时了,所以需要处理这个逻辑 [Gifur@202397]*/
  502. if(ExistsFileA(m_strFilePath))
  503. {
  504. #ifdef RVC_OS_WIN
  505. struct _stat64i32 statbuf;
  506. _stat64i32(m_strFilePath.GetData(), &statbuf);
  507. #endif
  508. SYSTEMTIME st = GetModifyTime(m_strFilePath.GetData());
  509. strUpdateTime = CSimpleStringA::Format("%d-%02d-%02d-%02d:%02d:%02d",
  510. st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
  511. }
  512. else
  513. {
  514. #ifdef RVC_OS_WIN
  515. SYSTEMTIME st, stLocal;
  516. GetSystemTime(&st);
  517. SystemTimeToTzSpecificLocalTime(NULL, &st, &stLocal);
  518. #else
  519. SYSTEMTIME stLocal = CSmallDateTime::GetNow().ToSystemTime();
  520. #endif
  521. strUpdateTime = CSimpleStringA::Format("%d-%02d-%02d-%02d:%02d:%02d",
  522. stLocal.wYear, stLocal.wMonth, stLocal.wDay,
  523. stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  524. }
  525. return strUpdateTime.GetData();
  526. }
  527. void CenterSettingsMicroServiceHelper::GetTimeoutValue(int& timeout)
  528. {
  529. int timeoutFromConfig = 0;
  530. m_pCenterConfig->ReadConfigValueInt("CenterSetting", "Timeout", timeoutFromConfig);
  531. if(timeoutFromConfig == 0)
  532. return;
  533. else
  534. timeout = timeoutFromConfig;
  535. }
  536. #ifdef RVC_OS_WIN
  537. int CenterSettingsMicroServiceHelper::OnRequest(CenterSettingReq& req, CenterSettingResponse& res, string& errMsg)
  538. {
  539. PROCESS_LINK_CONTEXT("LR0402101SyncCenter")
  540. bool ret = m_pHttpFunc->Post(req, res, &nextLink);
  541. if(ret && res.m_success)
  542. {
  543. if(!res.m_is_update)
  544. return SUCC;
  545. ConvertGBKToUtf8(res.m_strConfig);
  546. string strConfig = res.m_strConfig;
  547. BYTE sm3[32] = {};
  548. if(strConfig.length() > 2)
  549. {
  550. if (!SM3Hash((BYTE*)(strConfig.c_str()), strlen(strConfig.c_str()), sm3))
  551. {
  552. errMsg = "计算SM3失败";
  553. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
  554. (CSimpleStringA::Format("计算SM3失败(%s)", req.m_url.c_str()));
  555. return CalcSM3Fail;
  556. }
  557. else
  558. {
  559. int sm3len = sizeof(sm3);
  560. char* strsm3 = ConvertBytesToHexStr(sm3, 32);
  561. if(0 != strcmp(strsm3, res.m_sm3.c_str()))
  562. {
  563. errMsg = "SM3校验失败";
  564. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
  565. (CSimpleStringA::Format("SM3校验失败(%s)", req.m_url.c_str()));
  566. return CheckSM3Fail;
  567. }
  568. m_strVersion = res.m_version_no.c_str();
  569. return SUCC;
  570. }
  571. }
  572. }
  573. else
  574. {
  575. //ConvertUtf8ToGBK(res.m_errMsg);
  576. errMsg = res.m_errMsg;
  577. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
  578. (CSimpleStringA::Format("访问失败:%s", res.m_errMsg.c_str()));
  579. if(res.m_sysCode == 28 || res.m_sysCode == 7)
  580. return AccessServiceFail;
  581. return MANUAL;
  582. }
  583. }
  584. #else
  585. int CenterSettingsMicroServiceHelper::GetCenterSettingsFromHttp(CenterSettingReq& req, string& errMsg)
  586. {
  587. LOG_FUNCTION();
  588. CenterSettingResponse res;
  589. struct GetCenterSettingReq //Req和Ans的变量名必须和服务端json要求的一致,切记!
  590. {
  591. string m_terminal_no;
  592. string m_version;
  593. string m_update_time;
  594. string m_config;
  595. JSONCONVERT2OBJECT_MEMEBER_REGISTER(m_terminal_no, m_version, m_update_time, m_config)
  596. } getCenterSettingReq;
  597. struct GetCenterSettingAns //Req和Ans的变量名必须和服务端json要求的一致,切记!
  598. {
  599. bool success;
  600. string message;
  601. bool is_update;
  602. bool is_reset;
  603. string version_no;
  604. string sm3;
  605. string config;
  606. JSONCONVERT2OBJECT_MEMEBER_REGISTER(success, message, is_update, is_reset, version_no, sm3, config)
  607. }getCenterSettingAns;
  608. HttpClientResponseResult result;
  609. HttpClientRequestConfig config(HttpRequestMethod::POST, req.m_url, &SpGetToken);
  610. if (req.m_timeOut > 0) config.SetTimeout(req.m_timeOut);
  611. getCenterSettingReq.m_terminal_no = req.m_terminal_no;
  612. getCenterSettingReq.m_version = req.m_version;
  613. getCenterSettingReq.m_update_time = req.m_update_time;
  614. getCenterSettingReq.m_config = req.m_config;
  615. SP::Module::Restful::FulfillRequestJsonBody(&config, getCenterSettingReq);
  616. Dbg("Geting centtersetting...");
  617. RestfulClient client = RestfulClient::getInstance();
  618. PROCESS_LINK_CONTEXT("LR0402101GetCenterSetting");
  619. config.PreDo();
  620. client.Do(&config, &result, &nextLink);
  621. Dbg("ret result.ResponseOK() = %d.", result.ResponseOK());
  622. if (!result.ResponseOK()) {
  623. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Do failed: %s", result.WhatError().c_str());
  624. errMsg = result.WhatError();
  625. return AccessServiceFail;
  626. }
  627. SP::Module::Restful::CommResponseJson responseStatus;
  628. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  629. if (!responseStatus.IsOperatedOK()) {
  630. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(result.content.c_str());
  631. errMsg = responseStatus.WhatError().c_str();
  632. return MANUAL;
  633. }
  634. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
  635. if (!SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, getCenterSettingAns)) {
  636. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("parse json data node failed: ");
  637. errMsg = "解析集中配置返回的信息失败";
  638. return UNknown;
  639. }
  640. //transferblank(centerSettingAns.version_no);
  641. ///** 当时粤超开发Windows版本时,要求服务端将数组转化为字符串传送,这边信创为了兼容,需要重新转为数组处理(信创是支持JSON数组) [Gifur@202398]*/
  642. //string strConfig = centerSettingAns.config;
  643. //vector<ConfigItem> m_config;
  644. //SP::Utility::replaceInPlace(centerSettingAns.config, "\\\"", "\"");
  645. //if (!Json2Object(m_config, centerSettingAns.config)) {
  646. // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse config content failed!");
  647. // errMsg = "解析集中配置返回的配置信息失败";
  648. // return UNknown;
  649. //}
  650. res.Parse(result.content);
  651. string strConfig = SP::Utility::GBK2UTF8(res.m_strConfig);
  652. if (!res.m_is_update) {
  653. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed.");
  654. errMsg = "集中配置已是最新版本";
  655. return EXIST;
  656. }
  657. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("config length:%d", strConfig.length());
  658. BYTE sm3[32] = {};
  659. if (strConfig.length() > 2) {
  660. if (!SM3Hash((BYTE*)(strConfig.c_str()), strConfig.length(), sm3)) {
  661. errMsg = "计算SM3失败";
  662. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSettingsFromHttp")("计算SM3失败(%s)", req.m_url.c_str());
  663. return CalcSM3Fail;
  664. } else {
  665. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sm3:%s", res.m_sm3.c_str());
  666. char* strsm3 = SP::Module::Util::ConvertBytesToHexStr(sm3, 32);
  667. if (0 != strcmp(strsm3, res.m_sm3.c_str())) {
  668. errMsg = "SM3校验失败";
  669. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSettingsFromHttp")("SM3校验失败(%s)", req.m_url.c_str());
  670. delete[] strsm3;
  671. return CheckSM3Fail;
  672. }
  673. m_strVersion = res.m_version_no.c_str();
  674. delete[] strsm3;
  675. }
  676. if (WriteToConfig(res)) {
  677. m_strVersion = res.m_version_no.c_str();
  678. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("WriteToConfig m_strVersion:%s", m_strVersion.GetData());
  679. m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig, true);
  680. m_pRunConfig->WriteConfigValue("CenterSetting", "version", m_strVersion);
  681. UpdateVersion();
  682. if (res.m_is_reset) {
  683. LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "Update centersetting with critical items.");
  684. }
  685. return SUCC;
  686. }
  687. }
  688. return UNknown;
  689. }
  690. #endif