mod_UpgradeMgr.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #ifndef RVC_MOD_UPGRADEMGR_H_
  2. #define RVC_MOD_UPGRADEMGR_H_
  3. #include "SpBase.h"
  4. #include "SimpleString.h"
  5. #include "UpgradeManager_server_g.h"
  6. #include "Download_msg_g.h"
  7. #include "UpgradeRun_msg_g.h"
  8. #include "UpgradeMgrFSM.h"
  9. #include "SpTest.h"
  10. #include "modVer.h"
  11. #include "UpgradeTaskFSM.h"
  12. using namespace UpgradeManager;
  13. // 升级管理 UpgradeManager 0x506
  14. class CUpgradeMgrEntity : public CEntityBase, public ISysVarListener, public IBroadcastListener
  15. {
  16. public:
  17. CUpgradeMgrEntity(){
  18. m_IsSM3listSucc=0;
  19. m_beginSM3HashTime=0;
  20. m_strSM3Hash="";
  21. m_bStartUp=false;//首页是否进入
  22. m_initSucc=false;//状态机是否启动成功
  23. m_bSystemStartUp=false;//框架是否启动成功
  24. m_testResult=Error_Succeed;//默认是成功的
  25. m_iBlackFileSum=0;
  26. }
  27. virtual ~CUpgradeMgrEntity() {}
  28. virtual const char *GetEntityName() const { return "UpgradeManager"; }
  29. virtual bool IsService()const{return true;}
  30. const char* GetEntityVersion() const override
  31. {
  32. return MODULE_VERSION_FULL;
  33. }
  34. ON_ENTITYT_TEST()
  35. virtual void OnStarted();
  36. virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  37. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext);
  38. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/);
  39. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  40. void OnDownloadEvent(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, Download::DownloadResult &evt);
  41. void OnUpgradeCheckEvent(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, UpgradeRun::UpgradeCheckEvent &evt);
  42. void OnUpgradeDoneEvent(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, UpgradeRun::UpgradeDoneEvent &evt);
  43. static char GetInstallStateVal(const InstallStateEnum enumVal);
  44. ErrorCodeEnum RegistLocalPack(const CSimpleStringA &strPackFile);
  45. DWORD RegistManualPack(const CSimpleStringA &strPackFile);
  46. DWORD GetManualPacks(CSimpleStringA &strManualPacks);
  47. ErrorCodeEnum DownloadPack(const CSimpleStringA &strPackFile);
  48. ErrorCodeEnum CancelDownloadPack(const CSimpleStringA &strPackFile);
  49. ErrorCodeEnum PushUpdateTask(const CSimpleStringA &strPackName, const int nPackType);
  50. //ErrorCodeEnum PushUpdateTask(const CSimpleStringA &strPackName);
  51. ErrorCodeEnum CancelUpdate(const CSimpleStringA &strPackName);
  52. ErrorCodeEnum RollbackUpdate(const CSimpleStringA &strVersion);
  53. ErrorCodeEnum SwitchUpgrade(const CSimpleStringA &strPack);
  54. ErrorCodeEnum GetUpgradeState(bool &bInstalling, CSimpleStringA &strPackFile, CSimpleStringA &strExecID,
  55. char &nInstallState, bool &bSysInstall, bool &bLightPack, CSimpleStringA &strNewVersion);
  56. ErrorCodeEnum SyncTime();
  57. ErrorCodeEnum UpdatePackFailInfo(CSimpleStringA strVersion);
  58. ErrorCodeEnum MD5File(CSimpleStringA strToSignFilePath, CSimpleStringA &strMD5);
  59. ErrorCodeEnum MD5Data(CSimpleStringA strData, CSimpleStringA &strMD5);
  60. ErrorCodeEnum MD5Folder(CSimpleStringA strFolderPath, bool isDepDir=false);
  61. ErrorCodeEnum GetMD5List(CSimpleStringA &strMD5List);
  62. //新国密SM3函数,isSub表示是否截取新国密中间一段密文
  63. ErrorCodeEnum SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub);
  64. ErrorCodeEnum SM3DataToStr(CSimpleStringA strData, CSimpleStringA &strSM3,bool isSub);
  65. ErrorCodeEnum SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub);
  66. //创建install.ini文件
  67. ErrorCodeEnum createInstallFile();
  68. //检测active文件是否被锁
  69. ErrorCodeEnum testActive();
  70. ErrorCodeEnum StopMediaPlay();
  71. //modify by lwt 新状态机加入方法
  72. ErrorCodeEnum NewStopMediaPlay();
  73. static void HttpsLogCallBack(const char* logtxt);
  74. #ifdef RVC_OS_WIN
  75. SP_BEGIN_MSG_DISPATCH_MAP(CUpgradeMgrEntity)
  76. SP_BEGIN_ENTITY_MSG("Download")
  77. SP_MSG_HANDLE_NS(Download, DownloadResult, OnDownloadEvent)
  78. SP_END_ENTITY_MSG()
  79. SP_BEGIN_ENTITY_MSG("UpgradeRun")
  80. SP_MSG_HANDLE_NS(UpgradeRun, UpgradeCheckEvent, OnUpgradeCheckEvent)
  81. SP_MSG_HANDLE_NS(UpgradeRun, UpgradeDoneEvent, OnUpgradeDoneEvent)
  82. SP_END_ENTITY_MSG()
  83. SP_END_MSG_DISPATCH_MAP()
  84. #else
  85. virtual void OnBroadcastEvent(CUUID SubID, const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer)
  86. {
  87. if (!pszEntityName)
  88. {
  89. LOG_TRACE("pszEntityName cannot empty!");
  90. }
  91. else if (_stricmp("Download", pszEntityName) == 0)
  92. {
  93. switch (dwMessageId) {
  94. case eMsg_DownloadResult:
  95. if (eMsgSig_DownloadResult == dwMessageSignature) {
  96. Download::DownloadResult t;
  97. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t);
  98. if (Error == Error_Succeed)
  99. OnDownloadEvent(pszEntityName, dwMessageId, dwMessageSignature, t);
  100. }
  101. else {
  102. LOG_TRACE("DownloadResult signature mismatched!");
  103. }
  104. break;
  105. default:
  106. LOG_TRACE("msg id %d ignored!", dwMessageId);
  107. break;
  108. }
  109. }
  110. else if (_stricmp("UpgradeRun", pszEntityName) == 0)
  111. {
  112. switch (dwMessageId) {
  113. case eMsg_UpgradeCheckEvent:
  114. if (eMsgSig_UpgradeCheckEvent == dwMessageSignature) {
  115. UpgradeRun::UpgradeCheckEvent t;
  116. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t);
  117. if (Error == Error_Succeed)
  118. OnUpgradeCheckEvent(pszEntityName, dwMessageId, dwMessageSignature, t);
  119. }
  120. else {
  121. LOG_TRACE("UpgradeCheckEvent signature mismatched!" );
  122. }
  123. break;
  124. case eMsg_UpgradeDoneEvent:
  125. if (eMsgSig_UpgradeDoneEvent == dwMessageSignature) {
  126. UpgradeRun::UpgradeDoneEvent t;
  127. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t);
  128. if (Error == Error_Succeed)
  129. OnUpgradeDoneEvent(pszEntityName, dwMessageId, dwMessageSignature, t);
  130. }
  131. else {
  132. LOG_TRACE("UpgradeDoneEvent signature mismatched!");
  133. }
  134. break;
  135. default:
  136. LOG_TRACE("msg id %d ignored!", dwMessageId);
  137. break;
  138. }
  139. }
  140. else
  141. {
  142. LOG_TRACE("ignore pszEntityName");
  143. }
  144. }
  145. #endif
  146. public:
  147. CUpgradeMgrFSM m_fsm;
  148. map<CSimpleStringA, CSimpleStringA> m_FileHashMap; // 版本文件hash值集合
  149. CSimpleStringA m_strMD5List;
  150. CSimpleStringA m_strSM3Hash;//SM3 32位hash
  151. int m_IsSM3listSucc;//获取SM3哈希list是否成功,0:还未计算完毕,1:表示成功 ,-1表示计算失败
  152. DWORD m_beginSM3HashTime;//开始计算sm3hahs时间
  153. bool m_bStartUp;//是否系统首页启动成功
  154. bool m_bSystemStartUp;//框架启动成功
  155. CUpgradeTaskFSM m_taskFSM;
  156. bool bNewUpgradeMgr;//是否启用新状态机(很重要的变量)
  157. ErrorCodeEnum m_testResult;//实体级别握手变量
  158. CSimpleStringA m_grayLaunchUrl;//灰度发布url地址
  159. int m_CenterModel;//集中配置模式 0:旧模式 1:新旧并存模式 2:新模式
  160. bool m_initSucc;//状态机是否启动成功
  161. int m_iBlackFileSum;//黑名单文件数量
  162. };
  163. class CUpgradeMgrSession : public UpgradeMgrService_ServerSessionBase
  164. {
  165. public:
  166. CUpgradeMgrSession(CUpgradeMgrEntity *pEntity) : m_pEntity(pEntity) {}
  167. virtual ~CUpgradeMgrSession() {}
  168. virtual void Handle_RegistLocalPack(SpReqAnsContext<UpgradeMgrService_RegistLocalPack_Req, UpgradeMgrService_RegistLocalPack_Ans>::Pointer ctx)
  169. {
  170. ErrorCodeEnum rc = m_pEntity->RegistLocalPack(ctx->Req.strPackFile);
  171. ctx->Answer(rc);
  172. }
  173. virtual void Handle_RegistManualPack(SpReqAnsContext<UpgradeMgrService_RegistManualPack_Req, UpgradeMgrService_RegistManualPack_Ans>::Pointer ctx)
  174. {
  175. LOG_FUNCTION();
  176. DWORD dwRet = 0;
  177. CSimpleStringA strErrmsg;
  178. dwRet = m_pEntity->RegistManualPack(ctx->Req.strPackFile);
  179. if (ERROR_SUCCESS != dwRet)
  180. {
  181. switch (dwRet)
  182. {
  183. case NOT_MANUALPACK_ERR:
  184. strErrmsg = "升级包类型不是手动安装,请确认!";
  185. break;
  186. case IS_UPDATEING_ERR:
  187. strErrmsg = "正在升级,请稍后!";
  188. break;
  189. default:
  190. strErrmsg = "未知的手动升级错误,请联系维护人员!";
  191. break;
  192. }
  193. }
  194. else
  195. {
  196. Dbg("推送手动升级任务:[%s]成功", ctx->Req.strPackFile);
  197. }
  198. ctx->Ans.Errcode = dwRet;
  199. ctx->Ans.ErrMsg = strErrmsg;
  200. ctx->Answer(Error_Succeed);
  201. //ctx->Answer(Error_Succeed, dwRet);
  202. }
  203. virtual void Handle_CancelUpdate(SpReqAnsContext<UpgradeMgrService_CancelUpdate_Req, UpgradeMgrService_CancelUpdate_Ans>::Pointer ctx)
  204. {
  205. ErrorCodeEnum rc = m_pEntity->CancelUpdate(ctx->Req.strPackFile);
  206. ctx->Answer(rc);
  207. }
  208. virtual void Handle_RollbackUpdate(SpReqAnsContext<UpgradeMgrService_RollbackUpdate_Req, UpgradeMgrService_RollbackUpdate_Ans>::Pointer ctx)
  209. {
  210. auto rc = m_pEntity->RollbackUpdate(ctx->Req.strVersion);
  211. ctx->Answer(rc);
  212. }
  213. virtual void Handle_GetUpgradeState(SpReqAnsContext<UpgradeMgrService_GetUpgradeState_Req, UpgradeMgrService_GetUpgradeState_Ans>::Pointer ctx)
  214. {
  215. auto rc = m_pEntity->GetUpgradeState(ctx->Ans.bInstalling, ctx->Ans.strPackFile, ctx->Ans.strExecID,
  216. ctx->Ans.cInstallState, ctx->Ans.bSysInstall, ctx->Ans.bLightPack, ctx->Ans.strNewVersion);
  217. ctx->Answer(rc);
  218. }
  219. virtual void Handle_SwitchUpgrade(SpReqAnsContext<UpgradeMgrService_SwitchUpgrade_Req, UpgradeMgrService_SwitchUpgrade_Ans>::Pointer ctx)
  220. {
  221. auto rc = m_pEntity->SwitchUpgrade(ctx->Req.strPackFile);
  222. ctx->Answer(rc);
  223. }
  224. virtual void Handle_GetManualPacks(SpReqAnsContext<UpgradeMgrService_GetManualPacks_Req, UpgradeMgrService_GetManualPacks_Ans>::Pointer ctx)
  225. {
  226. LOG_FUNCTION();
  227. DWORD dwRet = 0;
  228. CSimpleStringA strErrmsg;
  229. CSimpleStringA strPackList;
  230. dwRet = m_pEntity->GetManualPacks(strPackList);
  231. if (ERROR_SUCCESS == dwRet)
  232. {
  233. ctx->Ans.strPackFileList = strPackList;
  234. Dbg("获取手动升级包列表成功:[%s]", strPackList);
  235. }
  236. else
  237. {
  238. Dbg("不存在手动安装的升级包");
  239. ctx->Ans.strPackFileList = "";
  240. switch (dwRet)
  241. {
  242. case NO_EXIST_MANUAL_PACK_ERR:
  243. strErrmsg = "不存在手动升级任务,请确认!";
  244. break;
  245. default:
  246. strErrmsg = "未知的获取手动升级任务错误,请联系维护人员!";
  247. break;
  248. }
  249. }
  250. ctx->Ans.Errcode = dwRet;
  251. ctx->Ans.ErrMsg = strErrmsg;
  252. //ctx->Answer(Error_Succeed, dwRet);
  253. ctx->Answer(Error_Succeed);
  254. }
  255. private:
  256. CUpgradeMgrEntity *m_pEntity;
  257. };
  258. #endif //RVC_MOD_UPGRADEMGR_H_