mod_UpgradeMgr.h 9.2 KB

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