UpgradeRunFSM.cpp 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885
  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. ((CUpgradeRunEntity*)pEntity)->BroadcastUpgradeDoneEvent(e);
  1089. // 删除临时解压目录
  1090. m_pFSM->DeleteUnzipDir();//先删除临时目录,再发送Event_EndUpgrade,否则m_strInstallPack被清空后assert(!m_strInstallPack.IsNullOrEmpty())会报异常
  1091. m_pFSM->PostEventFIFO(new FSMEvent(CUpgradeRunFSM::Event_EndUpgrade));
  1092. }
  1093. };
  1094. ErrorCodeEnum CUpgradeRunFSM::InstallPack(bool &bSysInstall, bool &bLightPack, CSimpleStringA &strNewVersion, CSimpleStringA &strErrMsg)
  1095. {
  1096. CSimpleStringA strConfigPath;
  1097. auto rc = GetInstallConfigPath(strConfigPath);
  1098. assert(rc == Error_Succeed);
  1099. auto pEntityFunc = m_pEntity->GetFunction();
  1100. assert(pEntityFunc != NULL);
  1101. auto pPrivFunc = pEntityFunc->GetPrivilegeFunction();
  1102. assert(pPrivFunc != NULL);
  1103. CSystemStaticInfo sysInfo;
  1104. ZeroMemory(&sysInfo, sizeof(sysInfo));
  1105. rc = pEntityFunc->GetSystemStaticInfo(sysInfo);
  1106. assert(rc == Error_Succeed);
  1107. // 检查文件是否存在
  1108. #ifdef RVC_OS_WIN
  1109. DWORD attr = GetFileAttributesA(strConfigPath);
  1110. assert((attr != INVALID_FILE_ATTRIBUTES) && !(attr & FILE_ATTRIBUTE_DIRECTORY));
  1111. #else
  1112. if(!ExistsFileA(strConfigPath.GetData()))
  1113. {
  1114. strErrMsg = "run.ini不存在";
  1115. return Error_NotExist;
  1116. }
  1117. #endif // RVC_OS_WIN
  1118. // UpgradeVersion=1.1.2|A
  1119. char *p = inifile_read_str(strConfigPath, "Action", "UpgradeVersion", "");
  1120. CSimpleStringA strUpgradeVersion = p;
  1121. toolkit_free(p);
  1122. // ToRun= autorun.bat
  1123. p = inifile_read_str(strConfigPath, "Action", "ToRun", "");
  1124. CSimpleStringA strToRun = p;
  1125. toolkit_free(p);
  1126. // SysCustomVer=1.4
  1127. p = inifile_read_str(strConfigPath, "Action", "SysCustomVer", "");
  1128. CSimpleStringA strSysCustomVer = p;
  1129. toolkit_free(p);
  1130. // InstallType=auto或manual
  1131. p = inifile_read_str(strConfigPath, "Precondition", "InstallType", "");
  1132. CSimpleStringA strInstallType = p;
  1133. toolkit_free(p);
  1134. bSysInstall = !strToRun.IsNullOrEmpty();
  1135. CVersion latterVersion;
  1136. if (!bSysInstall && strUpgradeVersion.IsNullOrEmpty())
  1137. {
  1138. bLightPack = true;
  1139. }
  1140. else
  1141. {
  1142. bLightPack = false;
  1143. CVersion &curVer = sysInfo.InstallVersion;
  1144. if (strUpgradeVersion == "A")
  1145. {
  1146. latterVersion = CVersion(curVer.GetMajor(), curVer.GetMinor(), curVer.GetRevision(), curVer.GetBuild()+1);
  1147. }
  1148. else
  1149. {
  1150. // 指定版本
  1151. DWORD dwMajor(0), dwMinor(0), dwRevision(0);
  1152. int n = sscanf(strUpgradeVersion, "%d.%d.%d", &dwMajor, &dwMinor, &dwRevision);
  1153. //assert(n == 3);
  1154. if (n < 3)
  1155. {
  1156. strErrMsg = CSimpleStringA::Format("指定升级版本无效(%s)", (const char*)strUpgradeVersion);
  1157. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("specified software version is invalid: [%s]", (const char*)strUpgradeVersion));
  1158. return Error_NotMeetCondition;
  1159. }
  1160. if (dwMajor < curVer.GetMajor()
  1161. || (dwMajor == curVer.GetMajor() && dwMinor < curVer.GetMinor())
  1162. || (dwMajor == curVer.GetMajor() && dwMinor == curVer.GetMinor() && dwRevision <curVer.GetRevision()))
  1163. {
  1164. LogError(Severity_Low, Error_NotMeetCondition, 0,
  1165. CSimpleStringA::Format("specified software version is invalid, config: [%s], current: [%d.%d.%d]",
  1166. (const char*)strUpgradeVersion, curVer.GetMajor(), curVer.GetMinor(), curVer.GetRevision()));
  1167. strErrMsg = CSimpleStringA::Format("指定升级版本无效(配置:%s, 当前:%d.%d.%d)", (const char*)strUpgradeVersion, curVer.GetMajor(), curVer.GetMinor(), curVer.GetRevision());
  1168. return Error_NotMeetCondition;
  1169. }
  1170. if (dwMajor == curVer.GetMajor() && dwMinor == curVer.GetMinor() && dwRevision ==curVer.GetRevision())
  1171. latterVersion = CVersion(dwMajor, dwMinor, dwRevision, curVer.GetBuild()+1);
  1172. else
  1173. latterVersion = CVersion(dwMajor, dwMinor, dwRevision, 1);
  1174. }
  1175. LOG_TRACE("upgraded install version is: [%s]", (const char*)latterVersion.ToString());
  1176. strNewVersion = latterVersion.ToString();
  1177. }
  1178. if (bLightPack)
  1179. {
  1180. rc = pPrivFunc->BeginLightInstall(m_strInstallPack);
  1181. if (rc != Error_Succeed)
  1182. {
  1183. strErrMsg = "轻量升级失败";
  1184. LogError(Severity_Low, Error_Unexpect, ERROR_UPGRADERUN_INSTALL_LIGHTPACK_FAIL, "轻量升级失败");
  1185. return Error_Unexpect;
  1186. }
  1187. //尝试对轻量包文件整体赋权
  1188. return rc;
  1189. }
  1190. else if (bSysInstall)
  1191. {
  1192. // xkm@20161208: 系统外执行改为异步线程池执行
  1193. //strNewVersion = strSysCustomVer; // 存放系统定制版本
  1194. //return pPrivFunc->BeginSysPackInstall(m_strInstallPack);
  1195. ////modify by zl 20170813,通过升级类型判断是否自动升级。如果是手工升级类型
  1196. //bool bManual = (strInstallType.Compare("manual",true)==0)?true:false;
  1197. //if (!bManual)
  1198. //{
  1199. // pEntityFunc->PostThreadPoolTask(new SysPackInstallTask(this, m_strInstallPack, strSysCustomVer));
  1200. //}
  1201. //else
  1202. //{
  1203. // //手工升级直接返回
  1204. // return Error_Succeed;
  1205. //}
  1206. pEntityFunc->PostThreadPoolTask(new SysPackInstallTask(this, m_strInstallPack, strSysCustomVer));
  1207. }
  1208. else
  1209. {
  1210. // 框架升级,建立新目录
  1211. CSimpleStringA strErrInfo = "";
  1212. Dbg("准备开始安装目录,版本[%s],安装包[%s]",(const char*)latterVersion.ToString(),m_strInstallPack.GetData());
  1213. rc = pPrivFunc->CreateInstallNewVersion(latterVersion, m_strInstallPack,strErrInfo);
  1214. if (rc != Error_Succeed)
  1215. {
  1216. Dbg("创建新版本目录失败:%s",strErrInfo.GetData());
  1217. strErrMsg = CSimpleStringA::Format("创建新版本目录失败:%s",strErrInfo.GetData());
  1218. LogError(Severity_Low, Error_Unexpect, ERROR_UPGRADERUN_CREATE_VERSION_FAIL, "create new version directory fail");
  1219. return Error_Unexpect;
  1220. }
  1221. //ToDelete=Run\bin\abc.dll,Data\*.tmp
  1222. p = inifile_read_str(strConfigPath, "Action", "ToDelete", "");
  1223. CSimpleStringA strToDelete = p;
  1224. toolkit_free(p);
  1225. if (!strToDelete.IsNullOrEmpty())
  1226. {
  1227. #ifdef RVC_OS_WIN
  1228. #else
  1229. /*适配linux终端: 转换路径中的‘\’字符成‘/’*/
  1230. Dbg("ToDelete tranfer begin=%s", strToDelete.GetData());
  1231. string tmp = strToDelete.GetData();
  1232. replace(tmp.begin(), tmp.end(), '\\', SPLIT_SLASH);
  1233. strToDelete = tmp.c_str();
  1234. Dbg("ToDelete tranfer end=%s", strToDelete.GetData());
  1235. #endif
  1236. auto list = strToDelete.Split(',');
  1237. for(int i=0; i<list.GetCount(); i++)
  1238. {
  1239. Dbg("delete file [%s] in new version", (const char*)list[i]);
  1240. rc = pPrivFunc->DeleteFileInNewVersion(list[i]);
  1241. }
  1242. }
  1243. //ToCopy= Run\bin\SpShell.exe, Run\dep\*.dll
  1244. p = inifile_read_str(strConfigPath, "Action", "ToCopy", "");
  1245. CSimpleStringA strToCopy = p;
  1246. toolkit_free(p);
  1247. if (!strToCopy.IsNullOrEmpty())
  1248. {
  1249. #ifdef RVC_OS_WIN
  1250. #else
  1251. /*转换路径中的‘\’字符成‘/’*/
  1252. Dbg("ToCopy tranfer begin=%s", strToCopy.GetData());
  1253. string tmp = strToCopy.GetData();
  1254. replace(tmp.begin(), tmp.end(), '\\', SPLIT_SLASH);
  1255. strToCopy = tmp.c_str();
  1256. Dbg("ToCopy tranfer end=%s", strToCopy.GetData());
  1257. #endif
  1258. auto copyList = strToCopy.Split(',');
  1259. for(int i=0; i<copyList.GetCount(); i++)
  1260. {
  1261. auto &file = copyList[i];
  1262. // 通配符检测
  1263. if (file.IndexOf("*") >0)
  1264. {
  1265. CSimpleStringA strUnzipPath;
  1266. GetUnzipTempDir(strUnzipPath);
  1267. auto strFileDir = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)GetFileDirectory(file));
  1268. list<CSimpleStringA> fileList;
  1269. RecursiveGetSubFiles(strFileDir, strFileDir, fileList);//得到文件夹下面所有文件
  1270. CSimpleStringA strFileFilter = _GetFileName(file);//得到过滤条件
  1271. for(auto it = fileList.begin(); it != fileList.end(); it++)
  1272. {
  1273. if (IsFileMatch(strFileFilter, _GetFileName((const char*)(*it))))
  1274. {
  1275. CSimpleStringA strActFileName = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)GetFileDirectory(file), (const char*)(*it));
  1276. Dbg("copy file [%s] matched wildchar name [%s]", (const char*)strActFileName, (const char*)strFileFilter);
  1277. rc = pPrivFunc->CopyFileToNewVersion(strActFileName, 3);
  1278. Dbg("copy file [%s] to new version %s", (const char*)strActFileName, rc == Error_Succeed ? "succeed" : "fail");
  1279. if (rc != Error_Succeed)
  1280. {
  1281. strErrMsg = CSimpleStringA::Format("拷贝文件[%s]失败", (const char*)strActFileName);
  1282. return rc;
  1283. }
  1284. }
  1285. }
  1286. }
  1287. else
  1288. {
  1289. int nCopyMode = inifile_read_int(strConfigPath, GetFileName(file), "CopyMode", 3);
  1290. rc = pPrivFunc->CopyFileToNewVersion(file, nCopyMode);
  1291. Dbg("copy file [%s] to new version %s", (const char*)file, rc == Error_Succeed ? "succeed" : "fail");
  1292. if (rc != Error_Succeed)
  1293. {
  1294. strErrMsg = CSimpleStringA::Format("拷贝文件[%s]失败", (const char*)file);
  1295. return rc;
  1296. }
  1297. }
  1298. }
  1299. //Dbg("total copy %d files", list.GetCount());
  1300. }
  1301. //尝试对新系统版本文件整体赋权
  1302. }
  1303. return rc;
  1304. }
  1305. CSimpleStringA CUpgradeRunFSM::GetFileDirectory(const char *pszFullPath)
  1306. {
  1307. int i=strlen(pszFullPath)-1;
  1308. for( ; i>0 && pszFullPath[i]!=SPLIT_SLASH; i--)NULL;
  1309. return CSimpleStringA(pszFullPath, i);
  1310. }
  1311. CSimpleStringA CUpgradeRunFSM::GetFileName(const char *pszFullPath)
  1312. {
  1313. const char *p = strrchr(pszFullPath, SPLIT_SLASH);
  1314. if (p != NULL)
  1315. {
  1316. return p+1;
  1317. }
  1318. else
  1319. {
  1320. return pszFullPath;
  1321. }
  1322. }
  1323. void CUpgradeRunFSM::RecursiveGetSubFiles(const char *pszDir, const char *pszTrimStart, list<CSimpleStringA>& retList)
  1324. {
  1325. if (!ExistsDirA(pszDir))
  1326. return;
  1327. auto arr = fileutil_get_sub_files(pszDir);
  1328. if (arr != NULL)
  1329. {
  1330. for (int i = 0; i < arr->nelts; ++i)
  1331. {
  1332. char *file = ARRAY_IDX(arr, i, char*);
  1333. if (pszTrimStart != NULL && strnicmp(file, pszTrimStart, strlen(pszTrimStart))==0) {
  1334. file += strlen(pszTrimStart);
  1335. if (*file == SPLIT_SLASH)
  1336. file++;
  1337. }
  1338. retList.push_back(file);
  1339. }
  1340. toolkit_array_free2(arr);
  1341. }
  1342. arr = fileutil_get_sub_dirs(pszDir);
  1343. if (arr != NULL)
  1344. {
  1345. for (int i = 0; i < arr->nelts; ++i)
  1346. {
  1347. char *dir = ARRAY_IDX(arr, i, char*);
  1348. RecursiveGetSubFiles(dir, pszTrimStart, retList);
  1349. }
  1350. toolkit_array_free2(arr);
  1351. }
  1352. }
  1353. bool CUpgradeRunFSM::IsFileMatch(const char *pszFilter, const char *pszFileName)
  1354. {
  1355. const char *p1 = pszFilter;
  1356. const char *p2 = pszFileName;
  1357. if (p1 == NULL)
  1358. return true;
  1359. if (p2 == NULL)
  1360. return false;
  1361. if (*p1 ==NULL && *p2 ==NULL)
  1362. return true;
  1363. else if (*p1 == NULL)
  1364. return false;
  1365. else if (*p2 == NULL)
  1366. {
  1367. // 查找*p1是否全是*
  1368. while(*p1 == '*')
  1369. p1++;
  1370. if (*p1 == NULL)
  1371. return true;
  1372. else
  1373. return false;
  1374. }
  1375. if (*p1 != '*')
  1376. {
  1377. if (tolower(*p1) != tolower(*p2))
  1378. return false;
  1379. else
  1380. return IsFileMatch(p1+1, p2+1);
  1381. }
  1382. else
  1383. {
  1384. while(*++p1 == '*');
  1385. if (*p1 == NULL)
  1386. return true;
  1387. while (*p2)
  1388. {
  1389. while(tolower(*p1) != tolower(*p2) && *++p2);
  1390. if (*p2 == NULL)
  1391. return false;
  1392. if(IsFileMatch(p1+1, p2+1))
  1393. return true;
  1394. p2++;
  1395. }
  1396. return false;
  1397. }
  1398. }
  1399. void getFiles(string path, vector<string>& files)
  1400. {
  1401. #ifdef RVC_OS_WIN
  1402. //查询文件
  1403. //文件句柄
  1404. long hFile = 0;
  1405. //文件信息
  1406. struct _finddata_t fileinfo;
  1407. string p;
  1408. if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
  1409. {
  1410. do
  1411. {
  1412. //如果是目录,迭代之
  1413. //如果不是,加入列表
  1414. if ((fileinfo.attrib & _A_SUBDIR))
  1415. {
  1416. if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
  1417. getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
  1418. }
  1419. else
  1420. {
  1421. files.push_back(p.assign(path).append("\\").append(fileinfo.name));
  1422. }
  1423. } while (_findnext(hFile, &fileinfo) == 0);
  1424. _findclose(hFile);
  1425. }
  1426. #else
  1427. array_header_t* arr_files = fileutil_get_sub_files2_a(path.c_str(),1000);
  1428. if (arr_files)
  1429. {
  1430. int i;
  1431. for (i = 0; i < arr_files->nelts; ++i)
  1432. {
  1433. char* file_path = ARRAY_IDX(arr_files, i, char*);
  1434. string strfilePath = file_path;
  1435. files.push_back(strfilePath);
  1436. }
  1437. toolkit_array_free2(arr_files);
  1438. }
  1439. array_header_t* arr_dir = fileutil_get_sub_dirs_a(path.c_str());
  1440. if (arr_dir) {
  1441. int i;
  1442. for (i = 0; i < arr_dir->nelts; ++i) {
  1443. char* dir_path = ARRAY_IDX(arr_dir, i, char*);
  1444. getFiles(dir_path, files);
  1445. }
  1446. }
  1447. #endif
  1448. }
  1449. bool CUpgradeRunFSM::CheckNewRunFilesSign()
  1450. {
  1451. CSimpleStringA strErrMsg;
  1452. int nVerifyflg = 0;
  1453. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  1454. CSmartPointer<IConfigInfo> spConfig;
  1455. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  1456. if (Error_Succeed == Error)
  1457. {
  1458. Error = spConfig->ReadConfigValueInt("SpBase", "VerifyCodeSign", nVerifyflg);
  1459. if (Error_Succeed == Error)
  1460. {
  1461. Dbg("get VerifyCodeSign[%d] from CenterSetting.ini", nVerifyflg);
  1462. }
  1463. else
  1464. {
  1465. Dbg("get VerifyCodeSign from CenterSetting.ini failed");
  1466. }
  1467. }
  1468. if (0 == nVerifyflg)
  1469. {
  1470. Dbg("VerifyCodeSign flag is 0 or not exsit,ignore code signature");
  1471. return true;
  1472. }
  1473. //TODO:校验升级包中mod和bin目录下所有签名,防止升级后,出现失败无法启动框架或升级实体导致无法自动回滚
  1474. CSimpleStringA strDownloadsPath;
  1475. auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  1476. assert(rc == Error_Succeed);
  1477. CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  1478. if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  1479. strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength() - 4);
  1480. CSimpleStringA strDownloadRunPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "Run", (const char*)strUnzipPath);
  1481. string runPath = strDownloadRunPath.GetData();
  1482. vector<string> files;
  1483. getFiles(runPath, files);
  1484. int size = files.size();
  1485. for (int i = 0;i < size;i++)
  1486. {
  1487. CSimpleStringA strFileName = files[i].c_str();
  1488. if (strFileName.IsEndWith(".exe", true) || strFileName.IsEndWith(".dll", true))
  1489. {
  1490. rc = m_pEntity->GetFunction()->VerifySignature(strFileName.GetData(), strErrMsg);
  1491. if (rc != Error_Succeed)
  1492. {
  1493. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", strFileName));
  1494. return false;
  1495. }
  1496. Dbg("%s in pack %s, verify sign success", (const char*)strFileName, (const char*)m_strInstallPack);
  1497. }
  1498. }
  1499. //CSimpleStringA strDownloadsPath;
  1500. //auto rc = m_pEntity->GetFunction()->GetPath("Downloads", strDownloadsPath);
  1501. //assert(rc == Error_Succeed);
  1502. //CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s\\%s", (const char*)strDownloadsPath, (const char*)m_strInstallPack);
  1503. //if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  1504. // strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength() - 4);
  1505. //CSimpleStringA strSpShellPath = CSimpleStringA::Format("%s\\Run\\bin\\SpShell.exe", (const char*)strUnzipPath);
  1506. //CSimpleStringA strSpHostPath = CSimpleStringA::Format("%s\\Run\\bin\\SpHost.exe", (const char*)strUnzipPath);
  1507. //CSimpleStringA strSpbasePath = CSimpleStringA::Format("%s\\Run\\bin\\SpBase.dll", (const char*)strUnzipPath);
  1508. //CSimpleStringA strUpgradeManagerPath = CSimpleStringA::Format("%s\\Run\\mod\\mod_UpgradeMgr.dll", (const char*)strUnzipPath);
  1509. //// 检查文件是否存在,存在则校验其签名
  1510. //DWORD attr = GetFileAttributesA(strSpShellPath);
  1511. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1512. //{
  1513. // Dbg("not find %s in pack %s, no need to verify sign", strSpShellPath, m_strInstallPack);
  1514. //}
  1515. //else
  1516. //{
  1517. // rc = m_pEntity->GetFunction()->VerifySignature(strSpShellPath, strErrMsg);
  1518. // if (rc != Error_Succeed)
  1519. // {
  1520. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strSpShellPath));
  1521. // return false;
  1522. // }
  1523. //}
  1524. //attr = GetFileAttributesA(strSpHostPath);
  1525. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1526. //{
  1527. // Dbg("not find %s in pack %s, no need to verify sign", strSpHostPath, m_strInstallPack);
  1528. //}
  1529. //else
  1530. //{
  1531. // rc = m_pEntity->GetFunction()->VerifySignature(strSpHostPath, strErrMsg);
  1532. // if (rc != Error_Succeed)
  1533. // {
  1534. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strSpHostPath));
  1535. // return false;
  1536. // }
  1537. //}
  1538. //attr = GetFileAttributesA(strSpbasePath);
  1539. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1540. //{
  1541. // Dbg("not find %s in pack %s, no need to verify sign", strSpbasePath, m_strInstallPack);
  1542. //}
  1543. //else
  1544. //{
  1545. // rc = m_pEntity->GetFunction()->VerifySignature(strSpbasePath, strErrMsg);
  1546. // if (rc != Error_Succeed)
  1547. // {
  1548. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strSpbasePath));
  1549. // return false;
  1550. // }
  1551. //}
  1552. //
  1553. //attr = GetFileAttributesA(strUpgradeManagerPath);
  1554. //if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
  1555. //{
  1556. // Dbg("not find %s in pack %s, no need to verify sign", strUpgradeManagerPath, m_strInstallPack);
  1557. //}
  1558. //else
  1559. //{
  1560. // rc = m_pEntity->GetFunction()->VerifySignature(strUpgradeManagerPath, strErrMsg);
  1561. // if (rc != Error_Succeed)
  1562. // {
  1563. // LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("[%s]签名校验失败", (const char*)strUpgradeManagerPath));
  1564. // return false;
  1565. // }
  1566. //}
  1567. return true;
  1568. }
  1569. bool CUpgradeRunFSM::getOSVersion(DWORD &dwMajorVersion, DWORD &dwMinorVersion)
  1570. {
  1571. #ifdef RVC_OS_WIN
  1572. OSVERSIONINFO osvi;
  1573. ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  1574. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  1575. GetVersionEx(&osvi);
  1576. dwMajorVersion = osvi.dwMajorVersion;
  1577. dwMinorVersion = osvi.dwMinorVersion;
  1578. return true;
  1579. #else
  1580. struct utsname kernel_info;
  1581. int ret = uname(&kernel_info);
  1582. if (ret == 0) {
  1583. Dbg("get linux kernel version success: %s", kernel_info.release);
  1584. int n = sscanf((const char*)kernel_info.release, "%d.%d", &dwMajorVersion, &dwMinorVersion);
  1585. return true;
  1586. }
  1587. else {
  1588. Dbg("get linux kernel version fail: %s", strerror(errno));
  1589. return false;
  1590. }
  1591. #endif // RVC_OS_WIN
  1592. }