mod_UpgradeMgr.cpp 43 KB

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