SpEntityPrivilege.cpp 88 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpTimer.h"
  4. #include "SpMisc.h"
  5. #include "SpEntity.h"
  6. #include "SpModule.h"
  7. #include "SpEntityPrivilege.h"
  8. #include "SpAsyncWait.h"
  9. #include "sp_iom.h"
  10. #include "sp_svc.h"
  11. #include "sp_log.h"
  12. #include "sp_var.h"
  13. #include "sp_def.h"
  14. #include "sp_cfg.h"
  15. #include "sp_env.h"
  16. #include "memutil.h"
  17. #include "strutil.h"
  18. #include "fileutil.h"
  19. #include "shm_array.h"
  20. #include "shm_mem.h"
  21. #include "iobuffer.h"
  22. #include "iniutil.h"
  23. #include "def.h"
  24. #include "dbgutil.h"
  25. #include <algorithm>
  26. #include "sp_httpDefine.h"
  27. #ifdef RVC_OS_WIN
  28. #include "CodeSignVerify.h"
  29. #include <io.h>
  30. #include "log_producer_config.h"
  31. #else
  32. #include "sp_dbg_export.h"
  33. #include <winpr/ini.h>
  34. #include <winpr/string.h>
  35. #include <winpr/crt.h>
  36. #include <winpr/file.h>
  37. #endif //RVC_OS_WIN
  38. static ErrorCodeEnum ControlEntity(
  39. SpEntity *pEntity,
  40. const char *pszEntityName,
  41. int call_type,
  42. const char *cmd_line,
  43. //don't change this type bcz: 1. ipc would not convey pointer-type, and receiver may receive as 4bytes type. [4/2/2020 11:13 Gifur]
  44. int param1, int param2,
  45. CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  46. {
  47. if (!pszEntityName) {
  48. return Error_Null;
  49. } else if (strlen(pszEntityName) == 0) {
  50. return Error_Param;
  51. }
  52. sp_env_t *env = sp_get_env();
  53. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszEntityName);
  54. if (!ent)
  55. return Error_NotExist;
  56. iobuffer_t *req_pkt = iobuffer_create(-1, -1);
  57. int v = ent->cfg->idx;
  58. bool fetch_user_code = false;
  59. iobuffer_write(req_pkt, IOBUF_T_I4, &v, 0);
  60. if (call_type == SHELL_CMD_REQ_ENTITY_START)
  61. iobuffer_write(req_pkt, IOBUF_T_STR, cmd_line, -1);
  62. else if (call_type == SHELL_CMD_REQ_ENTITY_TEST) {
  63. /** prohibit user from sending test call in the absence of test mode [5/20/2020 Gifur] */
  64. if (param1 == 1/*Test_Examine*/ && !is_own_test_mode( env->cfg->args->test_mode)) {
  65. iobuffer_destroy(req_pkt);
  66. return Error_NoPrivilege;
  67. }
  68. fetch_user_code = true;
  69. iobuffer_write(req_pkt, IOBUF_T_I4, &param1, 0);
  70. }
  71. SpAsyncWaitRPC *pAsyncWait = new SpAsyncWaitRPC(pEntity, &req_pkt, call_type, fetch_user_code);
  72. ErrorCodeEnum Error = pAsyncWait->Begin();
  73. if (Error == Error_Succeed) {
  74. pAsynWaitSp.Attach(pAsyncWait, pAsyncWait->GetRefCountPtr());
  75. }
  76. pAsyncWait->DecrementRef(); // xkm@20150115
  77. if (req_pkt)
  78. iobuffer_dec_ref(req_pkt);
  79. return Error;
  80. }
  81. SpEntityPrivilege::SpEntityPrivilege(SpModule *pModule, sp_entity_t *ent, sp_cfg_shell_entity_t *cfg_ent, CEntityBase *pEntityBase)
  82. : SpEntity(pModule, ent, cfg_ent, pEntityBase), m_pEntityLifeListener(NULL)
  83. {
  84. spinlock_init(&m_maplock);
  85. m_pEntityStateListenerMap = stringmap_create(0);
  86. }
  87. SpEntityPrivilege::~SpEntityPrivilege()
  88. {
  89. UnregistEntityStateEvent(NULL);
  90. stringmap_destroy(m_pEntityStateListenerMap);
  91. }
  92. ErrorCodeEnum SpEntityPrivilege::Init()
  93. {
  94. ErrorCodeEnum Error = SpEntity::Init();
  95. return Error;
  96. }
  97. void SpEntityPrivilege::Term()
  98. {
  99. //....
  100. SpEntity::Term();
  101. UnregistEntityStateEvent(NULL); // unregister all
  102. }
  103. CSmartPointer<IEntityFunctionPrivilege> SpEntityPrivilege::GetPrivilegeFunction()
  104. {
  105. IEntityFunctionPrivilege *pPrivilege = dynamic_cast<IEntityFunctionPrivilege*>(this);
  106. return pPrivilege;
  107. }
  108. ErrorCodeEnum SpEntityPrivilege::StartEntity(const char *pszEntityName, const char *pszCmdLine,CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  109. {
  110. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_START, pszCmdLine, 0, 0, pAsynWaitSp);
  111. }
  112. /*To Close*/
  113. ErrorCodeEnum SpEntityPrivilege::StopEntity(const char *pszEntityName,CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  114. {
  115. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_STOP, NULL, 0, 0, pAsynWaitSp);
  116. }
  117. /*To Close*/
  118. ErrorCodeEnum SpEntityPrivilege::CloseEntity(const char *pszEntityName,CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  119. {
  120. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_STOP, NULL, 0, 0, pAsynWaitSp);
  121. }
  122. /*To kill*/
  123. ErrorCodeEnum SpEntityPrivilege::TerminateEntity(const char *pszEntityName,CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  124. {
  125. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_TERMINATE, NULL, 0, 0, pAsynWaitSp);
  126. }
  127. ErrorCodeEnum SpEntityPrivilege::PauseEntity(const char *pszEntityName,CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  128. {
  129. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_PAUSE, NULL, 0, 0, pAsynWaitSp);
  130. }
  131. ErrorCodeEnum SpEntityPrivilege::ContinueEntity(const char *pszEntityName,CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  132. {
  133. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_CONTINUE, NULL, 0, 0, pAsynWaitSp);
  134. }
  135. ErrorCodeEnum SpEntityPrivilege::TestEntity(const char *pszEntityName,EntityTestEnum eTestType, CSmartPointer<IAsynWaitSp> &pAsynWaitSp)
  136. {
  137. return ControlEntity(this, pszEntityName, SHELL_CMD_REQ_ENTITY_TEST, NULL, (int)eTestType, 0, pAsynWaitSp);
  138. }
  139. ErrorCodeEnum SpEntityPrivilege::RegistEntityLifeEvent(IEntityLifeListener *pListener)
  140. {
  141. if (!m_pEntityLifeListener) {
  142. sp_mod_entity_life_cb cb;
  143. cb.on_entity_close = &SpEntityPrivilege::__on_entity_close;
  144. cb.on_entity_create = &SpEntityPrivilege::__on_entity_create;
  145. cb.on_entity_exception = &SpEntityPrivilege::__on_entity_exception;
  146. cb.user_data = this;
  147. int rc = sp_mod_entity_life_listener_create(&cb, m_svc, pListener, &m_pEntityLifeListener);
  148. return SpTranslateError(rc);
  149. } else {
  150. return Error_Duplication;
  151. }
  152. }
  153. ErrorCodeEnum SpEntityPrivilege::UnregistLiftEvent()
  154. {
  155. if (!m_pEntityLifeListener) {
  156. return Error_NotInit;
  157. } else {
  158. sp_mod_entity_life_listener_destroy(m_pEntityLifeListener);
  159. m_pEntityLifeListener = NULL;
  160. return Error_Succeed;
  161. }
  162. }
  163. ErrorCodeEnum SpEntityPrivilege::RegistEntityStateEvent(const char *pszEntityName,IEntityStateListener *pListener)
  164. {
  165. sp_env_t *env = sp_get_env();
  166. int target_ent_id;
  167. if (!pListener)
  168. return Error_Null;
  169. if (pszEntityName) {
  170. sp_entity_t *ent;
  171. ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszEntityName);
  172. if (!ent)
  173. return Error_NotExist;
  174. target_ent_id = ent->cfg->idx;
  175. } else {
  176. LOG_TRACE("registered state event for all entities!");
  177. target_ent_id = -1; // regist for all entities
  178. pszEntityName = "*";
  179. }
  180. ErrorCodeEnum Error = Error_Succeed;
  181. spinlock_enter(&m_maplock, -1);
  182. if (stringmap_find(m_pEntityStateListenerMap, pszEntityName) ){
  183. Error = Error_AlreadyExist;
  184. } else {
  185. int rc;
  186. sp_mod_entity_state_listener_t *listener;
  187. sp_mod_entity_event_cb cb;
  188. cb.on_close_connection = &SpEntityPrivilege::__on_close_connection;
  189. cb.on_create_connection = &SpEntityPrivilege::__on_create_connection;
  190. cb.on_user_state = &SpEntityPrivilege::__on_user_state;;
  191. cb.on_entity_state = &SpEntityPrivilege::__on_entity_state;
  192. cb.user_data = this;
  193. rc = sp_mod_entity_listener_create(target_ent_id, &cb, m_svc, pListener, &listener);
  194. if (rc == 0) {
  195. stringmap_add(m_pEntityStateListenerMap, pszEntityName ? pszEntityName : "*", listener);
  196. } else {
  197. Error = SpTranslateError(rc);
  198. }
  199. }
  200. spinlock_leave(&m_maplock);
  201. return Error;
  202. }
  203. ErrorCodeEnum SpEntityPrivilege::UnregistEntityStateEvent(const char *pszEntityName)
  204. {
  205. ErrorCodeEnum Error = Error_Succeed;
  206. if (pszEntityName == NULL) {
  207. pszEntityName = "*";
  208. }
  209. spinlock_enter(&m_maplock, -1);
  210. if (pszEntityName) {
  211. stringmap_kv_pair *kvp;
  212. kvp = stringmap_find(m_pEntityStateListenerMap, pszEntityName);
  213. if (kvp) {
  214. sp_mod_entity_state_listener_t *listener;
  215. listener = (sp_mod_entity_state_listener_t *)stringmap_kv_pair_get_value(kvp);
  216. stringmap_remove(m_pEntityStateListenerMap, pszEntityName);
  217. sp_mod_entity_listener_destroy(listener);
  218. } else {
  219. Error = Error_NotExist;
  220. }
  221. } else { // unregist all
  222. stringmap_iterator *it = stringmap_iterator_create(m_pEntityStateListenerMap);
  223. while (stringmap_iterator_next(it) == 0) {
  224. const char *ent_name = (const char*)stringmap_iterator_get_key(it);
  225. sp_mod_entity_state_listener_t *listener = (sp_mod_entity_state_listener_t *)stringmap_iterator_get_value(it);
  226. stringmap_remove(m_pEntityStateListenerMap, ent_name);
  227. sp_mod_entity_listener_destroy(listener);
  228. }
  229. stringmap_iterator_destroy(it);
  230. }
  231. spinlock_leave(&m_maplock);
  232. return Error;
  233. }
  234. ErrorCodeEnum SpEntityPrivilege::GetSpecifiedEntityState(const char* pszEntityName, EntityStateEnum& eEntityState, DWORD& dwUserState)
  235. {
  236. if (pszEntityName == NULL) {
  237. return Error_Param;
  238. }
  239. sp_env_t* env = sp_get_env();
  240. sp_entity_t* ent;
  241. if (strlen(pszEntityName) == 0) {
  242. ent = m_ent;
  243. } else {
  244. ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszEntityName);
  245. }
  246. if (!ent) {
  247. return Error_NotExist;
  248. }
  249. eEntityState = (EntityStateEnum)ent->state;
  250. dwUserState = ent->user_state;
  251. return Error_Succeed;
  252. }
  253. ErrorCodeEnum SpEntityPrivilege::DisplayBlueScreen(const char *pszTitle)
  254. {
  255. ErrorCodeEnum Error;
  256. iobuffer_t *pkt = iobuffer_create(-1, -1);
  257. iobuffer_write(pkt, IOBUF_T_STR, pszTitle, -1);
  258. //int nBlueScreen = 1;
  259. //iobuffer_write(pkt, IOBUF_T_I4, &nBlueScreen, 0);
  260. Error = PostInfoShell(SHELL_CMD_INFO_BLUESCREEN_DISPLAY, &pkt);
  261. if (pkt)
  262. iobuffer_dec_ref(pkt);
  263. return Error;
  264. }
  265. ErrorCodeEnum SpEntityPrivilege::UndisplayBlueScreen()
  266. {
  267. ErrorCodeEnum Error;
  268. iobuffer_t *pkt = iobuffer_create(-1, -1);
  269. Error = PostInfoShell(SHELL_CMD_INFO_BLUESCREEN_UNDISPLAY, &pkt);
  270. if (pkt)
  271. iobuffer_dec_ref(pkt);
  272. return Error;
  273. }
  274. ErrorCodeEnum SpEntityPrivilege::Reboot(RebootTriggerEnum eTriggerReason,RebootWayEnum eWay)
  275. {
  276. ErrorCodeEnum Error;
  277. int v;
  278. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("call SpEntityPrivilege::Reboot, reason:%d, way:%d", eTriggerReason, eWay);
  279. iobuffer_t *pkt = iobuffer_create(-1, -1);
  280. v = eTriggerReason;
  281. iobuffer_write(pkt, IOBUF_T_I4, &v, 0);
  282. v = eWay;
  283. iobuffer_write(pkt, IOBUF_T_I4, &v, 0);
  284. Error = PostInfoShell(SHELL_CMD_INFO_MACHINE_REBOOT, &pkt);
  285. if (pkt)
  286. iobuffer_dec_ref(pkt);
  287. return Error;
  288. }
  289. bool SpEntityPrivilege::WriteInstallLog(const char *pszPackName, const char *pszLogText)
  290. {
  291. auto env = sp_get_env();
  292. // 创建安装包日志文件
  293. CSimpleStringA strInstallLogDir = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "InstallLog", env->dir->root_runinfo_path);
  294. if (!ExistsDirA(strInstallLogDir))
  295. CreateDirA(strInstallLogDir, TRUE);
  296. // 写安装包日志
  297. CSimpleStringA strInstallLog = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s.log", (const char*)strInstallLogDir, pszPackName);
  298. FILE *pInstallLog = fopen(strInstallLog, "a+");
  299. if (pInstallLog == NULL)
  300. {
  301. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("open install log file [%s] to write fail", pszPackName));
  302. return false;
  303. }
  304. fprintf_s(pInstallLog, "[%s] %s\r\n", (const char*)CSmallDateTime::GetNow().ToTimeString(), pszLogText);
  305. fflush(pInstallLog);
  306. fclose(pInstallLog);
  307. return true;
  308. }
  309. bool SpEntityPrivilege::RecursiveCopyDir(const char *pszSourceDir, const char *pszDestDir, CSimpleStringA& strErrInfo)
  310. {
  311. array_header_t *arr;
  312. if (!ExistsDirA(pszSourceDir))
  313. {
  314. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("source dir [%s] not exists", pszSourceDir);
  315. return false;
  316. }
  317. if (!ExistsDirA(pszDestDir))
  318. {
  319. if (!CreateDirRecursiveA(pszDestDir))
  320. {
  321. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create dir [%s] fail: %d", pszDestDir, GetLastError());
  322. return false;
  323. }
  324. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create dir [%s] succ", pszDestDir);
  325. }
  326. arr = fileutil_get_sub_files_a(pszSourceDir);
  327. if (arr)
  328. {
  329. int i;
  330. for (i = 0; i < arr->nelts; ++i)
  331. {
  332. char szDestFile[256] = { 0 };
  333. char *file = ARRAY_IDX(arr, i, char*);
  334. strcpy(szDestFile, pszDestDir);
  335. if (szDestFile[strlen(szDestFile) - 1] != SPLIT_SLASH)
  336. strcat(szDestFile, SPLIT_SLASH_STR);
  337. strcat(szDestFile, strrchr(file, SPLIT_SLASH) + 1);
  338. if (!CopyFileA(file, szDestFile, FALSE))
  339. {
  340. strErrInfo = CSimpleStringA::Format("copy file [%s] fail: %d", file, GetLastError());
  341. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy file [%s] fail: %d", file, GetLastError());
  342. toolkit_array_free2(arr);
  343. return false;
  344. }
  345. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy file [%s] succ", file);
  346. }
  347. toolkit_array_free2(arr);
  348. }
  349. arr = fileutil_get_sub_dirs_a(pszSourceDir);
  350. if (arr)
  351. {
  352. int i;
  353. for (i = 0; i < arr->nelts; ++i)
  354. {
  355. char szDestSubDir[256] = { 0 };
  356. char *dir = ARRAY_IDX(arr, i, char*);
  357. strcpy(szDestSubDir, pszDestDir);
  358. if (szDestSubDir[strlen(szDestSubDir) - 1] != SPLIT_SLASH)
  359. strcat(szDestSubDir, SPLIT_SLASH_STR);
  360. strcat(szDestSubDir, strrchr(dir, SPLIT_SLASH) + 1);
  361. if (!RecursiveCopyDir(dir, szDestSubDir, strErrInfo))
  362. {
  363. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy dir [%s] fail: %d", dir, GetLastError());
  364. toolkit_array_free2(arr);
  365. return false;
  366. }
  367. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy dir [%s] succ", dir);
  368. }
  369. toolkit_array_free2(arr);
  370. }
  371. return true;
  372. }
  373. // 创建新版本目录,拷贝当前版本bin、cfg、dep、mod、install.ini,并修改Shell.ini及install.ini中相关配置
  374. ErrorCodeEnum SpEntityPrivilege::CreateInstallNewVersion(CVersion NewSoftwareVersion,const char *pszPackageName, CSimpleStringA& strErrInfo)
  375. {
  376. auto env = sp_get_env();
  377. auto cfg = env->cfg;
  378. // 创建安装包日志文件
  379. WriteInstallLog(pszPackageName, CSimpleStringA::Format("Create new version: [%s], pack: [%s]",
  380. (const char*)NewSoftwareVersion.ToString(), (const char*)pszPackageName));
  381. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Create new version: [%s], pack: [%s]", (const char*)NewSoftwareVersion.ToString(), (const char*)pszPackageName);
  382. CSimpleStringA strCurVerPath = env->dir->base_path;
  383. CSimpleStringA strNewVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", env->dir->root_ver_path, (const char*)NewSoftwareVersion.ToString());
  384. auto &v = cfg->install_ini->install_version;
  385. CVersion curVersion(v.major, v.minor, v.revision, v.build);
  386. TOOLKIT_ASSERT(curVersion != NewSoftwareVersion);
  387. if (curVersion == NewSoftwareVersion)
  388. {
  389. LogError(Severity_Low, Error_Bug, 0, CSimpleStringA::Format("new ver [%s] equals current ver [%s]",
  390. (const char*)NewSoftwareVersion.ToString(), (const char*)curVersion.ToString()));
  391. strErrInfo = CSimpleStringA::Format("new ver [%s] equals current ver [%s]",
  392. (const char*)NewSoftwareVersion.ToString(), (const char*)curVersion.ToString());
  393. return Error_Bug;
  394. }
  395. if (ExistsDirA(strNewVerPath)) {
  396. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new version dir [%s] already exist, delete it %s", (const char*)strNewVerPath, RemoveDirRecursiveA(strNewVerPath) ? "success" : "fail");
  397. RemoveDirRecursiveA(strNewVerPath);
  398. }
  399. if (!CreateDirA(strNewVerPath, TRUE))
  400. {
  401. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create new version dir fail: %d", GetLastError());
  402. strErrInfo = CSimpleStringA::Format("create new version dir fail: %d", GetLastError());
  403. return Error_Unexpect;
  404. }
  405. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create new version dir succ");
  406. //增加错误信息字段,回传给上层应用
  407. CSimpleStringA strErrMsg = "";
  408. CSimpleStringA strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "bin", (const char*)strCurVerPath);
  409. CSimpleStringA strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "bin", (const char*)strNewVerPath);
  410. if (!RecursiveCopyDir(strSource, strDest, strErrMsg)) {
  411. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy bin dir fail");
  412. strErrInfo = CSimpleStringA::Format("copy bin dir fail: %s", strErrMsg.GetData());
  413. return Error_Unexpect;
  414. }
  415. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy bin dir succ");
  416. strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "cfg", (const char*)strCurVerPath);
  417. strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "cfg", (const char*)strNewVerPath);
  418. if (!RecursiveCopyDir(strSource, strDest, strErrMsg)) {
  419. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy cfg dir fail");
  420. strErrInfo = CSimpleStringA::Format("copy cfg dir fail: %s", strErrMsg.GetData());
  421. return Error_Unexpect;
  422. }
  423. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy cfg dir succ");
  424. strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "dep", (const char*)strCurVerPath);
  425. strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "dep", (const char*)strNewVerPath);
  426. if (!RecursiveCopyDir(strSource, strDest, strErrMsg)) {
  427. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy dep dir fail");
  428. strErrInfo = CSimpleStringA::Format("copy dep dir fail: %s", strErrMsg.GetData());
  429. return Error_Unexpect;
  430. }
  431. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy dep dir succ");
  432. strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "mod", (const char*)strCurVerPath);
  433. strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "mod", (const char*)strNewVerPath);
  434. if (!RecursiveCopyDir(strSource, strDest, strErrMsg)) {
  435. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy mod dir fail");
  436. strErrInfo = CSimpleStringA::Format("copy mod dir fail: %s", strErrMsg.GetData());
  437. return Error_Unexpect;
  438. }
  439. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy mod dir succ");
  440. strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "res", (const char*)strCurVerPath);
  441. strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "res", (const char*)strNewVerPath);
  442. // 检测res目录是否存在
  443. if (ExistsDirA(strSource))
  444. {
  445. if (!RecursiveCopyDir(strSource, strDest, strErrMsg)) {
  446. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy res dir fail");
  447. strErrInfo = CSimpleStringA::Format("copy res dir fail: %s", strErrMsg.GetData());
  448. return Error_Unexpect;
  449. }
  450. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy res dir succ");
  451. }
  452. else
  453. {
  454. if (!CreateDirA(strDest, TRUE))
  455. {
  456. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create res dir fail");
  457. strErrInfo = "create res dir fail";
  458. return Error_Unexpect;
  459. }
  460. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create res dir succ");
  461. }
  462. strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "imdep", (const char*)strCurVerPath);
  463. strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "imdep", (const char*)strNewVerPath);
  464. // 检测imdep目录是否存在
  465. if (ExistsDirA(strSource))
  466. {
  467. if (!RecursiveCopyDir(strSource, strDest,strErrMsg))
  468. {
  469. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy imdep dir fail");
  470. strErrInfo = CSimpleStringA::Format("copy imdep dir fail: %s", strErrMsg.GetData());
  471. return Error_Unexpect;
  472. }
  473. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy imdep dir succ");
  474. }
  475. else
  476. {
  477. if (!CreateDirA(strDest, TRUE))
  478. {
  479. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create imdep dir fail");
  480. strErrInfo = "create imdep dir fail";
  481. return Error_Unexpect;
  482. }
  483. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create imdep dir succ");
  484. }
  485. strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "install.ini", (const char*)strCurVerPath);
  486. strDest = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "install.ini", (const char*)strNewVerPath);
  487. if (!CopyFileA(strSource, strDest, FALSE))
  488. {
  489. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy install.ini fail: %d", GetLastError());
  490. strErrInfo = CSimpleStringA::Format("copy install.ini fail: %d", GetLastError());
  491. return Error_Unexpect;
  492. }
  493. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy install.ini succ");
  494. // 修改新Shell.ini
  495. CSimpleStringA strShellVarIni = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "shellVar.ini", (const char*)env->dir->root_runinfo_path);
  496. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("update SoftwareVersion to %s", strShellVarIni);
  497. int nRet = inifile_format_write((const char*)strShellVarIni, "Main", "SoftwareVersion", "%d.%d.%d", NewSoftwareVersion.GetMajor(),
  498. NewSoftwareVersion.GetMinor(), NewSoftwareVersion.GetRevision());
  499. //// 修改当前install.ini
  500. inifile_write_str(cfg->install_ini_path, "Main", "LatterInstallVersion", NewSoftwareVersion.ToString());
  501. inifile_write_str(cfg->install_ini_path, "Main", "LatterInstallPack", pszPackageName);
  502. //inifile_write_str(cfg->install_ini_path, CurVersion.ToString(), "InstallState", "U");
  503. // 修改新版本install.ini
  504. auto strNewInstallIni = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "install.ini", (const char*)strNewVerPath);
  505. TOOLKIT_ASSERT(ExistsFileA(strNewInstallIni));
  506. char szNow[16] = {};
  507. sprintf(szNow, "0x%08X", y2k_time_now());
  508. // 缓存前版本轻量包记录
  509. char *packs = inifile_read_str(strNewInstallIni, "Main", "LightPack", "");
  510. nRet |= inifile_write_str(strNewInstallIni, "Main", "InstallVersion", NewSoftwareVersion.ToString());
  511. nRet |= inifile_write_str(strNewInstallIni, "Main", "CreateDate", szNow);
  512. nRet |= inifile_write_str(strNewInstallIni, "Main", "LatterInstallVersion", "");
  513. nRet |= inifile_write_str(strNewInstallIni, "Main", "LightPack", "");
  514. nRet |= inifile_write_str(strNewInstallIni, "Main", "TotalRunCount", "1");
  515. nRet |= inifile_write_str(strNewInstallIni, "Main", "TodayRunCount", "1");
  516. nRet |= inifile_write_str(strNewInstallIni, "Main", "CurrentTime", szNow);
  517. nRet |= inifile_write_str(strNewInstallIni, NewSoftwareVersion.ToString(), "PreviousInstallVersion", curVersion.ToString());
  518. nRet |= inifile_write_str(strNewInstallIni, NewSoftwareVersion.ToString(), "InstallPack", pszPackageName);
  519. nRet |= inifile_write_str(strNewInstallIni, NewSoftwareVersion.ToString(), "InstallState", "I"); // 正在安装
  520. // 去掉所有历史版本中轻量安装记录
  521. if (packs)
  522. {
  523. if (strlen(packs) >0)
  524. {
  525. char *p = NULL;
  526. while((p = strrchr(packs, ',')) != NULL)
  527. {
  528. *p = 0;
  529. WritePrivateProfileSectionA(p+1, NULL, strNewInstallIni);
  530. }
  531. WritePrivateProfileSectionA(packs, NULL, strNewInstallIni);
  532. }
  533. FREE(packs);
  534. }
  535. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("write version into install.ini done");
  536. // 修改内存配置项
  537. auto ver_info = (sp_cfg_version_info_t*)shm_malloc(sizeof(sp_cfg_version_info_t));
  538. memset(ver_info, 0, sizeof(sp_cfg_version_info_t));
  539. ver_info->version.major = NewSoftwareVersion.GetMajor();
  540. ver_info->version.minor = NewSoftwareVersion.GetMinor();
  541. ver_info->version.revision = NewSoftwareVersion.GetRevision();
  542. ver_info->version.build = NewSoftwareVersion.GetBuild();
  543. ver_info->previous_version.major = curVersion.GetMajor();
  544. ver_info->previous_version.minor = curVersion.GetMinor();
  545. ver_info->previous_version.revision = curVersion.GetRevision();
  546. ver_info->previous_version.build = curVersion.GetBuild();
  547. ver_info->install_pack = shm_strdup(pszPackageName);
  548. ver_info->install_state = Install_Pending;
  549. SHM_ARRAY_PUSH(cfg->install_ini->arr_version, sp_cfg_version_info_t*) = ver_info;
  550. cfg->install_ini->latter_install_version.major = NewSoftwareVersion.GetMajor();
  551. cfg->install_ini->latter_install_version.minor = NewSoftwareVersion.GetMinor();
  552. cfg->install_ini->latter_install_version.revision = NewSoftwareVersion.GetRevision();
  553. cfg->install_ini->latter_install_version.build = NewSoftwareVersion.GetBuild();
  554. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("write version into share mem done");
  555. return nRet == 0 ? Error_Succeed : Error_Unexpect;
  556. }
  557. ErrorCodeEnum SpEntityPrivilege::GenerateNewInstallCfg() {
  558. auto env = sp_get_env();
  559. auto cfg = env->cfg;
  560. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Generate new install.ini to %s", cfg->install_ini_path);
  561. if (ExistsFile(cfg->install_ini_path))
  562. {
  563. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("file exist, do not create, %s", cfg->install_ini_path);
  564. return Error_AlreadyExist;
  565. }
  566. char szVer[128];
  567. char szNow[128];
  568. y2k_time_t now;
  569. auto active_version = cfg->install_ini->install_version;
  570. auto szIniPath = cfg->install_ini_path;
  571. sprintf(szVer, "%d.%d.%d.%d", active_version.major, active_version.minor, active_version.revision, active_version.build);
  572. inifile_write_str(szIniPath, "Main", "InstallVersion", szVer);
  573. sprintf(szNow, "0x%08X", cfg->install_ini->install_time);
  574. inifile_write_str(szIniPath, "Main", "CreateDate", szNow);
  575. inifile_write_str(szIniPath, "Main", "LatterInstallVersion", "");
  576. inifile_write_str(szIniPath, "Main", "LightPack", "");
  577. inifile_write_str(szIniPath, "Main", "TotalRunCount", "0");
  578. inifile_write_str(szIniPath, "Main", "TodayRunCount", "0");
  579. inifile_write_str(szIniPath, "Main", "CurrentTime", szNow);
  580. inifile_write_str(szIniPath, szVer, "SwitchOverDate", szNow);
  581. inifile_write_str(szIniPath, szVer, "InstallPack", "");
  582. inifile_write_str(szIniPath, szVer, "InstallState", "A");
  583. return Error_Succeed;
  584. }
  585. ErrorCodeEnum CopyFolder(CSimpleStringA strSourcePath, CSimpleStringA strDestPath)
  586. {
  587. if (strSourcePath.IsNullOrEmpty() || strDestPath.IsNullOrEmpty())
  588. {
  589. return Error_Null;
  590. }
  591. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Start to copy dir %s to dir %s", (const char*)strSourcePath,(const char*)strDestPath);
  592. #ifdef _WIN32
  593. _finddata_t FileInfo;
  594. CSimpleStringA strfind = strSourcePath + "\\*";
  595. long Handle = _findfirst(strfind, &FileInfo);
  596. if (-1L == Handle)
  597. {
  598. _findclose(Handle);
  599. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s文件夹为空", strSourcePath);
  600. return Error_Succeed;
  601. }
  602. CSimpleStringA newPath;
  603. do{
  604. if (FileInfo.attrib & _A_SUBDIR)
  605. {
  606. if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
  607. {
  608. newPath = strSourcePath + "\\" + FileInfo.name;
  609. CSimpleStringA newDestPath = strDestPath + "\\" + FileInfo.name;
  610. /*if (strcmp(FileInfo.name, "") == 0)
  611. {
  612. continue;
  613. }*/
  614. if (!ExistsDirA(newDestPath))
  615. {
  616. CreateDirA(newDestPath, TRUE);
  617. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Create Dir %s success", (const char*)newDestPath);
  618. }
  619. CopyFolder(newPath, newDestPath);
  620. }
  621. }
  622. else
  623. {
  624. CSimpleStringA strFindName = FileInfo.name;
  625. {
  626. CSimpleStringA strSourceFile = strSourcePath + "\\" + strFindName;
  627. CSimpleStringA strDestFile = strDestPath + "\\" + strFindName;
  628. if (ExistsFileA(strSourceFile))
  629. {
  630. // 先去除目标文件只读属性
  631. if (ExistsFileA(strDestFile))
  632. RemoveFileReadOnlyAttributeA(strDestFile);
  633. LOG_TRACE("copy file from [%s] to [%s]", (const char*)strSourceFile, (const char*)strDestFile);
  634. BOOL bRet = CopyFileA(strSourceFile, strDestFile, FALSE);
  635. // 去除只读属性
  636. if (bRet)
  637. RemoveFileReadOnlyAttributeA(strDestFile);
  638. else
  639. {
  640. // 覆盖失败,则生成.new副本
  641. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy file [%s] to [%s] fail, now save as .new file", (const char*) strSourcePath, (const char*) strDestFile);
  642. strDestFile += ".new";
  643. bRet = CopyFileA(strSourceFile, strDestFile, FALSE);
  644. if (bRet)
  645. {
  646. RemoveFileReadOnlyAttributeA(strDestPath);
  647. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy [%s] as [%s] succeed", (const char*)strSourceFile, (const char*) strDestFile);
  648. }
  649. else
  650. {
  651. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("copy file [%s] as [%s] fail", (const char*) strSourceFile, (const char*) strDestFile));
  652. return Error_Block;
  653. }
  654. }
  655. }
  656. else
  657. {
  658. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("file [%s] to copy not exists", (const char*)strSourceFile));
  659. return Error_NotExist;
  660. }
  661. }
  662. }
  663. } while (_findnext(Handle, &FileInfo) == 0);
  664. _findclose(Handle);
  665. return Error_Succeed;
  666. #else
  667. if (CopyDirA(strSourcePath, strDestPath)) {
  668. return Error_Succeed;
  669. }
  670. return Error_Unexpect;
  671. #endif //_WIN32
  672. }
  673. CSimpleStringA GetFileDirectory(const char *pszFullPath)
  674. {
  675. int i=strlen(pszFullPath)-1;
  676. for( ; i>0 && pszFullPath[i]!=SPLIT_SLASH; i--)NULL;
  677. return CSimpleStringA(pszFullPath, i);
  678. }
  679. ErrorCodeEnum SpEntityPrivilege::BeginLightInstall(const char *pszPackageName)
  680. {
  681. // 创建安装包日志文件
  682. WriteInstallLog(pszPackageName, CSimpleStringA::Format("Begin install light pack: [%s]", pszPackageName));
  683. CSimpleStringA strAdPath;
  684. auto rc = GetPath("Ad", strAdPath);
  685. TOOLKIT_ASSERT(rc == Error_Succeed);
  686. CSimpleStringA strDownloadsPath;
  687. rc = GetPath("Downloads", strDownloadsPath);
  688. TOOLKIT_ASSERT(rc == Error_Succeed);
  689. CSimpleStringA strUnzipPath = CSimpleStringA::Format(
  690. "%s" SPLIT_SLASH_STR "%s",
  691. (const char*)strDownloadsPath, (const char*)pszPackageName);
  692. if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  693. strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength()-4);
  694. auto strConfigPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "Run.ini", (const char*)strUnzipPath);
  695. // 检查文件是否存在
  696. DWORD attr = GetFileAttributesA(strConfigPath);
  697. TOOLKIT_ASSERT((attr != INVALID_FILE_ATTRIBUTES) && !(attr & FILE_ATTRIBUTE_DIRECTORY));
  698. char *p = inifile_read_str(strConfigPath, "Action", "ToCopy", "");
  699. CSimpleStringA strToCopy = p;
  700. FREE(p);
  701. //TOOLKIT_ASSERT(!strToCopy.IsNullOrEmpty());
  702. if (strToCopy.IsNullOrEmpty())
  703. {
  704. LogError(Severity_Low, Error_Null, 0, "file to copy not define");
  705. return Error_Null;
  706. }
  707. #if defined(RVC_OS_LINUX)
  708. std::string strCopy = strToCopy.GetData();
  709. std::replace(strCopy.begin(), strCopy.end(), '\\', SPLIT_SLASH);
  710. strToCopy = strCopy.c_str();
  711. #endif //RVC_OS_LINUX
  712. auto list = strToCopy.Split(',');
  713. for(int i=0; i<list.GetCount(); i++)
  714. {
  715. auto &file = list[i];
  716. if (file.IsStartWith("Data" SPLIT_SLASH_STR))
  717. {
  718. // 通配符检测
  719. if (file.IndexOf("*") >0)
  720. {
  721. CSimpleStringA strSourcePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)GetFileDirectory(file));
  722. CSimpleStringA StrDirToCopy = GetFileDirectory(file).SubString(5, file.GetLength()-5);
  723. CSimpleStringA strDestPath = "";
  724. if (StrDirToCopy.IsNullOrEmpty())
  725. {
  726. strDestPath = strAdPath;
  727. }
  728. else
  729. {
  730. strDestPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strAdPath, (const char*)GetFileDirectory(file).SubString(5, file.GetLength()-5));
  731. }
  732. rc = CopyFolder(strSourcePath, strDestPath);
  733. if (Error_Succeed != rc)
  734. {
  735. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("copy dir [%s] to dir [%s] fail", (const char*)strSourcePath, (const char*)strDestPath));
  736. }
  737. }
  738. else
  739. {
  740. CSimpleStringA strSourcePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)file);
  741. CSimpleStringA strDestPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strAdPath, (const char*)file.SubString(5, file.GetLength()-5));
  742. if (ExistsFileA(strSourcePath))
  743. {
  744. // 先去除目标文件只读属性
  745. if (ExistsFileA(strDestPath))
  746. RemoveFileReadOnlyAttributeA(strDestPath);
  747. LOG_TRACE("copy file from [%s] to [%s]", (const char*)strSourcePath, (const char*)strDestPath);
  748. BOOL bRet = CopyFileA(strSourcePath, strDestPath, FALSE);
  749. // 去除只读属性
  750. if (bRet)
  751. RemoveFileReadOnlyAttributeA(strDestPath);
  752. else
  753. {
  754. // 覆盖失败,则生成.new副本
  755. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy file [%s] to [%s] fail, now save as .new file", (const char*) strSourcePath, (const char*) strDestPath);
  756. strDestPath += ".new";
  757. bRet = CopyFileA(strSourcePath, strDestPath, FALSE);
  758. if (bRet)
  759. {
  760. RemoveFileReadOnlyAttributeA(strDestPath);
  761. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("copy [%s] as [%s] succeed", (const char*)strSourcePath, (const char*) strDestPath);
  762. }
  763. else
  764. {
  765. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("copy file [%s] as [%s] fail", (const char*) strSourcePath, (const char*) strDestPath));
  766. return Error_Block;
  767. }
  768. }
  769. }
  770. else
  771. {
  772. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("file [%s] to copy not exists", (const char*)strSourcePath));
  773. return Error_NotExist;
  774. }
  775. }
  776. }
  777. else
  778. {
  779. LogError(Severity_Low, Error_NoPrivilege, 0, CSimpleStringA::Format("light pack [%s] has invalid copy item: [%s]",
  780. (const char*)pszPackageName, (const char*)file));
  781. return Error_NoPrivilege;
  782. }
  783. }
  784. // 登录到安装记录文件中
  785. sp_env_t *env = sp_get_env();
  786. auto cfg = env->cfg;
  787. CSimpleStringA strPackName = pszPackageName;
  788. CSimpleStringA strLightPacks = cfg->install_ini->light_packs;
  789. if (!strLightPacks.IsNullOrEmpty())
  790. strLightPacks += ",";
  791. strLightPacks += strPackName;
  792. inifile_write_str(cfg->install_ini_path, "Main", "LightPack", strLightPacks);
  793. shm_free(cfg->install_ini->light_packs);
  794. cfg->install_ini->light_packs = shm_strdup(strLightPacks);
  795. // 修改内存配置项
  796. sp_cfg_pack_info_t *pack_info = (sp_cfg_pack_info_t*)shm_malloc(sizeof(sp_cfg_pack_info_t));
  797. memset(pack_info, 0, sizeof(sp_cfg_pack_info_t));
  798. pack_info->name = shm_strdup(strPackName);
  799. pack_info->install_time = y2k_time_now();
  800. pack_info->state = Install_Installed;
  801. SHM_ARRAY_PUSH(cfg->install_ini->arr_light_pack, sp_cfg_pack_info_t*) = pack_info;
  802. inifile_format_write(cfg->install_ini_path, strPackName, "InstalledDate", "0x%08X", y2k_time_now());
  803. inifile_write_str(cfg->install_ini_path, strPackName, "PackState", "U");
  804. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("install light pack [%s] succeed", (const char*)strPackName);
  805. return Error_Succeed;
  806. }
  807. #ifdef _WIN32
  808. bool SpEntityPrivilege::IsWow64Process()
  809. {
  810. typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
  811. LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process");
  812. BOOL bIsWow64 = FALSE;
  813. if (NULL != fnIsWow64Process)
  814. {
  815. if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
  816. {
  817. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("call IsWow64Process error: %d", GetLastError());
  818. return false;
  819. }
  820. return bIsWow64 == TRUE;
  821. }
  822. else
  823. {
  824. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get IsWow64Process error: %d", GetLastError());
  825. return false;
  826. }
  827. }
  828. #endif //_WIN32
  829. // result=0&msg=install ok
  830. bool SpEntityPrivilege::GetSysUpgradeResult(const char *pszResultLog, ErrorCodeEnum &eErrorCode, CSimpleStringA &strErrMsg)
  831. {
  832. // 设置初始值
  833. eErrorCode = Error_Succeed;
  834. strErrMsg = "";
  835. if (!ExistsFileA(pszResultLog))
  836. {
  837. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleStringA::Format("result log [%s] not exist", pszResultLog));
  838. strErrMsg = "result.log not exist";
  839. return false;
  840. }
  841. FILE *pResultLog = fopen(pszResultLog, "r");
  842. if (pResultLog == NULL)
  843. {
  844. LogError(Severity_Low, Error_Unexpect, 0, CSimpleStringA::Format("open result log [%s] fail", pszResultLog));
  845. strErrMsg = "open result.log fail";
  846. return false;
  847. }
  848. char szTmp[4096] = {};
  849. int nRead = fread_s(szTmp, sizeof(szTmp), 1, sizeof(szTmp), pResultLog);
  850. CSimpleStringA strResult = szTmp;
  851. fclose(pResultLog);
  852. pResultLog = NULL;
  853. auto arr = strResult.Split('&');
  854. for (int i = 0; i < arr.GetCount(); i++)
  855. {
  856. auto arr2 = arr[i].Split('=');
  857. if (arr2.GetCount() == 2)
  858. {
  859. if (stricmp(arr2[0], "result") == 0)
  860. eErrorCode = (ErrorCodeEnum)(DWORD)atoi(arr2[1]);
  861. else if (stricmp(arr2[0], "msg") == 0)
  862. strErrMsg = arr2[1];
  863. }
  864. }
  865. return true;
  866. }
  867. // 执行系统外升级
  868. ErrorCodeEnum SpEntityPrivilege::BeginSysPackInstall(const char *pszPackageName, CSimpleStringA &strErrMsg)
  869. {
  870. // 创建安装包日志文件
  871. strErrMsg = "";
  872. WriteInstallLog(pszPackageName, CSimpleStringA::Format("begin install os pack: [%s]", pszPackageName));
  873. CSimpleStringA strDownloadsPath;
  874. auto rc = GetPath("Downloads", strDownloadsPath);
  875. TOOLKIT_ASSERT(rc == Error_Succeed);
  876. CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)pszPackageName);
  877. if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  878. strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength() - 4);
  879. auto strConfigPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "Run.ini", (const char*)strUnzipPath);
  880. // 检查文件是否存在
  881. DWORD attr = GetFileAttributesA(strConfigPath);
  882. TOOLKIT_ASSERT((attr != INVALID_FILE_ATTRIBUTES) && !(attr & FILE_ATTRIBUTE_DIRECTORY));
  883. // ToRun=install.bat
  884. char *p = inifile_read_str(strConfigPath, "Action", "ToRun", "");
  885. CSimpleStringA strToRun = p;
  886. FREE(p);
  887. //TOOLKIT_ASSERT(!strToCopy.IsNullOrEmpty());
  888. if (strToRun.IsNullOrEmpty())
  889. {
  890. strErrMsg = "未定义执行文件[ToRun]";
  891. LogError(Severity_Low, Error_Null, 0, "file to run not define");
  892. return Error_Null;
  893. }
  894. ErrorCodeEnum eErrorCode = Error_Succeed;
  895. auto list = strToRun.Split(',');
  896. for (int i = 0; i < list.GetCount(); i++)
  897. {
  898. auto &file = list[i];
  899. CSimpleStringA strSourcePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)file);
  900. if (ExistsFileA(strSourcePath))
  901. {
  902. #ifdef _WIN32
  903. // 如果是Wow64模式,需屏蔽System32重定向
  904. PVOID pRedirectOldValue(NULL);
  905. bool bIsWow64 = IsWow64Process();
  906. if (bIsWow64)
  907. {
  908. if (!Wow64DisableWow64FsRedirection(&pRedirectOldValue))
  909. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Wow64DisableWow64FsRedirection fail: %d", GetLastError());
  910. else
  911. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Wow64DisableWow64FsRedirection succ");
  912. }
  913. #endif //_WIN32
  914. // xkm@20161114: 执行完成,从result.txt中读取安装结果
  915. system(strSourcePath);
  916. CSimpleStringA strResultLog = strUnzipPath + SPLIT_SLASH_STR "result.log";
  917. if (!GetSysUpgradeResult(strResultLog, eErrorCode, strErrMsg))
  918. {
  919. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get upgrade result from result.log fail, %s", (const char*)strErrMsg);
  920. /** ?? [Gifur@202268]*/
  921. eErrorCode = Error_Succeed;
  922. strErrMsg = "";
  923. }
  924. #ifdef _WIN32
  925. // 如果是Wow64模式,恢复System32重定向
  926. if (bIsWow64)
  927. {
  928. if (!Wow64RevertWow64FsRedirection(pRedirectOldValue))
  929. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Wow64RevertWow64FsRedirection fail: %d", GetLastError());
  930. else
  931. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Wow64RevertWow64FsRedirection succ");
  932. }
  933. #endif //_WIN32
  934. if (eErrorCode != Error_Succeed)
  935. {
  936. LogError(Severity_Low, Error_UpdateFailed, 0, CSimpleStringA::Format("run file [%s] error: %s(%d)", (const char*)file, (const char*)strErrMsg, eErrorCode));
  937. WriteInstallLog(pszPackageName, CSimpleStringA::Format("run file [%s] error: %s(%d)", (const char*)file, (const char*)strErrMsg, eErrorCode));
  938. return eErrorCode;
  939. }
  940. }
  941. else
  942. {
  943. strErrMsg = "指定执行文件不存在";
  944. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("file [%s] to run not exists", (const char*)strSourcePath));
  945. WriteInstallLog(pszPackageName, CSimpleStringA::Format("file [%s] to run not exists", (const char*)strSourcePath));
  946. return Error_NotExist;
  947. }
  948. }
  949. WriteInstallLog(pszPackageName, "install sys pack succ");
  950. // 登录到安装记录文件中
  951. sp_env_t *env = sp_get_env();
  952. auto cfg = env->cfg;
  953. CSimpleStringA strPackName = pszPackageName;
  954. char *pszSysPacks = inifile_read_str(cfg->install_ini_path, "Main", "SysPack", "");
  955. CSimpleStringA strSysPacks = pszSysPacks;
  956. FREE(pszSysPacks);
  957. if (!strSysPacks.IsNullOrEmpty())
  958. strSysPacks += ",";
  959. strSysPacks += pszPackageName;
  960. inifile_write_str(cfg->install_ini_path, "Main", "SysPack", strSysPacks);
  961. inifile_format_write(cfg->install_ini_path, strPackName, "InstalledDate", "0x%08X", y2k_time_now());
  962. inifile_write_str(cfg->install_ini_path, strPackName, "PackState", "U");
  963. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("install sys pack [%s] succ", (const char*)strPackName);
  964. return Error_Succeed;
  965. }
  966. // 判断是否是已安装的系统外升级包
  967. ErrorCodeEnum SpEntityPrivilege::IsInstalledSysPack(const char *pszPackageName)
  968. {
  969. // 登录到安装记录文件中
  970. sp_env_t *env = sp_get_env();
  971. auto cfg = env->cfg;
  972. CSimpleStringA strPackName = pszPackageName;
  973. // 查询系统外升级包
  974. char *p = inifile_read_str(cfg->install_ini_path, "Main", "SysPack", "");
  975. CSimpleStringA strSysPackList = p;
  976. FREE(p);
  977. if (!strSysPackList.IsNullOrEmpty() && (strSysPackList.IndexOf(strPackName)!= -1))
  978. {
  979. return Error_Succeed;
  980. }
  981. return Error_Unexpect;
  982. }
  983. ErrorCodeEnum SpEntityPrivilege::CopyFileToNewVersion(const char *pszRelativeFile, int nCopyMode)
  984. {
  985. auto env = sp_get_env();
  986. auto cfg = env->cfg;
  987. // 取到新版本安装包名称
  988. char *p = inifile_read_str(cfg->install_ini_path, "Main", "LatterInstallVersion", "");
  989. CSimpleStringA strNewVer = p;
  990. FREE(p);
  991. TOOLKIT_ASSERT(!strNewVer.IsNullOrEmpty());
  992. CSimpleStringA strNewInstallIni = CSimpleStringA::Format(
  993. #ifdef _WIN32
  994. "%s\\%s\\install.ini",
  995. #else
  996. "%s/%s/install.ini",
  997. #endif //_WIN32
  998. env->dir->root_ver_path, (const char*)strNewVer);
  999. TOOLKIT_ASSERT(ExistsFileA(strNewInstallIni));
  1000. p = inifile_read_str(strNewInstallIni, strNewVer, "InstallPack", "");
  1001. CSimpleStringA strPackName = p;
  1002. FREE(p);
  1003. TOOLKIT_ASSERT(!strPackName.IsNullOrEmpty());
  1004. // 取得临时解压目录
  1005. CSimpleStringA strDownloadsPath;
  1006. auto rc = GetPath("Downloads", strDownloadsPath);
  1007. TOOLKIT_ASSERT(rc == Error_Succeed);
  1008. CSimpleStringA strUnzipPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadsPath, (const char*)strPackName);
  1009. if (strUnzipPath.IsEndWith(".zip") || strUnzipPath.IsEndWith(".cab"))
  1010. strUnzipPath = strUnzipPath.SubString(0, strUnzipPath.GetLength()-4);
  1011. CSimpleStringA strCopyPath = pszRelativeFile;
  1012. CSimpleStringA strSourceFile;
  1013. CSimpleStringA strDestFile;
  1014. if (strCopyPath.IsStartWith("Data" SPLIT_SLASH_STR))
  1015. {
  1016. CSimpleStringA strAdPath;
  1017. rc = GetPath("Ad", strAdPath);
  1018. TOOLKIT_ASSERT(rc == Error_Succeed);
  1019. strSourceFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)strCopyPath);
  1020. strDestFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strAdPath, (const char*)strCopyPath.SubString(5, strCopyPath.GetLength()-5));
  1021. }
  1022. else if (strCopyPath.IsStartWith("Run" SPLIT_SLASH_STR))
  1023. {
  1024. strSourceFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUnzipPath, (const char*)strCopyPath);
  1025. CSimpleStringA strNewVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", env->dir->root_ver_path, (const char*)strNewVer);
  1026. strDestFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s",(const char*) strNewVerPath, (const char*)strCopyPath.SubString(4, strCopyPath.GetLength()-4));
  1027. }
  1028. else
  1029. {
  1030. WriteInstallLog(strPackName, CSimpleStringA::Format("Copy file: [%s], result: [0x%X]", pszRelativeFile, Error_NoPrivilege));
  1031. LogError(Severity_Low, Error_NoPrivilege, 0, CSimpleStringA::Format("invalid copy item: [%s], must start with \"Data\" or \"Run\"", (const char*)pszRelativeFile));
  1032. return Error_NoPrivilege;
  1033. }
  1034. //TOOLKIT_ASSERT(ExistsFileA(strSourceFile));
  1035. if (!ExistsFileA(strSourceFile))
  1036. {
  1037. WriteInstallLog(strPackName, CSimpleStringA::Format("Copy file: [%s], result: [0x%X]", pszRelativeFile, Error_NotExist));
  1038. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("file [%s] to copy not exist", (const char*)strSourceFile));
  1039. return Error_NotExist;
  1040. }
  1041. //#ifdef _DEBUG
  1042. // bool bVerifySign = false;
  1043. //#else
  1044. // bool bVerifySign = true;
  1045. //#endif
  1046. //
  1047. // if (bVerifySign && (strSourceFile.IsEndWith(".dll", true) || strSourceFile.IsEndWith(".exe", true)))
  1048. // {
  1049. // CSimpleStringA strErrMsg;
  1050. // if (VerifySignature(strSourceFile, strErrMsg) != Error_Succeed)
  1051. // {
  1052. // WriteInstallLog(strPackName, CSimpleStringA::Format("file [%s] sign verify not pass: %s", pszRelativeFile, (const char*)strErrMsg));
  1053. // LogError(Severity_Low, Error_FailVerify, 0, CSimpleStringA::Format("file [%s] sign verify not pass: %s", (const char*)strSourceFile, (const char*)strErrMsg));
  1054. // return Error_FailVerify;
  1055. // }
  1056. // }
  1057. // check dest dir if exists
  1058. auto strDestDir = GetFileDirectory(strDestFile);
  1059. if (!ExistsDirA(strDestDir))
  1060. CreateDirA(strDestDir, TRUE);
  1061. BOOL bDestFileExists = ExistsFileA(strDestFile);
  1062. if (bDestFileExists)
  1063. RemoveFileReadOnlyAttributeA(strDestFile);
  1064. BOOL bRet = TRUE;
  1065. // 1(copy only exisit); 2(copy only not exist); 3(copy always); 4(no copy if exist)
  1066. switch (nCopyMode)
  1067. {
  1068. case 1:
  1069. {
  1070. if (bDestFileExists)
  1071. bRet= CopyFileA(strSourceFile, strDestFile, FALSE);
  1072. else
  1073. LOG_TRACE("ignore file [%s] copy for dest file not exists", pszRelativeFile);
  1074. }
  1075. break;
  1076. case 2:
  1077. {
  1078. if (!bDestFileExists)
  1079. bRet= CopyFileA(strSourceFile, strDestFile, TRUE);
  1080. else
  1081. LOG_TRACE("ignore file [%s] copy for dest file exists", pszRelativeFile);
  1082. }
  1083. break;
  1084. case 3:
  1085. bRet= CopyFileA(strSourceFile, strDestFile, FALSE);
  1086. break;
  1087. case 4:
  1088. {
  1089. // 不发生拷贝,只进行判断
  1090. if(bDestFileExists)
  1091. LOG_TRACE("file [%s] exist", pszRelativeFile);
  1092. else
  1093. LOG_TRACE("file [%s] not exist", pszRelativeFile);
  1094. }
  1095. break;
  1096. }
  1097. if (bRet)
  1098. RemoveFileReadOnlyAttributeA(strDestFile);
  1099. rc = bRet ? Error_Succeed : Error_Unexpect;
  1100. WriteInstallLog(strPackName, CSimpleStringA::Format("Copy file: [%s], result: [0x%X]", pszRelativeFile, rc));
  1101. return rc;
  1102. }
  1103. // File*A.*
  1104. bool SpEntityPrivilege::IsFileMatch(const char *pszFilter, const char *pszFileName)
  1105. {
  1106. if (stricmp(pszFilter, "*") == 0 || stricmp(pszFilter, "*.*") == 0)
  1107. return true;
  1108. const char *p1 = pszFilter;
  1109. const char *p2 = pszFileName;
  1110. if (p1 == NULL)
  1111. return true;
  1112. if (p2 == NULL)
  1113. return false;
  1114. if (*p1 ==NULL && *p2 ==NULL)
  1115. return true;
  1116. else if (*p1 == NULL)
  1117. return false;
  1118. else if (*p2 == NULL)
  1119. {
  1120. // 查找*p1是否全是*
  1121. while(*p1 == '*')
  1122. p1++;
  1123. if (*p1 == NULL)
  1124. return true;
  1125. else
  1126. return false;
  1127. }
  1128. if (*p1 != '*')
  1129. {
  1130. if (tolower(*p1) != tolower(*p2))
  1131. return false;
  1132. else
  1133. return IsFileMatch(p1+1, p2+1);
  1134. }
  1135. else
  1136. {
  1137. while(*++p1 == '*');
  1138. if (*p1 == NULL)
  1139. return true;
  1140. while (*p2)
  1141. {
  1142. while(tolower(*p1) != tolower(*p2) && *++p2);
  1143. if (*p2 == NULL)
  1144. return false;
  1145. if(IsFileMatch(p1+1, p2+1))
  1146. return true;
  1147. p2++;
  1148. }
  1149. return false;
  1150. }
  1151. }
  1152. CSimpleStringA SpEntityPrivilege::GetFileDirectory(const char *pszFullPath)
  1153. {
  1154. int i=strlen(pszFullPath);
  1155. for( ; i>0 && pszFullPath[i-1]!=SPLIT_SLASH; i--)NULL;
  1156. return CSimpleStringA(pszFullPath, i);
  1157. }
  1158. ErrorCodeEnum SpEntityPrivilege::DeleteFileInNewVersion(const char *pszRelativeFile)
  1159. {
  1160. auto env = sp_get_env();
  1161. auto cfg = env->cfg;
  1162. // 取到新版本安装包名称
  1163. char *p =inifile_read_str(cfg->install_ini_path, "Main", "LatterInstallVersion", "");
  1164. CSimpleStringA strNewVer = p;
  1165. FREE(p);
  1166. CSimpleStringA strNewInstallIni = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s" SPLIT_SLASH_STR "install.ini"
  1167. , env->dir->root_ver_path, (const char*)strNewVer);
  1168. TOOLKIT_ASSERT(ExistsFileA(strNewInstallIni));
  1169. p = inifile_read_str(strNewInstallIni, strNewVer, "InstallPack", "");
  1170. CSimpleStringA strPackName = p;
  1171. FREE(p);
  1172. TOOLKIT_ASSERT(!strPackName.IsNullOrEmpty());
  1173. CSimpleStringA strDelFile = pszRelativeFile;
  1174. CSimpleStringA strDestFile;
  1175. if (strDelFile.IsStartWith("Data" SPLIT_SLASH_STR))
  1176. {
  1177. CSimpleStringA strAdPath;
  1178. auto rc = GetPath("Ad", strAdPath);
  1179. TOOLKIT_ASSERT(rc == Error_Succeed);
  1180. strDestFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strAdPath, (const char*)strDelFile.SubString(5, strDelFile.GetLength()-5));
  1181. }
  1182. else if (strDelFile.IsStartWith("Run" SPLIT_SLASH_STR))
  1183. {
  1184. CSimpleStringA strNewVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", env->dir->root_ver_path, (const char*)strNewVer);
  1185. TOOLKIT_ASSERT(ExistsDirA(strNewVerPath));
  1186. strDestFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strNewVerPath, (const char*)strDelFile.SubString(4, strDelFile.GetLength()-4));
  1187. }
  1188. else
  1189. {
  1190. WriteInstallLog(strPackName, CSimpleStringA::Format("Delete file: [%s], result: [%d]", pszRelativeFile, Error_NoPrivilege));
  1191. LogError(Severity_Low, Error_NoPrivilege, 0, CSimpleStringA::Format("invalid delete item: [%s], must start with \"Data\" or \"Run\"", (const char*)pszRelativeFile));
  1192. return Error_NoPrivilege;
  1193. }
  1194. // 解析文件通配符*
  1195. BOOL bRet = TRUE;
  1196. int nIndex = strDestFile.IndexOf("*");
  1197. if (nIndex > 0)
  1198. {
  1199. CSimpleStringA strFileFilter = _GetFileName(strDestFile);
  1200. CSimpleStringA strDestDir = strDestFile.SubString(0, strDestFile.GetLength()-strFileFilter.GetLength()-1);
  1201. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete wildchar file [%s] in dir [%s]", (const char*)strFileFilter, (const char*)strDestDir);
  1202. // 删除所有匹配文件
  1203. auto arr = fileutil_get_sub_files(strDestDir);
  1204. if (arr != NULL)
  1205. {
  1206. for (int i = 0; i < arr->nelts; ++i)
  1207. {
  1208. char *file = ARRAY_IDX(arr, i, char*);
  1209. if (IsFileMatch(strFileFilter, _GetFileName(file)))
  1210. {
  1211. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete match file: [%s]", file);
  1212. bRet &= RemoveFileA(file);
  1213. }
  1214. else
  1215. {
  1216. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ignore not match file: [%s]", file);
  1217. }
  1218. }
  1219. toolkit_array_free2(arr);
  1220. }
  1221. // xkm@20170302: 删除所有匹配子目录
  1222. auto subdirs = fileutil_get_sub_dirs(strDestDir);
  1223. if (subdirs != NULL)
  1224. {
  1225. for (int i = 0; i < subdirs->nelts; ++i)
  1226. {
  1227. const char *dir = ARRAY_IDX(subdirs, i, char*);
  1228. if (IsFileMatch(strFileFilter, _GetFileName(dir)))
  1229. {
  1230. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete match dir: [%s]", dir);
  1231. bRet &= RemoveDirRecursive(dir);
  1232. }
  1233. else
  1234. {
  1235. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ignore not match dir: [%s]", dir);
  1236. }
  1237. }
  1238. toolkit_array_free2(subdirs);
  1239. }
  1240. }
  1241. else
  1242. {
  1243. if (ExistsFileA(strDestFile))
  1244. {
  1245. bRet = DeleteFileA(strDestFile);
  1246. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete file [%s] result: %d", strDestFile, bRet);
  1247. }
  1248. else if (ExistsDirA(strDestFile))
  1249. {
  1250. bRet = RemoveDirRecursive(strDestFile);
  1251. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete dir [%s] result: %d", strDestFile, bRet);
  1252. }
  1253. else
  1254. {
  1255. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("delete file [%s] fail, not exists", pszRelativeFile);
  1256. }
  1257. }
  1258. auto rc = bRet ? Error_Succeed : Error_Unexpect;
  1259. WriteInstallLog(strPackName, CSimpleStringA::Format("Delete file: [%s], result: [%d]", pszRelativeFile, rc));
  1260. return rc;
  1261. }
  1262. ErrorCodeEnum SpEntityPrivilege::RollBackToPreviousVersion()
  1263. {
  1264. auto env = sp_get_env();
  1265. auto cfg = env->cfg;
  1266. // 修改当前Install.ini配置
  1267. auto &v = cfg->install_ini->install_version;
  1268. CVersion curVersion(v.major, v.minor, v.revision, v.build);
  1269. CInstallInfo info = {};
  1270. auto rc = GetInstallInfo(curVersion, info);
  1271. TOOLKIT_ASSERT(rc == Error_Succeed);
  1272. if (!info.PreviousInstallVersion.IsValid())
  1273. {
  1274. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("current version [%s] has no previous version", (const char*)curVersion.ToString()));
  1275. return Error_NotExist;
  1276. }
  1277. auto strPrevVersion = info.PreviousInstallVersion.ToString();
  1278. // 检查对应文件夹是否存在
  1279. CSimpleStringA strPreVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", env->dir->root_ver_path, (const char*)strPrevVersion);
  1280. if (!ExistsDirA(strPreVerPath))
  1281. {
  1282. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("previous version dir [%s] not exists", (const char*)strPreVerPath));
  1283. return Error_NotExist;
  1284. }
  1285. // 修改当前版本状态为倒回R
  1286. int nRet = inifile_write_str(cfg->install_ini_path, curVersion.ToString(), "InstallState", "R");
  1287. // 更新回退次数
  1288. auto nTotalRollbackCount = inifile_read_int(cfg->install_ini_path, curVersion.ToString(), "TotalRollbackCount", 0);
  1289. nTotalRollbackCount++;
  1290. nRet = inifile_write_int(cfg->install_ini_path, curVersion.ToString(), "TotalRollbackCount", nTotalRollbackCount);
  1291. if (-1 == nRet)
  1292. {
  1293. LogError(Severity_Low, Error_Unexpect, 0, "inifile_write_int TotalRollbackCount");
  1294. }
  1295. LOG_TRACE("inifile_write_int, nTotalRollbackCount[%d]", nTotalRollbackCount);
  1296. // 修改active.txt文件
  1297. CSimpleStringA strActiveFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "active.txt", env->dir->root_ver_path);
  1298. HANDLE hFile = ::CreateFileA(strActiveFile, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1299. BOOL bSetSucc = FALSE;
  1300. if (hFile == INVALID_HANDLE_VALUE)
  1301. {
  1302. LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
  1303. return Error_Unexpect;
  1304. }
  1305. DWORD dwWrittenLen(0);
  1306. bSetSucc = WriteFile(hFile, (const char*)strPrevVersion, strPrevVersion.GetLength(), &dwWrittenLen, NULL);
  1307. FlushFileBuffers(hFile);
  1308. SetEndOfFile(hFile);
  1309. CloseHandle(hFile);
  1310. LOG_TRACE("set rollback to previous version [%s] succeed", (const char*)strPrevVersion);
  1311. //出现active文件为空的问题,此处增加写文件件后再读一次,确认是否写成功,以此来确认是否是写文件导致
  1312. if (1)
  1313. {
  1314. hFile = ::CreateFileA(strActiveFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1315. if (hFile == INVALID_HANDLE_VALUE)
  1316. {
  1317. LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
  1318. return Error_Unexpect;
  1319. }
  1320. DWORD dwReadLen(0);
  1321. char cVer[16] = { 0 };
  1322. if (ReadFile(hFile, cVer, 16, &dwReadLen, NULL))
  1323. {
  1324. LOG_TRACE("read active.txt, version len[%d], version[%s]", dwReadLen, cVer);
  1325. //如果为空,则重写
  1326. if (strlen(cVer) == 0)
  1327. {
  1328. if (WriteFile(hFile, (const char*)strPrevVersion, strPrevVersion.GetLength(), &dwWrittenLen, NULL))
  1329. {
  1330. LOG_TRACE("rewrite active.txt success, strPrevVersion[%s]", strPrevVersion);
  1331. }
  1332. else
  1333. {
  1334. LogError(Severity_Low, Error_Unexpect, 0, "rewrite active.txt fail");
  1335. }
  1336. }
  1337. }
  1338. else
  1339. {
  1340. LogError(Severity_Low, Error_Unexpect, 0, "Read active.txt fail");
  1341. }
  1342. FlushFileBuffers(hFile);
  1343. SetEndOfFile(hFile);
  1344. CloseHandle(hFile);
  1345. }
  1346. return bSetSucc ? Error_Succeed : Error_Unexpect;
  1347. }
  1348. ErrorCodeEnum SpEntityPrivilege::RollBackToHistoryVersion(CVersion historyVersion)
  1349. {
  1350. auto env = sp_get_env();
  1351. auto cfg = env->cfg;
  1352. // 判断目标版本是否小于当前版本
  1353. auto &v = cfg->install_ini->install_version;
  1354. CVersion curVersion(v.major, v.minor, v.revision, v.build);
  1355. if (curVersion <= historyVersion)
  1356. {
  1357. LogError(Severity_Low, Error_Param, 0, CSimpleStringA::Format("history version [%s] >= current version [%s]",
  1358. (const char*)historyVersion.ToString(), (const char*)curVersion.ToString()));
  1359. return Error_Param;
  1360. }
  1361. // 修改当前Install.ini配置
  1362. CInstallInfo info= {};
  1363. auto rc = GetInstallInfo(historyVersion, info);
  1364. if (rc != Error_Succeed)
  1365. {
  1366. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("history version [%s] to rollback not exist", (const char*)historyVersion.ToString()));
  1367. return Error_NotExist;
  1368. }
  1369. // 检查对应文件夹是否存在
  1370. CSimpleStringA strHisVersion = historyVersion.ToString();
  1371. CSimpleStringA strHisVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", env->dir->root_ver_path, (const char*)strHisVersion);
  1372. if (!ExistsDirA(strHisVerPath))
  1373. {
  1374. LogError(Severity_Low, Error_NotExist, 0, CSimpleStringA::Format("history version dir [%s] not exists", (const char*)strHisVerPath));
  1375. return Error_NotExist;
  1376. }
  1377. // 修改当前版本状态为倒回R
  1378. int nRet = inifile_write_str(cfg->install_ini_path, curVersion.ToString(), "InstallState", "R");
  1379. // 更新回退次数
  1380. auto nTotalRollbackCount = inifile_read_int(cfg->install_ini_path, curVersion.ToString(), "TotalRollbackCount", 0);
  1381. nTotalRollbackCount++;
  1382. nRet = inifile_write_int(cfg->install_ini_path, curVersion.ToString(), "TotalRollbackCount", nTotalRollbackCount);
  1383. if (-1 == nRet)
  1384. {
  1385. LogError(Severity_Low, Error_Unexpect, 0, "inifile_write_int TotalRollbackCount");
  1386. }
  1387. LOG_TRACE("inifile_write_int, nTotalRollbackCount[%d]", nTotalRollbackCount);
  1388. // 修改active.txt文件
  1389. CSimpleStringA strActiveFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "active.txt", env->dir->root_ver_path);
  1390. HANDLE hFile = ::CreateFileA(strActiveFile, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1391. BOOL bSetSucc = FALSE;
  1392. if (hFile == INVALID_HANDLE_VALUE)
  1393. {
  1394. LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
  1395. return Error_Unexpect;
  1396. }
  1397. DWORD dwWrittenLen(0);
  1398. bSetSucc = WriteFile(hFile, (const char*)strHisVersion, strHisVersion.GetLength(), &dwWrittenLen, NULL);
  1399. FlushFileBuffers(hFile);
  1400. SetEndOfFile(hFile);
  1401. CloseHandle(hFile);
  1402. //出现active文件为空的问题,此处增加写文件件后再读一次,确认是否写成功,以此来确认是否是写文件导致
  1403. if (1)
  1404. {
  1405. hFile = ::CreateFileA(strActiveFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1406. if (hFile == INVALID_HANDLE_VALUE)
  1407. {
  1408. LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
  1409. return Error_Unexpect;
  1410. }
  1411. DWORD dwReadLen(0);
  1412. char cVer[16] = {0};
  1413. if (ReadFile(hFile,cVer,16,&dwReadLen,NULL))
  1414. {
  1415. LOG_TRACE("read active.txt, version len[%d], version[%s]", dwReadLen, cVer);
  1416. }
  1417. else
  1418. {
  1419. LogError(Severity_Low, Error_Unexpect, 0, "Read active.txt fail");
  1420. }
  1421. CloseHandle(hFile);
  1422. }
  1423. LOG_TRACE("set rollback to history version [%s] succeed", (const char*)strHisVersion);
  1424. return bSetSucc ? Error_Succeed : Error_Unexpect;
  1425. }
  1426. ErrorCodeEnum SpEntityPrivilege::UpgradeToNewVersion(bool bToSysInstall)
  1427. {
  1428. auto env = sp_get_env();
  1429. auto cfg = env->cfg;
  1430. // 修改当前Install.ini配置
  1431. auto &v = cfg->install_ini->install_version;
  1432. CVersion curVersion(v.major, v.minor, v.revision, v.build);
  1433. int nRet = inifile_write_str(cfg->install_ini_path, curVersion.ToString(), "InstallState", "U"); // 已升级
  1434. // 取到新版本
  1435. char *p = inifile_read_str(cfg->install_ini_path, "Main", "LatterInstallVersion", "");
  1436. CSimpleStringA strNewVer = p;
  1437. FREE(p);
  1438. //TOOLKIT_ASSERT(!strNewVer.IsNullOrEmpty());
  1439. if (strNewVer.IsNullOrEmpty())
  1440. {
  1441. LogError(Severity_Low, Error_Unexpect, 0, "install.ini Main LatterInstallVersion is null");
  1442. return Error_Unexpect;
  1443. }
  1444. CSimpleStringA strNewVerPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", env->dir->root_ver_path, (const char*)strNewVer);
  1445. // 修改新版本install.ini
  1446. auto strNewInstallIni = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "install.ini", (const char*)strNewVerPath);
  1447. TOOLKIT_ASSERT(ExistsFileA(strNewInstallIni));
  1448. // 取新版本安装包名称
  1449. p = inifile_read_str(strNewInstallIni, strNewVer, "InstallPack", "");
  1450. CSimpleStringA strPackName = p;
  1451. FREE(p);
  1452. TOOLKIT_ASSERT(!strPackName.IsNullOrEmpty());
  1453. WriteInstallLog(strPackName, "Upgrade to new version");
  1454. nRet &= inifile_write_str(strNewInstallIni, curVersion.ToString(), "InstallState", "U"); // 已升级
  1455. nRet &= inifile_write_str(strNewInstallIni, strNewVer, "InstallState", "S"); // 设置启动
  1456. // 修改active.txt配置
  1457. CSimpleStringA strActiveFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "active.txt", env->dir->root_ver_path);
  1458. HANDLE hFile = ::CreateFileA(strActiveFile, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1459. BOOL bSetSucc = (nRet == 0);
  1460. if (hFile != INVALID_HANDLE_VALUE)
  1461. {
  1462. DWORD dwWrittenLen(0);
  1463. bSetSucc = bSetSucc && WriteFile(hFile, (const char*)strNewVer, strNewVer.GetLength(), &dwWrittenLen, NULL);
  1464. FlushFileBuffers(hFile);
  1465. SetEndOfFile(hFile);
  1466. CloseHandle(hFile);
  1467. LOG_TRACE("WriteFile [%s] to active.txt", (const char*)strNewVer);
  1468. }
  1469. else
  1470. {
  1471. bSetSucc = FALSE;
  1472. LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
  1473. }
  1474. //出现active文件为空的问题,此处增加写文件件后再读一次,确认是否写成功,以此来确认是否是写文件导致
  1475. if (1)
  1476. {
  1477. hFile = ::CreateFileA(strActiveFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  1478. if (hFile == INVALID_HANDLE_VALUE)
  1479. {
  1480. LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
  1481. return Error_Unexpect;
  1482. }
  1483. DWORD dwReadLen(0);
  1484. char cVer[16] = {0};
  1485. if (ReadFile(hFile,cVer,16,&dwReadLen,NULL))
  1486. {
  1487. LOG_TRACE("read active.txt, version len[%d], version[%s]", dwReadLen, cVer);
  1488. }
  1489. else
  1490. {
  1491. LogError(Severity_Low, Error_Unexpect, 0, "Read active.txt fail");
  1492. }
  1493. CloseHandle(hFile);
  1494. }
  1495. // 修改内存配置
  1496. if (bSetSucc)
  1497. {
  1498. sp_version_t newVersion = {};
  1499. sscanf((const char*)strNewVer, "%d.%d.%d.%d", &newVersion.major, &newVersion.minor, &newVersion.revision, &newVersion.build);
  1500. auto newVerInfo = sp_cfg_find_version_info(cfg, &newVersion);
  1501. if (newVerInfo != NULL)
  1502. newVerInfo->install_state = Install_SetToStart;
  1503. LOG_TRACE("set new version [%s] active", (const char*)strNewVer);
  1504. return Error_Succeed;
  1505. }
  1506. else
  1507. {
  1508. LogError(Severity_Low, Error_Unexpect, 0, "switch to new version fail");
  1509. }
  1510. return Error_Unexpect;
  1511. }
  1512. ErrorCodeEnum SpEntityPrivilege::SetRunSucceed()
  1513. {
  1514. sp_env_t *env = sp_get_env();
  1515. auto cfg = env->cfg;
  1516. // 修改内存状态
  1517. auto pVerInfo = sp_cfg_find_version_info(cfg, &cfg->install_ini->install_version);
  1518. pVerInfo->install_state = Install_Active; // 安装成功
  1519. // 设置后一版本状态为倒回
  1520. if (sp_version_is_valid(&cfg->install_ini->latter_install_version))
  1521. {
  1522. // 修改后一版本安装文件状态为倒回
  1523. auto &latterVer = cfg->install_ini->latter_install_version;
  1524. char tmp[MAX_PATH];
  1525. auto rc = sp_dir_get_path_version(env->dir, latterVer.major, latterVer.minor, latterVer.revision, latterVer.build, SP_DIR_INSTALL_INI,
  1526. NULL, tmp, MAX_PATH, detect_env_test_mode(env->cfg->args->test_mode));
  1527. if (rc != 0)
  1528. {
  1529. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get install.ini path failed!");
  1530. return (ErrorCodeEnum)rc;
  1531. }
  1532. if (ExistsFileA(tmp)) // 可能后续版本目录被删除
  1533. {
  1534. // 倒回状态
  1535. CVersion lVer(latterVer.major, latterVer.minor, latterVer.revision, latterVer.build);
  1536. inifile_write_str(tmp, (const char*)lVer.ToString(), "InstallState", "R");
  1537. // 修改内存状态
  1538. auto pLatterVerInfo = sp_cfg_find_version_info(cfg, &latterVer);
  1539. if (pLatterVerInfo != NULL)
  1540. pLatterVerInfo->install_state = Install_RollBack;
  1541. // 修改对应安装包日志
  1542. auto p = inifile_read_str(tmp, (const char*)lVer.ToString(), "InstallPack", "");
  1543. CSimpleStringA strPackName = p;
  1544. FREE(p);
  1545. TOOLKIT_ASSERT(!strPackName.IsNullOrEmpty());
  1546. auto &curVer = cfg->install_ini->install_version;
  1547. WriteInstallLog(strPackName, CSimpleStringA::Format("Rollback to version: [%d.%d.%d.%d]",
  1548. curVer.major, curVer.minor, curVer.revision, curVer.build));
  1549. }
  1550. }
  1551. // 设置当前版本安装状态为活动
  1552. char *pCurVersion = inifile_read_str(cfg->install_ini_path, "Main", "InstallVersion", "");
  1553. inifile_write_str(cfg->install_ini_path, pCurVersion, "InstallState", "A");
  1554. inifile_format_write(cfg->install_ini_path, pCurVersion, "SwitchOverDate", "0x%08X", y2k_time_now());
  1555. auto pPackName = inifile_read_str(cfg->install_ini_path, pCurVersion, "InstallPack", "");
  1556. CSimpleStringA strPackName = pPackName;
  1557. FREE(pCurVersion);
  1558. FREE(pPackName);
  1559. // 修改安装包历史
  1560. if (!strPackName.IsNullOrEmpty())
  1561. WriteInstallLog(strPackName, "Set version state active");
  1562. // 拷贝升级包到Upgraded目录
  1563. const char *pPackFile = pVerInfo->install_pack;
  1564. CSimpleStringA strDownloadPath, strUpgradedPath;
  1565. GetPath("Downloads", strDownloadPath);
  1566. GetPath("Upgraded", strUpgradedPath);
  1567. CSimpleStringA strSourcePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDownloadPath, pPackFile);
  1568. CSimpleStringA strDestPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strUpgradedPath, pPackFile);
  1569. CopyFileA(strSourcePath, strDestPath, FALSE);
  1570. return Error_Succeed;
  1571. }
  1572. ErrorCodeEnum SpEntityPrivilege::IsPackInstalled(const char *pszPackName, bool &bInstalled)
  1573. {
  1574. if (pszPackName == NULL)
  1575. {
  1576. bInstalled = false;
  1577. return Error_Param;
  1578. }
  1579. // 先从内存查找
  1580. auto env = sp_get_env();
  1581. auto cfg = env->cfg;
  1582. bInstalled = sp_cfg_is_pack_installed(cfg, pszPackName) == 0;
  1583. if (bInstalled)
  1584. return Error_Succeed;
  1585. // 再从安装文件目录查找
  1586. CSimpleStringA strPath;
  1587. GetPath("RunInfo", strPath);
  1588. CSimpleStringA strInstallLog = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "InstallLog" SPLIT_SLASH_STR "%s.log", (const char*)strPath, pszPackName);
  1589. bInstalled = ExistsFileA(strInstallLog) == TRUE;
  1590. return Error_Succeed;
  1591. }
  1592. ErrorCodeEnum SpEntityPrivilege::GetSystemStaticInfoForVersion(CVersion verSoftware,CSystemStaticInfo &Info)
  1593. {
  1594. auto env = sp_get_env();
  1595. auto cfg = env->cfg;
  1596. auto root_ini = cfg->root_ini;
  1597. memset(&Info, 0, sizeof(Info));
  1598. Info.strTerminalID = CSimpleStringA(root_ini->terminal_no);
  1599. Info.strMachineType = CSimpleStringA(root_ini->machine_type);
  1600. Info.MachineVersion = CVersion(root_ini->machine_version.major, root_ini->machine_version.minor, root_ini->machine_version.revision, root_ini->machine_version.build);
  1601. Info.eScreen = (ScreenEnum)root_ini->screen;
  1602. Info.strSite = root_ini->site;
  1603. Info.strEnrolAddr = root_ini->enroll_address;
  1604. Info.EnrolGPS = CSphereVector(root_ini->enroll_gps_x, root_ini->enroll_gps_y);
  1605. CSimpleStringA strInstallIni = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s" SPLIT_SLASH_STR "install.ini", env->dir->root_ver_path, (const char*)verSoftware.ToString());
  1606. if (ExistsFileA(strInstallIni))
  1607. {
  1608. int n1(0), n2(0), n3(0), n4(0);
  1609. auto p = inifile_read_str(strInstallIni, "Main", "LatterInstallVersion", "");
  1610. int n = sscanf(p, "%d.%d.%d.%d", &n1, &n2, &n3, &n4);
  1611. toolkit_free(p);
  1612. if (n == 4)
  1613. Info.LatterInstallVersion = CVersion(n1, n2, n3, n4);
  1614. else
  1615. Info.LatterInstallVersion = CVersion(0, 0, 0, 0);
  1616. //Info.LatterInstallPack = inifile_read_int(strInstallIni, "Main", "LatterInstallPack", 0);
  1617. Info.nTotalRunCount = inifile_read_int(strInstallIni, "Main", "TotalRunCount", 0);
  1618. Info.nTodayRunCount = inifile_read_int(strInstallIni, "Main", "TodayRunCount", 0);
  1619. Info.tmCreateDate = CSmallDateTime(inifile_read_int(strInstallIni, "Main", "CreateDate", 0));
  1620. Info.tmCurrentTime = CSmallDateTime(inifile_read_int(strInstallIni, "Main", "CurrentTime", 0));
  1621. p = inifile_read_str(strInstallIni, "Main", "InstallVersion", "");
  1622. n = sscanf(p, "%d.%d.%d.%d", &n1, &n2, &n3, &n4);
  1623. toolkit_free(p);
  1624. if (n != 4)
  1625. return Error_Unexpect;
  1626. Info.InstallVersion = CVersion(n1, n2, n3, n4);
  1627. auto strInstallVersion = Info.InstallVersion.ToString();
  1628. p = inifile_read_str(strInstallIni, strInstallVersion, "PreviousInstallVersion", "");
  1629. n = sscanf(p, "%d.%d.%d.%d", &n1, &n2, &n3, &n4);
  1630. toolkit_free(p);
  1631. if (n == 4)
  1632. Info.PreviousInstallVersion = CVersion(n1, n2, n3, n4);
  1633. else
  1634. Info.PreviousInstallVersion = CVersion(0, 0, 0, 0);
  1635. Info.tmSwithOverDate = CSmallDateTime(inifile_read_int(strInstallIni, strInstallVersion, "SwitchOverDate", 0));
  1636. p = inifile_read_str(strInstallIni, strInstallVersion, "InstallPack", "");
  1637. Info.InstallPack = p;
  1638. toolkit_free(p);
  1639. Info.InstallState = (InstallStateEnum)read_ini_install_state(strInstallIni, strInstallVersion, "InstallState");
  1640. // light pack
  1641. p = inifile_read_str(strInstallIni, "Main", "LightPack", "");
  1642. CSimpleStringA strLightPacks = p;
  1643. toolkit_free(p);
  1644. if (!strLightPacks.IsNullOrEmpty())
  1645. {
  1646. auto list = strLightPacks.Split(',');
  1647. Info.LightPackInfos.Init(list.GetCount());
  1648. for (int i = 0; i < list.GetCount(); ++i)
  1649. {
  1650. auto& strPackName = list[i];
  1651. Info.LightPackInfos[i].strPackName = strPackName;
  1652. Info.LightPackInfos[i].State = (InstallStateEnum)read_ini_install_state(strInstallIni, strPackName, "PackState");
  1653. Info.LightPackInfos[i].tmInstalledDate = CSmallDateTime(inifile_read_int(strInstallIni, strPackName, "InstalledDate", 0));
  1654. }
  1655. }
  1656. }
  1657. else
  1658. {
  1659. auto latterVer = cfg->install_ini->latter_install_version;
  1660. Info.LatterInstallVersion = CVersion(latterVer.major, latterVer.minor, latterVer.revision, latterVer.build);
  1661. Info.nTotalRunCount = cfg->install_ini->total_run_count;
  1662. Info.tmCreateDate = CSmallDateTime(cfg->install_ini->current_startup_time);
  1663. Info.tmCurrentTime = CSmallDateTime(cfg->install_ini->install_time);
  1664. auto installver = cfg->install_ini->install_version;
  1665. Info.InstallVersion = CVersion(installver.major, installver.minor, installver.revision, installver.build);
  1666. Info.PreviousInstallVersion = CVersion(0, 0, 0, 0);
  1667. Info.tmSwithOverDate = CSmallDateTime(cfg->install_ini->install_time);
  1668. Info.InstallPack = "";
  1669. Info.InstallState = Install_Active;
  1670. Info.InstallPack = "";
  1671. Info.LightPackInfos.Clear();
  1672. }
  1673. return Error_Succeed;
  1674. }
  1675. ErrorCodeEnum SpEntityPrivilege::SetSysDebugLevel(const char *pszEntityName,DebugLevelEnum eDebugLevel,bool bPersist)
  1676. {
  1677. sp_env_t *env = sp_get_env();
  1678. if (!pszEntityName)
  1679. return Error_Null;
  1680. if (stricmp(pszEntityName, "SpShell") == 0)
  1681. env->cfg->shell_ini->shell_debug_level = (int)eDebugLevel;
  1682. sp_cfg_shell_entity_t *cfg_ent = sp_cfg_get_entity_by_name(env->cfg, pszEntityName);
  1683. if (cfg_ent) {
  1684. int old = cfg_ent->debug_level;
  1685. if (old != eDebugLevel) {
  1686. cfg_ent->debug_level = (int)eDebugLevel;
  1687. if (bPersist) {
  1688. return SpTranslateError(sp_cfg_refresh_debug_level(env->cfg, cfg_ent));
  1689. }
  1690. }
  1691. } else {
  1692. return Error_NotExist;
  1693. }
  1694. return Error_Succeed;
  1695. }
  1696. ErrorCodeEnum SpEntityPrivilege::RefreshFrameworkState(FrameworkStateEnum eState)
  1697. {
  1698. int rc = Error_Succeed;
  1699. char n[12] = { '\0' };
  1700. sp_env_t* env = sp_get_env();
  1701. sp_cfg_t* cfg = env->cfg;
  1702. const int old_state = cfg->shell_ini->shell_state;
  1703. if (old_state != (int)eState) {
  1704. cfg->shell_ini->shell_state = eState;
  1705. _itoa(eState, n, 10);
  1706. rc = sp_var_client_set((sp_var_client_t*)m_var_client, VAR_RSERVERD_KEY_TERM_STATE, n, 0);
  1707. if (rc == Error_Succeed) {
  1708. iobuffer_t* pkt = iobuffer_create(-1, -1);
  1709. int v1 = (int)eState;
  1710. int v2 = (int)old_state;
  1711. iobuffer_write(pkt, IOBUF_T_I4, &v1, 0);
  1712. iobuffer_write(pkt, IOBUF_T_I4, &v2, 0);
  1713. rc = PostInfoShell(SHELL_CMD_INFO_TERMINALSTAGE_CHANGE, &pkt);
  1714. if (pkt) {
  1715. iobuffer_dec_ref(pkt);
  1716. }
  1717. }
  1718. }
  1719. return SpTranslateError(rc);
  1720. }
  1721. ErrorCodeEnum SpEntityPrivilege::ShowOuputConsole()
  1722. {
  1723. ErrorCodeEnum Error;
  1724. iobuffer_t *pkt = iobuffer_create(-1, -1);
  1725. Error = PostInfoShell(SHELL_CMD_INFO_OUTPUT_CONSOLE_ON, &pkt);
  1726. if (pkt)
  1727. iobuffer_dec_ref(pkt);
  1728. return Error;
  1729. }
  1730. ErrorCodeEnum SpEntityPrivilege::CloseOuputConsole()
  1731. {
  1732. ErrorCodeEnum Error;
  1733. iobuffer_t *pkt = iobuffer_create(-1, -1);
  1734. Error = PostInfoShell(SHELL_CMD_INFO_OUTPUT_CONSOLE_OFF, &pkt);
  1735. if (pkt)
  1736. iobuffer_dec_ref(pkt);
  1737. return Error;
  1738. }
  1739. ErrorCodeEnum SpEntityPrivilege::BeginLogSend(const char* endpoint, const char* topicSys, const char* topicUser, const char* topicBeidou, const char* bussSys, const char* bussUser)
  1740. {
  1741. ErrorCodeEnum Error;
  1742. iobuffer_t* pkt = iobuffer_create(-1, -1);
  1743. iobuffer_write(pkt, IOBUF_T_STR, endpoint, -1);
  1744. iobuffer_write(pkt, IOBUF_T_STR, topicSys, -1);
  1745. iobuffer_write(pkt, IOBUF_T_STR, topicUser, -1);
  1746. iobuffer_write(pkt, IOBUF_T_STR, topicBeidou, -1);
  1747. iobuffer_write(pkt, IOBUF_T_STR, bussSys, -1);
  1748. iobuffer_write(pkt, IOBUF_T_STR, bussUser, -1);
  1749. Error = PostInfoShell(SHELL_CMD_INFO_START_UPLOAD_LOG, &pkt);
  1750. if (pkt)
  1751. iobuffer_dec_ref(pkt);
  1752. return Error;
  1753. }
  1754. ErrorCodeEnum SpEntityPrivilege::SetHttpToken(const char* channelId, const char* token)
  1755. {
  1756. ErrorCodeEnum Error;
  1757. iobuffer_t* pkt = iobuffer_create(-1, -1);
  1758. iobuffer_write(pkt, IOBUF_T_STR, channelId, -1);
  1759. iobuffer_write(pkt, IOBUF_T_STR, token, -1);
  1760. Error = PostInfoShell(SHELL_CMD_INFO_UPDATE_TOKEN, &pkt);
  1761. if (pkt)
  1762. iobuffer_dec_ref(pkt);
  1763. return Error;
  1764. }
  1765. ErrorCodeEnum SpEntityPrivilege::SetEntityPriority(const char* pszEntityName, EntityPriorityEnum nPriority)
  1766. {
  1767. if (!pszEntityName)
  1768. return Error_Null;
  1769. sp_env_t* env = sp_get_env();
  1770. sp_mod_mgr_t* mod_mgr = env->mod_mgr;
  1771. sp_entity_t* ent = sp_mod_mgr_find_entity_by_name(mod_mgr, pszEntityName);
  1772. if (!ent) {
  1773. return Error_NotExist;
  1774. }
  1775. #ifndef _WIN32
  1776. auto func = [nPriority] {
  1777. switch (nPriority) {
  1778. case Priority_Low:
  1779. return TOOLKIT_PRIORITY_LOW;
  1780. case Priority_Below_Normal:
  1781. return TOOLKIT_PRIORITY_BELOW_NORMAL;
  1782. case Priority_Normal:
  1783. return TOOLKIT_PRIORITY_NORMAL;
  1784. case Priority_Above_Normal:
  1785. return TOOLKIT_PRIORITY_ABOVE_NORMAL;
  1786. case Priority_High:
  1787. return TOOLKIT_PRIORITY_HIGH;
  1788. case Priority_Highest:
  1789. return TOOLKIT_PRIORITY_HIGHEST;
  1790. default:
  1791. return TOOLKIT_PRIORITY_NORMAL;
  1792. }
  1793. };
  1794. int res = toolkit_os_setpriority(ent->mod->process.pid, func());
  1795. #else
  1796. int priviliegeValue = TOOLKIT_PRIORITY_NORMAL;
  1797. switch (nPriority) {
  1798. case Priority_Low:
  1799. priviliegeValue = TOOLKIT_PRIORITY_LOW;
  1800. break;
  1801. case Priority_Below_Normal:
  1802. priviliegeValue = TOOLKIT_PRIORITY_BELOW_NORMAL;
  1803. break;
  1804. case Priority_Normal:
  1805. priviliegeValue = TOOLKIT_PRIORITY_NORMAL;
  1806. break;
  1807. case Priority_Above_Normal:
  1808. priviliegeValue = TOOLKIT_PRIORITY_ABOVE_NORMAL;
  1809. break;
  1810. case Priority_High:
  1811. priviliegeValue = TOOLKIT_PRIORITY_HIGH;
  1812. break;
  1813. case Priority_Highest:
  1814. priviliegeValue = TOOLKIT_PRIORITY_HIGHEST;
  1815. break;
  1816. default:
  1817. priviliegeValue = TOOLKIT_PRIORITY_NORMAL;
  1818. break;
  1819. }
  1820. int res = toolkit_os_setpriority(ent->mod->process.pid, priviliegeValue);
  1821. #endif //NOT _WIN32
  1822. if (res != 0) {
  1823. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("toolkit_os_setpriority failed %s ", toolkit_strerror(res));
  1824. return Error_Unexpect;
  1825. }
  1826. return Error_Succeed;
  1827. }
  1828. ErrorCodeEnum SpEntityPrivilege::GetEntityPriority(const char* pszEntityName, EntityPriorityEnum& nPriority)
  1829. {
  1830. if (!pszEntityName)
  1831. return Error_Null;
  1832. sp_env_t* env = sp_get_env();
  1833. sp_mod_mgr_t* mod_mgr = env->mod_mgr;
  1834. sp_entity_t* ent = sp_mod_mgr_find_entity_by_name(mod_mgr, pszEntityName);
  1835. if (!ent) {
  1836. return Error_NotExist;
  1837. }
  1838. int priority;
  1839. int res = toolkit_os_getpriority(ent->mod->process.pid, &priority);
  1840. if (res != 0) {
  1841. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("toolkit_os_getpriority failed %s ", toolkit_strerror(res));
  1842. return Error_Unexpect;
  1843. }
  1844. #if defined(_MSC_VER)
  1845. switch (priority) {
  1846. case TOOLKIT_PRIORITY_LOW:
  1847. nPriority = Priority_Low;
  1848. break;
  1849. case TOOLKIT_PRIORITY_BELOW_NORMAL:
  1850. nPriority = Priority_Below_Normal;
  1851. break;
  1852. case TOOLKIT_PRIORITY_NORMAL:
  1853. nPriority = Priority_Normal;
  1854. break;
  1855. case TOOLKIT_PRIORITY_ABOVE_NORMAL:
  1856. nPriority = Priority_Above_Normal;
  1857. break;
  1858. case TOOLKIT_PRIORITY_HIGH:
  1859. nPriority = Priority_High;
  1860. break;
  1861. case TOOLKIT_PRIORITY_HIGHEST:
  1862. nPriority = Priority_Highest;
  1863. break;
  1864. default:
  1865. nPriority = Priority_Unknown;
  1866. break;
  1867. }
  1868. #else
  1869. auto func = [](int value) {
  1870. switch (value) {
  1871. case TOOLKIT_PRIORITY_LOW:
  1872. return Priority_Low;
  1873. case TOOLKIT_PRIORITY_BELOW_NORMAL:
  1874. return Priority_Below_Normal;
  1875. case TOOLKIT_PRIORITY_NORMAL:
  1876. return Priority_Normal;
  1877. case TOOLKIT_PRIORITY_ABOVE_NORMAL:
  1878. return Priority_Above_Normal;
  1879. case TOOLKIT_PRIORITY_HIGH:
  1880. return Priority_High;
  1881. case TOOLKIT_PRIORITY_HIGHEST:
  1882. return Priority_Highest;
  1883. default:
  1884. return Priority_Unknown;
  1885. }
  1886. };
  1887. nPriority = func(priority);
  1888. #endif //_MSC_VER
  1889. return Error_Succeed;
  1890. }
  1891. ErrorCodeEnum SpEntityPrivilege::GetToken(CSimpleString& curToken)
  1892. {
  1893. sp_env_t* env = sp_get_env();
  1894. if (env->cfg->shell_ini->token == NULL || strlen(env->cfg->shell_ini->token) == 0)
  1895. return ErrorCodeEnum::Error_NotConfig;
  1896. curToken = env->cfg->shell_ini->token;
  1897. return Error_Succeed;
  1898. }
  1899. ErrorCodeEnum SpEntityPrivilege::GetVTMErrMsgArr(CAutoArray<CSimpleStringA>& strErrorCodeArr, CAutoArray<CSimpleStringA>& strDescriptionArr,
  1900. CAutoArray<CSimpleStringA>& strRemarkArr)
  1901. {
  1902. sp_env_t* env = sp_get_env();
  1903. if(env->cfg->root_ini->vtm_err_msg_config == NULL || strlen(env->cfg->root_ini->vtm_err_msg_config) == 0)
  1904. return ErrorCodeEnum::Error_NotConfig;
  1905. return (ErrorCodeEnum)ConvertStrToVTMErrMsg(env->cfg->root_ini->vtm_err_msg_config, strErrorCodeArr, strDescriptionArr, strRemarkArr);
  1906. }
  1907. ErrorCodeEnum SpEntityPrivilege::TryUpdateToken(CSimpleString& oldToken, CSimpleString& newToken)
  1908. {
  1909. char t_oldToken[MAX_PATH] = "", t_newToken[MAX_PATH] = "";
  1910. auto ret = sp_TryUpdateToken(t_oldToken, t_newToken);
  1911. if (ret == Error_Succeed)
  1912. {
  1913. oldToken = t_oldToken;
  1914. newToken = t_newToken;
  1915. }
  1916. return (ErrorCodeEnum)ret;
  1917. }
  1918. ErrorCodeEnum SpEntityPrivilege::InitCfgUrl(VTMInitParam& info)
  1919. {
  1920. auto cfg = sp_get_env()->cfg;
  1921. if (cfg == NULL || cfg->shell_ini == NULL || cfg->root_ini == NULL)
  1922. return Error_Null;
  1923. if (info.terminalNo.GetLength() > 0)
  1924. {
  1925. if (cfg->root_ini->terminal_no)
  1926. shm_free(cfg->root_ini->terminal_no);
  1927. cfg->root_ini->terminal_no = shm_strdup(info.terminalNo.GetData());
  1928. }
  1929. if (info.channelId.GetLength() > 0)
  1930. {
  1931. if (cfg->shell_ini->channelId)
  1932. shm_free(cfg->shell_ini->channelId);
  1933. cfg->shell_ini->channelId = shm_strdup(info.channelId.GetData());
  1934. }
  1935. if (info.tokenSecret.GetLength() > 0)
  1936. {
  1937. if (cfg->shell_ini->tokenSecret)
  1938. shm_free(cfg->shell_ini->tokenSecret);
  1939. cfg->shell_ini->tokenSecret = shm_strdup(info.tokenSecret.GetData());
  1940. }
  1941. if (info.CommonLaunchUrl.GetLength() > 0)
  1942. {
  1943. if (cfg->shell_ini->CommonLaunchUrl)
  1944. shm_free(cfg->shell_ini->CommonLaunchUrl);
  1945. cfg->shell_ini->CommonLaunchUrl = shm_strdup(info.CommonLaunchUrl.GetData());
  1946. }
  1947. if (info.CenterConfigTotal.GetLength() > 0)
  1948. {
  1949. if (cfg->shell_ini->CenterConfigTotal)
  1950. shm_free(cfg->shell_ini->CenterConfigTotal);
  1951. cfg->shell_ini->CenterConfigTotal = shm_strdup(info.CenterConfigTotal.GetData());
  1952. }
  1953. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("TerminalNo:%s, CommonLaunchUrl:%s, CenterConfigTotal:%s"
  1954. , cfg->root_ini->terminal_no == NULL ? "" : cfg->root_ini->terminal_no
  1955. , cfg->shell_ini->CommonLaunchUrl == NULL ? "" : cfg->shell_ini->CommonLaunchUrl
  1956. , cfg->shell_ini->CenterConfigTotal == NULL ? "" : cfg->shell_ini->CenterConfigTotal);
  1957. return Error_Succeed;
  1958. }
  1959. ErrorCodeEnum SpEntityPrivilege::TryUpdateVTMERRMSG()
  1960. {
  1961. LOG_FUNCTION();
  1962. iobuffer_t* req_pkt = iobuffer_create(-1, -1);
  1963. SpAsyncWaitRPC* pAsyncWait = new SpAsyncWaitRPC(this, &req_pkt, SHELL_CMD_REQ_TRY_UPDATE_VTMERRMSG);
  1964. ErrorCodeEnum Error = pAsyncWait->Begin();
  1965. if (Error == Error_Succeed)
  1966. {
  1967. Error = pAsyncWait->WaitAnswer(30000);//WaitAnswer如果设定为INFINE,则最大10s,在http访问中会触发超时
  1968. if (Error == Error_Succeed)
  1969. {
  1970. CAutoBuffer AnsBuf;
  1971. bool bEnd;
  1972. Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
  1973. if (Error == Error_Succeed)
  1974. {
  1975. iobuffer_t* pkt = iobuffer_create(-1, AnsBuf.GetCount());
  1976. iobuffer_write(pkt, IOBUF_T_BUF, &AnsBuf[0], AnsBuf.GetCount());
  1977. }
  1978. }
  1979. }
  1980. pAsyncWait->DecrementRef();
  1981. if (req_pkt)
  1982. iobuffer_dec_ref(req_pkt);
  1983. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TryUpdateVTMERRMSG ret:%d", Error);
  1984. return Error;
  1985. }
  1986. ErrorCodeEnum SpEntityPrivilege::TryUpdateCfg()
  1987. {
  1988. LOG_FUNCTION();
  1989. iobuffer_t* req_pkt = iobuffer_create(-1, -1);
  1990. SpAsyncWaitRPC* pAsyncWait = new SpAsyncWaitRPC(this, &req_pkt, SHELL_CMD_REQ_TRY_UPDATE_CFG);
  1991. ErrorCodeEnum Error = pAsyncWait->Begin();
  1992. if (Error == Error_Succeed)
  1993. {
  1994. Error = pAsyncWait->WaitAnswer(30000);//WaitAnswer如果设定为INFINE,则最大10s,在http访问中会触发超时
  1995. if (Error == Error_Succeed)
  1996. {
  1997. CAutoBuffer AnsBuf;
  1998. bool bEnd;
  1999. Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
  2000. if (Error == Error_Succeed)
  2001. {
  2002. iobuffer_t* pkt = iobuffer_create(-1, AnsBuf.GetCount());
  2003. iobuffer_write(pkt, IOBUF_T_BUF, &AnsBuf[0], AnsBuf.GetCount());
  2004. }
  2005. }
  2006. }
  2007. pAsyncWait->DecrementRef();
  2008. if (req_pkt)
  2009. iobuffer_dec_ref(req_pkt);
  2010. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TryUpdateCfg ret:%d", Error);
  2011. return Error;
  2012. }
  2013. ErrorCodeEnum SpEntityPrivilege::ModifyMemCfgParam(MemCfgParam& info)
  2014. {
  2015. LOG_FUNCTION();
  2016. iobuffer_t* req_pkt = iobuffer_create(-1, -1);
  2017. iobuffer_write(req_pkt, IOBUF_T_STR, info.configType, -1);
  2018. iobuffer_write(req_pkt, IOBUF_T_STR, info.module.GetData(), -1);
  2019. iobuffer_write(req_pkt, IOBUF_T_STR, info.name.GetData(), -1);
  2020. iobuffer_write(req_pkt, IOBUF_T_STR, info.value.GetData(), -1);
  2021. SpAsyncWaitRPC* pAsyncWait = new SpAsyncWaitRPC(this, &req_pkt, SHELL_CMD_REQ_MODIFY_MEM_CFG);
  2022. ErrorCodeEnum Error = pAsyncWait->Begin();
  2023. if (Error == Error_Succeed)
  2024. {
  2025. Error = pAsyncWait->WaitAnswer(30000);//WaitAnswer如果设定为INFINE,则最大10s,在http访问中会触发超时
  2026. if (Error == Error_Succeed)
  2027. {
  2028. CAutoBuffer AnsBuf;
  2029. bool bEnd;
  2030. Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
  2031. if (Error == Error_Succeed)
  2032. {
  2033. iobuffer_t* pkt = iobuffer_create(-1, AnsBuf.GetCount());
  2034. iobuffer_write(pkt, IOBUF_T_BUF, &AnsBuf[0], AnsBuf.GetCount());
  2035. }
  2036. }
  2037. }
  2038. pAsyncWait->DecrementRef();
  2039. if (req_pkt)
  2040. iobuffer_dec_ref(req_pkt);
  2041. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ModifyMemCfgParam ret:%d", Error);
  2042. return Error;
  2043. }
  2044. ErrorCodeEnum SpEntityPrivilege::WriteTerminalNoToRootIni(CSimpleString terminalNo)
  2045. {
  2046. LOG_FUNCTION();
  2047. iobuffer_t* req_pkt = iobuffer_create(-1, -1);
  2048. iobuffer_write(req_pkt, IOBUF_T_STR, terminalNo.GetData(), -1);
  2049. SpAsyncWaitRPC* pAsyncWait = new SpAsyncWaitRPC(this, &req_pkt, SHELL_CMD_REQ_WRITE_TERMINALNO);
  2050. ErrorCodeEnum Error = pAsyncWait->Begin();
  2051. if (Error == Error_Succeed)
  2052. {
  2053. Error = pAsyncWait->WaitAnswer(30000);//WaitAnswer如果设定为INFINE,则最大10s,在http访问中会触发超时
  2054. if (Error == Error_Succeed)
  2055. {
  2056. CAutoBuffer AnsBuf;
  2057. bool bEnd;
  2058. Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
  2059. if (Error == Error_Succeed)
  2060. {
  2061. iobuffer_t* pkt = iobuffer_create(-1, AnsBuf.GetCount());
  2062. iobuffer_write(pkt, IOBUF_T_BUF, &AnsBuf[0], AnsBuf.GetCount());
  2063. }
  2064. }
  2065. }
  2066. pAsyncWait->DecrementRef();
  2067. if (req_pkt)
  2068. iobuffer_dec_ref(req_pkt);
  2069. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("WriteTerminalNoToRootIni ret:%d", Error);
  2070. return Error;
  2071. }
  2072. ErrorCodeEnum SpEntityPrivilege::TryUpdateCenterCfg(bool& isUpdate, bool& isReset, CSimpleString& version)
  2073. {
  2074. char t_version[MAX_PATH] = "";
  2075. int t_isUpdate = 0, t_isReset = 0;
  2076. auto ret = sp_TryUpdateCenterCfg(&t_isUpdate, &t_isReset, t_version);
  2077. if (ret == Error_Succeed)
  2078. {
  2079. isUpdate = t_isUpdate;
  2080. isReset = t_isReset;
  2081. version = t_version;
  2082. }
  2083. return (ErrorCodeEnum)ret;
  2084. }
  2085. void SpEntityPrivilege::GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
  2086. unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
  2087. unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
  2088. unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err)
  2089. {
  2090. #if defined(_MSC_VER)
  2091. log_producer_config_get_upload_info(t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
  2092. t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err);
  2093. #else
  2094. ///*TODO(80374374@3/9/2023): */
  2095. #endif //_MSC_VER
  2096. }
  2097. void SpEntityPrivilege::on_entity_create(int entity_id, int trigger_entity_id)
  2098. {
  2099. if (m_pEntityLifeListener) {
  2100. sp_env_t *env = sp_get_env();
  2101. IEntityLifeListener *pCallback = (IEntityLifeListener *)sp_mod_entity_life_listener_get_tag(m_pEntityLifeListener);
  2102. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  2103. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(mod_mgr, entity_id);
  2104. sp_entity_t *trigger_ent = sp_mod_mgr_find_entity_by_idx(mod_mgr, trigger_entity_id);
  2105. pCallback->OnCreated(ent->cfg->name, Error_Succeed, trigger_ent->cfg->name);
  2106. }
  2107. }
  2108. void SpEntityPrivilege::on_entity_close(int entity_id, int trigger_entity_id, int cause_code)
  2109. {
  2110. if (m_pEntityLifeListener) {
  2111. sp_env_t *env = sp_get_env();
  2112. IEntityLifeListener *pCallback = (IEntityLifeListener *)sp_mod_entity_life_listener_get_tag(m_pEntityLifeListener);
  2113. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  2114. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(mod_mgr, entity_id);
  2115. sp_entity_t *trigger_ent = sp_mod_mgr_find_entity_by_idx(mod_mgr, trigger_entity_id);
  2116. pCallback->OnClosed(ent->cfg->name, (EntityCloseCauseEnum)cause_code, Error_Succeed, trigger_ent->cfg->name);
  2117. }
  2118. }
  2119. void SpEntityPrivilege::on_entity_exception(int entity_id, int error, int entity_state)
  2120. {
  2121. if (m_pEntityLifeListener) {
  2122. sp_env_t *env = sp_get_env();
  2123. IEntityLifeListener *pCallback = (IEntityLifeListener *)sp_mod_entity_life_listener_get_tag(m_pEntityLifeListener);
  2124. sp_mod_mgr_t *mod_mgr = env->mod_mgr;
  2125. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(mod_mgr, entity_id);
  2126. pCallback->OnException(ent->cfg->name, "", (EntityStateEnum)entity_state, (EntityStateEnum)entity_state, (ErrorCodeEnum)error);
  2127. }
  2128. }
  2129. void SpEntityPrivilege::__on_entity_create(sp_mod_entity_life_listener_t *listener, int entity_id, int trigger_entity_id, void *user_data)
  2130. {
  2131. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2132. pThis->on_entity_create(entity_id, trigger_entity_id);
  2133. }
  2134. void SpEntityPrivilege::__on_entity_close(sp_mod_entity_life_listener_t *listener, int entity_id, int trigger_entity_id, int cause_code, void *user_data)
  2135. {
  2136. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2137. pThis->on_entity_close(entity_id, trigger_entity_id, cause_code);
  2138. }
  2139. void SpEntityPrivilege::__on_entity_exception(sp_mod_entity_life_listener_t *listener, int entity_id, int error, int entity_state, void *user_data)
  2140. {
  2141. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2142. pThis->on_entity_exception(entity_id, error, entity_state);
  2143. }
  2144. void SpEntityPrivilege::on_user_state(sp_mod_entity_state_listener_t *listener, int entity_id, int last_state, int curr_state)
  2145. {
  2146. sp_env_t *env = sp_get_env();
  2147. IEntityStateListener *pListener = (IEntityStateListener *)sp_mod_entity_listener_get_tag(listener);
  2148. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, entity_id);
  2149. pListener->OnUserStateHook(ent->cfg->name, (DWORD)curr_state, (DWORD)last_state);
  2150. }
  2151. void SpEntityPrivilege::on_entity_state(sp_mod_entity_state_listener_t *listener, int entity_id, int trigger_entity_id, int last_state, int curr_state)
  2152. {
  2153. sp_env_t *env = sp_get_env();
  2154. IEntityStateListener *pListener = (IEntityStateListener *)sp_mod_entity_listener_get_tag(listener);
  2155. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, entity_id);
  2156. sp_entity_t *trigger_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, trigger_entity_id);
  2157. pListener->OnEntityStateHook(ent->cfg->name, trigger_ent->cfg->name, (EntityStateEnum)curr_state, (EntityStateEnum)last_state);
  2158. }
  2159. void SpEntityPrivilege::on_create_connection(sp_mod_entity_state_listener_t *listener, int src_entity_id, int dst_entity_id)
  2160. {
  2161. sp_env_t *env = sp_get_env();
  2162. IEntityStateListener *pListener = (IEntityStateListener *)sp_mod_entity_listener_get_tag(listener);
  2163. sp_entity_t *src_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, src_entity_id);
  2164. sp_entity_t *dst_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, dst_entity_id);
  2165. pListener->OnCeateConnection(src_ent->cfg->name, dst_ent->cfg->name);
  2166. }
  2167. void SpEntityPrivilege::on_close_connection(sp_mod_entity_state_listener_t *listener, int src_entity_id, int dst_entity_id)
  2168. {
  2169. sp_env_t *env = sp_get_env();
  2170. IEntityStateListener *pListener = (IEntityStateListener *)sp_mod_entity_listener_get_tag(listener);
  2171. sp_entity_t *src_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, src_entity_id);
  2172. sp_entity_t *dst_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, dst_entity_id);
  2173. pListener->OnCloseConnection(src_ent->cfg->name, dst_ent->cfg->name);
  2174. }
  2175. void SpEntityPrivilege::__on_user_state(sp_mod_entity_state_listener_t *listener, int entity_id, int last_state, int curr_state, void *user_data)
  2176. {
  2177. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2178. pThis->on_user_state(listener, entity_id, last_state, curr_state);
  2179. }
  2180. void SpEntityPrivilege::__on_entity_state(sp_mod_entity_state_listener_t *listener, int entity_id, int trigger_entity_id, int last_state, int curr_state, void *user_data)
  2181. {
  2182. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2183. pThis->on_entity_state(listener, entity_id, trigger_entity_id, last_state, curr_state);
  2184. }
  2185. void SpEntityPrivilege::__on_create_connection(sp_mod_entity_state_listener_t *listener, int src_entity_id, int dst_entity_id, void *user_data)
  2186. {
  2187. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2188. pThis->on_create_connection(listener, src_entity_id, dst_entity_id);
  2189. }
  2190. void SpEntityPrivilege::__on_close_connection(sp_mod_entity_state_listener_t *listener, int src_entity_id, int dst_entity_id, void *user_data)
  2191. {
  2192. SpEntityPrivilege *pThis = static_cast<SpEntityPrivilege*>(user_data);
  2193. pThis->on_close_connection(listener, src_entity_id, dst_entity_id);
  2194. }