UpgradeRunFSM.cpp 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907
  1. #include "stdafx.h"
  2. #include "UpgradeRunFSM.h"
  3. #include "mod_UpgradeRun.h"
  4. #include "iniutil.h"
  5. #include "memutil.h"
  6. #include "fileutil.h"
  7. #include <vector>
  8. #include "EventCode.h"
  9. #include<algorithm>
  10. #ifdef RVC_OS_WIN
  11. #include <shellapi.h>
  12. #include <io.h>
  13. #include "XUnzip.h"
  14. #else
  15. #include <errno.h>
  16. #include <sys/utsname.h>
  17. #include "XUnZipZilb.h"
  18. #endif // RVC_OS_WIN
  19. CUpgradeRunFSM::CUpgradeRunFSM(void)
  20. {
  21. //解决sonar扫描问题
  22. }
  23. CUpgradeRunFSM::~CUpgradeRunFSM(void)
  24. {
  25. //解决sonar扫描问题
  26. }
  27. ErrorCodeEnum CUpgradeRunFSM::OnInit()
  28. {
  29. AddStateHooker(this);
  30. //m_nIntallPackType = 1;
  31. //m_strInstallPack = "update-1.0.0.zip";
  32. m_chInstallState = 'N';
  33. return Error_Succeed;
  34. }
  35. ErrorCodeEnum CUpgradeRunFSM::OnExit()
  36. {
  37. RemoveStateHooker(this);
  38. return Error_Succeed;
  39. }
  40. ErrorCodeEnum CUpgradeRunFSM::GetRunState(CSimpleStringA &strPackName, char &cState)
  41. {
  42. if (!m_strInstallPack.IsNullOrEmpty())
  43. {
  44. strPackName = m_strInstallPack;
  45. if (m_iState == s1)
  46. cState = 'P';
  47. else
  48. cState = 'I';
  49. }
  50. return Error_Succeed;
  51. }
  52. void CUpgradeRunFSM::OnStateTrans(int iSrcState, int iDstState)
  53. {
  54. Dbg("CUpgradeRunFSM state change from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  55. }
  56. void CUpgradeRunFSM::s1_on_entry()
  57. {
  58. //解决sonar扫描问题
  59. }
  60. void CUpgradeRunFSM::s1_on_exit()
  61. {
  62. //解决sonar扫描问题
  63. }
  64. unsigned int CUpgradeRunFSM::s1_on_event(FSMEvent* event)
  65. {
  66. if (event->iEvt == Event_EnableUpgrade)
  67. {
  68. if (!m_strInstallPack.IsNullOrEmpty())
  69. {
  70. LOG_TRACE("continue upgrade pack: [%s]", (const char*)m_strInstallPack);
  71. return 1;
  72. }
  73. }
  74. else if (event->iEvt == Event_StartUpgrade)
  75. {
  76. StartUpgradeEvent *pEvent = (StartUpgradeEvent*)event;
  77. if (!m_strInstallPack.IsNullOrEmpty())
  78. {
  79. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("pack [%s] is installing now, refuse upgrade pack [%s]",
  80. (const char*)m_strInstallPack, (const char*)pEvent->strPackName));
  81. }
  82. else
  83. {
  84. LOG_TRACE("upgrade disable now, install pack [%s] later", (const char*)pEvent->strPackName);
  85. m_strInstallPack = pEvent->strPackName;
  86. m_nIntallPackType = pEvent->nPackType;
  87. m_chInstallState = 'N';
  88. }
  89. }
  90. return 0;
  91. }
  92. void CUpgradeRunFSM::s2_on_entry()
  93. {
  94. m_strInstallPack.Clear();
  95. m_nIntallPackType = 1;
  96. m_chInstallState = 'N';
  97. }
  98. void CUpgradeRunFSM::s2_on_exit()
  99. {
  100. //解决sonar扫描问题
  101. }
  102. unsigned int CUpgradeRunFSM::s2_on_event(FSMEvent* event)
  103. {
  104. if (event->iEvt == Event_DisableUpgrade)
  105. {
  106. LOG_TRACE("pause upgrade now");
  107. }
  108. else if (event->iEvt == Event_StartUpgrade)
  109. {
  110. StartUpgradeEvent *pEvent = (StartUpgradeEvent*)event;
  111. assert(m_strInstallPack.IsNullOrEmpty());
  112. m_strInstallPack = pEvent->strPackName;
  113. m_nIntallPackType = pEvent->nPackType;
  114. m_chInstallState = 'N';
  115. LOG_TRACE("start upgrade pack: [%s], type[%d]", (const char*)pEvent->strPackName, pEvent->nPackType);
  116. }
  117. return 0;
  118. }
  119. namespace Task
  120. {
  121. struct UnzipTask : public ITaskSp
  122. {
  123. CUpgradeRunFSM* fsm;
  124. explicit UnzipTask(CUpgradeRunFSM* f) : fsm(f) {}
  125. void Process()
  126. {
  127. auto pEntity = fsm->GetEntityBase();
  128. //兼容zip和cab格式安装包
  129. if (fsm->m_strInstallPack.IsEndWith(".cab"))
  130. {
  131. //校验安装包签名
  132. auto rc = fsm->CheckInstallPackSign();
  133. if (rc == Error_Succeed)
  134. {
  135. LOG_TRACE("check pack [%s] sign succeed", (const char*)fsm->m_strInstallPack);
  136. }
  137. else
  138. {
  139. UpgradeRun::UpgradeDoneEvent e = {};
  140. e.strPackName = fsm->m_strInstallPack;
  141. e.error = rc;
  142. e.strComment = "升级包签名校验失败";
  143. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);
  144. LogError(Severity_Low, rc, ERROR_UPGRADERUN_CABSIGN_FAIL, CSimpleStringA::Format("升级包[%s]签名校验失败", (const char*)fsm->m_strInstallPack));
  145. fsm->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  146. return;
  147. }
  148. rc = fsm->UncabPack();
  149. if (rc == Error_Succeed)
  150. {
  151. fsm->m_chInstallState = 'Z';
  152. LOG_TRACE("unzip pack [%s] succeed", (const char*)fsm->m_strInstallPack);
  153. if (fsm->IsManual() && (1 == fsm->m_nIntallPackType))
  154. {
  155. UpgradeRun::UpgradeDoneEvent e = {};
  156. e.strPackName = fsm->m_strInstallPack;
  157. e.error = rc;
  158. e.bSysInstall = true;
  159. e.strComment = "手动升级";
  160. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);
  161. fsm->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  162. return;
  163. }
  164. }
  165. else
  166. {
  167. fsm->DeleteInstallingPack();//删除解压失败的安装包,下次升级重新下载
  168. UpgradeRun::UpgradeDoneEvent e = {};
  169. e.strPackName = fsm->m_strInstallPack;
  170. e.error = rc;
  171. e.strComment = "解压失败";
  172. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);
  173. LogError(Severity_Low, rc, ERROR_UPGRADERUN_CAB_UNZIP_FAIL, CSimpleStringA::Format("uncab pack [%s] fail", (const char*)fsm->m_strInstallPack));
  174. fsm->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  175. return;
  176. }
  177. }
  178. else if (fsm->m_strInstallPack.IsEndWith(".zip"))
  179. {
  180. auto rc = fsm->UnzipPack();
  181. //auto rc = fsm->NewUnzipPack();
  182. if (rc == Error_Succeed)
  183. {
  184. fsm->m_chInstallState = 'Z';
  185. LOG_TRACE("unzip pack [%s] succeed", (const char*)fsm->m_strInstallPack);
  186. //若果是手动升级,且是第一次执行,直接返回
  187. if (fsm->IsManual() && (1==fsm->m_nIntallPackType))
  188. {
  189. UpgradeRun::UpgradeDoneEvent e = {};
  190. e.strPackName = fsm->m_strInstallPack;
  191. e.error = rc;
  192. e.bSysInstall = true;
  193. e.strComment = "手动升级";
  194. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);
  195. fsm->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  196. return;
  197. }
  198. }
  199. else
  200. {
  201. fsm->DeleteInstallingPack();//删除解压失败的安装包,下次升级重新下载
  202. UpgradeRun::UpgradeDoneEvent e = {};
  203. e.strPackName = fsm->m_strInstallPack;
  204. e.error = rc;
  205. e.strComment = "解压失败";
  206. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);
  207. LogError(Severity_Low, rc, ERROR_UPGRADERUN_ZIP_UNZIP_FAIL, CSimpleStringA::Format("unzip pack [%s] fail", (const char*)fsm->m_strInstallPack));
  208. fsm->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  209. return;
  210. }
  211. }
  212. else
  213. {
  214. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("unkown pack format, [%s]", (const char*)fsm->m_strInstallPack));
  215. fsm->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  216. return;
  217. }
  218. fsm->ScheduleTimer(1, 3000);
  219. }
  220. };
  221. struct InstallPackTask : ITaskSp
  222. {
  223. explicit InstallPackTask(CUpgradeRunFSM *pFSM)
  224. : m_pFSM(pFSM) {}
  225. CUpgradeRunFSM *m_pFSM;
  226. virtual void Process()
  227. {
  228. auto pEntity = m_pFSM->GetEntityBase();
  229. bool bSysInstall = false;
  230. bool bLightPack = false;
  231. CSimpleStringA strNewVer;
  232. CSimpleStringA strErrMsg = "安装成功";
  233. auto rc = m_pFSM->InstallPack(bSysInstall, bLightPack, strNewVer, strErrMsg);
  234. // 系统外升级单独线程异步执行,返回成功不表示升级完成
  235. if (!bSysInstall || rc != Error_Succeed)
  236. {
  237. UpgradeRun::UpgradeDoneEvent e = {};
  238. e.strPackName = m_pFSM->m_strInstallPack;
  239. e.error = rc;
  240. e.bLightPack = bLightPack;
  241. e.bSysInstall = bSysInstall;
  242. e.strNewVersion = strNewVer;
  243. e.strComment = strErrMsg;
  244. if (rc == Error_Succeed)
  245. {
  246. Dbg("install pack [%s] succeed", (const char*)m_pFSM->m_strInstallPack);
  247. }
  248. else
  249. {
  250. LogError(Severity_Low, rc, ERROR_UPGRADERUN_INSTALL_PACK_FAIL, CSimpleStringA::Format("install pack [%s] fail", (const char*)m_pFSM->m_strInstallPack));
  251. if (!bLightPack && !bSysInstall)
  252. {
  253. Dbg("delete temp new version dir");
  254. CSimpleStringA strRootVerPath;
  255. pEntity->GetFunction()->GetPath("RootVer", strRootVerPath);
  256. CSimpleStringA strNewVerPath = CSimpleStringA::Format("%s\\%s", (const char*)strRootVerPath, (const char*)strNewVer);
  257. if (ExistsDirA(strNewVerPath))
  258. {
  259. RemoveDirRecursiveA(strNewVerPath);
  260. }
  261. }
  262. }
  263. // 删除临时解压目录
  264. m_pFSM->DeleteUnzipDir();
  265. m_pFSM->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  266. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);//modify by zl 20190905,全部处理完再发事件,否则会导致UpgradeRun和UpgradeMgr两个状态机不同步
  267. }
  268. }
  269. };
  270. }
  271. // 每次暂停之后当前步骤要重做一次
  272. void CUpgradeRunFSM::s3_on_entry()
  273. {
  274. // 检查安装包状态
  275. assert(!m_strInstallPack.IsNullOrEmpty());
  276. assert(m_chInstallState != 'I');
  277. if (m_chInstallState == 'N') // 新安装包
  278. {
  279. //另起线程解压,防止解压超时
  280. Task::UnzipTask* task = new Task::UnzipTask(this);
  281. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  282. }
  283. }
  284. void CUpgradeRunFSM::s3_on_exit()
  285. {
  286. //解决sonar扫描问题
  287. }
  288. unsigned int CUpgradeRunFSM::s3_on_event(FSMEvent* event)
  289. {
  290. if (event->iEvt == Event_DisableUpgrade)
  291. {
  292. LOG_TRACE("pause upgrade pack: [%s]", (const char*)m_strInstallPack);
  293. }
  294. else if (event->iEvt == Event_StartUpgrade)
  295. {
  296. StartUpgradeEvent *pEvent = (StartUpgradeEvent*)event;
  297. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("pack [%s] is installing now, refuse upgrade pack [%s]",
  298. (const char*)m_strInstallPack, (const char*)pEvent->strPackName));
  299. return 1;
  300. }
  301. else if (event->iEvt == Event_EndUpgrade)
  302. {
  303. m_strInstallPack.Clear();
  304. m_chInstallState = 'N';
  305. }
  306. else if (event->iEvt == EVT_TIMER)
  307. {
  308. if (m_chInstallState == 'Z') // 已解压
  309. {
  310. // 检查安装配置文件
  311. CAutoArray<CSimpleStringA> coverlist;
  312. CSimpleStringA strErrMsg = "检查通过";
  313. auto rc = CheckInstallConfig(coverlist, strErrMsg);
  314. // 广播检查结果
  315. UpgradeCheckEvent e = {};
  316. e.error = rc;
  317. e.coverList = coverlist;
  318. e.strPackName = m_strInstallPack;
  319. e.strComment = strErrMsg;
  320. ((CUpgradeRunEntity*)m_pEntity)->BroadcastUpgradeCheckEvent(e);
  321. if (rc == Error_Succeed)
  322. {
  323. LOG_TRACE("pack [%s] install check passed", (const char*)m_strInstallPack);
  324. m_chInstallState = 'C';
  325. }
  326. else
  327. {
  328. LogError(Severity_Low, rc, ERROR_UPGRADERUN_INSTALL_CHECK_FAIL, CSimpleStringA::Format("pack [%s] install check not pass", (const char*)m_strInstallPack));
  329. // 删除临时解压目录
  330. DeleteUnzipDir();
  331. PostEventFIFO(new FSMEvent(Event_EndUpgrade));
  332. return 1;
  333. }
  334. }
  335. if (m_chInstallState == 'C') // 已检查
  336. {
  337. //另起线程安装,防止安装超时
  338. Task::InstallPackTask* task = new Task::InstallPackTask(this);
  339. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  340. m_chInstallState = 'I';
  341. //bool bSysInstall = false;
  342. //bool bLightPack = false;
  343. //CSimpleStringA strNewVer;
  344. //CSimpleStringA strErrMsg = "安装成功";
  345. //auto rc = InstallPack(bSysInstall, bLightPack, strNewVer, strErrMsg);
  346. //// 系统外升级单独线程异步执行,返回成功不表示升级完成
  347. //if (!bSysInstall || rc != Error_Succeed)
  348. //{
  349. // UpgradeRun::UpgradeDoneEvent e = {};
  350. // e.strPackName = m_strInstallPack;
  351. // e.error = rc;
  352. // e.bLightPack = bLightPack;
  353. // e.bSysInstall = bSysInstall;
  354. // e.strNewVersion = strNewVer;
  355. // e.strComment = strErrMsg;
  356. // ((CUpgradeRunEntity*)m_pEntity)->BroadcastUpgradeDoneEvent(e);
  357. // if (rc == Error_Succeed)
  358. // {
  359. // Dbg("install pack [%s] succeed", (const char*)m_strInstallPack);
  360. // }
  361. // else
  362. // {
  363. // LogError(Severity_Low, rc, 0, CSimpleStringA::Format("install pack [%s] fail", (const char*)m_strInstallPack));
  364. // if (!bLightPack && !bSysInstall)
  365. // {
  366. // Dbg("delete temp new version dir");
  367. // CSimpleStringA strRootVerPath;
  368. // m_pEntity->GetFunction()->GetPath("RootVer", strRootVerPath);
  369. // CSimpleStringA strNewVerPath = CSimpleStringA::Format("%s\\%s", (const char*)strRootVerPath, (const char*)strNewVer);
  370. // if (ExistsDirA(strNewVerPath))
  371. // {
  372. // RemoveDirRecursiveA(strNewVerPath);
  373. // }
  374. // }
  375. // }
  376. // // 删除临时解压目录
  377. // DeleteUnzipDir();
  378. // PostEventFIFO(new FSMEvent(Event_EndUpgrade));
  379. // return 1;
  380. //}
  381. }
  382. ScheduleTimer(1, 1000);
  383. }
  384. return 0;
  385. }
  386. ErrorCodeEnum CUpgradeRunFSM::DeleteUnzipDir()
  387. {
  388. assert(!m_strInstallPack.IsNullOrEmpty());
  389. CSimpleStringA strUnzipPath;
  390. auto rc = GetUnzipTempDir(strUnzipPath);
  391. // 如目标目录存在,则先删除
  392. if (rc == Error_Succeed && ExistsDirA(strUnzipPath))
  393. {
  394. RemoveDirRecursiveA(strUnzipPath);
  395. Dbg("remove unzip temp dir: [%s]", (const char*)strUnzipPath);
  396. }
  397. return rc;
  398. }
  399. ErrorCodeEnum CUpgradeRunFSM::CheckInstallPackSign()
  400. {
  401. assert(!m_strInstallPack.IsNullOrEmpty());
  402. int nVerifyCodeSign = 0;
  403. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  404. CSmartPointer<IConfigInfo> spConfig;
  405. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  406. if (Error_Succeed == Error)
  407. {
  408. Error = spConfig->ReadConfigValueInt("SpBase", "VerifyCodeSign", nVerifyCodeSign);
  409. if (Error_Succeed == Error)
  410. {
  411. Dbg("get VerifyCodeSign[%d] from CenterSetting.ini", nVerifyCodeSign);
  412. }
  413. else
  414. {
  415. Dbg("get VerifyCodeSign from CenterSetting.ini failed");
  416. }
  417. }
  418. if (nVerifyCodeSign == 0)
  419. {
  420. Dbg("VerifyCodeSign flag is 0 or not exsit,ignore code signature");
  421. return Error_Succeed;
  422. }
  423. CSimpleStringA strDownloadsPath;
  424. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  425. assert(rc == Error_Succeed);
  426. CSimpleStringA strCabFile = CSimpleStringA::Format("%s\\%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  427. //验证签名
  428. CSimpleStringA strErrMsg;
  429. rc = m_pEntity->GetFunction()->VerifySignature(strCabFile, strErrMsg);
  430. if (rc != Error_Succeed)
  431. {
  432. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strCabFile));
  433. return Error_Unexpect;
  434. }
  435. return Error_Succeed;
  436. }
  437. bool CUpgradeRunFSM::IsManual()
  438. {
  439. CSimpleStringA strConfigPath;
  440. auto rc = GetInstallConfigPath(strConfigPath);
  441. assert(rc == Error_Succeed);
  442. // 检查文件是否存在
  443. #ifdef RVC_OS_WIN
  444. DWORD attr = GetFileAttributesA(strConfigPath);
  445. Dbg("check install config: %s, attr[0x%08X]", (const char*)strConfigPath, attr);
  446. if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  447. {
  448. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("install config [%s] not exists",
  449. (const char*)strConfigPath));
  450. return false;
  451. }
  452. #else
  453. if (!ExistsFileA(strConfigPath))
  454. {
  455. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("install config [%s] not exists",
  456. (const char*)strConfigPath));
  457. return false;
  458. }
  459. #endif // RVC_OS_WIN
  460. // InstallType=manual
  461. char *p = inifile_read_str(strConfigPath, "Precondition", "InstallType", "");
  462. CSimpleStringA strInstallType = p;
  463. toolkit_free(p);
  464. if (!strInstallType.IsNullOrEmpty())
  465. {
  466. return (strInstallType.Compare("manual",true)==0)?true:false;
  467. }
  468. return false;
  469. }
  470. ErrorCodeEnum CUpgradeRunFSM::NewUnzipPack()
  471. {
  472. //assert(!m_strInstallPack.IsNullOrEmpty());
  473. //// 设定解压临时目录
  474. //char szOldPath[MAX_PATH] = {};
  475. //GetCurrentDirectoryA(MAX_PATH, szOldPath);
  476. //CSimpleStringA strDownloadsPath;
  477. //auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  478. //assert(rc == Error_Succeed);
  479. //CSimpleStringA strUnzipPath;
  480. //rc = GetUnzipTempDir(strUnzipPath);
  481. //assert(rc == Error_Succeed);
  482. //// 如目标目录存在,则先删除
  483. //if (ExistsDirA(strUnzipPath))
  484. //{
  485. // RemoveDirRecursiveA(strUnzipPath);
  486. //}
  487. //// 创建临时解压目录
  488. //CreateDirectoryA(strUnzipPath, NULL);
  489. //SetCurrentDirectoryA(strUnzipPath);
  490. //CSimpleStringA strZipFile = CSimpleStringA::Format("%s\\%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  491. ////将路径转为TCHAR类型
  492. //int iUnicode = MultiByteToWideChar(CP_ACP, 0, strZipFile.GetData(), strZipFile.GetLength(), NULL, 0);
  493. //WCHAR* pwUnicode = new WCHAR[iUnicode + 2];
  494. //if (pwUnicode)
  495. //{
  496. // ZeroMemory(pwUnicode, iUnicode + 2);
  497. //}
  498. //MultiByteToWideChar(CP_ACP, 0, strZipFile.GetData(), strZipFile.GetLength(), pwUnicode, iUnicode);
  499. //pwUnicode[iUnicode] = '\0';
  500. //pwUnicode[iUnicode+1] = '\0';
  501. ////解压文件
  502. ////SetCurrentDirectoryA(strdec.c_str());//将进程的工作目录移动到该参数所指的目录下,该目录为winrar.exe的默认文件路径
  503. ////解压文件会直接在项目的.vcproj目录下进行
  504. ////HZIP hz = OpenZip(pwUnicode,0);
  505. //HZIP hz = OpenZip("C:\\rvc\\Downloads\\a845816b53f24aff_test2019030601.zip",0);
  506. //ZIPENTRY ze;
  507. //auto zrc = GetZipItem(hz,-1,&ze);
  508. //assert(zrc == ZR_OK);
  509. //int numitems = ze.index;
  510. //for (int zi = 0; zi < numitems; zi++)
  511. //{
  512. // ZIPENTRY ze;
  513. // zrc = GetZipItem(hz, zi, &ze);
  514. // assert(zrc == ZR_OK);
  515. // zrc = UnzipItem(hz, zi,ze.name);
  516. // assert(zrc == ZR_OK);
  517. // Dbg("unzip [%s] item succeed", ze.name);
  518. //}
  519. //CloseZip(hz);
  520. //// 恢复当前目录
  521. //SetCurrentDirectoryA(szOldPath);
  522. return Error_Succeed;
  523. }
  524. ErrorCodeEnum CUpgradeRunFSM::UnzipPack()
  525. {
  526. #ifdef RVC_OS_WIN
  527. assert(!m_strInstallPack.IsNullOrEmpty());
  528. // 设定解压临时目录
  529. char szOldPath[MAX_PATH] = {};
  530. GetCurrentDirectoryA(MAX_PATH, szOldPath);
  531. CSimpleStringA strDownloadsPath;
  532. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  533. assert(rc == Error_Succeed);
  534. CSimpleStringA strUnzipPath;
  535. rc = GetUnzipTempDir(strUnzipPath);
  536. assert(rc == Error_Succeed);
  537. // 如目标目录存在,则先删除
  538. if (ExistsDirA(strUnzipPath))
  539. {
  540. RemoveDirRecursiveA(strUnzipPath);
  541. }
  542. // 创建临时解压目录
  543. CreateDirectoryA(strUnzipPath, NULL);
  544. SetCurrentDirectoryA(strUnzipPath);
  545. // 解压
  546. CSimpleStringA strZipFile = CSimpleStringA::Format("%s\\%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  547. DWORD attr = GetFileAttributesA(strZipFile);
  548. if (attr == INVALID_FILE_ATTRIBUTES)
  549. {
  550. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("pack [%s] not exists", (const char*)m_strInstallPack));
  551. return Error_NotExist;
  552. }
  553. HZIP hz = OpenZip((void*)(const char*)strZipFile,0,ZIP_FILENAME);
  554. if (hz == 0)
  555. {
  556. SetCurrentDirectoryA(szOldPath);
  557. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("open zip file [%s] fail", (const char*)m_strInstallPack));
  558. return Error_Unexpect;
  559. }
  560. ZIPENTRY ze;
  561. auto zrc = GetZipItemA(hz,-1,&ze);
  562. assert(zrc == ZR_OK);
  563. int numitems=ze.index;
  564. for (int i=0; i<numitems; i++)
  565. {
  566. zrc = GetZipItemA(hz,i,&ze);
  567. assert(zrc == ZR_OK);
  568. UnzipItem(hz,i,ze.name,0,ZIP_FILENAME);
  569. assert(zrc == ZR_OK);
  570. Dbg("unzip [%s] item succeed", ze.name);
  571. }
  572. CloseZip(hz);
  573. // 恢复当前目录
  574. SetCurrentDirectoryA(szOldPath);
  575. return Error_Succeed;
  576. #else
  577. assert(!m_strInstallPack.IsNullOrEmpty());
  578. CSimpleStringA strDownloadsPath;
  579. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  580. assert(rc == Error_Succeed);
  581. CSimpleStringA strUnzipPath;
  582. rc = GetUnzipTempDir(strUnzipPath);
  583. assert(rc == Error_Succeed);
  584. // 如目标目录存在,则先删除
  585. if (ExistsDirA(strUnzipPath))
  586. {
  587. if (!RemoveDirRecursiveA(strUnzipPath)) {
  588. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("remove old unzip dir [%s] fail", strUnzipPath.GetData()));
  589. return Error_NotExist;
  590. }
  591. }
  592. // 创建临时解压目录
  593. CreateDirA(strUnzipPath.GetData(), false);
  594. // 解压
  595. CSimpleStringA strZipFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  596. string zipFileStr = strZipFile.GetData();
  597. string zipTempDir = strUnzipPath.GetData();
  598. if (!ExistsFileA(strZipFile.GetData()))
  599. {
  600. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("pack [%s] not exists", (const char*)m_strInstallPack));
  601. return Error_NotExist;
  602. }
  603. if (UnZipToDir(zipFileStr, zipTempDir)!=0)
  604. {
  605. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("unzip pack [%s] fail", (const char*)m_strInstallPack));
  606. return Error_NotExist;
  607. }
  608. return Error_Succeed;
  609. #endif
  610. }
  611. ErrorCodeEnum CUpgradeRunFSM::UncabPack()
  612. {
  613. #ifdef RVC_OS_WIN
  614. assert(!m_strInstallPack.IsNullOrEmpty());
  615. // 设定解压临时目录
  616. char szOldPath[MAX_PATH] = {};
  617. GetCurrentDirectoryA(MAX_PATH, szOldPath);
  618. CSimpleStringA strDownloadsPath;
  619. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  620. assert(rc == Error_Succeed);
  621. CSimpleStringA strUnzipPath;
  622. rc = GetUnzipTempDir(strUnzipPath);
  623. assert(rc == Error_Succeed);
  624. // 如目标目录存在,则先删除
  625. if (ExistsDirA(strUnzipPath))
  626. {
  627. RemoveDirRecursiveA(strUnzipPath);
  628. }
  629. // 创建临时解压目录
  630. CreateDirectoryA(strUnzipPath, NULL);
  631. SetCurrentDirectoryA(strUnzipPath);
  632. // 解压
  633. CSimpleStringA strZipFile = CSimpleStringA::Format("%s\\%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  634. DWORD attr = GetFileAttributesA(strZipFile);
  635. if (attr == INVALID_FILE_ATTRIBUTES)
  636. {
  637. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("pack [%s] not exists", (const char*)m_strInstallPack));
  638. return Error_NotExist;
  639. }
  640. CSimpleStringA strCmd;
  641. CSimpleStringA strBinFath;
  642. rc = m_pEntity->GetFunction()->GetPath("Bin", strBinFath);
  643. assert(rc == Error_Succeed);
  644. //先进入目标目录"D:\cabarc.exe -p -r X a\ D:\a.cab *.* D:\a\"
  645. strCmd = CSimpleStringA::Format(("%s\\cabarc.exe -p -r X %s *.* %s\\"), (const char*)strBinFath, (const char*)strZipFile, (const char*)strUnzipPath);
  646. Dbg("解压cab命令:%s", strCmd);
  647. DWORD dwRet = SYSTEM_ON(strCmd, TRUE);
  648. if (0 != dwRet)
  649. {
  650. Dbg("%s解压cab失败", strZipFile);
  651. rc = Error_Unexpect;
  652. }
  653. else
  654. {
  655. Dbg("%s解压cab成功", strZipFile);
  656. }
  657. SetCurrentDirectoryA(szOldPath);
  658. return rc;
  659. #endif // RVC_OS_WIN
  660. return Error_Exception;
  661. }
  662. ErrorCodeEnum CUpgradeRunFSM::DeleteInstallingPack()
  663. {
  664. assert(!m_strInstallPack.IsNullOrEmpty());
  665. CSimpleStringA strDownloadsPath;
  666. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  667. assert(rc == Error_Succeed);
  668. CSimpleStringA strZipFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  669. #ifdef RVC_OS_WIN
  670. DWORD attr = GetFileAttributesA(strZipFile);
  671. if (attr == INVALID_FILE_ATTRIBUTES)
  672. {
  673. Dbg("pack [%s] not exists", strZipFile);
  674. return Error_Succeed;
  675. }
  676. if (DeleteFileA(strZipFile))
  677. {
  678. Dbg("delete %s success", strZipFile);
  679. }
  680. else
  681. {
  682. Dbg("delete %s failed", strZipFile);
  683. }
  684. #else
  685. if (!ExistsFileA(strZipFile.GetData()))
  686. {
  687. Dbg("pack [%s] not exists", strZipFile);
  688. return Error_Succeed;
  689. }
  690. if (RemoveFileA(strZipFile.GetData()))
  691. {
  692. Dbg("delete %s success", strZipFile.GetData());
  693. }
  694. else
  695. {
  696. Dbg("delete %s failed", strZipFile.GetData());
  697. }
  698. #endif // RVC_OS_WIN
  699. // 删除临时解压目录
  700. DeleteUnzipDir();
  701. return Error_Succeed;
  702. }
  703. DWORD CUpgradeRunFSM::waitSystem(const CSimpleStringA cmd, const CSimpleStringA par, BOOL nShow)
  704. {
  705. #ifdef RVC_OS_WIN
  706. SHELLEXECUTEINFOA ShExecInfo = { 0 };
  707. ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  708. ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
  709. ShExecInfo.hwnd = NULL;
  710. ShExecInfo.lpVerb = NULL;
  711. ShExecInfo.lpFile = cmd; //调用的程序名
  712. ShExecInfo.lpParameters = par; //调用程序的命令行参数
  713. ShExecInfo.lpDirectory = NULL;
  714. ShExecInfo.nShow = nShow ? SW_SHOW : SW_HIDE; //窗口状态为隐藏
  715. ShExecInfo.hInstApp = NULL;
  716. if (!ShellExecuteEx(&ShExecInfo))
  717. {
  718. Dbg("ShellExecuteEx failed %d", GetLastError());
  719. return GetLastError();
  720. }
  721. //等到该进程结束,如果120s没解压结束,强行杀死进程
  722. if (WaitForSingleObject(ShExecInfo.hProcess, 120000) == WAIT_TIMEOUT)
  723. {
  724. if (!TerminateProcess(ShExecInfo.hProcess, 0))
  725. {
  726. return GetLastError();
  727. }
  728. return -1;
  729. }
  730. DWORD exitCode = 0;
  731. if (!GetExitCodeProcess(ShExecInfo.hProcess, &exitCode))
  732. {
  733. return GetLastError();
  734. }
  735. //Sleep(100);
  736. return exitCode;
  737. #endif // RVC_OS_WIN
  738. return -1;
  739. }
  740. DWORD CUpgradeRunFSM::SYSTEM_ON(CSimpleStringA cmdLine, BOOL isWait)
  741. {
  742. UINT result = 0;
  743. CSimpleStringA strCmd, strPar;
  744. strPar = CSimpleStringA::Format(("/c %s >cmd.log 2>&1"), cmdLine);
  745. strCmd = CSimpleStringA::Format(("cmd %s >cmd.log 2>&1"), strPar);
  746. //result = WinExec(strCmd.GetData(), SW_HIDE);
  747. return waitSystem("cmd.exe", strPar, FALSE);
  748. //return result > 31 ? ERROR_SUCCESS : result + 31;
  749. //return result > 31 ? TRUE : FALSE;
  750. // //char tempCmd[2048];
  751. // //CStringToMultiByte(strCmd, tempCmd, strCmd.GetLength() + 1);
  752. //#ifdef DEBUG
  753. // //result = system(cmdLine);
  754. // //return result;
  755. // return waitSystem(_T("cmd.exe"), strPar, FALSE);
  756. //#else
  757. // if (isWait)
  758. // {
  759. // return waitSystem(("cmd.exe"), strPar, FALSE);
  760. // }
  761. // else
  762. // {
  763. // result = WinExec(strCmd.GetData(), SW_HIDE);
  764. // //return result > 31 ? ERROR_SUCCESS : result + 31;
  765. // return result > 31 ? ERROR_SUCCESS : result;
  766. // }
  767. //#endif
  768. }
  769. ErrorCodeEnum CUpgradeRunFSM::GetUnzipTempDir(CSimpleStringA &strUnzipDir)
  770. {
  771. CSimpleStringA strDownloadsPath;
  772. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  773. assert(rc == Error_Succeed);
  774. strUnzipDir = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  775. if (strUnzipDir.IsEndWith(".zip") || strUnzipDir.IsEndWith(".cab"))
  776. strUnzipDir = strUnzipDir.SubString(0, strUnzipDir.GetLength()-4);
  777. return Error_Succeed;
  778. }
  779. ErrorCodeEnum CUpgradeRunFSM::GetInstallConfigPath(CSimpleStringA &strConfigPath)
  780. {
  781. CSimpleStringA strUnzipPath;
  782. auto rc = GetUnzipTempDir(strUnzipPath);
  783. assert(rc == Error_Succeed);
  784. strConfigPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "Run.ini", (const char*)strUnzipPath);
  785. return Error_Succeed;
  786. }
  787. ErrorCodeEnum CUpgradeRunFSM::CheckInstallConfig(CAutoArray<CSimpleStringA> &coverlist, CSimpleStringA &strErrMsg)
  788. {
  789. CSimpleStringA strConfigPath;
  790. auto rc = GetInstallConfigPath(strConfigPath);
  791. assert(rc == Error_Succeed);
  792. // 检查文件是否存在
  793. #ifdef RVC_OS_WIN
  794. DWORD attr = GetFileAttributesA(strConfigPath);
  795. Dbg("check install config: %s", (const char*)strConfigPath);
  796. //assert((attr != INVALID_FILE_ATTRIBUTES) && !(attr & FILE_ATTRIBUTE_DIRECTORY));
  797. if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  798. {
  799. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("install config [%s] not exists",
  800. (const char*)strConfigPath));
  801. strErrMsg = "run.ini不存在";
  802. return Error_Unexpect;
  803. }
  804. #else
  805. Dbg("check install config: %s", (const char*)strConfigPath);
  806. if (!ExistsFileA(strConfigPath.GetData()))
  807. {
  808. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("install config [%s] not exists",
  809. (const char*)strConfigPath));
  810. strErrMsg = "run.ini不存在";
  811. return Error_Unexpect;
  812. }
  813. #endif // RVC_OS_WIN
  814. CSystemStaticInfo sysInfo;
  815. ZeroMemory(&sysInfo, sizeof(sysInfo));
  816. rc = m_pEntity->GetFunction()->GetSystemStaticInfo(sysInfo);
  817. assert(rc == Error_Succeed);
  818. // MachineType=RVC.Standard,RVC.Wall
  819. char *p = inifile_read_str(strConfigPath, "Precondition", "MachineType", "");
  820. CSimpleStringA strMachineType = p;
  821. toolkit_free(p);
  822. if (!strMachineType.IsNullOrEmpty())
  823. {
  824. bool bMatch = strMachineType.IndexOf(sysInfo.strMachineType) >=0;
  825. if (!bMatch)
  826. {
  827. LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("machine type mismatch, config: [%s], current: [%s]",
  828. (const char*)strMachineType, (const char*)sysInfo.strMachineType));
  829. strErrMsg = CSimpleStringA::Format("机型不匹配(配置:%s, 当前:%s)", (const char*)strMachineType, (const char*)sysInfo.strMachineType);
  830. return Error_NotMeetCondition;
  831. }
  832. }
  833. // MachineVersion=1.0-
  834. p = inifile_read_str(strConfigPath, "Precondition", "MachineVersion", "");
  835. CSimpleStringA strMachineVersion = p;
  836. toolkit_free(p);
  837. if (!strMachineVersion.IsNullOrEmpty())
  838. {
  839. CVersion CurMachineVersion(sysInfo.MachineVersion.GetMajor(), sysInfo.MachineVersion.GetMinor());
  840. bool bMatch = false;
  841. DWORD dwMajor1(0), dwMinor1(0);
  842. int n = sscanf(strMachineVersion, "%d.%d", &dwMajor1, &dwMinor1);
  843. CVersion beginVersion(dwMajor1, dwMinor1);
  844. auto list = strMachineVersion.Split('-');
  845. if (list.GetCount() >= 2)
  846. {
  847. DWORD dwMajor2(0), dwMinor2(0);
  848. n = sscanf(list[1], "%d.%d", &dwMajor2, &dwMinor2);
  849. CVersion endVersion(dwMajor2, dwMinor2);
  850. bMatch = CurMachineVersion >= beginVersion && CurMachineVersion <= endVersion;
  851. }
  852. else
  853. {
  854. if (strMachineVersion.IsEndWith("-"))
  855. bMatch = CurMachineVersion >= beginVersion;
  856. else
  857. bMatch = CurMachineVersion == beginVersion;
  858. }
  859. if (!bMatch)
  860. {
  861. LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("machine version mismatch, config: [%s], current: [%s]",
  862. (const char*)strMachineVersion, (const char*)sysInfo.MachineVersion.ToString()));
  863. strErrMsg = CSimpleStringA::Format("硬件版本不匹配(配置:%s, 当前:%s)", (const char*)strMachineVersion, (const char*)sysInfo.MachineVersion.ToString());
  864. return Error_NotMeetCondition;
  865. }
  866. }
  867. // SoftwareVersion=1.1.1-1.2.1
  868. p = inifile_read_str(strConfigPath, "Precondition", "SoftwareVersion", "");
  869. CSimpleStringA strSoftwareVersion = p;
  870. toolkit_free(p);
  871. if (!strSoftwareVersion.IsNullOrEmpty())
  872. {
  873. CVersion CurSoftwareVersion(sysInfo.InstallVersion.GetMajor(), sysInfo.InstallVersion.GetMinor(), sysInfo.InstallVersion.GetRevision(), 0);
  874. bool bMatch = false;
  875. DWORD dwMajor1(0), dwMinor1(0), dwRevision1(0);
  876. int n = sscanf(strSoftwareVersion, "%d.%d.%d", &dwMajor1, &dwMinor1, &dwRevision1);
  877. CVersion beginVersion(dwMajor1, dwMinor1, dwRevision1, 0);
  878. auto list = strSoftwareVersion.Split('-');
  879. if (list.GetCount() >= 2)
  880. {
  881. DWORD dwMajor2(0), dwMinor2(0), dwRevision2(0);
  882. n = sscanf(list[1], "%d.%d.%d", &dwMajor2, &dwMinor2, &dwRevision2);
  883. CVersion endVersion(dwMajor2, dwMinor2, dwRevision2, 0);
  884. bMatch = CurSoftwareVersion >= beginVersion && CurSoftwareVersion <= endVersion;
  885. }
  886. else
  887. {
  888. if (strSoftwareVersion.IsEndWith("-"))
  889. bMatch = CurSoftwareVersion >= beginVersion;
  890. else
  891. bMatch = CurSoftwareVersion == beginVersion;
  892. }
  893. if (!bMatch)
  894. {
  895. LogError(Severity_Low, Error_NotMeetCondition, 0, (const char*)CSimpleStringA::Format("software version mismatch, config: [%s], current: [%s]",
  896. (const char*)strSoftwareVersion, (const char*)sysInfo.InstallVersion.ToString()));
  897. strErrMsg = CSimpleStringA::Format("终端版本不匹配(配置:%s, 当前:%s)", (const char*)strSoftwareVersion, (const char*)sysInfo.InstallVersion.ToString());
  898. return Error_NotMeetCondition;
  899. }
  900. }
  901. // OSVersion=6.1
  902. p = inifile_read_str(strConfigPath, "Precondition", "OSVersion", "");
  903. CSimpleStringA strOSVersion = p;
  904. toolkit_free(p);
  905. //if (!strOSVersion.IsNullOrEmpty())
  906. //{
  907. // OSVERSIONINFO osvi;
  908. // ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  909. // osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  910. // GetVersionEx(&osvi);
  911. // CVersion osVersion(osvi.dwMajorVersion, osvi.dwMinorVersion);
  912. // DWORD dwMajor1(0), dwMinor1(0);
  913. // int n = sscanf(strOSVersion, "%d.%d", &dwMajor1, &dwMinor1);
  914. // CVersion beginVersion(dwMajor1, dwMinor1);
  915. // bool bMatch = false;
  916. // auto list = strOSVersion.Split('-');
  917. // if (list.GetCount() >= 2)
  918. // {
  919. // DWORD dwMajor2(0), dwMinor2(0);
  920. // n = sscanf(list[1], "%d.%d", &dwMajor2, &dwMinor2);
  921. // CVersion endVersion(dwMajor2, dwMinor2);
  922. // bMatch = osVersion >= beginVersion && osVersion <= endVersion;
  923. // }
  924. // else
  925. // {
  926. // if (strOSVersion.IsEndWith("-"))
  927. // bMatch = osVersion >= beginVersion;
  928. // else
  929. // bMatch = osVersion == beginVersion;
  930. // }
  931. // if (!bMatch)
  932. // {
  933. // LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("OS version mismatch, config: [%s], current: [%s]",
  934. // (const char*)strOSVersion, (const char*)osVersion.ToString()));
  935. // strErrMsg = CSimpleStringA::Format("操作系统版本不匹配(配置:%s, 当前:%s)", (const char*)strOSVersion, (const char*)osVersion.ToString());
  936. // return Error_NotMeetCondition;
  937. // }
  938. //}
  939. if (!strOSVersion.IsNullOrEmpty())
  940. {
  941. DWORD dwMajorVersion(0), dwMinorVersion(0);
  942. if (getOSVersion(dwMajorVersion,dwMinorVersion)) {
  943. CVersion osVersion(dwMajorVersion, dwMinorVersion);
  944. DWORD dwMajor1(0), dwMinor1(0);
  945. int n = sscanf(strOSVersion, "%d.%d", &dwMajor1, &dwMinor1);
  946. CVersion beginVersion(dwMajor1, dwMinor1);
  947. bool bMatch = false;
  948. auto list = strOSVersion.Split('-');
  949. if (list.GetCount() >= 2)
  950. {
  951. DWORD dwMajor2(0), dwMinor2(0);
  952. n = sscanf(list[1], "%d.%d", &dwMajor2, &dwMinor2);
  953. CVersion endVersion(dwMajor2, dwMinor2);
  954. bMatch = osVersion >= beginVersion && osVersion <= endVersion;
  955. }
  956. else
  957. {
  958. if (strOSVersion.IsEndWith("-"))
  959. bMatch = osVersion >= beginVersion;
  960. else
  961. bMatch = osVersion == beginVersion;
  962. }
  963. if (!bMatch)
  964. {
  965. LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("OS version mismatch, config: [%s], current: [%s]",
  966. (const char*)strOSVersion, (const char*)osVersion.ToString()));
  967. strErrMsg = CSimpleStringA::Format("操作系统版本不匹配(配置:%s, 当前:%s)", (const char*)strOSVersion, (const char*)osVersion.ToString());
  968. return Error_NotMeetCondition;
  969. }
  970. }
  971. else{
  972. LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("OS version get fail, config: [%s], current: [0.0.0.0]",
  973. (const char*)strOSVersion));
  974. strErrMsg = CSimpleStringA::Format("操作系统版本获取失败(配置:%s, 当前:0.0.0.0)", (const char*)strOSVersion);
  975. return Error_NotMeetCondition;
  976. }
  977. }
  978. // Device=(HPxx,1.0-),(IBMxx,2.0-3.0)
  979. p = inifile_read_str(strConfigPath, "Precondition", "Device", "");
  980. CSimpleStringA strDevice = p;
  981. toolkit_free(p);
  982. // Depend=upgrade1.zip, upgrade2.zip
  983. p = inifile_read_str(strConfigPath, "Precondition", "Depend", "");
  984. CSimpleStringA strDepend = p;
  985. toolkit_free(p);
  986. if (!strDepend.IsNullOrEmpty())
  987. {
  988. auto list = strDepend.Split(',');
  989. for(int i=0; i<list.GetCount(); i++)
  990. {
  991. auto& strPack = list[i];
  992. //TODO:此处判断需要调用真正的是否安装接口(修改前)
  993. if (!m_pEntity->GetFunction()->IsPackInstalled(strPack))
  994. {
  995. strErrMsg = CSimpleStringA::Format("依赖包[%s]未安装", (const char*)strPack);
  996. LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("depend pack [%s] not installed", (const char*)strPack));
  997. return Error_NotMeetCondition;
  998. }
  999. }
  1000. }
  1001. // Cover=upgrade3.zip, upgrade4.zip
  1002. p = inifile_read_str(strConfigPath, "Precondition", "Cover", "");
  1003. CSimpleStringA strCover = p;
  1004. toolkit_free(p);
  1005. if (!strCover.IsNullOrEmpty())
  1006. {
  1007. coverlist = strCover.Split(',');
  1008. }
  1009. if (!CheckNewRunFilesSign())
  1010. {
  1011. strErrMsg = CSimpleStringA::Format("升级包中dll或exe签名验证失败");
  1012. LogError(Severity_Low, Error_NotMeetCondition, 0, CSimpleStringA::Format("升级包中dll或exe签名验证失败"));
  1013. return Error_NotMeetCondition;
  1014. }
  1015. return Error_Succeed;
  1016. }
  1017. CSimpleStringA CUpgradeRunFSM::GetSysPatchNameFromPackName(const char *pszPackName)
  1018. {
  1019. //操作系统补丁升级包名格式:ServerPack_日期_补丁名
  1020. CSimpleStringA str = pszPackName;
  1021. CSimpleStringA strSysPatchName = "";
  1022. if (!str.IsNullOrEmpty())
  1023. {
  1024. auto arr = str.Split('_');
  1025. if (arr.GetCount() == 3)
  1026. {
  1027. strSysPatchName = arr[2];
  1028. }
  1029. else
  1030. {
  1031. Dbg("升级包名[%s]不符合规范, 必须是:ServerPack_日期_补丁名格式", str);
  1032. }
  1033. }
  1034. return strSysPatchName;
  1035. }
  1036. struct SysPackInstallTask : ITaskSp
  1037. {
  1038. SysPackInstallTask(CUpgradeRunFSM *pFSM, const char *pszPackName, const char *pszSysCustomVer)
  1039. : m_pFSM(pFSM), m_strSysPackName(pszPackName), m_strSysCustomVer(pszSysCustomVer) {}
  1040. CUpgradeRunFSM *m_pFSM;
  1041. CSimpleStringA m_strSysPackName;
  1042. CSimpleStringA m_strSysCustomVer;
  1043. virtual void Process()
  1044. {
  1045. auto pEntity = m_pFSM->GetEntityBase();
  1046. CSimpleStringA strErrMsg;
  1047. CSimpleStringA strVersion;
  1048. Dbg("begin install sys pack: [%s]", (const char*)m_strSysPackName);
  1049. auto rc = pEntity->GetFunction()->GetPrivilegeFunction()->BeginSysPackInstall(m_strSysPackName, strErrMsg);
  1050. Dbg("end install sys pack: [%s], result: %s(%d)", (const char*)m_strSysPackName, (const char*)strErrMsg, rc);
  1051. //获取升级结果
  1052. UpgradeRun::UpgradeDoneEvent e = {};
  1053. if (m_strSysPackName.IsStartWith("SP"))
  1054. {
  1055. //系统补丁
  1056. if (!((CUpgradeRunEntity*)pEntity)->GetServerPackUpgradeResult(m_strSysPackName, strVersion, strErrMsg))
  1057. {
  1058. Dbg("get [%s] ServerPack upgrade result fail, %s", (const char*)m_strSysPackName, (const char*)strErrMsg);
  1059. strErrMsg = "";
  1060. }
  1061. e.strSysPatchName = strVersion;
  1062. }
  1063. else if (m_strSysPackName.IsStartWith("FP"))
  1064. {
  1065. //固件
  1066. if (!((CUpgradeRunEntity*)pEntity)->GetFirmwarePackUpgradeResult(m_strSysPackName, strVersion, strErrMsg))
  1067. {
  1068. Dbg("get [%s] FirmwarePack upgrade result fail, %s", (const char*)m_strSysPackName, (const char*)strErrMsg);
  1069. strErrMsg = "";
  1070. }
  1071. e.strFWID = strVersion;
  1072. }
  1073. else if (m_strSysPackName.IsStartWith("SCP"))
  1074. {
  1075. //系统定制
  1076. e.strNewVersion = m_strSysCustomVer;
  1077. }
  1078. else
  1079. {
  1080. Dbg("unknow pack name[%s]", (const char*)m_strSysPackName);
  1081. }
  1082. e.strPackName = m_strSysPackName;
  1083. e.error = rc;
  1084. e.bLightPack = false;
  1085. e.bSysInstall = true;
  1086. e.strComment = strErrMsg;
  1087. Dbg("end install sys pack: [%s], result: %s(%d)", (const char*)m_strSysPackName, (const char*)strErrMsg, rc);
  1088. // 删除临时解压目录
  1089. m_pFSM->DeleteUnzipDir();//先删除临时目录,再发送Event_EndUpgrade,否则m_strInstallPack被清空后assert(!m_strInstallPack.IsNullOrEmpty())会报异常
  1090. m_pFSM->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  1091. Sleep(2000);
  1092. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e); //modify by lwt 20210207,全部处理完再发事件,否则会导致UpgradeRun和UpgradeMgr两个状态机不同步
  1093. }
  1094. };
  1095. ErrorCodeEnum CUpgradeRunFSM::InstallPack(bool &bSysInstall, bool &bLightPack, CSimpleStringA &strNewVersion, CSimpleStringA &strErrMsg)
  1096. {
  1097. CSimpleStringA strConfigPath;
  1098. auto rc = GetInstallConfigPath(strConfigPath);
  1099. assert(rc == Error_Succeed);
  1100. auto pEntityFunc = m_pEntity->GetFunction();
  1101. assert(pEntityFunc != NULL);
  1102. auto pPrivFunc = pEntityFunc->GetPrivilegeFunction();
  1103. assert(pPrivFunc != NULL);
  1104. CSystemStaticInfo sysInfo;
  1105. ZeroMemory(&sysInfo, sizeof(sysInfo));
  1106. rc = pEntityFunc->GetSystemStaticInfo(sysInfo);
  1107. assert(rc == Error_Succeed);
  1108. // 检查文件是否存在
  1109. #ifdef RVC_OS_WIN
  1110. DWORD attr = GetFileAttributesA(strConfigPath);
  1111. assert((attr != INVALID_FILE_ATTRIBUTES) && !(attr & FILE_ATTRIBUTE_DIRECTORY));
  1112. #else
  1113. if(!ExistsFileA(strConfigPath.GetData()))
  1114. {
  1115. strErrMsg = "run.ini不存在";
  1116. return Error_NotExist;
  1117. }
  1118. #endif // RVC_OS_WIN
  1119. // UpgradeVersion=1.1.2|A
  1120. char *p = inifile_read_str(strConfigPath, "Action", "UpgradeVersion", "");
  1121. CSimpleStringA strUpgradeVersion = p;
  1122. toolkit_free(p);
  1123. // ToRun= autorun.bat
  1124. p = inifile_read_str(strConfigPath, "Action", "ToRun", "");
  1125. CSimpleStringA strToRun = p;
  1126. toolkit_free(p);
  1127. // SysCustomVer=1.4
  1128. p = inifile_read_str(strConfigPath, "Action", "SysCustomVer", "");
  1129. CSimpleStringA strSysCustomVer = p;
  1130. toolkit_free(p);
  1131. // InstallType=auto或manual
  1132. p = inifile_read_str(strConfigPath, "Precondition", "InstallType", "");
  1133. CSimpleStringA strInstallType = p;
  1134. toolkit_free(p);
  1135. bSysInstall = !strToRun.IsNullOrEmpty();
  1136. CVersion latterVersion;
  1137. if (!bSysInstall && strUpgradeVersion.IsNullOrEmpty())
  1138. {
  1139. bLightPack = true;
  1140. }
  1141. else
  1142. {
  1143. bLightPack = false;
  1144. CVersion &curVer = sysInfo.InstallVersion;
  1145. if (strUpgradeVersion == "A")
  1146. {
  1147. latterVersion = CVersion(curVer.GetMajor(), curVer.GetMinor(), curVer.GetRevision(), curVer.GetBuild()+1);
  1148. }
  1149. else
  1150. {
  1151. // 指定版本
  1152. DWORD dwMajor(0), dwMinor(0), dwRevision(0);
  1153. int n = sscanf(strUpgradeVersion, "%d.%d.%d", &dwMajor, &dwMinor, &dwRevision);
  1154. //assert(n == 3);
  1155. if (n < 3)
  1156. {
  1157. strErrMsg = CSimpleStringA::Format("指定升级版本无效(%s)", (const char*)strUpgradeVersion);
  1158. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("specified software version is invalid: [%s]", (const char*)strUpgradeVersion));
  1159. return Error_NotMeetCondition;
  1160. }
  1161. if (dwMajor < curVer.GetMajor()
  1162. || (dwMajor == curVer.GetMajor() && dwMinor < curVer.GetMinor())
  1163. || (dwMajor == curVer.GetMajor() && dwMinor == curVer.GetMinor() && dwRevision <curVer.GetRevision()))
  1164. {
  1165. LogError(Severity_Low, Error_NotMeetCondition, 0,
  1166. CSimpleStringA::Format("specified software version is invalid, config: [%s], current: [%d.%d.%d]",
  1167. (const char*)strUpgradeVersion, curVer.GetMajor(), curVer.GetMinor(), curVer.GetRevision()));
  1168. strErrMsg = CSimpleStringA::Format("指定升级版本无效(配置:%s, 当前:%d.%d.%d)", (const char*)strUpgradeVersion, curVer.GetMajor(), curVer.GetMinor(), curVer.GetRevision());
  1169. return Error_NotMeetCondition;
  1170. }
  1171. if (dwMajor == curVer.GetMajor() && dwMinor == curVer.GetMinor() && dwRevision ==curVer.GetRevision())
  1172. latterVersion = CVersion(dwMajor, dwMinor, dwRevision, curVer.GetBuild()+1);
  1173. else
  1174. latterVersion = CVersion(dwMajor, dwMinor, dwRevision, 1);
  1175. }
  1176. LOG_TRACE("upgraded install version is: [%s]", (const char*)latterVersion.ToString());
  1177. strNewVersion = latterVersion.ToString();
  1178. }
  1179. if (bLightPack)
  1180. {
  1181. rc = pPrivFunc->BeginLightInstall(m_strInstallPack);
  1182. if (rc != Error_Succeed)
  1183. {
  1184. strErrMsg = "轻量升级失败";
  1185. LogError(Severity_Low, Error_Unexpect, ERROR_UPGRADERUN_INSTALL_LIGHTPACK_FAIL, "轻量升级失败");
  1186. return Error_Unexpect;
  1187. }
  1188. //尝试对轻量包文件整体赋权
  1189. return rc;
  1190. }
  1191. else if (bSysInstall)
  1192. {
  1193. // xkm@20161208: 系统外执行改为异步线程池执行
  1194. //strNewVersion = strSysCustomVer; // 存放系统定制版本
  1195. //return pPrivFunc->BeginSysPackInstall(m_strInstallPack);
  1196. ////modify by zl 20170813,通过升级类型判断是否自动升级。如果是手工升级类型
  1197. //bool bManual = (strInstallType.Compare("manual",true)==0)?true:false;
  1198. //if (!bManual)
  1199. //{
  1200. // pEntityFunc->PostThreadPoolTask(new SysPackInstallTask(this, m_strInstallPack, strSysCustomVer));
  1201. //}
  1202. //else
  1203. //{
  1204. // //手工升级直接返回
  1205. // return Error_Succeed;
  1206. //}
  1207. pEntityFunc->PostThreadPoolTask(new SysPackInstallTask(this, m_strInstallPack, strSysCustomVer));
  1208. }
  1209. else
  1210. {
  1211. // 框架升级,建立新目录
  1212. CSimpleStringA strErrInfo = "";
  1213. Dbg("准备开始安装目录,版本[%s],安装包[%s]",(const char*)latterVersion.ToString(),m_strInstallPack.GetData());
  1214. rc = pPrivFunc->CreateInstallNewVersion(latterVersion, m_strInstallPack,strErrInfo);
  1215. if (rc != Error_Succeed)
  1216. {
  1217. Dbg("创建新版本目录失败:%s",strErrInfo.GetData());
  1218. strErrMsg = CSimpleStringA::Format("创建新版本目录失败:%s",strErrInfo.GetData());
  1219. LogError(Severity_Low, Error_Unexpect, ERROR_UPGRADERUN_CREATE_VERSION_FAIL, "create new version directory fail");
  1220. return Error_Unexpect;
  1221. }
  1222. //ToDelete=Run\bin\abc.dll,Data\*.tmp
  1223. p = inifile_read_str(strConfigPath, "Action", "ToDelete", "");
  1224. CSimpleStringA strToDelete = p;
  1225. toolkit_free(p);
  1226. if (!strToDelete.IsNullOrEmpty())
  1227. {
  1228. #ifdef RVC_OS_WIN
  1229. #else
  1230. /*适配linux终端: 转换路径中的‘\’字符成‘/’*/
  1231. Dbg("ToDelete tranfer begin=%s", strToDelete.GetData());
  1232. string tmp = strToDelete.GetData();
  1233. replace(tmp.begin(), tmp.end(), '\\', SPLIT_SLASH);
  1234. strToDelete = tmp.c_str();
  1235. Dbg("ToDelete tranfer end=%s", strToDelete.GetData());
  1236. #endif
  1237. auto list = strToDelete.Split(',');
  1238. for(int i=0; i<list.GetCount(); i++)
  1239. {
  1240. Dbg("delete file [%s] in new version", (const char*)list[i]);
  1241. rc = pPrivFunc->DeleteFileInNewVersion(list[i]);
  1242. }
  1243. }
  1244. //ToCopy= Run\bin\SpShell.exe, Run\dep\*.dll
  1245. p = inifile_read_str(strConfigPath, "Action", "ToCopy", "");
  1246. CSimpleStringA strToCopy = p;
  1247. toolkit_free(p);
  1248. if (!strToCopy.IsNullOrEmpty())
  1249. {
  1250. #ifdef RVC_OS_WIN
  1251. #else
  1252. /*转换路径中的‘\’字符成‘/’*/
  1253. Dbg("ToCopy tranfer begin=%s", strToCopy.GetData());
  1254. string tmp = strToCopy.GetData();
  1255. replace(tmp.begin(), tmp.end(), '\\', SPLIT_SLASH);
  1256. strToCopy = tmp.c_str();
  1257. Dbg("ToCopy tranfer end=%s", strToCopy.GetData());
  1258. #endif
  1259. auto copyList = strToCopy.Split(',');
  1260. for(int i=0; i<copyList.GetCount(); i++)
  1261. {
  1262. auto &file = copyList[i];
  1263. // 通配符检测
  1264. if (file.IndexOf("*") >0)
  1265. {
  1266. CSimpleStringA strUnzipPath;
  1267. GetUnzipTempDir(strUnzipPath);
  1268. auto strFileDir = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)GetFileDirectory(file));
  1269. list<CSimpleStringA> fileList;
  1270. RecursiveGetSubFiles(strFileDir, strFileDir, fileList);//得到文件夹下面所有文件
  1271. CSimpleStringA strFileFilter = _GetFileName(file);//得到过滤条件
  1272. for(auto it = fileList.begin(); it != fileList.end(); it++)
  1273. {
  1274. if (IsFileMatch(strFileFilter, _GetFileName((const char*)(*it))))
  1275. {
  1276. CSimpleStringA strActFileName = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)GetFileDirectory(file), (const char*)(*it));
  1277. Dbg("copy file [%s] matched wildchar name [%s]", (const char*)strActFileName, (const char*)strFileFilter);
  1278. rc = pPrivFunc->CopyFileToNewVersion(strActFileName, 3);
  1279. Dbg("copy file [%s] to new version %s", (const char*)strActFileName, rc == Error_Succeed ? "succeed" : "fail");
  1280. if (rc != Error_Succeed)
  1281. {
  1282. strErrMsg = CSimpleStringA::Format("拷贝文件[%s]失败", (const char*)strActFileName);
  1283. return rc;
  1284. }
  1285. }
  1286. }
  1287. }
  1288. else
  1289. {
  1290. //判断绝对文件名是否存在,因存在智能对比,故此文件不一定存在
  1291. //Dbg("install file is %s",file.GetData());
  1292. CSimpleStringA strDownloadsPath;
  1293. ErrorCodeEnum ece = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  1294. if(ece != Error_Succeed){
  1295. Dbg("InstallPack fail ,get Downloads path is fail ,copy file [%s] fail",file.GetData());
  1296. strErrMsg = CSimpleStringA::Format("拷贝文件[%s]失败", file.GetData());
  1297. return ece;
  1298. }
  1299. CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", strDownloadsPath.GetData(), m_strInstallPack.GetData());
  1300. //Dbg("strUnzipPath is %s",strUnzipPath.GetData());
  1301. if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab")){
  1302. strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength()-4);
  1303. }
  1304. CSimpleStringA strSourceFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", strUnzipPath.GetData(), file.GetData());
  1305. //Dbg("strSourceFile is %s",strSourceFile.GetData());
  1306. if(ExistsFileA(strSourceFile.GetData())){
  1307. //int nCopyMode = inifile_read_int(strConfigPath, GetFileName(file), "CopyMode", 3);
  1308. rc = pPrivFunc->CopyFileToNewVersion(file.GetData(), 3);
  1309. Dbg("copy file [%s] to new version %s", file.GetData(), rc == Error_Succeed ? "succeed" : "fail");
  1310. if (rc != Error_Succeed)
  1311. {
  1312. strErrMsg = CSimpleStringA::Format("拷贝文件[%s]失败", file.GetData());
  1313. return rc;
  1314. }
  1315. }else{
  1316. Dbg("file [%s] is not exist ,ignore copy to new version ",file.GetData());
  1317. }
  1318. }
  1319. }
  1320. //Dbg("total copy %d files", list.GetCount());
  1321. }
  1322. //尝试对新系统版本文件整体赋权
  1323. }
  1324. return rc;
  1325. }
  1326. CSimpleStringA CUpgradeRunFSM::GetFileDirectory(const char *pszFullPath)
  1327. {
  1328. int i=strlen(pszFullPath)-1;
  1329. for( ; i>0 && pszFullPath[i]!=SPLIT_SLASH; i--)NULL;
  1330. return CSimpleStringA(pszFullPath, i);
  1331. }
  1332. CSimpleStringA CUpgradeRunFSM::GetFileName(const char *pszFullPath)
  1333. {
  1334. const char *p = strrchr(pszFullPath, SPLIT_SLASH);
  1335. if (p != NULL)
  1336. {
  1337. return p+1;
  1338. }
  1339. else
  1340. {
  1341. return pszFullPath;
  1342. }
  1343. }
  1344. void CUpgradeRunFSM::RecursiveGetSubFiles(const char *pszDir, const char *pszTrimStart, list<CSimpleStringA>& retList)
  1345. {
  1346. if (!ExistsDirA(pszDir))
  1347. return;
  1348. auto arr = fileutil_get_sub_files(pszDir);
  1349. if (arr != NULL)
  1350. {
  1351. for (int i = 0; i < arr->nelts; ++i)
  1352. {
  1353. char *file = ARRAY_IDX(arr, i, char*);
  1354. if (pszTrimStart != NULL && strnicmp(file, pszTrimStart, strlen(pszTrimStart))==0) {
  1355. file += strlen(pszTrimStart);
  1356. if (*file == SPLIT_SLASH)
  1357. file++;
  1358. }
  1359. retList.push_back(file);
  1360. }
  1361. toolkit_array_free2(arr);
  1362. }
  1363. arr = fileutil_get_sub_dirs(pszDir);
  1364. if (arr != NULL)
  1365. {
  1366. for (int i = 0; i < arr->nelts; ++i)
  1367. {
  1368. char *dir = ARRAY_IDX(arr, i, char*);
  1369. RecursiveGetSubFiles(dir, pszTrimStart, retList);
  1370. }
  1371. toolkit_array_free2(arr);
  1372. }
  1373. }
  1374. bool CUpgradeRunFSM::IsFileMatch(const char *pszFilter, const char *pszFileName)
  1375. {
  1376. const char *p1 = pszFilter;
  1377. const char *p2 = pszFileName;
  1378. if (p1 == NULL)
  1379. return true;
  1380. if (p2 == NULL)
  1381. return false;
  1382. if (*p1 ==NULL && *p2 ==NULL)
  1383. return true;
  1384. else if (*p1 == NULL)
  1385. return false;
  1386. else if (*p2 == NULL)
  1387. {
  1388. // 查找*p1是否全是*
  1389. while(*p1 == '*')
  1390. p1++;
  1391. if (*p1 == NULL)
  1392. return true;
  1393. else
  1394. return false;
  1395. }
  1396. if (*p1 != '*')
  1397. {
  1398. if (tolower(*p1) != tolower(*p2))
  1399. return false;
  1400. else
  1401. return IsFileMatch(p1+1, p2+1);
  1402. }
  1403. else
  1404. {
  1405. while(*++p1 == '*');
  1406. if (*p1 == NULL)
  1407. return true;
  1408. while (*p2)
  1409. {
  1410. while(tolower(*p1) != tolower(*p2) && *++p2);
  1411. if (*p2 == NULL)
  1412. return false;
  1413. if(IsFileMatch(p1+1, p2+1))
  1414. return true;
  1415. p2++;
  1416. }
  1417. return false;
  1418. }
  1419. }
  1420. void getFiles(string path, vector<string>& files)
  1421. {
  1422. #ifdef RVC_OS_WIN
  1423. //查询文件
  1424. //文件句柄
  1425. long hFile = 0;
  1426. //文件信息
  1427. struct _finddata_t fileinfo;
  1428. string p;
  1429. if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
  1430. {
  1431. do
  1432. {
  1433. //如果是目录,迭代之
  1434. //如果不是,加入列表
  1435. if ((fileinfo.attrib & _A_SUBDIR))
  1436. {
  1437. if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
  1438. getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
  1439. }
  1440. else
  1441. {
  1442. files.push_back(p.assign(path).append("\\").append(fileinfo.name));
  1443. }
  1444. } while (_findnext(hFile, &fileinfo) == 0);
  1445. _findclose(hFile);
  1446. }
  1447. #else
  1448. array_header_t* arr_files = fileutil_get_sub_files2_a(path.c_str(),1000);
  1449. if (arr_files)
  1450. {
  1451. int i;
  1452. for (i = 0; i < arr_files->nelts; ++i)
  1453. {
  1454. char* file_path = ARRAY_IDX(arr_files, i, char*);
  1455. string strfilePath = file_path;
  1456. files.push_back(strfilePath);
  1457. }
  1458. toolkit_array_free2(arr_files);
  1459. }
  1460. array_header_t* arr_dir = fileutil_get_sub_dirs_a(path.c_str());
  1461. if (arr_dir) {
  1462. int i;
  1463. for (i = 0; i < arr_dir->nelts; ++i) {
  1464. char* dir_path = ARRAY_IDX(arr_dir, i, char*);
  1465. getFiles(dir_path, files);
  1466. }
  1467. }
  1468. #endif
  1469. }
  1470. bool CUpgradeRunFSM::CheckNewRunFilesSign()
  1471. {
  1472. CSimpleStringA strErrMsg;
  1473. int nVerifyflg = 0;
  1474. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  1475. CSmartPointer<IConfigInfo> spConfig;
  1476. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  1477. if (Error_Succeed == Error)
  1478. {
  1479. Error = spConfig->ReadConfigValueInt("SpBase", "VerifyCodeSign", nVerifyflg);
  1480. if (Error_Succeed == Error)
  1481. {
  1482. Dbg("get VerifyCodeSign[%d] from CenterSetting.ini", nVerifyflg);
  1483. }
  1484. else
  1485. {
  1486. Dbg("get VerifyCodeSign from CenterSetting.ini failed");
  1487. }
  1488. }
  1489. if (0 == nVerifyflg)
  1490. {
  1491. Dbg("VerifyCodeSign flag is 0 or not exsit,ignore code signature");
  1492. return true;
  1493. }
  1494. //TODO:校验升级包中mod和bin目录下所有签名,防止升级后,出现失败无法启动框架或升级实体导致无法自动回滚
  1495. CSimpleStringA strDownloadsPath;
  1496. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  1497. assert(rc == Error_Succeed);
  1498. CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  1499. if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  1500. strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength() - 4);
  1501. CSimpleStringA strDownloadRunPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "Run", (const char*)strUnzipPath);
  1502. string runPath = strDownloadRunPath.GetData();
  1503. vector<string> files;
  1504. getFiles(runPath, files);
  1505. int size = files.size();
  1506. for (int i = 0;i < size;i++)
  1507. {
  1508. CSimpleStringA strFileName = files[i].c_str();
  1509. if (strFileName.IsEndWith(".exe", true) || strFileName.IsEndWith(".dll", true))
  1510. {
  1511. rc = m_pEntity->GetFunction()->VerifySignature(strFileName.GetData(), strErrMsg);
  1512. if (rc != Error_Succeed)
  1513. {
  1514. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", strFileName));
  1515. return false;
  1516. }
  1517. Dbg("%s in pack %s, verify sign success", (const char*)strFileName, (const char*)m_strInstallPack);
  1518. }
  1519. }
  1520. //CSimpleStringA strDownloadsPath;
  1521. //auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  1522. //assert(rc == Error_Succeed);
  1523. //CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s\\%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  1524. //if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  1525. // strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength() - 4);
  1526. //CSimpleStringA strSpShellPath = CSimpleStringA::Format("%s\\Run\\bin\\SpShell.exe", (const char*)strUnzipPath);
  1527. //CSimpleStringA strSpHostPath = CSimpleStringA::Format("%s\\Run\\bin\\SpHost.exe", (const char*)strUnzipPath);
  1528. //CSimpleStringA strSpbasePath = CSimpleStringA::Format("%s\\Run\\bin\\SpBase.dll", (const char*)strUnzipPath);
  1529. //CSimpleStringA strUpgradeManagerPath = CSimpleStringA::Format("%s\\Run\\mod\\mod_UpgradeMgr.dll", (const char*)strUnzipPath);
  1530. //// 检查文件是否存在,存在则校验其签名
  1531. //DWORD attr = GetFileAttributesA(strSpShellPath);
  1532. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1533. //{
  1534. // Dbg("not find %s in pack %s, no need to verify sign", strSpShellPath, m_strInstallPack);
  1535. //}
  1536. //else
  1537. //{
  1538. // rc = m_pEntity->GetFunction()->VerifySignature(strSpShellPath, strErrMsg);
  1539. // if (rc != Error_Succeed)
  1540. // {
  1541. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strSpShellPath));
  1542. // return false;
  1543. // }
  1544. //}
  1545. //attr = GetFileAttributesA(strSpHostPath);
  1546. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1547. //{
  1548. // Dbg("not find %s in pack %s, no need to verify sign", strSpHostPath, m_strInstallPack);
  1549. //}
  1550. //else
  1551. //{
  1552. // rc = m_pEntity->GetFunction()->VerifySignature(strSpHostPath, strErrMsg);
  1553. // if (rc != Error_Succeed)
  1554. // {
  1555. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strSpHostPath));
  1556. // return false;
  1557. // }
  1558. //}
  1559. //attr = GetFileAttributesA(strSpbasePath);
  1560. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1561. //{
  1562. // Dbg("not find %s in pack %s, no need to verify sign", strSpbasePath, m_strInstallPack);
  1563. //}
  1564. //else
  1565. //{
  1566. // rc = m_pEntity->GetFunction()->VerifySignature(strSpbasePath, strErrMsg);
  1567. // if (rc != Error_Succeed)
  1568. // {
  1569. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strSpbasePath));
  1570. // return false;
  1571. // }
  1572. //}
  1573. //
  1574. //attr = GetFileAttributesA(strUpgradeManagerPath);
  1575. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1576. //{
  1577. // Dbg("not find %s in pack %s, no need to verify sign", strUpgradeManagerPath, m_strInstallPack);
  1578. //}
  1579. //else
  1580. //{
  1581. // rc = m_pEntity->GetFunction()->VerifySignature(strUpgradeManagerPath, strErrMsg);
  1582. // if (rc != Error_Succeed)
  1583. // {
  1584. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strUpgradeManagerPath));
  1585. // return false;
  1586. // }
  1587. //}
  1588. return true;
  1589. }
  1590. bool CUpgradeRunFSM::getOSVersion(DWORD &dwMajorVersion, DWORD &dwMinorVersion)
  1591. {
  1592. #ifdef RVC_OS_WIN
  1593. OSVERSIONINFO osvi;
  1594. ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  1595. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  1596. GetVersionEx(&osvi);
  1597. dwMajorVersion = osvi.dwMajorVersion;
  1598. dwMinorVersion = osvi.dwMinorVersion;
  1599. return true;
  1600. #else
  1601. struct utsname kernel_info;
  1602. int ret = uname(&kernel_info);
  1603. if (ret == 0) {
  1604. Dbg("get linux kernel version success: %s", kernel_info.release);
  1605. int n = sscanf((const char*)kernel_info.release, "%d.%d", &dwMajorVersion, &dwMinorVersion);
  1606. return true;
  1607. }
  1608. else {
  1609. Dbg("get linux kernel version fail: %s", strerror(errno));
  1610. return false;
  1611. }
  1612. #endif // RVC_OS_WIN
  1613. }