mod_centersetting.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "Event.h"
  4. #include "mod_centersetting.h"
  5. #include <regex>
  6. #include "fileutil.h"
  7. #include "array.h"
  8. using namespace std;
  9. CServerSessionBase* CCenterSettingEntity::OnNewSession(const char* /*pszRemoteEntityName*/, const char* /*pszClass*/)
  10. {
  11. return new CCenterSettingService(this);
  12. }
  13. void CCenterSettingEntity::OnStarted()
  14. {
  15. GetFunction()->GetPath("CenterSetting", m_strFilePath);
  16. GetFunction()->OpenConfig(Config_CenterSetting, m_pCenterConfig);
  17. GetFunction()->GetPath("RunInfo", m_strBakPath);
  18. #ifdef RVC_OS_WIN
  19. m_strBakPath += "\\runcfg\\CenterSetting.ini";
  20. #else
  21. m_strBakPath += SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "CenterSetting.ini";
  22. #endif
  23. m_pMicroServiceHelper = new CenterSettingsMicroServiceHelper(this);
  24. if(!m_pCenterConfig->storageInMem())
  25. {
  26. m_isUseMemCfg = false;
  27. BeginDownloadCenterSetting();
  28. }
  29. else
  30. {
  31. m_isUseMemCfg = true;
  32. }
  33. // 启动轮询定时器
  34. const DWORD interval = 60000 * 5;
  35. GetFunction()->SetTimer(1, this, interval);
  36. }
  37. void CCenterSettingEntity::OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext)
  38. {
  39. GetFunction()->KillTimer(1);
  40. pTransactionContext->SendAnswer(Error_Succeed);
  41. }
  42. ErrorCodeEnum CCenterSettingEntity::BeginDownloadCenterSetting(bool bByHand, const string& url)
  43. {
  44. LOG_FUNCTION();
  45. #ifdef _MSC_VER
  46. EnterCriticalSection(&m_lock);
  47. #else
  48. std::unique_lock<std::mutex> lock1(m_lock);
  49. #endif
  50. if(!url.empty())
  51. {
  52. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("update centersettings url...");
  53. m_pMicroServiceHelper->UpdateUrl(url);
  54. }
  55. #ifdef RVC_OS_WIN
  56. int rc = m_pMicroServiceHelper->GetCenterSetting();
  57. #else
  58. int rc = m_pMicroServiceHelper->GetCenterSetting(bByHand);
  59. #endif
  60. if(EXIST == rc)
  61. {
  62. }
  63. else if(SUCC == rc)
  64. {
  65. LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_CENTER,
  66. CSimpleStringA::Format("下载集中配置成功:%s", m_pMicroServiceHelper->GetCurUrl().c_str()));
  67. LogEvent(Severity_Low, EVENT_MOD_CENTERSETTING_UPDATE_CENTER, "Update Centersetting.");
  68. if (bByHand)
  69. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210101")("手工下载集中配置成功");
  70. else
  71. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402101Z01")("自动下载集中配置成功");
  72. }
  73. else
  74. {
  75. LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
  76. CSimpleStringA::Format("下载集中配置失败:%s", m_pMicroServiceHelper->GetErrMsg()));
  77. if (!bByHand)
  78. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
  79. }
  80. if(m_spDownloadCall != NULL)
  81. {
  82. m_spDownloadCall->Ans.downloadStat = rc;
  83. m_spDownloadCall->Ans.retCenterConfigUrl = m_pMicroServiceHelper->GetCurUrl().c_str();
  84. if(rc == AllAddressNull)
  85. {
  86. m_spDownloadCall->Ans.strErrMsg = "所有地址都为空,请检查终端版本";
  87. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1101")("所有集中配置下载地址都为空");
  88. }
  89. else if(rc == AccessServiceFail)
  90. {
  91. m_spDownloadCall->Ans.strErrMsg = "网络异常,请检查网络连接情况";
  92. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1102")("网络异常,请检查网络连接情况");
  93. }
  94. else if(rc == CalcSM3Fail || rc == CheckSM3Fail)
  95. {
  96. m_spDownloadCall->Ans.strErrMsg = "集中配置内容校验失败,请重试";
  97. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1103")("集中配置内容校验失败");
  98. }
  99. else if(rc == MANUAL)
  100. {
  101. m_spDownloadCall->Ans.strErrMsg = "集中配置下载失败";
  102. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210101").setResultCode("RTA1104")("集中配置下载失败");
  103. }
  104. else if(rc == EXIST)
  105. {
  106. m_spDownloadCall->Ans.strErrMsg = "集中配置已是最新版本";
  107. }
  108. CSimpleStringA hostUrl;
  109. m_pCenterConfig->ReadConfigValue("AccessAuthorization", "HostInitUrl", hostUrl);
  110. m_spDownloadCall->Ans.HostUrl = hostUrl;
  111. m_spDownloadCall->Answer(Error_Succeed);
  112. m_spDownloadCall.Clear();
  113. }
  114. #ifdef _MSC_VER
  115. LeaveCriticalSection(&m_lock);
  116. #endif
  117. return Error_Succeed;
  118. }
  119. ErrorCodeEnum CCenterSettingEntity::DownloadCenterSetting(SpReqAnsContext<CenterSettingService_Downloadv2_Req, CenterSettingService_Downloadv2_Ans>::Pointer sp)
  120. {
  121. if (m_spDownloadCall != NULL)
  122. {
  123. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DownloadCenterSetting")
  124. ("last download call not complet");
  125. sp->Answer(Error_Duplication);
  126. return Error_Duplication;
  127. }
  128. m_spDownloadCall = sp;
  129. ErrorCodeEnum error = BeginDownloadCenterSetting(true, sp->Req.reqCenterConfigUrl.GetData());
  130. if (error != Error_Succeed) {
  131. m_spDownloadCall = nullptr;
  132. if (sp != NULL) {
  133. sp->Answer(Error_Succeed);
  134. }
  135. return error;
  136. }
  137. return Error_Succeed;
  138. }
  139. DWORD getCenterCfgThread(LPVOID param)
  140. {
  141. CCenterSettingEntity* req = (CCenterSettingEntity*)param;
  142. bool isUpdate = false, isReset = false;
  143. CSimpleString version;
  144. if(false == req->GetFunction()->HasPrivilege())
  145. {
  146. LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
  147. CSimpleStringA::Format("下载集中配置失败:%s do not has privilege", __FUNCTION__));
  148. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
  149. return -1;
  150. }
  151. auto ret = req->GetFunction()->GetPrivilegeFunction()->TryUpdateCenterCfg(isUpdate, isReset, version);
  152. if (ret != ErrorCodeEnum::Error_Succeed)
  153. {
  154. LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
  155. CSimpleStringA::Format("下载集中配置失败:%d", ret));
  156. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
  157. return -1;
  158. }
  159. if (!isUpdate)
  160. {
  161. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed from spshell");
  162. return -1;
  163. }
  164. LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_CENTER,
  165. CSimpleStringA::Format("下载集中配置成功,版本号变更成:%s", version.GetData()));
  166. LogEvent(Severity_Low, EVENT_MOD_CENTERSETTING_UPDATE_CENTER, "Update Centersetting.");
  167. if (isReset)
  168. LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "SpShell:Update centersetting with critical items.");
  169. return 0;
  170. }
  171. void CCenterSettingEntity::OnTimeout(DWORD dwTimerID)
  172. {
  173. if(m_isUseMemCfg)
  174. {
  175. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use memory config....");
  176. CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getCenterCfgThread, this, 0, NULL));
  177. }
  178. else
  179. {
  180. BeginDownloadCenterSetting();
  181. }
  182. }
  183. ErrorCodeEnum CCenterSettingEntity::GetAccessUrl(CSimpleStringA& url) //初始化地址
  184. {
  185. CSimpleStringA hostInitUrl;
  186. m_pCenterConfig->ReadConfigValue("AccessAuthorization", "HostInitUrl", hostInitUrl);
  187. if(hostInitUrl.IsNullOrEmpty())
  188. url = "初始化地址为空";
  189. else
  190. url = hostInitUrl;
  191. return Error_Succeed;
  192. }
  193. ErrorCodeEnum CCenterSettingEntity::GetCertainAceessUrl(CSimpleStringA& accessName, CSimpleStringA& url) //准入地址
  194. {
  195. LOG_FUNCTION();
  196. CSimpleStringA tUrl;
  197. m_pCenterConfig->ReadConfigValue("AccessAuthorization", accessName.GetData(), tUrl);
  198. if (tUrl.IsNullOrEmpty())
  199. url = "地址为空";
  200. else
  201. url = tUrl;
  202. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("准入地址 = %s", url.GetData());
  203. return Error_Succeed;
  204. }
  205. SP_BEGIN_ENTITY_MAP()
  206. SP_ENTITY(CCenterSettingEntity)
  207. SP_END_ENTITY_MAP()