CenterSettingConn.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  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. bool ret = m_pHttpFunc->Post(sReq, sResponse);
  427. if(ret && sResponse.m_success)
  428. {
  429. CSimpleStringA msg = CSimpleStringA::Format("上传版本号成功:{version : %s, update_time : %s}",
  430. sReq.m_version.c_str(), sReq.m_update_time.c_str());
  431. LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC, msg.GetData());
  432. }
  433. else
  434. {
  435. CSimpleStringA msg = CSimpleStringA::Format("上传版本号失败:%s", sResponse.m_errMsg.c_str());
  436. LogWarn(Severity_Middle, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED, msg.GetData());
  437. }
  438. #else
  439. struct UpdateVersionReq //Req和Ans的变量名必须和服务端json要求的一致,切记!
  440. {
  441. string terminal_no;
  442. string version_no;
  443. string terminal_update_time;
  444. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminal_no, version_no, terminal_update_time)
  445. } updateVersionReq;
  446. CSimpleStringA url;
  447. m_pCenterConfig->ReadConfigValue("CenterSetting", "UpdateVersionUrl", url);
  448. HttpClientResponseResult result;
  449. HttpClientRequestConfig config(HttpRequestMethod::POST, url.GetData(), &SpGetToken);
  450. updateVersionReq.terminal_no = m_terminalInfo.strTerminalID.GetData();
  451. updateVersionReq.version_no = m_strVersion;
  452. updateVersionReq.terminal_update_time = GetUpdateTime();
  453. SP::Module::Restful::FulfillRequestJsonBody(&config, updateVersionReq);
  454. RestfulClient client = RestfulClient::getInstance();
  455. config.PreDo();
  456. client.Do(&config, &result);
  457. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("返回内容为 %s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
  458. if (!result.ResponseOK()) {
  459. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Do failed: %s", result.WhatError().c_str());
  460. return;
  461. }
  462. SP::Module::Restful::CommResponseJson responseStatus;
  463. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  464. if (responseStatus.success) {
  465. CSimpleStringA msg = CSimpleStringA::Format("上传版本号成功:{version : %s, update_time : %s}",
  466. updateVersionReq.version_no.c_str(), updateVersionReq.terminal_update_time.c_str());
  467. LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_SUCC, msg.GetData());
  468. } else {
  469. CSimpleStringA msg = CSimpleStringA::Format("上传版本号失败:%s", result.content.c_str());
  470. LogWarn(Severity_Middle, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_VERSION_FAILED, msg.GetData());
  471. }
  472. #endif
  473. }
  474. SYSTEMTIME GetModifyTime(const string& strFilename)
  475. {
  476. #if defined(_MSC_VER)
  477. struct _stat64i32 statbuf;
  478. _stat64i32(strFilename.c_str(), &statbuf);
  479. struct tm* temptm = _localtime64(&statbuf.st_mtime);
  480. #else
  481. struct stat statbuf;
  482. ZeroMemory(&statbuf, sizeof(statbuf));
  483. stat(strFilename.c_str(), &statbuf);
  484. struct tm* temptm = localtime(&statbuf.st_mtime);
  485. #endif //_MSC_VER
  486. SYSTEMTIME st = { 1900 + temptm->tm_year,
  487. 1 + temptm->tm_mon,
  488. temptm->tm_wday,
  489. temptm->tm_mday,
  490. temptm->tm_hour,
  491. temptm->tm_min,
  492. temptm->tm_sec,
  493. 0 };
  494. return st;
  495. }
  496. string CenterSettingsMicroServiceHelper::GetUpdateTime()
  497. {
  498. CSimpleStringA strUpdateTime;
  499. /** 配置后置后本地没有这个实体文件,都被框架放到运行时了,所以需要处理这个逻辑 [Gifur@202397]*/
  500. if(ExistsFileA(m_strFilePath))
  501. {
  502. #ifdef RVC_OS_WIN
  503. struct _stat64i32 statbuf;
  504. _stat64i32(m_strFilePath.GetData(), &statbuf);
  505. #endif
  506. SYSTEMTIME st = GetModifyTime(m_strFilePath.GetData());
  507. strUpdateTime = CSimpleStringA::Format("%d-%02d-%02d-%02d:%02d:%02d",
  508. st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
  509. }
  510. else
  511. {
  512. #ifdef RVC_OS_WIN
  513. SYSTEMTIME st, stLocal;
  514. GetSystemTime(&st);
  515. SystemTimeToTzSpecificLocalTime(NULL, &st, &stLocal);
  516. #else
  517. SYSTEMTIME stLocal = CSmallDateTime::GetNow().ToSystemTime();
  518. #endif
  519. strUpdateTime = CSimpleStringA::Format("%d-%02d-%02d-%02d:%02d:%02d",
  520. stLocal.wYear, stLocal.wMonth, stLocal.wDay,
  521. stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  522. }
  523. return strUpdateTime.GetData();
  524. }
  525. void CenterSettingsMicroServiceHelper::GetTimeoutValue(int& timeout)
  526. {
  527. int timeoutFromConfig = 0;
  528. m_pCenterConfig->ReadConfigValueInt("CenterSetting", "Timeout", timeoutFromConfig);
  529. if(timeoutFromConfig == 0)
  530. return;
  531. else
  532. timeout = timeoutFromConfig;
  533. }
  534. #ifdef RVC_OS_WIN
  535. int CenterSettingsMicroServiceHelper::OnRequest(CenterSettingReq& req, CenterSettingResponse& res, string& errMsg)
  536. {
  537. bool ret = m_pHttpFunc->Post(req, res);
  538. if(ret && res.m_success)
  539. {
  540. if(!res.m_is_update)
  541. return SUCC;
  542. ConvertGBKToUtf8(res.m_strConfig);
  543. string strConfig = res.m_strConfig;
  544. BYTE sm3[32] = {};
  545. if(strConfig.length() > 2)
  546. {
  547. if (!SM3Hash((BYTE*)(strConfig.c_str()), strlen(strConfig.c_str()), sm3))
  548. {
  549. errMsg = "计算SM3失败";
  550. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
  551. (CSimpleStringA::Format("计算SM3失败(%s)", req.m_url.c_str()));
  552. return CalcSM3Fail;
  553. }
  554. else
  555. {
  556. int sm3len = sizeof(sm3);
  557. char* strsm3 = ConvertBytesToHexStr(sm3, 32);
  558. if(0 != strcmp(strsm3, res.m_sm3.c_str()))
  559. {
  560. errMsg = "SM3校验失败";
  561. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
  562. (CSimpleStringA::Format("SM3校验失败(%s)", req.m_url.c_str()));
  563. return CheckSM3Fail;
  564. }
  565. m_strVersion = res.m_version_no.c_str();
  566. return SUCC;
  567. }
  568. }
  569. }
  570. else
  571. {
  572. //ConvertUtf8ToGBK(res.m_errMsg);
  573. errMsg = res.m_errMsg;
  574. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnRequest")
  575. (CSimpleStringA::Format("访问失败:%s", res.m_errMsg.c_str()));
  576. if(res.m_sysCode == 28 || res.m_sysCode == 7)
  577. return AccessServiceFail;
  578. return MANUAL;
  579. }
  580. }
  581. #else
  582. int CenterSettingsMicroServiceHelper::GetCenterSettingsFromHttp(CenterSettingReq& req, string& errMsg)
  583. {
  584. LOG_FUNCTION();
  585. CenterSettingResponse res;
  586. struct GetCenterSettingReq //Req和Ans的变量名必须和服务端json要求的一致,切记!
  587. {
  588. string m_terminal_no;
  589. string m_version;
  590. string m_update_time;
  591. string m_config;
  592. JSONCONVERT2OBJECT_MEMEBER_REGISTER(m_terminal_no, m_version, m_update_time, m_config)
  593. } getCenterSettingReq;
  594. struct GetCenterSettingAns //Req和Ans的变量名必须和服务端json要求的一致,切记!
  595. {
  596. bool success;
  597. string message;
  598. bool is_update;
  599. bool is_reset;
  600. string version_no;
  601. string sm3;
  602. string config;
  603. JSONCONVERT2OBJECT_MEMEBER_REGISTER(success, message, is_update, is_reset, version_no, sm3, config)
  604. }getCenterSettingAns;
  605. HttpClientResponseResult result;
  606. HttpClientRequestConfig config(HttpRequestMethod::POST, req.m_url, &SpGetToken);
  607. if (req.m_timeOut > 0) config.SetTimeout(req.m_timeOut);
  608. getCenterSettingReq.m_terminal_no = req.m_terminal_no;
  609. getCenterSettingReq.m_version = req.m_version;
  610. getCenterSettingReq.m_update_time = req.m_update_time;
  611. getCenterSettingReq.m_config = req.m_config;
  612. SP::Module::Restful::FulfillRequestJsonBody(&config, getCenterSettingReq);
  613. Dbg("Geting centtersetting...");
  614. RestfulClient client = RestfulClient::getInstance();
  615. config.PreDo();
  616. client.Do(&config, &result);
  617. Dbg("ret result.ResponseOK() = %d.", result.ResponseOK());
  618. if (!result.ResponseOK()) {
  619. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Do failed: %s", result.WhatError().c_str());
  620. errMsg = result.WhatError();
  621. return AccessServiceFail;
  622. }
  623. SP::Module::Restful::CommResponseJson responseStatus;
  624. SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
  625. if (!responseStatus.IsOperatedOK()) {
  626. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(result.content.c_str());
  627. errMsg = responseStatus.WhatError().c_str();
  628. return MANUAL;
  629. }
  630. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
  631. if (!SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, getCenterSettingAns)) {
  632. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("parse json data node failed: ");
  633. errMsg = "解析集中配置返回的信息失败";
  634. return UNknown;
  635. }
  636. //transferblank(centerSettingAns.version_no);
  637. ///** 当时粤超开发Windows版本时,要求服务端将数组转化为字符串传送,这边信创为了兼容,需要重新转为数组处理(信创是支持JSON数组) [Gifur@202398]*/
  638. //string strConfig = centerSettingAns.config;
  639. //vector<ConfigItem> m_config;
  640. //SP::Utility::replaceInPlace(centerSettingAns.config, "\\\"", "\"");
  641. //if (!Json2Object(m_config, centerSettingAns.config)) {
  642. // DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse config content failed!");
  643. // errMsg = "解析集中配置返回的配置信息失败";
  644. // return UNknown;
  645. //}
  646. res.Parse(result.content);
  647. string strConfig = SP::Utility::GBK2UTF8(res.m_strConfig);
  648. if (!res.m_is_update) {
  649. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed.");
  650. errMsg = "集中配置已是最新版本";
  651. return EXIST;
  652. }
  653. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("config length:%d", strConfig.length());
  654. BYTE sm3[32] = {};
  655. if (strConfig.length() > 2) {
  656. if (!SM3Hash((BYTE*)(strConfig.c_str()), strConfig.length(), sm3)) {
  657. errMsg = "计算SM3失败";
  658. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSettingsFromHttp")("计算SM3失败(%s)", req.m_url.c_str());
  659. return CalcSM3Fail;
  660. } else {
  661. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sm3:%s", res.m_sm3.c_str());
  662. char* strsm3 = SP::Module::Util::ConvertBytesToHexStr(sm3, 32);
  663. if (0 != strcmp(strsm3, res.m_sm3.c_str())) {
  664. errMsg = "SM3校验失败";
  665. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSettingsFromHttp")("SM3校验失败(%s)", req.m_url.c_str());
  666. delete[] strsm3;
  667. return CheckSM3Fail;
  668. }
  669. m_strVersion = res.m_version_no.c_str();
  670. delete[] strsm3;
  671. }
  672. if (WriteToConfig(res)) {
  673. m_strVersion = res.m_version_no.c_str();
  674. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("WriteToConfig m_strVersion:%s", m_strVersion.GetData());
  675. m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig, true);
  676. m_pRunConfig->WriteConfigValue("CenterSetting", "version", m_strVersion);
  677. UpdateVersion();
  678. if (res.m_is_reset) {
  679. LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "Update centersetting with critical items.");
  680. }
  681. return SUCC;
  682. }
  683. }
  684. return UNknown;
  685. }
  686. #endif