mod_UpgradeMgr.cpp 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462
  1. #include "stdafx.h"
  2. #include "mod_UpgradeMgr.h"
  3. #include "UpgradeRun_client_g.h"
  4. using namespace UpgradeRun;
  5. #include "Download_client_g.h"
  6. using namespace Download;
  7. #include "AccessAuthorization_client_g.h"
  8. using namespace AccessAuthorization;
  9. #include "LocalMediaPlay_client_g.h"
  10. //using namespace LocalMediaPlay;
  11. #include "EventCode.h"
  12. //#include "md5file.h"
  13. #include "fileutil.h"
  14. #include <regex>
  15. #include "RVCComm.h"
  16. #ifdef RVC_OS_WIN
  17. #include <io.h>
  18. #include "json.h"
  19. #include "..\EventCode.h"
  20. #else
  21. #include <unistd.h>
  22. #include <dirent.h>
  23. #include <errno.h>
  24. #include "EventCode.h"
  25. #include "json/json.h"
  26. #endif
  27. #ifdef WITH_CPPRESTSDK
  28. #include "CommEntityRestful.hpp"
  29. #else
  30. #define SAFE_DELETE_HTTPCLIENT(obj) \
  31. do{if(obj != NULL) { obj->Destory(); obj = NULL; }}while(false)
  32. #endif
  33. namespace Task
  34. {
  35. //查询灰度控制
  36. struct QueryUpgradeControlTaskReq : CHTTPReq {
  37. string m_reqStr;
  38. string ToJson() {
  39. return m_reqStr;
  40. }
  41. };
  42. struct QueryUpgradeControlTaskRet : CHTTPRet {
  43. string m_retStr;
  44. bool Parse(string strData) {
  45. m_retStr=strData;
  46. return true;
  47. }
  48. };
  49. struct GetMD5Task : public ITaskSp
  50. {
  51. CUpgradeMgrEntity* Mgr;
  52. explicit GetMD5Task(CUpgradeMgrEntity* e) : Mgr(e) {}
  53. void Process(){
  54. LOG_FUNCTION();
  55. bool isSendHashList = false;
  56. for(int i=0;i<3;i++){
  57. Dbg("begin get MD5 list");
  58. //尝试三次机会获取,如失败则不再获取hash文件,计算耗时时间
  59. CSmallDateTime beginT = CSmallDateTime::GetNow();
  60. CSimpleStringA tempSM3ListStr = "";
  61. ErrorCodeEnum rc = Mgr->GetMD5List(tempSM3ListStr);
  62. CSmallDateTime endT = CSmallDateTime::GetNow();
  63. Dbg("get MD5 list 耗时%d秒",(DWORD)(endT-beginT));
  64. if (rc != Error_Succeed)
  65. {
  66. LogError(Severity_Middle, rc, 0, "get MD5 list fail");
  67. }
  68. else
  69. {
  70. CSimpleStringA tempSM3HashStr = "";
  71. if(Error_Succeed==Mgr->SM3DataToStr(tempSM3ListStr,tempSM3HashStr,true)){
  72. //通知发送传hash值给服务器,并置获取hash码成功状态位
  73. Mgr->m_strSM3Hash = tempSM3HashStr;
  74. Dbg("get MD5 list success, len=%d, SM3 hash=%s", Mgr->m_strMD5List.GetLength(),Mgr->m_strSM3Hash.GetData());
  75. isSendHashList = true;
  76. break;
  77. }else{
  78. LogError(Severity_Middle, rc, 0, "get MD5 list hash fail");
  79. }
  80. }
  81. }
  82. if(isSendHashList){
  83. Dbg("send MD5 list to ReportFSM");
  84. Mgr->m_IsSM3listSucc=1;//获取sm3hash成功
  85. Mgr->m_fsm.SendSM3ListEvent();
  86. }else{
  87. Mgr->m_IsSM3listSucc=-1;//获取sm3hash失败
  88. Dbg("get MD5 list fail,don't send MD5 list to ReportFSM");
  89. }
  90. }
  91. };
  92. struct InitFSMTask : public ITaskSp{
  93. CUpgradeMgrEntity* Mgr;
  94. explicit InitFSMTask(CUpgradeMgrEntity* e) : Mgr(e) {}
  95. void Process(){
  96. LOG_FUNCTION();
  97. //加载集中配置文件参数
  98. if(loadCenterSetting()!=Error_Succeed){
  99. Dbg("InitFSMTask loadCenterSetting fail");
  100. Mgr->m_testResult=Error_InvalidState;//自检失败
  101. return;
  102. }
  103. //查询灰度控制
  104. if(Mgr->m_CenterModel==0){
  105. Mgr->bNewUpgradeMgr = false;//旧模式
  106. }else if(Mgr->m_CenterModel==1){
  107. bool isNewUpgradeMgr=false;//是否是新模式
  108. if(QueryUpgradeControl(isNewUpgradeMgr)){
  109. if(isNewUpgradeMgr){
  110. Mgr->bNewUpgradeMgr = true;//新模式
  111. }else{
  112. Mgr->bNewUpgradeMgr = false;
  113. }
  114. }else{
  115. Mgr->bNewUpgradeMgr = false;//默认是旧模式,启动旧状态机
  116. }
  117. }else if(Mgr->m_CenterModel==2){
  118. //新模式
  119. Mgr->bNewUpgradeMgr = true;
  120. }
  121. if(Mgr->bNewUpgradeMgr){
  122. ErrorCodeEnum rc =Mgr->m_taskFSM.Init(Mgr);//启动新状态机
  123. if (rc != Error_Succeed)
  124. {
  125. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_INIT_NEW_UPGRADE, "init new upgradeTaskMgr FSM fail");
  126. Mgr->m_testResult=Error_InvalidState;//自检失败
  127. return;
  128. }else{
  129. Dbg("init new upgradeTaskMgr FSM succ");
  130. Mgr->m_initSucc = true;
  131. }
  132. Mgr->m_beginSM3HashTime = CSmallDateTime::GetNow();
  133. }else{
  134. //判断install.ini文件是否存在,不存在则创建新的文件
  135. if( Mgr->createInstallFile()!=Error_Succeed){
  136. LogWarn(Severity_Middle, Error_Exception, ERR_WRAN_CREATE_INSTALL, "create Install.ini error");
  137. Mgr->m_testResult = Error_InvalidState;//install.ini文件创建失败,则让健康杀死重试
  138. return;
  139. }
  140. ErrorCodeEnum rc = Mgr->m_fsm.Init(Mgr);//启动旧状态机
  141. if (rc != Error_Succeed)
  142. {
  143. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_INIT_OLD_UPGRADE, "init old upgradeMgr FSM fail");
  144. Mgr->m_testResult=Error_InvalidState;//自检失败
  145. return;
  146. }else{
  147. Dbg("init old upgradeMgr FSM succ");
  148. Mgr->m_initSucc = true;
  149. }
  150. CUUID subID;
  151. rc = Mgr->GetFunction()->SubscribeBroadcast("UpgradeRun", NULL, Mgr, subID);//启动安装实体广播监听
  152. if (rc != Error_Succeed)
  153. {
  154. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_INIT_OLD_UPGRADE, "subscribe entity [UpgradeRun] broadcast msg fail");
  155. Mgr->m_testResult=Error_InvalidState;//自检失败
  156. return;
  157. }
  158. Mgr->m_beginSM3HashTime = CSmallDateTime::GetNow();
  159. GetMD5Task* task = new GetMD5Task(Mgr);
  160. rc = Mgr->GetFunction()->PostThreadPoolTask(task);
  161. if (rc != Error_Succeed)
  162. {
  163. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_INIT_OLD_UPGRADE, "Post GetMD5Task task to Thread is fail");
  164. }
  165. Mgr->m_fsm.PostEventFIFO(new FSMEvent(CUpgradeMgrFSM::Event_EntryPermit));
  166. }
  167. }
  168. bool QueryUpgradeControl(bool &isNewUpgradeMgr)
  169. {
  170. //混合模式
  171. //访问灰度控制
  172. QueryUpgradeControlTaskReq qTempReq;
  173. QueryUpgradeControlTaskRet qTempRet;
  174. CSystemStaticInfo info;
  175. ErrorCodeEnum rc = Mgr->GetFunction()->GetSystemStaticInfo(info);
  176. if (rc != Error_Succeed)
  177. {
  178. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_UPGRADE_MODE, CSimpleStringA::Format("QueryUpgradeControl get CSystemStaticInfo fail,url=%s",Mgr->m_grayLaunchUrl.GetData()).GetData());
  179. return false;
  180. }
  181. #ifdef WITH_CPPRESTSDK
  182. struct InstanceReqJson
  183. {
  184. std::string terminal_no;
  185. std::string modular;
  186. JSONCONVERT2OBJECT_MEMEBER_REGISTER(terminal_no, modular)
  187. } instanceReq;
  188. instanceReq.terminal_no = info.strTerminalID.GetData();
  189. instanceReq.modular = "UpgradeManager";
  190. HttpClientResponseResult result;
  191. HttpClientRequestConfig config(HttpRequestMethod::POST, Mgr->m_grayLaunchUrl.GetData());
  192. SP::Module::Restful::FulfillRequestJsonBody(&config, instanceReq);
  193. RestfulClient client = RestfulClient::getInstance();
  194. config.PreDo();
  195. client.Do(&config, &result);
  196. if (result.ResponseOK()) {
  197. SP::Module::Restful::GrayResponseJson grayResponse;
  198. SP::Module::Restful::GetGrayInfoFromDebranchResponse(result.content, grayResponse);
  199. if (!grayResponse.IsOperatedOK()) {
  200. Dbg("gray: %s,%s", grayResponse.errorMsg.c_str(), result.content.c_str());
  201. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_UPGRADE_MODE, CSimpleStringA::Format("QueryUpgradeControl http response fail,url=%s, %s"
  202. , Mgr->m_grayLaunchUrl.GetData(), grayResponse.errorMsg.c_str()));
  203. return false;
  204. } else {
  205. isNewUpgradeMgr = grayResponse.graySwitch;
  206. Dbg("isNewUpgradeMgr:%d", isNewUpgradeMgr);
  207. return true;
  208. }
  209. } else {
  210. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_UPGRADE_MODE, CSimpleStringA::Format("QueryUpgradeControl http req fail,url=%s, %s"
  211. , Mgr->m_grayLaunchUrl.GetData(), result.WhatError().c_str()));
  212. return false;
  213. }
  214. #else
  215. Json::Value rootReq;
  216. Json::FastWriter writer;
  217. rootReq["terminal_no"] = info.strTerminalID.GetData();
  218. rootReq["modular"] = "UpgradeManager";//写死模块名
  219. string jsonReq = writer.write(rootReq);
  220. qTempReq.m_reqStr = jsonReq;//请求参数
  221. //qTempReq.m_printDbg = true;
  222. qTempReq.m_url = Mgr->m_grayLaunchUrl.GetData();//访问地址
  223. IHttpFunc* client;
  224. client = create_http(Mgr->HttpsLogCallBack);
  225. if (!client->Post(qTempReq, qTempRet)) {
  226. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_UPGRADE_MODE, CSimpleStringA::Format("QueryUpgradeControl http req fail,url=%s", Mgr->m_grayLaunchUrl.GetData()).GetData());
  227. SAFE_DELETE_HTTPCLIENT(client);
  228. return false;//失败
  229. }
  230. //解析报文
  231. //Dbg("qTempRet=%s",qTempRet.m_retStr.c_str());
  232. Json::Reader reader;
  233. Json::Value rootRet;
  234. if (!reader.parse(qTempRet.m_retStr, rootRet, false)) {
  235. LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_UPGRADE_MODE, CSimpleStringA::Format("QueryUpgradeControl parse resp is fail,url=%s", Mgr->m_grayLaunchUrl.GetData()).GetData());
  236. SAFE_DELETE_HTTPCLIENT(client);
  237. return false;//失败
  238. }
  239. bool isSucc = rootRet["success"].asBool();
  240. if (isSucc) {
  241. if (rootRet.isMember("data")) {
  242. if (rootRet["data"].asBool()) {
  243. isNewUpgradeMgr = true;
  244. } else {
  245. isNewUpgradeMgr = false;
  246. }
  247. SAFE_DELETE_HTTPCLIENT(client);
  248. return true;//查询成功
  249. } else {
  250. SAFE_DELETE_HTTPCLIENT(client);
  251. return false;//查询失败
  252. }
  253. } else {
  254. Dbg("QueryUpgradeControl [success] is false");
  255. SAFE_DELETE_HTTPCLIENT(client);
  256. return false;//查询失败
  257. }
  258. #endif
  259. }
  260. ErrorCodeEnum loadCenterSetting(){
  261. //访问灰度http地址的
  262. CSmartPointer<IConfigInfo> spConfig;
  263. ErrorCodeEnum rc = Mgr->GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
  264. if (rc == Error_Succeed){
  265. CSimpleStringA str="";
  266. rc = spConfig->ReadConfigValue("Common", "GrayLaunchUrl", str);
  267. if(rc==Error_Succeed){
  268. Mgr->m_grayLaunchUrl = str;
  269. Dbg("init read CenterSetting.ini [Common] GrayLaunchUrl=%s",str.GetData());
  270. }else{
  271. LogWarn(Severity_Middle, rc, ERR_READ_INI_FAIL, "get CenterSetting.ini [Common] GrayLaunchUrl error");
  272. return rc;
  273. }
  274. int iCenterModel =0;
  275. #ifdef RVC_OS_WIN
  276. rc = spConfig->ReadConfigValueInt("UpgradeManager", "CenterModel", iCenterModel);
  277. #else
  278. //改为通过centerModelUos判断新旧模式
  279. rc = spConfig->ReadConfigValueInt("UpgradeManager", "CenterModelUos", iCenterModel);
  280. #endif
  281. if(rc==Error_Succeed){
  282. if(iCenterModel!=0&&iCenterModel!=1&&iCenterModel!=2){
  283. LogWarn(Severity_Middle, rc, ERR_READ_INI_FAIL, CSimpleStringA::Format("get CenterSetting.ini [UpgradeManager] CenterModelUos invalid =%d",iCenterModel).GetData());
  284. return Error_InvalidState;
  285. }else{
  286. Mgr->m_CenterModel = iCenterModel;
  287. Dbg("init read CenterSetting.ini [UpgradeManager] CenterModelUos=%d",iCenterModel);
  288. }
  289. }else{
  290. LogWarn(Severity_Middle, rc, ERR_READ_INI_FAIL, "get CenterSetting.ini [UpgradeManager] CenterModelUos error");
  291. return rc;
  292. }
  293. }else{
  294. LogWarn(Severity_Middle, rc, ERR_READ_INI_FAIL, "get CenterSetting.ini error");
  295. return rc;
  296. }
  297. return Error_Succeed;
  298. }
  299. };
  300. }
  301. // 升级管理 UpgradeManager 0x506
  302. void CUpgradeMgrEntity::OnStarted()
  303. {
  304. // 初始化状态机
  305. //m_fsm.Init(this);
  306. auto pFunc = GetFunction();
  307. //CUUID subID;
  308. //ErrorCodeEnum rc = pFunc->SubscribeBroadcast("UpgradeRun", NULL, this, subID);
  309. //if (rc != Error_Succeed)
  310. //{
  311. // LogError(Severity_Middle, rc, 0, "subscribe entity [UpgradeRun] broadcast msg fail");
  312. // //return;
  313. //}
  314. //// 监视准入状态
  315. //CSimpleStringA strValue;
  316. //if (pFunc->GetSysVar("EntryPermit", strValue) == Error_Succeed && strValue.Compare("L") ==0)
  317. //{
  318. // // 已经进入准入状态
  319. // m_fsm.PostEventFIFO(new FSMEvent(CUpgradeMgrFSM::Event_EntryPermit));
  320. //}
  321. //else
  322. //{
  323. // rc= pFunc->RegistSysVarEvent("EntryPermit", this);
  324. // assert(rc == Error_Succeed);
  325. //}
  326. //zl@20190311 每次启动时生成新的MD5List
  327. //rc = GetMD5List(m_strMD5List);
  328. //if (rc != Error_Succeed)
  329. //{
  330. // LogError(Severity_Middle, rc, 0, "GetMD5List fail");
  331. //}
  332. //else
  333. //{
  334. // Dbg("get MD5 list success, len=%d", m_strMD5List.GetLength());
  335. //}
  336. // 监视准入状态
  337. ErrorCodeEnum rc;
  338. CSimpleStringA strValue;
  339. if (pFunc->GetSysVar("UIState", strValue) == Error_Succeed && strValue.Compare("M") ==0)
  340. {
  341. // 已经进入首页状态
  342. Dbg("system page isStartup 1");
  343. m_bStartUp =true;
  344. }
  345. else
  346. {
  347. // 否则启动监控
  348. rc= pFunc->RegistSysVarEvent("UIState", this);
  349. if (rc != Error_Succeed)
  350. {
  351. LogWarn(Severity_Middle, rc, ERR_WRAN_REGIST_SYS_VAR_FAIL, CSimpleStringA::Format("RegistSysVarEvent UIState is fail,%d",(int)rc).GetData());
  352. m_testResult=Error_InvalidState;//自检失败
  353. }else{
  354. Dbg("RegistSysVarEvent UIState succ");
  355. }
  356. }
  357. if (pFunc->GetSysVar("RunState", strValue) == Error_Succeed && strValue.Compare("N") ==0)
  358. {
  359. // 已经进入终端启动成功状态
  360. Dbg("====framework is start up 1====");
  361. m_bSystemStartUp =true;
  362. }
  363. else
  364. {
  365. // 否则启动监控RunState
  366. rc= pFunc->RegistSysVarEvent("RunState", this);
  367. if (rc != Error_Succeed)
  368. {
  369. LogWarn(Severity_Middle, rc, ERR_WRAN_REGIST_SYS_VAR_FAIL, CSimpleStringA::Format("RegistSysVarEvent RunState is fail,%d",(int)rc).GetData());
  370. m_testResult=Error_InvalidState;//自检失败
  371. }else{
  372. Dbg("RegistSysVarEvent RunState succ");
  373. }
  374. }
  375. //rc = pFunc->RegistSysVarEvent("CallState", this);
  376. //if(rc!=Error_Succeed){
  377. // LogWarn(Severity_Middle, rc, ERR_WRAN_REGIST_SYS_VAR_FAIL, CSimpleStringA::Format("RegistSysVarEvent CallState is fail,%d",(int)rc).GetData());
  378. // m_testResult=Error_InvalidState;//自检失败
  379. //}else{
  380. // // 已经进入终端启动成功状态
  381. // Dbg("RegistSysVarEvent UIState succ");
  382. //}
  383. //启动灰度控制判断,看启动什么状态机
  384. Task::InitFSMTask* task = new Task::InitFSMTask(this);
  385. rc = this->GetFunction()->PostThreadPoolTask(task);
  386. if (rc != Error_Succeed)
  387. {
  388. LogError(Severity_Middle, rc, 0, CSimpleStringA::Format("Post InitFSMTask task to Thread is fail,%d",(int)rc).GetData());
  389. m_testResult=Error_InvalidState;//自检失败
  390. }
  391. ////计算时间太长,放入工作线程中
  392. //Task::GetMD5Task* task = new Task::GetMD5Task(this);
  393. //rc = this->GetFunction()->PostThreadPoolTask(task);
  394. //if (rc != Error_Succeed)
  395. //{
  396. // LogError(Severity_Middle, rc, 0, "Post GetMD5Task task to Thread is fail");
  397. //}
  398. //m_beginSM3HashTime = CSmallDateTime::GetNow();
  399. //// 由于准入未上线或可能不稳定,为了保持升级服务的可用性,一直保持可升级状态
  400. //m_fsm.PostEventFIFO(new FSMEvent(CUpgradeMgrFSM::Event_EntryPermit));
  401. }
  402. void CUpgradeMgrEntity::OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  403. {
  404. if (Test_ShakeHand == eTestType)
  405. {
  406. //根据不同情况返回握手情况,监控实体根据不同情况杀死实体进程
  407. pTransactionContext->SendAnswer(m_testResult);
  408. }
  409. }
  410. void CUpgradeMgrEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  411. {
  412. GetFunction()->UnsubscribeBroadcast("Download");
  413. GetFunction()->UnsubscribeBroadcast("UpgradeRun");
  414. pTransactionContext->SendAnswer(Error_Succeed);
  415. }
  416. void CUpgradeMgrEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  417. {
  418. if (strcmp(pszKey, "EntryPermit") ==0)
  419. {
  420. if (strcmp(pszValue, "L") ==0)
  421. {
  422. // 准入成功
  423. m_fsm.PostEventFIFO(new FSMEvent(CUpgradeMgrFSM::Event_EntryPermit));
  424. // 取消监视
  425. this->GetFunction()->UnregistSysVarEvent("EntryPermit");
  426. }
  427. }
  428. if(strcmp("UIState",pszKey)==0){
  429. if(!m_bStartUp){
  430. if (strcmp(pszValue, "M") ==0){
  431. Dbg("system page isStartup 2");
  432. m_bStartUp = true;
  433. }
  434. }
  435. }
  436. if(strcmp("RunState",pszKey)==0){
  437. if(!m_bSystemStartUp){
  438. if (strcmp(pszValue, "N") ==0){
  439. Dbg("====framework is start up 2====");
  440. m_bSystemStartUp = true;
  441. }
  442. }
  443. }
  444. }
  445. void CUpgradeMgrEntity::OnDownloadEvent(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, Download::DownloadResult &evt)
  446. {
  447. Dbg("OnDownloadEvent, file:%s, result:%d, errMsg:%s", (const char*)evt.strFileName, evt.errorCode, (const char*)evt.errorMsg);
  448. m_fsm.PostEventFIFO(new CUpgradeMgrFSM::DownloadedEvent(evt.strFileName, evt.errorCode, evt.errorMsg));
  449. }
  450. void CUpgradeMgrEntity::OnUpgradeCheckEvent(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, UpgradeRun::UpgradeCheckEvent &evt)
  451. {
  452. Dbg("OnUpgradeCheckEvent, pack:%s, result:%d, errMsg:%s", (const char*)evt.strPackName, evt.error, (const char*)evt.strComment);
  453. auto pEvent = new CUpgradeMgrFSM::UpgradeRunCheckEvent(evt.strPackName, evt.error, evt.coverList, evt.strComment);
  454. m_fsm.PostEventFIFO(pEvent);
  455. }
  456. void CUpgradeMgrEntity::OnUpgradeDoneEvent(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, UpgradeRun::UpgradeDoneEvent &evt)
  457. {
  458. Dbg("OnUpgradeDoneEvent, pack:%s, result:%d, errMsg:%s", (const char*)evt.strPackName, evt.error, (const char*)evt.strComment);
  459. auto pEvent = new CUpgradeMgrFSM::UpgradeRunDoneEvent(evt.strPackName, evt.error, evt.bSysInstall, evt.bLightPack, evt.strNewVersion, evt.strFWID, evt.strSysPatchName,evt.strComment);
  460. m_fsm.PostEventFIFO(pEvent);
  461. //add by zl 20190221
  462. // 终端置为非升级状态。1:升级状态,0:非升级状态。处于升级状态时调用播放接口不生效
  463. auto rc = GetFunction()->SetSysVar("UpdateState", "0", true);
  464. assert(rc == Error_Succeed);
  465. }
  466. char CUpgradeMgrEntity::GetInstallStateVal(const InstallStateEnum enumVal)
  467. {
  468. const struct {
  469. int ch;
  470. InstallStateEnum val;
  471. } tbl[] = {
  472. {'A', Install_Active},
  473. {'I', Install_Pending},
  474. {'S', Install_SetToStart},
  475. {'F', Install_FailRun},
  476. {'R', Install_RollBack},
  477. {'U', Install_Upgraded},
  478. {'C',Install_Cancelled},
  479. {'W',Install_WaitConfirm},
  480. {'D', Install_Installed},
  481. };
  482. int i;
  483. for (i = 0; i < sizeof(tbl)/sizeof(tbl[0]); ++i) {
  484. if (tbl[i].val == enumVal) {
  485. return tbl[i].ch;
  486. }
  487. }
  488. return ' '; // error
  489. }
  490. //新状态机不处理
  491. ErrorCodeEnum CUpgradeMgrEntity::RegistLocalPack(const CSimpleStringA &strPackFile)
  492. {
  493. if(m_initSucc){
  494. if(bNewUpgradeMgr){
  495. Dbg("RegistLocalPack new UpgradeMgr is not deal with");
  496. return Error_NotImpl;
  497. }else{
  498. // 手动拷贝升级包,本地升级
  499. return m_fsm.RegistLocalPack(strPackFile);
  500. }
  501. }else{
  502. Dbg("initFSM is not end");
  503. return Error_Pending;//状态机还未启动
  504. }
  505. }
  506. //新状态机不处理
  507. DWORD CUpgradeMgrEntity::RegistManualPack(const CSimpleStringA &strPackFile)
  508. {
  509. if(m_initSucc){
  510. if(bNewUpgradeMgr){
  511. Dbg("RegistManualPack new UpgradeMgr is not deal with");
  512. return IS_UPDATEING_ERR;
  513. }else{
  514. // 用户桌面手动升级
  515. return m_fsm.RegistManualPack(strPackFile);
  516. }
  517. }else{
  518. Dbg("initFSM is not end");
  519. return IS_UPDATEING_ERR;//状态机还未启动
  520. }
  521. }
  522. ErrorCodeEnum CUpgradeMgrEntity::DownloadPack(const CSimpleStringA &strPackFile)
  523. {
  524. // 通知下载实体准备下载
  525. auto pClient = new DownloadService_ClientBase(this);
  526. auto rc = pClient->Connect();
  527. if (rc == Error_Succeed)
  528. {
  529. DownloadService_DownloadFile_Req req = {};
  530. DownloadService_DownloadFile_Ans ans = {};
  531. req.strFileName = strPackFile;
  532. req.dwExpireTime = CSmallDateTime::GetNow() + 3600 * 24 * 14;
  533. rc = pClient->DownloadFile(req, ans, 5000);
  534. pClient->GetFunction()->CloseSession();
  535. }
  536. else
  537. {
  538. Dbg("connect to download entity fail: %d", rc);
  539. pClient->SafeDelete();
  540. }
  541. return rc;
  542. }
  543. ErrorCodeEnum CUpgradeMgrEntity::CancelDownloadPack(const CSimpleStringA &strPackFile)
  544. {
  545. // 通知下载实体准备下载
  546. auto pClient = new DownloadService_ClientBase(this);
  547. auto rc = pClient->Connect();
  548. if (rc == Error_Succeed)
  549. {
  550. DownloadService_CancelDownloadFile_Req req = {};
  551. DownloadService_CancelDownloadFile_Ans ans = {};
  552. req.strFileName = strPackFile;
  553. rc = pClient->CancelDownloadFile(req, ans, 5000);
  554. pClient->GetFunction()->CloseSession();
  555. }
  556. else
  557. {
  558. Dbg("connect to download entity fail: %d", rc);
  559. pClient->SafeDelete();
  560. }
  561. return rc;
  562. }
  563. //新状态机不处理
  564. ErrorCodeEnum CUpgradeMgrEntity::CancelUpdate(const CSimpleStringA &strPackFile)
  565. {
  566. if(m_initSucc){
  567. if(bNewUpgradeMgr){
  568. Dbg("CancelUpdate new UpgradeMgr is not deal with");
  569. return Error_NotImpl;
  570. }else{
  571. // 取消安装
  572. m_fsm.PushCancelUpgradePack(strPackFile);
  573. return Error_Succeed;
  574. }
  575. }else{
  576. Dbg("initFSM is not end");
  577. return Error_Pending;//状态机还未启动
  578. }
  579. }
  580. //???新状态机处理
  581. ErrorCodeEnum CUpgradeMgrEntity::RollbackUpdate(const CSimpleStringA &strVersion)
  582. {
  583. if(m_initSucc){
  584. if(bNewUpgradeMgr){
  585. Dbg("RollbackUpdate new UpgradeMgr deal with");
  586. if(strVersion.GetLength()==0){
  587. LogError(Severity_Low, Error_NotImpl, 0, "version is empty , rollback upgrade fail");
  588. return Error_NotImpl;
  589. }else{
  590. ErrorCodeEnum rc = Error_Succeed;
  591. Dbg("try rollback to version: [%s]", (const char*)strVersion);
  592. int w1, w2, w3, w4;
  593. int ret = sscanf(strVersion, "%d.%d.%d.%d", &w1, &w2, &w3, &w4);
  594. if (ret <4)
  595. {
  596. Dbg("version [%s] parse fail", (const char*)strVersion);
  597. rc= Error_Param;
  598. }
  599. else
  600. {
  601. rc = m_taskFSM.RollBackToHistoryVersion(CVersion(w1, w2, w3, w4));
  602. }
  603. if (rc == Error_Succeed)
  604. {
  605. // 通过事件通知健康实体
  606. LogEvent(Severity_Middle, Event_Req_Framework_Rollback, "rollback upgrade succeed");
  607. }
  608. else
  609. {
  610. LogError(Severity_Low, rc, 0, "rollback upgrade fail");
  611. }
  612. return rc;
  613. }
  614. }else{
  615. // 调用框架接口回滚升级
  616. auto pFunc = GetFunction()->GetPrivilegeFunction();
  617. assert(pFunc != NULL);
  618. auto rc = Error_Succeed;
  619. if (strVersion.GetLength() == 0)
  620. {
  621. Dbg("try rollback to previous version");
  622. rc = pFunc->RollBackToPreviousVersion();
  623. }
  624. else
  625. {
  626. Dbg("try rollback to version: [%s]", (const char*)strVersion);
  627. int w1, w2, w3, w4;
  628. int ret = sscanf(strVersion, "%d.%d.%d.%d", &w1, &w2, &w3, &w4);
  629. if (ret <4)
  630. {
  631. Dbg("version [%s] parse fail", (const char*)strVersion);
  632. rc= Error_Param;
  633. }
  634. else
  635. {
  636. rc = pFunc->RollBackToHistoryVersion(CVersion(w1, w2, w3, w4));
  637. }
  638. }
  639. if (rc == Error_Succeed)
  640. {
  641. // 通过事件通知健康实体
  642. LogEvent(Severity_Middle, Event_Req_Framework_Rollback, "rollback upgrade succeed");
  643. ////更新安装失败包信息(包名和失败次数)
  644. //UpdatePackFailInfo();
  645. }
  646. else
  647. {
  648. LogError(Severity_Low, rc, 0, "rollback upgrade fail");
  649. }
  650. return rc;
  651. }
  652. }else{
  653. Dbg("initFSM is not end");
  654. return Error_Pending;//状态机还未启动
  655. }
  656. }
  657. DWORD CUpgradeMgrEntity::GetManualPacks(CSimpleStringA &strManualPacks)
  658. {
  659. if(m_initSucc){
  660. if(bNewUpgradeMgr){
  661. Dbg("GetManualPacks new UpgradeMgr is not deal with");
  662. return NO_EXIST_MANUAL_PACK_ERR;
  663. }else{
  664. return m_fsm.GetManualPacks(strManualPacks);
  665. }
  666. }else{
  667. Dbg("initFSM is not end");
  668. return NO_EXIST_MANUAL_PACK_ERR;//状态机还未启动
  669. }
  670. }
  671. ErrorCodeEnum CUpgradeMgrEntity::SyncTime()
  672. {
  673. // 通知准入实体同步时间
  674. AccessAuthService_ClientBase *pClient = new AccessAuthService_ClientBase(this);
  675. auto rc = pClient->Connect();
  676. if (rc == Error_Succeed)
  677. {
  678. Dbg("connect to entity [AccessAuthorization] succeed, start syncTime now");
  679. rc = pClient->SyncTime();
  680. pClient->GetFunction()->CloseSession();
  681. }
  682. else
  683. {
  684. LogError(Severity_Low, rc, 0, "connect to entity [AccessAuthorization] fail");
  685. pClient->SafeDelete();
  686. }
  687. return rc;
  688. }
  689. // 将升级任务推送到运行实体
  690. ErrorCodeEnum CUpgradeMgrEntity::PushUpdateTask(const CSimpleStringA &strPackName, const int nPackType)
  691. //ErrorCodeEnum CUpgradeMgrEntity::PushUpdateTask(const CSimpleStringA &strPackName)
  692. {
  693. auto pClient = new UpgradeRunService_ClientBase(this);
  694. auto rc = pClient->Connect();
  695. if (rc == Error_Succeed)
  696. {
  697. UpgradeRunService_PushUpdateTask_Info info;
  698. info.strPackName = strPackName;
  699. info.nTaskType = nPackType;
  700. rc = pClient->PushUpdateTask(info);
  701. pClient->GetFunction()->CloseSession();
  702. }
  703. else
  704. {
  705. Dbg("connect to upgrade run entity fail: %d", rc);
  706. pClient->SafeDelete();
  707. }
  708. return rc;
  709. }
  710. CServerSessionBase* CUpgradeMgrEntity::OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/)
  711. {
  712. return new CUpgradeMgrSession(this);
  713. }
  714. ErrorCodeEnum CUpgradeMgrEntity::SwitchUpgrade(const CSimpleStringA &strPack)
  715. {
  716. if(m_initSucc){
  717. if(bNewUpgradeMgr){
  718. Dbg("SwitchUpgrade new UpgradeMgr is not deal with");
  719. return Error_NotImpl;
  720. }else{
  721. m_fsm.PostEventFIFO(new FSMEvent(CUpgradeMgrFSM::Event_SwitchNow));
  722. return Error_Succeed;
  723. }
  724. }else{
  725. Dbg("initFSM is not end");
  726. return Error_Pending;//状态机还未启动
  727. }
  728. }
  729. ErrorCodeEnum CUpgradeMgrEntity::GetUpgradeState(bool &bInstalling, CSimpleStringA &strPackFile, CSimpleStringA &strExecID,
  730. char &cInstallState, bool &bSysInstall, bool &bLightPack, CSimpleStringA &strNewVersion)
  731. {
  732. if(m_initSucc){
  733. if(bNewUpgradeMgr){
  734. Dbg("GetUpgradeState new UpgradeMgr deal with");
  735. return m_taskFSM.GetUpgradeState(bInstalling, strPackFile, strExecID, cInstallState, bSysInstall, bLightPack, strNewVersion);
  736. }else{
  737. return m_fsm.GetUpgradeState(bInstalling, strPackFile, strExecID, cInstallState, bSysInstall, bLightPack, strNewVersion);
  738. }
  739. }else{
  740. Dbg("initFSM is not end");
  741. return Error_Pending;//状态机还未启动
  742. }
  743. }
  744. ErrorCodeEnum CUpgradeMgrEntity::MD5File(CSimpleStringA strFilePath, CSimpleStringA &strMD5)
  745. {//暂时不引用MD5生成
  746. //char* pMd5 = MD5FILE::MD5_file((char*)strFilePath.GetData(), 32);
  747. //if (NULL == pMd5)
  748. //{
  749. // Dbg("Get %s MD5 value fail");
  750. // return Error_Unexpect;
  751. //}
  752. //strMD5 = pMd5;
  753. return Error_Succeed;
  754. }
  755. ErrorCodeEnum CUpgradeMgrEntity::SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub){
  756. if(SM3Byte == NULL){
  757. return Error_Exception;
  758. }
  759. int SM3_len=64;
  760. if(isSub){
  761. SM3_len=32;
  762. }
  763. int i;
  764. char* file_SM3 = (char*)malloc((SM3_len + 1) * sizeof(char));
  765. if(file_SM3 == NULL)
  766. {
  767. fprintf(stderr, "SM3 malloc failed.\n");
  768. return Error_Exception;
  769. }
  770. memset(file_SM3, 0, (SM3_len + 1));
  771. if(SM3_len == 32)
  772. {
  773. for(i=0; i<16; i++)
  774. { //SM3截取中间16位字节,8-24位字节数,小写
  775. sprintf(&file_SM3[i*2], "%02x", SM3Byte[i+8]);
  776. }
  777. }
  778. else if(SM3_len == 64)
  779. {
  780. for(i=0; i<32; i++)
  781. {
  782. sprintf(&file_SM3[i*2], "%02x", SM3Byte[i]);
  783. }
  784. }
  785. strSM3=file_SM3;
  786. free(file_SM3);
  787. return Error_Succeed;
  788. }
  789. ErrorCodeEnum CUpgradeMgrEntity::createInstallFile()
  790. {
  791. CSimpleStringA strVerPath ;
  792. ErrorCodeEnum rc = this->GetFunction()->GetPath("Base", strVerPath);
  793. if(rc!=Error_Succeed){
  794. Dbg("get Base path is fail:%d",(int)rc);
  795. return rc;
  796. }
  797. CSimpleStringA strInstallPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "install.ini", strVerPath.GetData());
  798. if(ExistsFileA(strInstallPath.GetData())){
  799. Dbg("install.ini is exsit:%s",strInstallPath.GetData());
  800. return Error_Succeed;//已存在,框架已加载
  801. }else{
  802. Dbg("begin create new install.ini:%s",strInstallPath.GetData());
  803. //调用框架接口去创建文件
  804. auto pPrivilegeFunc = this->GetFunction()->GetPrivilegeFunction();
  805. if(pPrivilegeFunc==NULL){
  806. Dbg("get GetPrivilegeFunction is null");
  807. return Error_Null;
  808. }else{
  809. if(pPrivilegeFunc->GenerateNewInstallCfg()==Error_Succeed){
  810. Dbg("create new install.ini succ",strInstallPath.GetData());
  811. return Error_Succeed;
  812. }else{
  813. Dbg("create new install.ini fail ,exec GenerateNewInstallCfg is fail");
  814. return Error_Exception;
  815. }
  816. }
  817. }
  818. }
  819. ErrorCodeEnum CUpgradeMgrEntity::testActive()
  820. {
  821. CSimpleStringA rootVerPath;
  822. ErrorCodeEnum rc = this->GetFunction()->GetPath("RootVer",rootVerPath);//获取version根路径
  823. if(rc!=Error_Succeed){
  824. LogWarn(Severity_Middle, Error_Exception, ERR_WRAN_OPEN_ACTIVE_FAIL,"testActive fail , get RootVer path is fai");
  825. return Error_Bug;
  826. }
  827. CSimpleStringA strActiveFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "active.txt", rootVerPath.GetData());
  828. FILE* fp = fopen(strActiveFile.GetData(),"rb+");
  829. if(fp==NULL){
  830. LogWarn(Severity_Middle, Error_Exception, ERR_WRAN_OPEN_ACTIVE_FAIL,CSimpleStringA::Format("open write active.txt fail,please edit active attribute, err=%d",errno).GetData());
  831. return Error_Unexpect;
  832. }
  833. fclose(fp);
  834. return Error_Succeed;
  835. }
  836. ErrorCodeEnum CUpgradeMgrEntity::SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub)
  837. {
  838. if(strFilePath.IsNullOrEmpty()){
  839. return Error_Null;
  840. }
  841. int nlen = strlen(strFilePath.GetData());
  842. char* pchar = new char[nlen+1];
  843. strcpy(pchar,strFilePath.GetData());
  844. BYTE md5[32]={0};
  845. //Dbg("进行国密加密,file=%s",strFilePath.GetData());
  846. //if(SM3File(pchar,md5)){
  847. // delete pchar;
  848. // 获取16进制的字符串
  849. // if(Error_Succeed!=SM3_Str(strSM3,md5,isSub)){
  850. // Dbg("sm3国密转16进制字符串失败,file=%s",strFilePath.GetData());
  851. // return Error_Unexpect;
  852. // }
  853. // return Error_Succeed;
  854. //}else{
  855. // delete pchar;
  856. // Dbg("sm3国密加密失败,file=%s",strFilePath.GetData());
  857. // return Error_Unexpect;
  858. //}
  859. try
  860. {
  861. if(SM3File(pchar,md5)){
  862. delete pchar;
  863. //获取16进制的字符串
  864. if(Error_Succeed!=SM3_Str(strSM3,md5,isSub)){
  865. Dbg("sm3国密转16进制字符串失败,file=%s",strFilePath.GetData());
  866. return Error_Unexpect;
  867. }
  868. return Error_Succeed;
  869. }else{
  870. delete pchar;
  871. Dbg("sm3国密加密失败,file=%s",strFilePath.GetData());
  872. return Error_Unexpect;
  873. }
  874. }
  875. catch (...)
  876. {
  877. delete pchar;
  878. Dbg("sm3国密加密异常失败,file=%s",strFilePath.GetData());
  879. return Error_Exception;
  880. }
  881. }
  882. ErrorCodeEnum CUpgradeMgrEntity::MD5Data(CSimpleStringA strData, CSimpleStringA &strMD5)
  883. {//暂时不引用MD5生成
  884. //char* pMd5 = MD5FILE::MD5_data((char*)strData.GetData(), 32);
  885. //if (NULL == pMd5)
  886. //{
  887. // Dbg("Get %s MD5 value fail");
  888. // return Error_Unexpect;
  889. //}
  890. //strMD5 = pMd5;
  891. return Error_Succeed;
  892. }
  893. ErrorCodeEnum CUpgradeMgrEntity::SM3DataToStr(CSimpleStringA strData, CSimpleStringA &strSM3,bool isSub)
  894. {
  895. if(strData.IsNullOrEmpty()){
  896. return Error_Null;
  897. }
  898. BYTE md5[32]={0};
  899. try
  900. {
  901. if(SM3Hash((BYTE*)strData.GetData(),strlen(strData.GetData()),md5)){
  902. //获取16进制的字符串
  903. if(Error_Succeed!=SM3_Str(strSM3,md5,isSub)){
  904. Dbg("sm3国密转16进制字符串失败");
  905. return Error_Unexpect;
  906. }
  907. return Error_Succeed;
  908. }else{
  909. Dbg("sm3国密加密失败");
  910. return Error_Unexpect;
  911. }
  912. }
  913. catch (...)
  914. {
  915. Dbg("sm3国密加密异常失败");
  916. return Error_Exception;
  917. }
  918. }
  919. //修改成sm3加密
  920. ErrorCodeEnum CUpgradeMgrEntity::MD5Folder(CSimpleStringA strFolderPath,bool isDepDIr)
  921. {
  922. if (strFolderPath.IsNullOrEmpty())
  923. {
  924. return Error_Null;
  925. }
  926. Dbg("Start to get file hash list, dir=[%s] ", strFolderPath.GetData());
  927. #ifdef RVC_OS_WIN
  928. _finddata_t FileInfo;
  929. CSimpleStringA strfind = strFolderPath + SPLIT_SLASH_STR+"*";
  930. long Handle = _findfirst(strfind, &FileInfo);
  931. if (-1L == Handle)
  932. {
  933. _findclose(Handle);
  934. Dbg("%s文件夹为空", strFolderPath);
  935. return Error_Succeed;
  936. }
  937. CSimpleStringA newPath;
  938. do{
  939. if (FileInfo.attrib & _A_SUBDIR)
  940. {
  941. if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
  942. {
  943. CSimpleStringA strFindName = FileInfo.name;
  944. //整个黑名单文件夹过滤
  945. bool isBlackDir = false;
  946. list<CSimpleStringA>::iterator itor = m_fsm.m_DirBlacklist.begin();
  947. while(itor!=m_fsm.m_DirBlacklist.end())
  948. {
  949. CSimpleStringA dirBlack = *itor;
  950. if(strcmp(dirBlack.GetData(),FileInfo.name)==0){
  951. isBlackDir=true;
  952. break;
  953. }
  954. itor++;
  955. }
  956. if(isBlackDir){
  957. CSimpleStringA dirPath = strFolderPath + SPLIT_SLASH_STR + FileInfo.name;
  958. Dbg("BlackDir Filter don't add to md5 list, dir=[%s]", dirPath.GetData());
  959. continue;//跳过文件夹
  960. }else{
  961. //判断是否是dep文件夹或者是dep文件夹下面的子文件夹
  962. if(strcmp(FileInfo.name, "dep") == 0||isDepDIr){
  963. newPath = strFolderPath + SPLIT_SLASH_STR + FileInfo.name;
  964. ErrorCodeEnum rc = MD5Folder(newPath,true);
  965. if(Error_Succeed!=rc){
  966. _findclose(Handle);
  967. return rc;
  968. }
  969. }else{
  970. newPath = strFolderPath + SPLIT_SLASH_STR + FileInfo.name;
  971. ErrorCodeEnum rc = MD5Folder(newPath);
  972. if(Error_Succeed!=rc){
  973. _findclose(Handle);
  974. return rc;
  975. }
  976. }
  977. }
  978. }
  979. }
  980. else
  981. {
  982. CSimpleStringA strFindName = FileInfo.name;
  983. {
  984. if (strFindName.IndexOf(".") == -1)
  985. {
  986. Dbg("%s file name is illegal", strFindName);
  987. continue;
  988. }
  989. //Dbg("计算hash码文件:%s",strFindName);
  990. //整体黑名单文件过滤
  991. bool isBlackFile = false;
  992. list<CSimpleStringA>::iterator itor = m_fsm.m_FileBlacklist.begin();
  993. while(itor!=m_fsm.m_FileBlacklist.end())
  994. {
  995. CSimpleStringA fileBlack = *itor;
  996. if(strFindName.IsEndWith(fileBlack.GetData(),true)){
  997. isBlackFile=true;
  998. break;
  999. }
  1000. itor++;
  1001. }
  1002. if(isBlackFile){
  1003. Dbg("BlackFile Filter don't add to md5 list, file = [%s]", strFindName.GetData());
  1004. continue;
  1005. }
  1006. //对历史遗留的centerSetting错误缓存文件特殊处理,不纳入hash文件列表
  1007. //对所有集中配置文件都过滤,规则是CenterSetting.*.ini*
  1008. regex e("CenterSetting[.][^.]*[.]ini.*");
  1009. if(std::regex_match(strFindName.GetData(),e,regex_constants::match_default)){
  1010. continue;
  1011. }
  1012. // 过滤install.ini,集中配置,log文件和cfg\certs目录
  1013. // TODO:改成配置
  1014. //if (strFindName.IsEndWith("install.ini", true)
  1015. // || strFindName.IsEndWith("CenterSetting.DMZ.ini", true)
  1016. // || strFindName.IsEndWith("CenterSetting.LAN.ini", true)
  1017. // || strFindName.IsEndWith(".log", true)
  1018. // || strFindName.IsEndWith("RootCert.pem", true)
  1019. // || strFindName.IsEndWith("CaCert.pem", true)
  1020. // || strFindName.IsEndWith("userCert.pem", true)
  1021. // || strFindName.IsEndWith("CertBlackList.txt", true)
  1022. // || strFindName.IsEndWith("idfront.jpg", true)
  1023. // || strFindName.IsEndWith("idback.jpg", true))
  1024. //{
  1025. // Dbg("don't add %s to md5 list", strFindName);
  1026. // continue;
  1027. //}
  1028. //判断是否需要用dep白名单过滤
  1029. if(isDepDIr){
  1030. bool isWhiteFile = false;
  1031. list<CSimpleStringA>::iterator itor = m_fsm.m_DepWhitelist.begin();
  1032. while(itor!=m_fsm.m_DepWhitelist.end())
  1033. {
  1034. CSimpleStringA fileWhite = *itor;
  1035. if(strFindName.IsEndWith(fileWhite.GetData(),true)){
  1036. isWhiteFile=true;
  1037. break;
  1038. }
  1039. itor++;
  1040. }
  1041. //不是白名单也不是默认dll文件,不需要加入hash计算
  1042. if(!isWhiteFile&&!strFindName.IsEndWith(".dll", true)){
  1043. Dbg("WhiteFile Filter don't add to md5 list, file = [%s]", strFindName.GetData());
  1044. continue;
  1045. }
  1046. }
  1047. CSimpleStringA strFilePath = strFolderPath + SPLIT_SLASH_STR + strFindName;
  1048. CSimpleStringA strMD5Val;
  1049. //ErrorCodeEnum rErrcode = MD5File(strFilePath, strMD5Val);
  1050. //修改为SM3进行哈希
  1051. ErrorCodeEnum rErrcode = SM3FileToStr(strFilePath, strMD5Val,false);
  1052. if (Error_Succeed != rErrcode)
  1053. {
  1054. Dbg("%s获取MD5失败,错误码:%d", strFilePath.GetData(), (int)rErrcode);
  1055. _findclose(Handle);
  1056. return rErrcode;
  1057. }
  1058. m_FileHashMap[strFilePath] = strMD5Val;
  1059. }
  1060. }
  1061. } while (_findnext(Handle, &FileInfo) == 0);
  1062. _findclose(Handle);
  1063. return Error_Succeed;
  1064. #else
  1065. //循环扫描文件算出文件hash值
  1066. DIR* dir;
  1067. struct dirent* entry;
  1068. CSimpleStringA newPath;
  1069. if ((dir = opendir(strFolderPath.GetData())) == NULL)
  1070. {
  1071. Dbg("open dir fail:%d", errno);
  1072. return Error_Unexpect;
  1073. }
  1074. while ((entry = readdir(dir)) != NULL)
  1075. {
  1076. if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
  1077. {//current dir OR parrent dir
  1078. continue;
  1079. }
  1080. else if (entry->d_type == 4)
  1081. {//dir
  1082. CSimpleStringA strFindName = entry->d_name;
  1083. //整个黑名单文件夹过滤
  1084. bool isBlackDir = false;
  1085. list<CSimpleStringA>::iterator itor = m_fsm.m_DirBlacklist.begin();
  1086. while (itor != m_fsm.m_DirBlacklist.end())
  1087. {
  1088. CSimpleStringA dirBlack = *itor;
  1089. if (strcmp(dirBlack.GetData(), entry->d_name) == 0) {
  1090. isBlackDir = true;
  1091. break;
  1092. }
  1093. itor++;
  1094. }
  1095. if (isBlackDir) {
  1096. CSimpleStringA dirPath = strFolderPath + SPLIT_SLASH_STR + entry->d_name;
  1097. Dbg("BlackDir Filter don't add to md5 list, dir=[%s]", dirPath.GetData());
  1098. continue;//跳过文件夹
  1099. }
  1100. else {
  1101. //判断是否是dep文件夹或者是dep文件夹下面的子文件夹
  1102. if (strcmp(entry->d_name, "dep") == 0 || isDepDIr) {
  1103. newPath = strFolderPath + SPLIT_SLASH_STR + entry->d_name;
  1104. ErrorCodeEnum rc = MD5Folder(newPath, true);
  1105. if (Error_Succeed != rc) {
  1106. closedir(dir);
  1107. return rc;
  1108. }
  1109. }
  1110. else {
  1111. newPath = strFolderPath + SPLIT_SLASH_STR + entry->d_name;
  1112. ErrorCodeEnum rc = MD5Folder(newPath);
  1113. if (Error_Succeed != rc) {
  1114. closedir(dir);
  1115. return rc;
  1116. }
  1117. }
  1118. }
  1119. }
  1120. else if (entry->d_type == 8)
  1121. {//file
  1122. CSimpleStringA strFindName = entry->d_name;
  1123. {
  1124. //Linux下很多文件是没有后缀名,故放开。
  1125. //if (strFindName.IndexOf(".") == -1)
  1126. //{
  1127. // Dbg("%s file name is illegal", strFindName.GetData());
  1128. // continue;
  1129. //}
  1130. //整体黑名单文件过滤
  1131. bool isBlackFile = false;
  1132. list<CSimpleStringA>::iterator itor = m_fsm.m_FileBlacklist.begin();
  1133. while (itor != m_fsm.m_FileBlacklist.end())
  1134. {
  1135. CSimpleStringA fileBlack = *itor;
  1136. if (strFindName.IsEndWith(fileBlack.GetData(), true)) {
  1137. isBlackFile = true;
  1138. break;
  1139. }
  1140. itor++;
  1141. }
  1142. if (isBlackFile) {
  1143. Dbg("BlackFile Filter don't add to md5 list, file = [%s]", strFindName.GetData());
  1144. continue;
  1145. }
  1146. //对历史遗留的centerSetting错误缓存文件特殊处理,不纳入hash文件列表
  1147. //对所有集中配置文件都过滤,规则是CenterSetting.*.ini*
  1148. regex e("CenterSetting[.][^.]*[.]ini.*");
  1149. if (std::regex_match(strFindName.GetData(), e, regex_constants::match_default)) {
  1150. continue;
  1151. }
  1152. //判断是否需要用dep白名单过滤
  1153. if (isDepDIr) {
  1154. bool isWhiteFile = false;
  1155. list<CSimpleStringA>::iterator itor = m_fsm.m_DepWhitelist.begin();
  1156. while (itor != m_fsm.m_DepWhitelist.end())
  1157. {
  1158. CSimpleStringA fileWhite = *itor;
  1159. if (strFindName.IsEndWith(fileWhite.GetData(), true)) {
  1160. isWhiteFile = true;
  1161. break;
  1162. }
  1163. itor++;
  1164. }
  1165. //不是白名单也不是默认so文件,不需要加入hash计算
  1166. //if (!isWhiteFile && !strFindName.IsEndWith(".so", true)) {
  1167. // Dbg("WhiteFile Filter don't add to md5 list, file = [%s]", strFindName.GetData());
  1168. // continue;
  1169. //}
  1170. if (!isWhiteFile && strFindName.IndexOf(".so")==-1) {
  1171. Dbg("WhiteFile Filter don't add to md5 list, file = [%s]", strFindName.GetData());
  1172. continue;
  1173. }
  1174. }
  1175. CSimpleStringA strFilePath = strFolderPath + SPLIT_SLASH_STR + strFindName;
  1176. CSimpleStringA strMD5Val;
  1177. //ErrorCodeEnum rErrcode = MD5File(strFilePath, strMD5Val);
  1178. //修改为SM3进行哈希
  1179. ErrorCodeEnum rErrcode = SM3FileToStr(strFilePath, strMD5Val, false);
  1180. if (Error_Succeed != rErrcode)
  1181. {
  1182. Dbg("%s获取MD5失败,错误码:%d", strFilePath.GetData(), (int)rErrcode);
  1183. closedir(dir);
  1184. return rErrcode;
  1185. }
  1186. Sleep(200);//加入时间碎片
  1187. m_FileHashMap[strFilePath] = strMD5Val;
  1188. }
  1189. }
  1190. else if (entry->d_type == 10)
  1191. {//link file,暂不处理
  1192. continue;
  1193. }
  1194. }
  1195. closedir(dir);
  1196. return Error_Succeed;
  1197. #endif
  1198. }
  1199. ErrorCodeEnum CUpgradeMgrEntity::GetMD5List(CSimpleStringA &strMD5List)
  1200. {
  1201. if (!m_strMD5List.IsNullOrEmpty())
  1202. {
  1203. strMD5List = m_strMD5List;
  1204. return Error_Succeed;
  1205. }
  1206. m_FileHashMap.clear();//生成文件hash列表前先清空
  1207. CSystemStaticInfo ssInfo;
  1208. this->GetFunction()->GetSystemStaticInfo(ssInfo);
  1209. CSimpleStringA curVer = ssInfo.InstallVersion.ToString();
  1210. if (curVer.IsNullOrEmpty())
  1211. {
  1212. Dbg("InstallVersion is null");
  1213. return Error_Null;
  1214. }
  1215. CSimpleStringA strRootVerPath;
  1216. this->GetFunction()->GetPath("RootVer", strRootVerPath);
  1217. Dbg("strRootVerPath %s,curVer:%s", strRootVerPath.GetData(),curVer.GetData());
  1218. CSimpleStringA strCurVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strRootVerPath, (const char*)curVer);
  1219. if (!ExistsDirA(strCurVerPath))
  1220. {
  1221. Dbg("%d not exist", strCurVerPath);
  1222. return Error_Unexpect;
  1223. }
  1224. ErrorCodeEnum rc = MD5Folder(strCurVerPath);
  1225. if (Error_Succeed != rc)
  1226. {
  1227. return rc;
  1228. }
  1229. for(auto it=m_FileHashMap.begin(); it!=m_FileHashMap.end(); it++)
  1230. {
  1231. strMD5List += it->first;
  1232. strMD5List += ",";
  1233. strMD5List += it->second;
  1234. strMD5List += ";";
  1235. }
  1236. m_strMD5List = strMD5List;
  1237. return Error_Succeed;
  1238. }
  1239. ErrorCodeEnum CUpgradeMgrEntity::StopMediaPlay()
  1240. {
  1241. // 通知准入实体同步时间
  1242. LocalMediaPlay::PlayService_ClientBase *pClient = new LocalMediaPlay::PlayService_ClientBase(this);
  1243. auto rc = pClient->Connect();
  1244. if (rc == Error_Succeed)
  1245. {
  1246. Dbg("connect to entity [LocalMediaPlay] succeed, start StopMediaPlay now");
  1247. LocalMediaPlay::PlayService_StopPlayVideo_Req req1 = {};
  1248. LocalMediaPlay::PlayService_StopPlayVideo_Ans ans1 = {};
  1249. req1.CfgInx = 1;
  1250. if (Error_Succeed == pClient->StopPlayVideo(req1, ans1, 5000))
  1251. {
  1252. Dbg("StopPlayVideo success");
  1253. }
  1254. LocalMediaPlay::PlayService_StopPlayAudio_Req req2 = {};
  1255. LocalMediaPlay::PlayService_StopPlayAudio_Ans ans2 = {};
  1256. if (Error_Succeed == pClient->StopPlayAudio(req2, ans2, 5000))
  1257. {
  1258. Dbg("StopPlayAudio success");
  1259. }
  1260. pClient->GetFunction()->CloseSession();
  1261. }
  1262. else
  1263. {
  1264. LogError(Severity_Low, rc, 0, "connect to entity [LocalMediaPlay] fail");
  1265. pClient->SafeDelete();
  1266. }
  1267. return rc;
  1268. }
  1269. ErrorCodeEnum CUpgradeMgrEntity::NewStopMediaPlay()
  1270. {
  1271. // 通知媒体停止播放广告和声音
  1272. LocalMediaPlay::PlayService_ClientBase *pClient = new LocalMediaPlay::PlayService_ClientBase(this);
  1273. ErrorCodeEnum rc = pClient->Connect();
  1274. if (rc == Error_Succeed)
  1275. {
  1276. Dbg("connect to entity [LocalMediaPlay] succeed, start StopMediaPlay now");
  1277. LocalMediaPlay::PlayService_StopPlayVideo_Req req1 = {};
  1278. LocalMediaPlay::PlayService_StopPlayVideo_Ans ans1 = {};
  1279. req1.CfgInx = 1;
  1280. rc = pClient->StopPlayVideo(req1, ans1, 10000);
  1281. if (Error_Succeed == rc)
  1282. {
  1283. Dbg("StopPlayVideo success");
  1284. }else{
  1285. Dbg("StopPlayVideo fail");
  1286. pClient->GetFunction()->CloseSession();
  1287. pClient->SafeDelete();
  1288. return rc;
  1289. }
  1290. LocalMediaPlay::PlayService_StopPlayAudio_Req req2 = {};
  1291. LocalMediaPlay::PlayService_StopPlayAudio_Ans ans2 = {};
  1292. rc = pClient->StopPlayAudio(req2, ans2, 10000);
  1293. if (Error_Succeed == rc)
  1294. {
  1295. Dbg("StopPlayAudio success");
  1296. }else{
  1297. Dbg("StopPlayAudio fail");
  1298. pClient->GetFunction()->CloseSession();
  1299. pClient->SafeDelete();
  1300. return rc;
  1301. }
  1302. pClient->GetFunction()->CloseSession();
  1303. }
  1304. else
  1305. {
  1306. LogError(Severity_Low, rc, 0, "connect to entity [LocalMediaPlay] fail");
  1307. pClient->SafeDelete();
  1308. }
  1309. return rc;
  1310. }
  1311. SP_BEGIN_ENTITY_MAP()
  1312. SP_ENTITY(CUpgradeMgrEntity)
  1313. SP_END_ENTITY_MAP()
  1314. void CUpgradeMgrEntity::HttpsLogCallBack(const char* logtxt)
  1315. {
  1316. Dbg("%s",logtxt);
  1317. }