evtengine.cpp 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899
  1. #include "stdafx.h"
  2. #include "evtengine.h"
  3. #include "list.h"
  4. #include "array.h"
  5. #include "spinlock.h"
  6. #include "hashset.h"
  7. #include "hash.h"
  8. #include "jhash.h"
  9. #include "strutil.h"
  10. #include "fileutil.h"
  11. #include "scew.h"
  12. #if 0
  13. <?xml version="1.0" encoding="utf-8"?>
  14. <Transfer xmlns="test">
  15. <SlotList>
  16. <Slot Code="A" Timeout="1:00" OnceTrigger="true">
  17. <Filter></Filter>
  18. <Reset Source="B"/>
  19. <Reset Source="C"/>
  20. </Slot>
  21. <Slot Code="B" Timeout="" OnceTrigger="false">
  22. </Slot>
  23. </SlotList>
  24. <TriggerList>
  25. <Trigger LogType="Log_Warning" UserCode="2001" SeverityLevel="Severity_High" SysError="Error_Close" Message="">
  26. <Slot Code="Test2.TestSlot1" Positive="true"/>
  27. <Slot Code="TestSlot2"/>
  28. <SysVar Code="RunState">
  29. <State>O</State>
  30. <State>M</State>
  31. </SysVar>
  32. <SysVar Code="NetState" Positive="false">
  33. <State>D</State>
  34. </SysVar>
  35. </Trigger>
  36. </TriggerList>
  37. </Transfer>
  38. #endif
  39. #define BIT_MASK(bit) (1 << (bit))
  40. #ifndef MAX_PATH
  41. #define MAX_PATH 260
  42. #endif
  43. typedef struct evt_filter_key_t evt_filter_key_t;
  44. typedef struct evt_filter_t evt_filter_t;
  45. typedef struct evt_expire_t evt_expire_t;
  46. typedef struct evt_slot_key_t evt_slot_key_t;
  47. typedef struct evt_slot_t evt_slot_t;
  48. typedef struct evt_sysvar_rule_t evt_sysvar_rule_t;
  49. typedef struct evt_sysvar_key_t evt_sysvar_key_t;
  50. typedef struct evt_sysvar_t evt_sysvar_t;
  51. typedef struct evt_slot_rule_t evt_slot_rule_t;
  52. typedef struct evt_trigger_t evt_trigger_t;
  53. typedef struct evt_slotvar_t evt_slotvar_t;
  54. static int nIslog = 1;
  55. struct evt_filter_key_t
  56. {
  57. unsigned long long listen_id; // id
  58. };
  59. struct evt_filter_t
  60. {
  61. evt_filter_key_t key;
  62. int log_type;
  63. int ent_id;
  64. int severity;
  65. int sys_code;
  66. int user_code;
  67. char *entity;
  68. evt_slotvar_t *content_to_var;
  69. evt_slot_t *owner;
  70. struct hlist_node hentry;
  71. };
  72. struct evt_expire_t
  73. {
  74. int timer_id;
  75. int timeout;
  76. evt_slot_t *parent;
  77. };
  78. struct evt_slot_key_t
  79. {
  80. char *code;
  81. unsigned int index_hash_code;
  82. };
  83. struct evt_slotvar_t
  84. {
  85. char *name;
  86. char *init_value;
  87. char *current_value;
  88. };
  89. struct evt_slot_t
  90. {
  91. struct hlist_node hentry;
  92. evt_slot_key_t key;
  93. evt_expire_t *timer;
  94. evt_engine_t *parent;
  95. int once;
  96. array_header_t *arr_filter;
  97. array_header_t *arr_rref_reset;
  98. array_header_t *arr_ref_reset;
  99. array_header_t *arr_reset;
  100. array_header_t *arr_ref_trigger;
  101. array_header_t *arr_slotvar;
  102. int signal_state;
  103. struct list_head use_entry;
  104. struct list_head *use_list_ptr;
  105. };
  106. struct evt_sysvar_rule_t
  107. {
  108. struct list_head entry;
  109. evt_trigger_t *parent;
  110. int positive;
  111. array_header_t *arr_state;
  112. evt_sysvar_t *ref_sysvar;
  113. };
  114. struct evt_sysvar_key_t
  115. {
  116. char *code;
  117. unsigned int index_hash_code;
  118. };
  119. struct evt_sysvar_t
  120. {
  121. struct hlist_node hentry;
  122. evt_sysvar_key_t key;
  123. array_header_t *arr_ref_rule;
  124. struct evt_engine_t *parent;
  125. };
  126. struct evt_slot_rule_t
  127. {
  128. struct list_head entry;
  129. evt_trigger_t *parent;
  130. int positive;
  131. char *code;
  132. char *message;
  133. evt_slot_t *ref_slot;
  134. };
  135. struct evt_trigger_t
  136. {
  137. struct list_head entry;
  138. evt_engine_t *parent;
  139. struct list_head sysvar_list;
  140. struct list_head slot_rule_list;
  141. int log_type;
  142. int severity_level;
  143. int sys_code;
  144. int user_code;
  145. int delay_ms;
  146. int delay_timer_id; // if delay_ms != 0
  147. char *msg;
  148. struct list_head use_entry;
  149. };
  150. struct evt_engine_t
  151. {
  152. evt_engine_callback_t cb;
  153. struct list_head trigger_list;
  154. htable_t *filter_ht;
  155. htable_t *sysvar_ht;
  156. htable_t *slot_ht;
  157. spinlock_t lock;
  158. };
  159. static __inline void env_engine_lock(evt_engine_t *engine)
  160. {
  161. spinlock_enter(&engine->lock, -1);
  162. }
  163. static __inline void env_engine_unlock(evt_engine_t *engine)
  164. {
  165. spinlock_leave(&engine->lock);
  166. }
  167. static __inline unsigned int filter_key_hasher(const evt_filter_key_t *key)
  168. {
  169. return (unsigned int)key->listen_id;
  170. }
  171. static __inline int filter_key_cmp(const evt_filter_key_t *key1, const evt_filter_key_t *key2)
  172. {
  173. return key1->listen_id - key2->listen_id;
  174. }
  175. IMPLEMENT_HTABLE_STATIC(filter, evt_filter_key_t, evt_filter_t, key, hentry, filter_key_hasher, filter_key_cmp)
  176. static __inline unsigned int sysevt_key_hasher(const evt_sysvar_key_t *key)
  177. {
  178. return key->index_hash_code;
  179. }
  180. static __inline int sysevt_key_cmp(const evt_sysvar_key_t *key1, const evt_sysvar_key_t *key2)
  181. {
  182. return strcmp(key1->code, key2->code);
  183. }
  184. IMPLEMENT_HTABLE_STATIC(sysvar, evt_sysvar_key_t, evt_sysvar_t, key, hentry, sysevt_key_hasher, sysevt_key_cmp)
  185. static __inline unsigned int slot_key_hasher(const evt_slot_key_t *key)
  186. {
  187. return key->index_hash_code;
  188. }
  189. static __inline int sysevt_key_cmp(const evt_slot_key_t *key1, const evt_slot_key_t *key2)
  190. {
  191. return strcmp(key1->code, key2->code);
  192. }
  193. IMPLEMENT_HTABLE_STATIC(slot, evt_slot_key_t, evt_slot_t, key, hentry, slot_key_hasher, sysevt_key_cmp)
  194. static int process_trigger_list(evt_engine_t *engine, struct list_head *trigger_list);
  195. static int postprocess_slot_list(evt_engine_t *engine, struct list_head *affect_list);
  196. static void clear_slot_list(struct list_head *affect_list);
  197. static void clear_trigger_list(struct list_head *matched_trigger_list);
  198. static int generate_trigger_log(evt_engine_t *engine, evt_trigger_t *trigger);
  199. static void filter_free(evt_filter_t *filter)
  200. {
  201. if (filter) {
  202. if (filter->entity){
  203. free(filter->entity);
  204. }
  205. free(filter);
  206. }
  207. }
  208. static void slot_free(evt_slot_t *slot)
  209. {
  210. if (slot) {
  211. if (slot->key.code) {
  212. toolkit_free(slot->key.code);
  213. }
  214. if (slot->arr_filter) {
  215. int i;
  216. for (i = 0; i < slot->arr_filter->nelts; ++i) {
  217. evt_filter_t *filter = ARRAY_IDX(slot->arr_filter, i, evt_filter_t*);
  218. filter_free(filter);
  219. }
  220. array_free(slot->arr_filter);
  221. }
  222. if (slot->arr_reset) {
  223. int i;
  224. for (i = 0; i < slot->arr_reset->nelts; ++i) {
  225. toolkit_free(ARRAY_IDX(slot->arr_reset, i, char*));
  226. }
  227. array_free(slot->arr_reset);
  228. }
  229. if (slot->arr_ref_trigger) {
  230. array_free(slot->arr_ref_trigger);
  231. }
  232. if (slot->arr_rref_reset) {
  233. array_free(slot->arr_rref_reset);
  234. }
  235. if (slot->arr_ref_reset) {
  236. array_free(slot->arr_ref_reset);
  237. }
  238. if (slot->arr_slotvar) {
  239. int i;
  240. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  241. evt_slotvar_t *slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  242. if (slotvar->name){
  243. free(slotvar->name);
  244. }
  245. if (slotvar->init_value) {
  246. free(slotvar->init_value);
  247. }
  248. if (slotvar->current_value){
  249. free(slotvar->current_value);
  250. }
  251. free(slotvar);
  252. }
  253. array_free(slot->arr_slotvar);
  254. }
  255. if (slot->timer) {
  256. if (slot->signal_state) {
  257. int rc;
  258. evt_engine_t *engine = slot->parent;
  259. rc = engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  260. if (rc != 0)
  261. if (nIslog){
  262. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("kill timer %d failed!", slot->timer->timer_id);
  263. }
  264. slot->timer->timer_id = -1;
  265. }
  266. free(slot->timer);
  267. }
  268. free(slot);
  269. }
  270. }
  271. static void sysvar_free(evt_sysvar_t *sysvar)
  272. {
  273. if (sysvar) {
  274. if (sysvar->arr_ref_rule) {
  275. array_free(sysvar->arr_ref_rule);
  276. }
  277. if (sysvar->key.code){
  278. free(sysvar->key.code);
  279. }
  280. free(sysvar);
  281. }
  282. }
  283. static void trigger_free(evt_trigger_t *trigger)
  284. {
  285. if (trigger) {
  286. evt_slot_rule_t *slot_rule, *n1;
  287. evt_sysvar_rule_t *sysvar_rule, *n2;
  288. if (trigger->msg) {
  289. free(trigger->msg);
  290. }
  291. list_for_each_entry_safe(slot_rule, n1, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  292. list_del(&slot_rule->entry);
  293. //if (slot_rule->code)
  294. //free(slot_rule->code);
  295. free(slot_rule);
  296. }
  297. list_for_each_entry_safe(sysvar_rule, n2, &trigger->sysvar_list, evt_sysvar_rule_t, entry) {
  298. list_del(&sysvar_rule->entry);
  299. if (sysvar_rule->arr_state) {
  300. int i;
  301. for (i = 0; i < sysvar_rule->arr_state->nelts; ++i) {
  302. free(ARRAY_IDX(sysvar_rule->arr_state, i, char*));
  303. }
  304. array_free(sysvar_rule->arr_state);
  305. }
  306. free(sysvar_rule);
  307. }
  308. free(trigger);
  309. }
  310. }
  311. static void slot_rule_free(evt_slot_rule_t *rule)
  312. {
  313. if (rule) {
  314. if (rule->code){
  315. free(rule->code);
  316. }
  317. if (rule->message) {
  318. free(rule->message);
  319. }
  320. free(rule);
  321. }
  322. }
  323. static void sysvar_rule_free(evt_sysvar_rule_t *rule)
  324. {
  325. if (rule) {
  326. if (rule->arr_state) {
  327. int i;
  328. for (i = 0; i < rule->arr_state->nelts; ++i) {
  329. free(ARRAY_IDX(rule->arr_state, i, char*));
  330. }
  331. array_free(rule->arr_state);
  332. }
  333. free(rule);
  334. }
  335. }
  336. static void output_char(char **po, int *poi, int *pon, char *s, int sn)
  337. {
  338. char *o = *po;
  339. int on = *pon;
  340. int oi = *poi;
  341. if (sn == -1)
  342. sn = strlen(s);
  343. while (on-oi <= sn) {
  344. on = on * 2;
  345. o = (char*)realloc(o, on);
  346. }
  347. memcpy(o+oi, s, sn);
  348. oi += sn;
  349. *po = o;
  350. *poi = oi;
  351. *pon = on;
  352. }
  353. static evt_slotvar_t *slot_find_var(evt_slot_t *slot, char *s)
  354. {
  355. int i;
  356. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  357. evt_slotvar_t *slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  358. if (_stricmp(slotvar->name, s) == 0)
  359. return slotvar;
  360. }
  361. return NULL;
  362. }
  363. static char *expand_slot_rule_message(evt_slot_rule_t *slot_rule)
  364. {
  365. int oi = 0;
  366. int on = 32;
  367. char *o = (char*)malloc(on);
  368. int m = 0;
  369. char *s = NULL;
  370. char *p = slot_rule->message;
  371. while (*p) {
  372. if (m == 0) {
  373. if (p[0] == '$' && p[1] == '(') {
  374. m = 1;
  375. p++;
  376. }
  377. else {
  378. output_char(&o, &oi, &on, p, 1);
  379. }
  380. }
  381. else {
  382. if (p[0] == ')') {
  383. if (s) {
  384. char *t = (char*)malloc(p - s + 1);
  385. memcpy(t, s, p-s);
  386. t[p-s] = 0;
  387. evt_slotvar_t *slotvar = slot_find_var(slot_rule->ref_slot, t);
  388. free(t);
  389. if (slotvar) {
  390. output_char(&o, &oi, &on, slotvar->current_value, -1);
  391. }
  392. s = NULL;
  393. m = 0;
  394. }
  395. } else {
  396. if (!s) {
  397. s = p;
  398. }
  399. }
  400. }
  401. p++;
  402. }
  403. o[oi] = 0;
  404. return o;
  405. }
  406. static char *expand_trigger_message(evt_trigger_t *trigger)
  407. {
  408. int oi = 0;
  409. int on = 32;
  410. char *o = (char*)malloc(on);
  411. evt_slot_rule_t *tpos;
  412. list_for_each_entry(tpos, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  413. if (tpos->message) {
  414. char *t = expand_slot_rule_message(tpos);
  415. if (t) {
  416. output_char(&o, &oi, &on, t, -1);
  417. free(t);
  418. }
  419. }
  420. }
  421. if (trigger->msg) {
  422. output_char(&o, &oi, &on, trigger->msg, -1);
  423. }
  424. o[oi] = 0;
  425. return o;
  426. }
  427. static void get_matched_slot_list(evt_engine_t *engine, const CAutoArray<CUUID> &SubIDs, int log_type, int ent_id, int severity, int sys_code, int usr_code, const char *message, struct list_head *use_list)
  428. {
  429. #if 0
  430. evt_filter_key_t k;
  431. int i, j;
  432. for (j = 0; j < 3; ++j) {
  433. if (j == 0) {
  434. k.user_code = usr_code; // strict match
  435. } else if (j == 1) {
  436. k.user_code = -2; // accept any
  437. } else {
  438. if (usr_code) {
  439. k.user_code = -1; // reject ones that has no user code
  440. } else {
  441. continue;
  442. }
  443. }
  444. for (i = 0; i < engine->masks_cnt; ++i) {
  445. evt_filter_t *filter;
  446. int t = engine->masks[i];
  447. k.log_type = (t & BIT_MASK(LOG_FILTER_BIT_LOGTYPE)) ? Log_Ignore : log_type;
  448. k.ent_id = (t & BIT_MASK(LOG_FILTER_BIT_ENTITY)) ? -1 : ent_id;
  449. k.severity = (t & BIT_MASK(LOG_FILTER_BIT_SEVERITY)) ? Severity_None : severity;
  450. k.sys_code = (t & BIT_MASK(LOG_FILTER_BIT_SYSCODE)) ? Error_IgnoreAll : sys_code;
  451. k.index_hash_code = hash_filter(k.log_type, k.ent_id, k.severity, k.sys_code, k.user_code);
  452. filter = filter_find(engine->filter_ht, &k);
  453. while (filter) {
  454. int ii;
  455. for (ii = 0; ii < filter->arr_ref_slot->nelts; ++ii) {
  456. evt_slot_t *slot = ARRAY_IDX(filter->arr_ref_slot, ii, evt_slot_t*);
  457. if (!slot->use_entry.next) {
  458. list_add_tail(&slot->use_entry, use_list);
  459. slot->use_list_ptr = use_list;
  460. }
  461. }
  462. filter = filter_find_continue(engine->filter_ht, &filter->hentry, &k);
  463. }
  464. }
  465. }
  466. #endif
  467. int i;
  468. for (i = 0; i < SubIDs.GetCount(); ++i) {
  469. evt_filter_t *filter;
  470. evt_filter_key_t k;
  471. k.listen_id = (unsigned int)SubIDs[i];
  472. filter = filter_find(engine->filter_ht, &k);
  473. if (filter) {
  474. evt_slot_t *slot = filter->owner;
  475. if (nIslog){
  476. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("filter found, usr_code:%d, listen_id:%d", usr_code, k.listen_id);
  477. }
  478. if (!slot->use_entry.next) {
  479. list_add_tail(&slot->use_entry, use_list);
  480. slot->use_list_ptr = use_list;
  481. }
  482. if (filter->content_to_var) {
  483. if (filter->content_to_var->current_value) {
  484. free(filter->content_to_var->current_value);
  485. }
  486. filter->content_to_var->current_value = _strdup(message);
  487. }
  488. }
  489. else {
  490. if (nIslog){
  491. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find filter, listen_id:%d", k.listen_id);
  492. }
  493. }
  494. }
  495. }
  496. static void get_reset_slot_list(evt_engine_t *engine, struct list_head *matched_list, struct list_head *reset_list)
  497. {
  498. evt_slot_t *pos;
  499. list_for_each_entry(pos, matched_list, evt_slot_t, use_entry) {
  500. if (pos->arr_ref_reset) {
  501. int i;
  502. for (i = 0; i < pos->arr_ref_reset->nelts; ++i) {
  503. evt_slot_t *t = ARRAY_IDX(pos->arr_ref_reset, i, evt_slot_t*);
  504. if (!t->use_entry.next) {
  505. list_add_tail(&t->use_entry, reset_list);
  506. t->use_list_ptr = reset_list;
  507. }
  508. else {
  509. if (t->use_list_ptr == matched_list) {
  510. if (nIslog){
  511. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("warning: slot %s already set, cannot reset from slot %s ", t->key.code, pos->key.code);
  512. }
  513. }
  514. else if (t->use_list_ptr == reset_list) {
  515. // already triggers by others
  516. }
  517. else {
  518. if (nIslog){
  519. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("bug detected! %s%d", __FUNCTION__, __LINE__);
  520. }
  521. }
  522. }
  523. }
  524. }
  525. }
  526. }
  527. static void get_matched_trigger_list(evt_engine_t *engine, struct list_head *use_slot_list, struct list_head *use_trigger_list)
  528. {
  529. evt_slot_t *pos;
  530. list_for_each_entry(pos, use_slot_list, evt_slot_t, use_entry) {
  531. int i;
  532. for (i = 0; i < pos->arr_ref_trigger->nelts; ++i) {
  533. evt_trigger_t *trigger = ARRAY_IDX(pos->arr_ref_trigger, i, evt_trigger_t*);
  534. if (!trigger->use_entry.next) {
  535. list_add_tail(&trigger->use_entry, use_trigger_list);
  536. }
  537. }
  538. }
  539. }
  540. static void timer_cb(int timer_id, void *user_data)
  541. {
  542. evt_slot_t *slot = (evt_slot_t*)user_data;
  543. evt_engine_t *engine = slot->parent;
  544. if (timer_id == slot->timer->timer_id) {
  545. int rc;
  546. struct list_head affect_list = LIST_HEAD_INIT(affect_list);
  547. struct list_head trigger_list = LIST_HEAD_INIT(trigger_list);
  548. list_add_tail(&slot->use_entry, &affect_list);
  549. slot->use_list_ptr = &affect_list;
  550. slot->signal_state = !slot->signal_state;
  551. if (!slot->signal_state && slot->arr_slotvar) {
  552. int i;
  553. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  554. evt_slotvar_t *slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t *);
  555. free(slotvar->current_value);
  556. slotvar->current_value = _strdup(slotvar->init_value);
  557. }
  558. }
  559. engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  560. slot->timer->timer_id = -1;
  561. get_matched_trigger_list(engine, &affect_list, &trigger_list);
  562. rc = process_trigger_list(engine, &trigger_list);
  563. if (rc != 0) {
  564. if (nIslog){
  565. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process trigger list failed!");
  566. }
  567. return;
  568. }
  569. rc = postprocess_slot_list(engine, &affect_list);
  570. if (rc != 0) {
  571. if (nIslog){
  572. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("postprocess slotlist failed!");
  573. }
  574. return;
  575. }
  576. clear_slot_list(&affect_list);
  577. clear_trigger_list(&trigger_list);
  578. }
  579. }
  580. static void trigger_timer_cb(int timer_id, void *user_data)
  581. {
  582. evt_trigger_t *trigger = (evt_trigger_t *)user_data;
  583. evt_engine_t *engine = trigger->parent;
  584. if (timer_id == trigger->delay_timer_id) {
  585. generate_trigger_log(engine, trigger);
  586. engine->cb.kill_timer(engine, trigger->delay_timer_id, engine->cb.user_data);
  587. trigger->delay_timer_id = -1;
  588. }
  589. }
  590. static int process_matched_slot(evt_engine_t *engine, evt_slot_t *slot, int *removed)
  591. {
  592. int rc = 0;
  593. if (slot->signal_state) {
  594. // reset timer
  595. if (slot->timer) {
  596. rc = engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  597. if (rc != 0) {
  598. if (nIslog){
  599. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("kill timer failed! slot: %s, timer_id: %d", slot->key.code, slot->timer->timer_id);
  600. }
  601. }
  602. else {
  603. int new_id = engine->cb.new_timer_id(engine, engine->cb.user_data);
  604. slot->timer->timer_id = new_id;
  605. rc = engine->cb.set_timer(engine, new_id, slot->timer->timeout, &timer_cb, slot, engine->cb.user_data);
  606. if (rc != 0) {
  607. if (nIslog){
  608. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set timer failed! slot: %s, timer_id: %d", slot->key.code, new_id);
  609. }
  610. }
  611. }
  612. }
  613. if (removed){
  614. *removed = 1;
  615. }
  616. }
  617. else {
  618. slot->signal_state = !slot->signal_state;
  619. if (slot->timer) {
  620. int new_id = engine->cb.new_timer_id(engine, engine->cb.user_data);
  621. slot->timer->timer_id = new_id;
  622. rc = engine->cb.set_timer(engine, new_id, slot->timer->timeout, &timer_cb, slot, engine->cb.user_data);
  623. if (rc != 0) {
  624. if (nIslog){
  625. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set timer failed! slot: %s, timer_id: %d", slot->key.code, new_id);
  626. }
  627. }
  628. }
  629. if (removed) {
  630. *removed = 0;
  631. }
  632. }
  633. return rc;
  634. }
  635. static int process_matched_slot_list(evt_engine_t *engine, struct list_head *slot_list)
  636. {
  637. evt_slot_t *pos, *n;
  638. int rc = 0;
  639. list_for_each_entry_safe(pos, n, slot_list, evt_slot_t, use_entry) {
  640. int removed;
  641. rc = process_matched_slot(engine, pos, &removed);
  642. if (rc != 0) {
  643. if (nIslog){
  644. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process matched slot %s failed!", pos->key.code);
  645. }
  646. break;
  647. }
  648. if (removed) {
  649. list_del(&pos->use_entry);
  650. pos->use_entry.next = pos->use_entry.prev = NULL;
  651. pos->use_list_ptr = NULL;
  652. }
  653. }
  654. return rc;
  655. }
  656. static int process_reset_slot(evt_engine_t *engine, evt_slot_t *slot, int *removed)
  657. {
  658. int rc = 0;
  659. if (nIslog){
  660. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process reset slot: %s, current signal:%d", slot->key.code, slot->signal_state);
  661. }
  662. if (slot->signal_state) {
  663. slot->signal_state = !slot->signal_state;
  664. if (slot->timer) {
  665. rc = engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  666. slot->timer->timer_id = -1;
  667. }
  668. if (removed){
  669. *removed = 0;
  670. }
  671. if (slot->arr_slotvar) {
  672. int i;
  673. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  674. evt_slotvar_t* slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  675. free(slotvar->current_value);
  676. slotvar->current_value = _strdup(slotvar->init_value);
  677. }
  678. }
  679. }
  680. else {
  681. if (removed){
  682. *removed = 1;
  683. }
  684. }
  685. return rc;
  686. }
  687. static int process_reset_slot_list(evt_engine_t *engine, struct list_head *reset_list)
  688. {
  689. evt_slot_t *pos, *n;
  690. int rc = 0;
  691. list_for_each_entry_safe(pos, n, reset_list, evt_slot_t, use_entry) {
  692. int removed;
  693. rc = process_reset_slot(engine, pos, &removed);
  694. if (rc != 0) {
  695. if (nIslog){
  696. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process reset slot %s failed!", pos->key.code);
  697. }
  698. break;
  699. }
  700. if (removed) {
  701. list_del(&pos->use_entry);
  702. pos->use_entry.next = pos->use_entry.prev = NULL;
  703. pos->use_list_ptr = NULL;
  704. }
  705. }
  706. return rc;
  707. }
  708. static int generate_trigger_log(evt_engine_t *engine, evt_trigger_t *trigger)
  709. {
  710. int rc = Error_Succeed;
  711. char *msg = expand_trigger_message(trigger);
  712. switch (trigger->log_type) {
  713. case Log_Warning:
  714. LogWarn((SeverityLevelEnum)trigger->severity_level,(ErrorCodeEnum)trigger->sys_code, (DWORD)trigger->user_code,msg);
  715. break;
  716. case Log_Debug:
  717. LogTrace(msg, __FILE__, __LINE__);
  718. break;
  719. case Log_Error:
  720. LogError((SeverityLevelEnum)trigger->severity_level, (ErrorCodeEnum)trigger->sys_code, trigger->user_code, msg);
  721. break;
  722. case Log_Event:
  723. LogEvent((SeverityLevelEnum)trigger->severity_level, (DWORD)trigger->user_code, msg);
  724. break;
  725. default:
  726. if (nIslog){
  727. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("bug detected! %s %d", __FUNCTION__, __LINE__);
  728. }
  729. assert(0);
  730. rc = Error_Bug;
  731. }
  732. free(msg);
  733. return rc;
  734. }
  735. static int process_trigger(evt_engine_t *engine, evt_trigger_t *trigger)
  736. {
  737. int rc = 0;
  738. int ok = 0;
  739. if (nIslog){
  740. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process_trigger %s begin!", trigger->msg);
  741. }
  742. {
  743. evt_slot_rule_t *pos;
  744. list_for_each_entry(pos, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  745. if (nIslog){
  746. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule, code:%s positive:%d signal:%d", pos->code, pos->positive, pos->ref_slot->signal_state);
  747. }
  748. if (pos->positive ^ pos->ref_slot->signal_state)
  749. goto on_done;
  750. }
  751. }
  752. {
  753. evt_sysvar_rule_t *pos;
  754. list_for_each_entry(pos, &trigger->sysvar_list, evt_sysvar_rule_t, entry) {
  755. int i;
  756. CSimpleStringA strState;
  757. rc = engine->cb.get_sysevent(engine, pos->ref_sysvar->key.code, strState, engine->cb.user_data);
  758. if (rc != 0) {
  759. if (nIslog){
  760. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get sysvar failed!");
  761. }
  762. goto on_done;
  763. }
  764. if (nIslog){
  765. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sysvar key=%s, value=%s", pos->ref_sysvar->key.code, (LPCSTR)strState);
  766. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sysvar rule, %s, positive:%d", pos->ref_sysvar->key.code, pos->positive);
  767. }
  768. if (pos->positive) {
  769. for (i = 0; i < pos->arr_state->nelts; ++i) {
  770. char *state = ARRAY_IDX(pos->arr_state, i, char*);
  771. if (nIslog){
  772. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sys var state:%s", state);
  773. }
  774. if (strcmp(strState, state) == 0) {
  775. break;
  776. }
  777. }
  778. if (i == pos->arr_state->nelts) {
  779. goto on_done;
  780. }
  781. }
  782. else {
  783. for (i = 0; i < pos->arr_state->nelts; ++i) {
  784. char *state = ARRAY_IDX(pos->arr_state, i, char*);
  785. if (nIslog){
  786. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sys var state:%s", state);
  787. }
  788. if (strcmp(strState, state) == 0) {
  789. goto on_done;
  790. }
  791. }
  792. }
  793. }
  794. }
  795. ok = 1;
  796. on_done:
  797. if (ok) {
  798. if (trigger->delay_ms != 0 && trigger->delay_timer_id == -1) {
  799. trigger->delay_timer_id = engine->cb.new_timer_id(engine, engine->cb.user_data);
  800. rc = engine->cb.set_timer(engine, trigger->delay_timer_id, trigger->delay_ms, &trigger_timer_cb, trigger, engine->cb.user_data);
  801. if (rc != 0) {
  802. if (nIslog){
  803. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set timer failed!");
  804. }
  805. }
  806. } else {
  807. rc = generate_trigger_log(engine, trigger);
  808. if (rc != 0) {
  809. if (nIslog){
  810. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("generate trigger log failed!");
  811. }
  812. }
  813. }
  814. }
  815. else {
  816. if (trigger->delay_timer_id != -1) {
  817. engine->cb.kill_timer(engine, trigger->delay_timer_id, engine->cb.user_data);
  818. trigger->delay_timer_id = -1;
  819. }
  820. }
  821. if (nIslog){
  822. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("process_trigger end (ok=%d)!", ok);
  823. }
  824. return rc;
  825. }
  826. static int process_trigger_list(evt_engine_t *engine, struct list_head *trigger_list)
  827. {
  828. evt_trigger_t *pos;
  829. int rc = 0;
  830. list_for_each_entry(pos, trigger_list, evt_trigger_t, use_entry) {
  831. rc = process_trigger(engine, pos);
  832. if (rc != 0){
  833. break;
  834. }
  835. }
  836. return rc;
  837. }
  838. static int postprocess_slot_list(evt_engine_t *engine, struct list_head *affect_list)
  839. {
  840. int rc = 0;
  841. evt_slot_t *pos;
  842. list_for_each_entry(pos, affect_list, evt_slot_t, use_entry) {
  843. if (pos->once && pos->signal_state) {
  844. pos->signal_state = !pos->signal_state;
  845. if (pos->timer) {
  846. rc = engine->cb.kill_timer(engine, pos->timer->timer_id, engine->cb.user_data);
  847. pos->timer->timer_id = -1;
  848. if (rc != 0) {
  849. if (nIslog){
  850. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("postprocess slot %s failed!", pos->key.code);
  851. }
  852. return rc;
  853. }
  854. }
  855. }
  856. }
  857. return rc;
  858. }
  859. static void clear_slot_list(struct list_head *affect_list)
  860. {
  861. evt_slot_t *pos, *n;
  862. list_for_each_entry_safe(pos, n, affect_list, evt_slot_t, use_entry) {
  863. list_del(&pos->use_entry);
  864. pos->use_entry.next = pos->use_entry.prev = NULL;
  865. pos->use_list_ptr = NULL;
  866. }
  867. }
  868. static void clear_trigger_list(struct list_head *matched_trigger_list)
  869. {
  870. evt_trigger_t *pos, *n;
  871. list_for_each_entry_safe(pos, n, matched_trigger_list, evt_trigger_t, use_entry) {
  872. list_del(&pos->use_entry);
  873. pos->use_entry.next = pos->use_entry.prev = NULL;
  874. }
  875. };
  876. static int process_log(evt_engine_t *engine, const CAutoArray<CUUID> &SubIDs, int log_type, int ent_id, int severity, int sys_code, int usr_code, const char *message)
  877. {
  878. int rc;
  879. struct list_head matched_list = LIST_HEAD_INIT(matched_list);
  880. struct list_head reset_list = LIST_HEAD_INIT(reset_list);
  881. struct list_head affect_list = LIST_HEAD_INIT(affect_list);
  882. struct list_head matched_trigger_list = LIST_HEAD_INIT(matched_trigger_list);
  883. get_matched_slot_list(engine, SubIDs,log_type, ent_id, severity, sys_code, usr_code, message, &matched_list);
  884. if (list_empty(&matched_list)) {
  885. if (nIslog){
  886. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("warning: no matched slot! sys_code = %d, usr_code = %d", sys_code, usr_code);
  887. }
  888. return 0;
  889. }
  890. get_reset_slot_list(engine, &matched_list, &reset_list);
  891. rc = process_matched_slot_list(engine, &matched_list);
  892. if (rc != 0) {
  893. if (nIslog){
  894. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process matched slot list failed!");
  895. }
  896. return rc;
  897. }
  898. rc = process_reset_slot_list(engine, &reset_list);
  899. if (rc != 0) {
  900. if (nIslog){
  901. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process reset slot list failed!");
  902. }
  903. return rc;
  904. }
  905. list_splice_tail(&matched_list, &affect_list);
  906. list_splice_tail(&reset_list, &affect_list);
  907. get_matched_trigger_list(engine, &affect_list, &matched_trigger_list);
  908. rc = process_trigger_list(engine, &matched_trigger_list);
  909. if (rc != 0) {
  910. if (nIslog){
  911. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process trigger list failed!");
  912. }
  913. return rc;
  914. }
  915. rc = postprocess_slot_list(engine, &affect_list);
  916. if (rc != 0) {
  917. if (nIslog){
  918. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("postprocess slot list failed!");
  919. }
  920. return rc;
  921. }
  922. clear_slot_list(&affect_list);
  923. clear_trigger_list(&matched_trigger_list);
  924. return rc;
  925. }
  926. static int process_sysvar(evt_engine_t *engine, evt_sysvar_t *sysvar, const char *old_value, const char *curr_value)
  927. {
  928. int i;
  929. int rc = 0;
  930. struct list_head trigger_list = LIST_HEAD_INIT(trigger_list);
  931. for (i = 0; i < sysvar->arr_ref_rule->nelts; ++i) {
  932. evt_sysvar_rule_t *rule = ARRAY_IDX(sysvar->arr_ref_rule, i, evt_sysvar_rule_t*);
  933. evt_trigger_t *trigger = rule->parent;
  934. if (!trigger->use_entry.next) {
  935. list_add_tail(&trigger->use_entry, &trigger_list);
  936. }
  937. }
  938. rc = process_trigger_list(engine, &trigger_list);
  939. if (rc != 0) {
  940. if (nIslog){
  941. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process trigger list failed!");
  942. }
  943. }
  944. clear_trigger_list(&trigger_list);
  945. return rc;
  946. }
  947. static int build_ref(evt_engine_t *engine)
  948. {
  949. int i;
  950. evt_trigger_t *trigger;
  951. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("engine->slot_ht->size = %d.", engine->slot_ht->size);
  952. for (i = 0; i < engine->slot_ht->size; ++i) {
  953. evt_slot_t *tpos;
  954. struct hlist_node *pos;
  955. hlist_for_each_entry(tpos, pos, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  956. int j;
  957. for (j = 0; j < tpos->arr_reset->nelts; ++j) {
  958. char *code = ARRAY_IDX(tpos->arr_reset, j, char*);
  959. evt_slot_key_t key;
  960. key.code = code;
  961. key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  962. evt_slot_t *ref_slot = slot_find(engine->slot_ht, &key);
  963. if (ref_slot) {
  964. ARRAY_PUSH(ref_slot->arr_rref_reset, evt_slot_t*) = tpos;
  965. ARRAY_PUSH(tpos->arr_ref_reset, evt_slot_t*) = ref_slot;
  966. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("build reset ref for slot %s->%s", tpos->key.code, code);
  967. }
  968. else {
  969. if (nIslog){
  970. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot build reset ref for slot %s->%s", tpos->key.code, code);
  971. }
  972. return Error_Unexpect;
  973. }
  974. }
  975. }
  976. }
  977. list_for_each_entry(trigger, &engine->trigger_list, evt_trigger_t, entry) {
  978. evt_slot_rule_t *rule;
  979. list_for_each_entry(rule, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  980. evt_slot_key_t key;
  981. key.code = rule->code;
  982. key.index_hash_code = hash32_str(key.code, HASH32_STR_INIT);
  983. evt_slot_t *ref_slot = slot_find(engine->slot_ht, &key);
  984. if (ref_slot) {
  985. rule->ref_slot = ref_slot;
  986. ARRAY_PUSH(ref_slot->arr_ref_trigger, evt_trigger_t*) = rule->parent;
  987. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("array push trigger.slot %s.", rule->code);
  988. }
  989. else {
  990. if (nIslog){
  991. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger.slot %s cannot find code!", rule->code);
  992. }
  993. return Error_Unexpect;
  994. }
  995. }
  996. }
  997. return 0;
  998. }
  999. // HH:MM:SS.mmm or MM:SS.mmm or xxxms or xxx
  1000. // 10:10:10 -> 10h 10m 10 second
  1001. // 1:00 -> 1min = 1000ms
  1002. // 1s -> 1 second = 1000ms
  1003. // 1000 -> 1000millisecond
  1004. // 1000ms -> 1000millisecond
  1005. // 1min -> 1000millisecond
  1006. // return millisecond
  1007. static int parse_timeout_value(const char *s)
  1008. {
  1009. int t[8] = {0};
  1010. int tc = 0;
  1011. const char *p = s;
  1012. #define PARSE_T_COLON 0x7fff0000
  1013. #define PARSE_T_DOT 0x7fff0001
  1014. #define PARSE_T_MIN 0x7fff0002
  1015. #define PARSE_T_MS 0x7fff0003
  1016. #define PARSE_T_S 0x7fff0004
  1017. #define PARSE_T_H 0x7fff0005
  1018. while (*p && tc < 8) {
  1019. switch (*p) {
  1020. case ':':
  1021. t[tc++] = PARSE_T_COLON;
  1022. p++;
  1023. break;
  1024. case '.':
  1025. t[tc++] = PARSE_T_DOT;
  1026. p++;
  1027. break;
  1028. case 's':
  1029. t[tc++] = PARSE_T_S;
  1030. p++;
  1031. break;
  1032. case 'h':
  1033. t[tc++] = PARSE_T_H;
  1034. p++;
  1035. break;
  1036. case 'm':
  1037. if (p[1] == 'i' && p[2] == 'n') {
  1038. t[tc++] = PARSE_T_MIN;
  1039. p += 3;
  1040. } else if (p[1] == 's') {
  1041. t[tc++] = PARSE_T_MS;
  1042. p += 2;
  1043. }
  1044. break;
  1045. case '0':
  1046. case '1':
  1047. case '2':
  1048. case '3':
  1049. case '4':
  1050. case '5':
  1051. case '6':
  1052. case '7':
  1053. case '8':
  1054. case '9':
  1055. {
  1056. int x = *p - '0';
  1057. ++p;
  1058. while (*p >= '0' && *p <= '9') {
  1059. x = x * 10 + (*p - '0');
  1060. p++;
  1061. }
  1062. if (x >= 0x7fff0000)
  1063. return -1;
  1064. t[tc++] = x;
  1065. }
  1066. break;
  1067. default:
  1068. return -1;
  1069. }
  1070. }
  1071. switch (tc) {
  1072. case 0:
  1073. return 0;
  1074. case 1:
  1075. if (t[0] < 0x7fff0000)
  1076. return t[0];
  1077. break;
  1078. case 2:
  1079. if (t[0] < 0x7fff0000) {
  1080. if (t[1] == PARSE_T_S) {
  1081. return t[0] * 1000;
  1082. } else if (t[1] == PARSE_T_MS) {
  1083. return t[0];
  1084. } else if (t[1] == PARSE_T_H) {
  1085. return t[0] * 60 * 60 * 1000;
  1086. } else if (t[1] == PARSE_T_MIN) {
  1087. return t[0] * 60 * 1000;
  1088. } else {
  1089. return -1;
  1090. }
  1091. } else if (t[0] == PARSE_T_DOT && t[1] < 0x7fff0000) {
  1092. return t[1];
  1093. }
  1094. break;
  1095. case 3:
  1096. if (t[0] < 0x7fff0000 && t[2] < 0x7fff0000) {
  1097. if (t[1] == PARSE_T_DOT) {
  1098. return t[0] * 1000 + t[2];
  1099. } else if (t[1] == PARSE_T_COLON) {
  1100. return (t[0] * 60 + t[2]) * 1000;
  1101. }
  1102. }
  1103. break;
  1104. case 5:
  1105. if (t[0] < 0x7fff0000 && t[2] < 0x7fff0000 && t[4] < 0x7fff0000 && t[1] == PARSE_T_COLON && t[3] == PARSE_T_COLON)
  1106. return ((t[0] * 60 + t[2]) * 60 + t[4]) * 1000;
  1107. break;
  1108. case 7:
  1109. if (t[0] < 0x7fff0000 && t[2] < 0x7fff0000 && t[4] < 0x7fff0000 && t[1] == PARSE_T_COLON && t[3] == PARSE_T_COLON && t[5] == PARSE_T_DOT && t[6] < 0x7fff0000)
  1110. return ((t[0] * 60 + t[2]) * 60 + t[4]) * 1000 + t[6];
  1111. default:
  1112. break;
  1113. }
  1114. return -1;
  1115. }
  1116. static int parse_bool(const char *s)
  1117. {
  1118. if (_stricmp(s, "true") == 0 || _stricmp(s, "1") == 0) {
  1119. return 1;
  1120. }
  1121. else if (_stricmp(s, "false") == 0 || _stricmp(s, "0") == 0) {
  1122. return 0;
  1123. }
  1124. else {
  1125. if (nIslog){
  1126. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse bool failed! s : %s", s);
  1127. }
  1128. return -1;
  1129. }
  1130. }
  1131. static int parse_log_type(const char *s)
  1132. {
  1133. static const char *keys[] = {"Log_Ignore", "Log_Event", "Log_Warning", "Log_Error", "Log_Debug"};
  1134. int i;
  1135. for (i = 0; i < array_size(keys); ++i) {
  1136. if (_stricmp(s, keys[i]) == 0)
  1137. return i;
  1138. }
  1139. return -1;
  1140. }
  1141. static int parse_ent_id(evt_engine_t *engine, const char *s)
  1142. {
  1143. // get entity devel id
  1144. return engine->cb.get_entity_id(engine, s, engine->cb.user_data);
  1145. }
  1146. static int parse_severity(const char *s)
  1147. {
  1148. static const struct {
  1149. char *key;
  1150. int level;
  1151. } ts[] = {
  1152. {"Severity_None", 0},
  1153. {"Severity_Low", 1},
  1154. {"Severity_Middle", 2},
  1155. {"Severity_High", 3},
  1156. {"0", 0},
  1157. {"1", 1},
  1158. {"2", 2},
  1159. {"3", 3},
  1160. };
  1161. for (int i = 0; i < array_size(ts); ++i) {
  1162. if (_stricmp(s, ts[i].key) == 0) {
  1163. return ts[i].level;
  1164. }
  1165. }
  1166. return -1;
  1167. }
  1168. #define DEF_CODE(x) {#x, x},
  1169. static int parse_sys_code(const char *s)
  1170. {
  1171. static const struct {
  1172. const char *code;
  1173. int code_value;
  1174. }keys[] = {
  1175. DEF_CODE(Error_Succeed)
  1176. DEF_CODE(Error_DataCheck)
  1177. DEF_CODE(Error_Null)
  1178. DEF_CODE(Error_Param)
  1179. DEF_CODE(Error_Overflow)
  1180. DEF_CODE(Error_TooSmallBuffer)
  1181. DEF_CODE(Error_NotIntegrated)
  1182. DEF_CODE(Error_TargetBeing)
  1183. DEF_CODE(Error_NoTarget)
  1184. DEF_CODE(Error_NoDefine)
  1185. DEF_CODE(Error_NotImpl)
  1186. DEF_CODE(Error_NotExist)
  1187. DEF_CODE(Error_Duplication)
  1188. DEF_CODE(Error_Unregisted)
  1189. DEF_CODE(Error_AlreadyExist)
  1190. DEF_CODE(Error_MethodNotFound)
  1191. DEF_CODE(Error_Redirect)
  1192. DEF_CODE(Error_InvalidState)
  1193. DEF_CODE(Error_NotInit)
  1194. DEF_CODE(Error_Paused)
  1195. DEF_CODE(Error_Stoped)
  1196. DEF_CODE(Error_Losted)
  1197. DEF_CODE(Error_Closed)
  1198. DEF_CODE(Error_TaskControl)
  1199. DEF_CODE(Error_Pending)
  1200. DEF_CODE(Error_Cancel)
  1201. DEF_CODE(Error_Break)
  1202. DEF_CODE(Error_NotMeetCondition)
  1203. DEF_CODE(Error_NoPrivilege)
  1204. DEF_CODE(Error_MethodSignatureFailed)
  1205. DEF_CODE(Error_PeerAction)
  1206. DEF_CODE(Error_PeerClose)
  1207. DEF_CODE(Error_PeerIgnore)
  1208. DEF_CODE(Error_PeerReject)
  1209. DEF_CODE(Error_PeerDelay)
  1210. DEF_CODE(Error_Process)
  1211. DEF_CODE(Error_NetBroken)
  1212. DEF_CODE(Error_UpdateFailed)
  1213. DEF_CODE(Error_RegistryFailed)
  1214. DEF_CODE(Error_IO)
  1215. DEF_CODE(Error_Readonly)
  1216. DEF_CODE(Error_TimeOut)
  1217. DEF_CODE(Error_BlockTimeOut)
  1218. DEF_CODE(Error_ThreadTimeOut)
  1219. DEF_CODE(Error_QueueTimeOut)
  1220. DEF_CODE(Error_ReplyTimeOut)
  1221. DEF_CODE(Error_Hardware)
  1222. DEF_CODE(Error_DevLoadFileFailed)
  1223. DEF_CODE(Error_DevNotAvailable)
  1224. DEF_CODE(Error_DevAlreadyConnected)
  1225. DEF_CODE(Error_DevConnFailed)
  1226. DEF_CODE(Error_DevCommFailed)
  1227. DEF_CODE(Error_DevMedia)
  1228. DEF_CODE(Error_Debug)
  1229. DEF_CODE(Error_Assert)
  1230. DEF_CODE(Error_Trace)
  1231. DEF_CODE(Error_Bug)
  1232. DEF_CODE(Error_Unrecover)
  1233. DEF_CODE(Error_Resource)
  1234. DEF_CODE(Error_NewProcess)
  1235. DEF_CODE(Error_FailVerify)
  1236. DEF_CODE(Error_Block)
  1237. DEF_CODE(Error_Exception)
  1238. DEF_CODE(Error_Unexpect)
  1239. };
  1240. if (s) {
  1241. if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
  1242. char *p;
  1243. return (int)strtol(&s[2], &p, 16);
  1244. } else if (s[0] <= '9' && s[0] >= '1') {
  1245. return atoi(s);
  1246. } else {
  1247. int i;
  1248. for (i = 0; i < array_size(keys); ++i) {
  1249. if (_stricmp(s, keys[i].code) == 0) {
  1250. return keys[i].code_value;
  1251. }
  1252. }
  1253. }
  1254. }
  1255. return -1;
  1256. }
  1257. static int parse_usr_code(const char *s)
  1258. {
  1259. if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
  1260. char *p;
  1261. return (int)strtol(&s[2], &p, 16);
  1262. }
  1263. else if (s[0] <= '9' && s[0] >= '1') {
  1264. return atoi(s);
  1265. }
  1266. else {
  1267. return -1;
  1268. }
  1269. }
  1270. static char *parse_code(const char *ns, const char *s)
  1271. {
  1272. if (strchr(s, '.')) {
  1273. return toolkit_strdup(s);
  1274. }
  1275. else {
  1276. return strdup_printf("%s.%s", ns, s);
  1277. }
  1278. }
  1279. static int extract_filter_element(evt_engine_t* engine, rvc_slotfilter_t* filter_elem, int* p_log_type, int* p_ent_id, const char** p_entity, int* p_severity, int* p_sys_code, int* p_usr_code, const char** p_slotvar)
  1280. {
  1281. int log_type, ent_id, severity, sys_code, usr_code;
  1282. const char* entity = NULL;
  1283. const char* slotvar = NULL;
  1284. if (filter_elem->strLogType) {
  1285. log_type = parse_log_type(filter_elem->strLogType);
  1286. if (log_type == -1) {
  1287. if (nIslog) {
  1288. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse log type failed!");
  1289. }
  1290. return Error_Unexpect;
  1291. }
  1292. }
  1293. else {
  1294. log_type = Log_Ignore;
  1295. }
  1296. if (filter_elem->strEntity) {
  1297. ent_id = parse_ent_id(engine, filter_elem->strEntity);
  1298. if (ent_id == -1) {
  1299. if (nIslog) {
  1300. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse entity id failed!");
  1301. }
  1302. return Error_Unexpect;
  1303. }
  1304. else {
  1305. entity = filter_elem->strEntity;
  1306. }
  1307. }
  1308. else {
  1309. ent_id = -1;
  1310. }
  1311. if (filter_elem->strSeverityLevel) {
  1312. severity = parse_severity(filter_elem->strSeverityLevel);
  1313. if (severity == -1) {
  1314. if (nIslog) {
  1315. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse severity level failed!");
  1316. }
  1317. return Error_Unexpect;
  1318. }
  1319. }
  1320. else {
  1321. severity = Severity_None;
  1322. }
  1323. if (filter_elem->strSysError) {
  1324. sys_code = parse_sys_code(filter_elem->strSysError);
  1325. if (sys_code == -1) {
  1326. if (nIslog) {
  1327. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse sys code failed! sys_code: %s", filter_elem->strSysError);
  1328. }
  1329. return Error_Unexpect;
  1330. }
  1331. }
  1332. else {
  1333. sys_code = Error_IgnoreAll;
  1334. }
  1335. if (filter_elem->strUserCode) {
  1336. usr_code = parse_usr_code(filter_elem->strUserCode);
  1337. }
  1338. else {
  1339. usr_code = -2;
  1340. }
  1341. if (filter_elem->strContentToVar) {
  1342. slotvar = filter_elem->strContentToVar;
  1343. }
  1344. else {
  1345. slotvar = NULL;
  1346. }
  1347. if (!(filter_elem->strLogType || filter_elem->strEntity || filter_elem->strSeverityLevel || filter_elem->strSysError || filter_elem->strUserCode || filter_elem->strContentToVar)){
  1348. return Error_Null;
  1349. }
  1350. *p_log_type = log_type;
  1351. *p_ent_id = ent_id;
  1352. *p_severity = severity;
  1353. *p_sys_code = sys_code;
  1354. *p_usr_code = usr_code;
  1355. *p_entity = entity;
  1356. *p_slotvar = slotvar;
  1357. return 0;
  1358. }
  1359. static int extract_filter(evt_engine_t *engine, scew_element *filter_elem, int *p_log_type, int *p_ent_id, const char **p_entity, int *p_severity, int *p_sys_code, int *p_usr_code, const char **p_slotvar)
  1360. {
  1361. int log_type, ent_id, severity, sys_code, usr_code;
  1362. const char *entity = NULL;
  1363. const char *slotvar = NULL;
  1364. scew_attribute *attr;
  1365. attr = scew_element_attribute_by_name(filter_elem, "LogType");
  1366. if (attr) {
  1367. log_type = parse_log_type(scew_attribute_value(attr));
  1368. if (log_type == -1) {
  1369. if (nIslog){
  1370. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse log type failed!");
  1371. }
  1372. return Error_Unexpect;
  1373. }
  1374. }
  1375. else {
  1376. log_type = Log_Ignore;
  1377. }
  1378. attr = scew_element_attribute_by_name(filter_elem, "Entity");
  1379. if (attr) {
  1380. ent_id = parse_ent_id(engine, scew_attribute_value(attr));
  1381. if (ent_id == -1) {
  1382. if (nIslog){
  1383. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse entity id failed!");
  1384. }
  1385. return Error_Unexpect;
  1386. }
  1387. else {
  1388. entity = scew_attribute_value(attr);
  1389. }
  1390. }
  1391. else {
  1392. ent_id = -1;
  1393. }
  1394. attr = scew_element_attribute_by_name(filter_elem, "SeverityLevel");
  1395. if (attr) {
  1396. severity = parse_severity(scew_attribute_value(attr));
  1397. if (severity == -1) {
  1398. if (nIslog){
  1399. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse severity level failed!");
  1400. }
  1401. return Error_Unexpect;
  1402. }
  1403. }
  1404. else {
  1405. severity = Severity_None;
  1406. }
  1407. attr = scew_element_attribute_by_name(filter_elem, "SysError");
  1408. if (attr) {
  1409. sys_code = parse_sys_code(scew_attribute_value(attr));
  1410. if (sys_code == -1) {
  1411. if (nIslog){
  1412. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse sys code failed! sys_code: %s", scew_attribute_value(attr));
  1413. }
  1414. return Error_Unexpect;
  1415. }
  1416. }
  1417. else {
  1418. sys_code = Error_IgnoreAll;
  1419. }
  1420. attr = scew_element_attribute_by_name(filter_elem, "UserCode");
  1421. if (attr) {
  1422. usr_code = parse_usr_code(scew_attribute_value(attr));
  1423. }
  1424. else {
  1425. usr_code = -2;
  1426. }
  1427. attr = scew_element_attribute_by_name(filter_elem, "ContentToVar");
  1428. if (attr) {
  1429. slotvar = scew_attribute_value(attr);
  1430. }
  1431. else {
  1432. slotvar = NULL;
  1433. }
  1434. *p_log_type = log_type;
  1435. *p_ent_id = ent_id;
  1436. *p_severity = severity;
  1437. *p_sys_code = sys_code;
  1438. *p_usr_code = usr_code;
  1439. *p_entity = entity;
  1440. *p_slotvar = slotvar;
  1441. return 0;
  1442. }
  1443. static int load_filter_element(evt_engine_t* engine, evt_slot_t* slot, rvc_slotfilter_t* filter_elem)
  1444. {
  1445. evt_filter_t* filter = ZALLOC_T(evt_filter_t);
  1446. const char* entity = NULL;
  1447. const char* slotvar = NULL;
  1448. int rc = extract_filter_element(engine, filter_elem, &filter->log_type, &filter->ent_id, (const char**)&entity, &filter->severity, &filter->sys_code, &filter->user_code, &slotvar);
  1449. if (rc != 0) {
  1450. return rc;
  1451. }
  1452. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("filter->log_type = %d, filter->ent_id = %d, entity = %s, filter->severity = %d, filter->sys_code = %d, filter->user_code = 0x%08x, slotvar = %s.", filter->log_type, filter->ent_id, entity, filter->severity, filter->sys_code, filter->user_code, slotvar);
  1453. if (slotvar) {
  1454. int i;
  1455. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  1456. evt_slotvar_t* var = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  1457. if (_stricmp(var->name, slotvar) == 0) {
  1458. filter->content_to_var = var;
  1459. break;
  1460. }
  1461. }
  1462. if (!filter->content_to_var) {
  1463. if (nIslog) {
  1464. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find %s slotvar!", slotvar);
  1465. }
  1466. return -1;
  1467. }
  1468. }
  1469. filter->entity = entity ? _strdup(entity) : NULL;
  1470. filter->key.listen_id = 0;
  1471. filter->owner = slot;
  1472. ARRAY_PUSH(slot->arr_filter, evt_filter_t*) = filter;
  1473. return 0;
  1474. }
  1475. static int load_filter(evt_engine_t *engine, evt_slot_t *slot, scew_element *filter_elem)
  1476. {
  1477. evt_filter_t *filter = ZALLOC_T(evt_filter_t);
  1478. const char *entity = NULL;
  1479. const char *slotvar = NULL;
  1480. int rc = extract_filter(engine, filter_elem, &filter->log_type, &filter->ent_id, (const char**)&entity, &filter->severity, &filter->sys_code, &filter->user_code, &slotvar);
  1481. if (rc != 0) {
  1482. if (nIslog){
  1483. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("extract filter failed!");
  1484. }
  1485. return rc;
  1486. }
  1487. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("filter->log_type = %d, filter->ent_id = %d, entity = %s, filter->severity = %d, filter->sys_code = %d, filter->user_code = 0x%08x, slotvar = %s.", filter->log_type, filter->ent_id, entity, filter->severity, filter->sys_code, filter->user_code, slotvar);
  1488. if (slotvar) {
  1489. int i;
  1490. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  1491. evt_slotvar_t *var = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t *);
  1492. if (_stricmp(var->name, slotvar) == 0) {
  1493. filter->content_to_var = var;
  1494. break;
  1495. }
  1496. }
  1497. if (!filter->content_to_var) {
  1498. if (nIslog){
  1499. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find %s slotvar!", slotvar);
  1500. }
  1501. return -1;
  1502. }
  1503. }
  1504. filter->entity = entity ? _strdup(entity) : NULL;
  1505. filter->key.listen_id = 0;
  1506. filter->owner = slot;
  1507. ARRAY_PUSH(slot->arr_filter, evt_filter_t*) = filter;
  1508. return 0;
  1509. }
  1510. static int load_slotvar(evt_engine_t *engine, evt_slot_t *slot, scew_element *slotvar_elem)
  1511. {
  1512. evt_slotvar_t *slotvar = ZALLOC_T(evt_slotvar_t);
  1513. scew_attribute *attr;
  1514. attr = scew_element_attribute_by_name(slotvar_elem, "Name");
  1515. if (attr) {
  1516. slotvar->name = _strdup(scew_attribute_value(attr));
  1517. }
  1518. else {
  1519. if (nIslog){
  1520. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("not found slot var Name property!");
  1521. }
  1522. return -1;
  1523. }
  1524. attr = scew_element_attribute_by_name(slotvar_elem, "Value");
  1525. if (attr) {
  1526. slotvar->init_value = _strdup(scew_attribute_value(attr));
  1527. slotvar->current_value = _strdup(slotvar->init_value);
  1528. }
  1529. else {
  1530. if (nIslog){
  1531. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("not found slot var Value property!");
  1532. }
  1533. return -1;
  1534. }
  1535. ARRAY_PUSH(slot->arr_slotvar, evt_slotvar_t*) = slotvar;
  1536. return 0;
  1537. }
  1538. static int load_slotvar_element(evt_engine_t* engine, evt_slot_t* slot, rvc_slotvar_t* slotvar_elem)
  1539. {
  1540. evt_slotvar_t* slotvar = ZALLOC_T(evt_slotvar_t);
  1541. if (slotvar_elem->strName) {
  1542. slotvar->name = _strdup(slotvar_elem->strName);
  1543. }
  1544. else {
  1545. return -1;
  1546. }
  1547. if (slotvar_elem->strValue) {
  1548. slotvar->init_value = _strdup(slotvar_elem->strValue);
  1549. slotvar->current_value = _strdup(slotvar->init_value);
  1550. }
  1551. else {
  1552. return -1;
  1553. }
  1554. ARRAY_PUSH(slot->arr_slotvar, evt_slotvar_t*) = slotvar;
  1555. return 0;
  1556. }
  1557. static int load_slot_arrays(evt_engine_t* engine, const char* ns, rvc_slot_t* tnode)
  1558. {
  1559. evt_slot_t* slot = ZALLOC_T(evt_slot_t);
  1560. if (!slot) {
  1561. return Error_Resource;
  1562. }
  1563. INIT_HLIST_NODE(&slot->hentry);
  1564. slot->arr_filter = array_make(-1, sizeof(evt_filter_t*));
  1565. slot->arr_reset = array_make(-1, sizeof(char*));
  1566. slot->arr_rref_reset = array_make(-1, sizeof(evt_slot_t*));
  1567. slot->arr_ref_reset = array_make(-1, sizeof(evt_slot_t*));
  1568. slot->arr_ref_trigger = array_make(-1, sizeof(evt_trigger_t*));
  1569. slot->arr_slotvar = array_make(-1, sizeof(evt_slotvar_t*));
  1570. slot->parent = engine;
  1571. char* code = NULL;
  1572. if (!tnode->strCode) {
  1573. if (nIslog) {
  1574. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot miss attribute code!");
  1575. }
  1576. goto on_error;
  1577. }
  1578. else {
  1579. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("tnode->strCode == %s.", tnode->strCode);
  1580. code = parse_code(ns, tnode->strCode);
  1581. if (!code) {
  1582. if (nIslog) {
  1583. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code failed!");
  1584. }
  1585. goto on_error;
  1586. }
  1587. else {
  1588. slot->key.code = code;
  1589. slot->key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1590. }
  1591. }
  1592. if (tnode->strTimeout) {
  1593. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("tnode->strTimeout == %s.", tnode->strTimeout);
  1594. evt_expire_t* expire = ZALLOC_T(evt_expire_t);
  1595. if (!expire) {
  1596. goto on_error;
  1597. }
  1598. expire->timeout = parse_timeout_value(tnode->strTimeout);
  1599. if (expire->timeout < 0) {
  1600. FREE(expire);
  1601. goto on_error;
  1602. }
  1603. if (expire->timeout == 0) {
  1604. FREE(expire);
  1605. }
  1606. else {
  1607. expire->parent = slot;
  1608. expire->timer_id = 0;
  1609. slot->timer = expire;
  1610. }
  1611. }
  1612. if (tnode->strOneTrigger) {
  1613. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("tnode->strOneTrigger == %s.", tnode->strOneTrigger);
  1614. slot->once = parse_bool(tnode->strOneTrigger);
  1615. }
  1616. else {
  1617. slot->once = 0;
  1618. }
  1619. int vars_arr_length = sizeof(tnode->Vars) / sizeof(rvc_slotvar_t);
  1620. if (vars_arr_length > 0) {
  1621. for (int ivar = 0; ivar < vars_arr_length; ivar++) {
  1622. int rc = load_slotvar_element(engine, slot, &tnode->Vars[ivar]);
  1623. if (rc != 0) {
  1624. break;
  1625. }
  1626. else {
  1627. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("slot var name is %s, value is %s.", tnode->Vars[ivar].strName, tnode->Vars[ivar].strValue);
  1628. }
  1629. }
  1630. }
  1631. int filters_arr_length = sizeof(tnode->Filters) / sizeof(rvc_slotfilter_t);
  1632. if (filters_arr_length > 0) {
  1633. for (int ifilter = 0; ifilter < filters_arr_length; ifilter++) {
  1634. int rc = load_filter_element(engine, slot, &tnode->Filters[ifilter]);
  1635. if (rc != 0) {
  1636. break;
  1637. }
  1638. }
  1639. }
  1640. int reset_arr_length = sizeof(tnode->Reset) / sizeof(rvc_slotreset_t);
  1641. if (reset_arr_length > 0) {
  1642. for (int ireset = 0; ireset < reset_arr_length; ireset++) {
  1643. if (tnode->Reset[ireset].strSource) {
  1644. char* source = parse_code(ns, tnode->Reset[ireset].strSource);
  1645. if (!source) {
  1646. if (nIslog) {
  1647. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code of Reset tag Source attribute failed!");
  1648. }
  1649. goto on_error;
  1650. }
  1651. else {
  1652. ARRAY_PUSH(slot->arr_reset, char*) = source;
  1653. }
  1654. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("slot var reset source is %s.", tnode->Reset[ireset].strSource);
  1655. }
  1656. else {
  1657. break;
  1658. }
  1659. }
  1660. }
  1661. if (!slot->timer) {
  1662. slot->once = 1;
  1663. }
  1664. if (slot_find(engine->slot_ht, &slot->key)) {
  1665. if (nIslog) {
  1666. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("duplicate slot %s", slot->key.code);
  1667. }
  1668. goto on_error;
  1669. }
  1670. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d, engine->slot_ht count = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size, htable_get_count(engine->slot_ht));
  1671. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("slot->key.code = %s, slot->key.index_hash_code = %d.", slot->key.code, slot->key.index_hash_code);
  1672. slot_add(engine->slot_ht, slot);
  1673. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d, engine->slot_ht count = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size, htable_get_count(engine->slot_ht));
  1674. return 0;
  1675. on_error:
  1676. slot_free(slot);
  1677. return Error_Unexpect;
  1678. }
  1679. static int load_slot(evt_engine_t *engine, const char *ns, scew_element *slot_elem)
  1680. {
  1681. evt_slot_t *slot = ZALLOC_T(evt_slot_t);
  1682. if (!slot){
  1683. return Error_Resource;
  1684. }
  1685. INIT_HLIST_NODE(&slot->hentry);
  1686. slot->arr_filter = array_make(-1, sizeof(evt_filter_t*));
  1687. slot->arr_reset = array_make(-1, sizeof(char*));
  1688. slot->arr_rref_reset = array_make(-1, sizeof(evt_slot_t*));
  1689. slot->arr_ref_reset = array_make(-1, sizeof(evt_slot_t*));
  1690. slot->arr_ref_trigger = array_make(-1, sizeof(evt_trigger_t*));
  1691. slot->arr_slotvar = array_make(-1, sizeof(evt_slotvar_t*));
  1692. slot->parent = engine;
  1693. char* code = NULL;
  1694. scew_list* slotval_list = NULL;
  1695. scew_list* filter_list = NULL;
  1696. scew_list* reset_list = NULL;
  1697. scew_attribute *attr = scew_element_attribute_by_name(slot_elem, "Code");
  1698. if (!attr) {
  1699. if (nIslog){
  1700. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot miss attribute code!");
  1701. }
  1702. goto on_error;
  1703. }
  1704. else {
  1705. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("scew_attribute_name is %s.", scew_attribute_name(attr));
  1706. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("scew_attribute_value is %s.", scew_attribute_value(attr));
  1707. code = parse_code(ns, scew_attribute_value(attr));
  1708. if (!code) {
  1709. if (nIslog){
  1710. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code failed!");
  1711. }
  1712. goto on_error;
  1713. }
  1714. else {
  1715. slot->key.code = code;
  1716. slot->key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1717. }
  1718. }
  1719. attr = scew_element_attribute_by_name(slot_elem, "Timeout");
  1720. if (attr) {
  1721. evt_expire_t *expire = ZALLOC_T(evt_expire_t);
  1722. if (!expire){
  1723. goto on_error;
  1724. }
  1725. expire->timeout = parse_timeout_value(scew_attribute_value(attr));
  1726. if (expire->timeout < 0) {
  1727. FREE(expire);
  1728. goto on_error;
  1729. }
  1730. if (expire->timeout == 0) {
  1731. FREE(expire);
  1732. }
  1733. else {
  1734. expire->parent = slot;
  1735. expire->timer_id = 0;
  1736. slot->timer = expire;
  1737. }
  1738. }
  1739. attr = scew_element_attribute_by_name(slot_elem, "OnceTrigger");
  1740. if (attr) {
  1741. slot->once = parse_bool(scew_attribute_value(attr));
  1742. }
  1743. else {
  1744. slot->once = 0;
  1745. }
  1746. slotval_list = scew_element_list_by_name(slot_elem, "Var");
  1747. if (slotval_list) {
  1748. for (scew_list *it = scew_list_first(slotval_list); it; it = scew_list_next(it)) {
  1749. scew_element *elem = (scew_element *)scew_list_data(it);
  1750. int rc = load_slotvar(engine, slot, elem);
  1751. if (rc != 0) {
  1752. if (nIslog){
  1753. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot var failed!%s", slot->key.code);
  1754. }
  1755. goto on_error;
  1756. }
  1757. }
  1758. scew_list_free(slotval_list);
  1759. }
  1760. filter_list = scew_element_list_by_name(slot_elem, "Filter");
  1761. if (filter_list) {
  1762. for (scew_list *it = scew_list_first(filter_list); it; it = scew_list_next(it)) {
  1763. scew_element *elem = (scew_element *)scew_list_data(it);
  1764. int rc = load_filter(engine, slot, elem);
  1765. if (rc != 0) {
  1766. if (nIslog){
  1767. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load filter failed!");
  1768. }
  1769. goto on_error;
  1770. }
  1771. }
  1772. scew_list_free(filter_list);
  1773. }
  1774. reset_list = scew_element_list_by_name(slot_elem, "Reset");
  1775. if (reset_list) {
  1776. for (scew_list *it = scew_list_first(reset_list); it; it = scew_list_next(it)) {
  1777. scew_element *elem = (scew_element *)scew_list_data(it);
  1778. attr = scew_element_attribute_by_name(elem, "Source");
  1779. if (attr) {
  1780. char *source = parse_code(ns, scew_attribute_value(attr));
  1781. if (!source) {
  1782. if (nIslog){
  1783. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code of Reset tag Source attribute failed!");
  1784. }
  1785. goto on_error;
  1786. }
  1787. else {
  1788. ARRAY_PUSH(slot->arr_reset, char*) = source;
  1789. }
  1790. }
  1791. else {
  1792. if (nIslog){
  1793. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Reset tag miss source attribute!");
  1794. }
  1795. goto on_error;
  1796. }
  1797. }
  1798. scew_list_free(reset_list);
  1799. }
  1800. if (!slot->timer){
  1801. slot->once = 1;
  1802. }
  1803. if (slot_find(engine->slot_ht, &slot->key)) {
  1804. if (nIslog){
  1805. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("duplicate slot %s", slot->key.code);
  1806. }
  1807. goto on_error;
  1808. }
  1809. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d, engine->slot_ht count = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size, htable_get_count(engine->slot_ht));
  1810. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("slot->key.code = %s, slot->key.index_hash_code = %d.", slot->key.code, slot->key.index_hash_code);
  1811. slot_add(engine->slot_ht, slot);
  1812. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d, engine->slot_ht count = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size, htable_get_count(engine->slot_ht));
  1813. return 0;
  1814. on_error:
  1815. slot_free(slot);
  1816. return Error_Unexpect;
  1817. }
  1818. static int load_slot_element_rule(evt_trigger_t* trigger, const char* ns, rvc_triggerslot_t* slot_elem)
  1819. {
  1820. evt_slot_rule_t* rule = ZALLOC_T(evt_slot_rule_t);
  1821. if (slot_elem->strCode) {
  1822. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Slot Code value is %s.", slot_elem->strCode);
  1823. rule->code = parse_code(ns, slot_elem->strCode);
  1824. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("after parse_code, rule->code is %s.", rule->code);
  1825. }
  1826. else {
  1827. goto on_error;
  1828. }
  1829. if (slot_elem->strPositive) {
  1830. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Slot Positive value is %s.", slot_elem->strPositive);
  1831. rule->positive = parse_bool(slot_elem->strPositive);
  1832. if (rule->positive == -1) {
  1833. if (nIslog) {
  1834. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule parse positive attr failed!");
  1835. }
  1836. goto on_error;
  1837. }
  1838. }
  1839. else {
  1840. rule->positive = 1;
  1841. }
  1842. if (slot_elem->strMessage) {
  1843. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Slot Message value is %s.", slot_elem->strMessage);
  1844. rule->message = _strdup(slot_elem->strMessage);
  1845. }
  1846. rule->parent = trigger;
  1847. list_add_tail(&rule->entry, &trigger->slot_rule_list);
  1848. return 0;
  1849. on_error:
  1850. slot_rule_free(rule);
  1851. return Error_Unexpect;
  1852. }
  1853. static int load_slot_rule(evt_trigger_t *trigger, const char *ns, scew_element *slot_elem)
  1854. {
  1855. evt_slot_rule_t *rule = ZALLOC_T(evt_slot_rule_t);
  1856. scew_attribute *attr = scew_element_attribute_by_name(slot_elem, "Code");
  1857. if (attr) {
  1858. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Slot Code value is %s.", scew_attribute_value(attr));
  1859. rule->code = parse_code(ns, scew_attribute_value(attr));
  1860. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("after parse_code, rule->code is %s.", rule->code);
  1861. }
  1862. else {
  1863. if (nIslog){
  1864. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule parse code attribute failed!");
  1865. }
  1866. goto on_error;
  1867. }
  1868. attr = scew_element_attribute_by_name(slot_elem, "Positive");
  1869. if (attr) {
  1870. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Slot Positive value is %s.", scew_attribute_value(attr));
  1871. rule->positive = parse_bool(scew_attribute_value(attr));
  1872. if (rule->positive == -1) {
  1873. if (nIslog){
  1874. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule parse positive attr failed!");
  1875. }
  1876. goto on_error;
  1877. }
  1878. }
  1879. else {
  1880. rule->positive = 1;
  1881. }
  1882. attr = scew_element_attribute_by_name(slot_elem, "Message");
  1883. if (attr) {
  1884. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Slot Message value is %s.", scew_attribute_value(attr));
  1885. rule->message = _strdup(scew_attribute_value(attr));
  1886. }
  1887. rule->parent = trigger;
  1888. list_add_tail(&rule->entry, &trigger->slot_rule_list);
  1889. return 0;
  1890. on_error:
  1891. slot_rule_free(rule);
  1892. return Error_Unexpect;
  1893. }
  1894. static int load_sysvar_element_rule(evt_engine_t* engine, evt_trigger_t* trigger, rvc_triggersysvar_t* sysvar_elem)
  1895. {
  1896. evt_sysvar_rule_t* rule = ZALLOC_T(evt_sysvar_rule_t);
  1897. scew_list* state_list = NULL;
  1898. if (sysvar_elem->strCode) {
  1899. char* code = sysvar_elem->strCode;
  1900. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sysvar code is %s.", code);
  1901. evt_sysvar_key_t key;
  1902. key.code = code;
  1903. key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1904. evt_sysvar_t* sysvar = sysvar_find(engine->sysvar_ht, &key);
  1905. if (!sysvar) {
  1906. sysvar = ZALLOC_T(evt_sysvar_t);
  1907. INIT_HLIST_NODE(&sysvar->hentry);
  1908. sysvar->arr_ref_rule = array_make(-1, sizeof(evt_sysvar_rule_t*));
  1909. sysvar->parent = engine;
  1910. sysvar->key.code = _strdup(code);
  1911. sysvar->key.index_hash_code = key.index_hash_code;
  1912. sysvar_add(engine->sysvar_ht, sysvar);
  1913. }
  1914. ARRAY_PUSH(sysvar->arr_ref_rule, evt_sysvar_rule_t*) = rule;
  1915. rule->ref_sysvar = sysvar;
  1916. }
  1917. else {
  1918. goto on_error;
  1919. }
  1920. if (sysvar_elem->strPositive) {
  1921. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sysvar Positive is %s.", sysvar_elem->strPositive);
  1922. rule->positive = parse_bool(sysvar_elem->strPositive);
  1923. }
  1924. else {
  1925. rule->positive = 1;
  1926. }
  1927. rule->parent = trigger;
  1928. rule->arr_state = array_make(0, sizeof(char*));
  1929. int states_arr_length = sizeof(sysvar_elem->strstates) / sizeof(char*);
  1930. if (states_arr_length > 0) {
  1931. for (int istate = 0; istate < states_arr_length; istate++) {
  1932. const char* state = sysvar_elem->strstates[istate];
  1933. if (state) {
  1934. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("add sysvar state %s.", state);
  1935. ARRAY_PUSH(rule->arr_state, char*) = _strdup(state);
  1936. }
  1937. else {
  1938. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sysvar state is NULL, add it.");
  1939. //ARRAY_PUSH(rule->arr_state, char*) = NULL;
  1940. break;
  1941. }
  1942. }
  1943. }
  1944. else {
  1945. if (nIslog) {
  1946. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger sysvar does not have state children!");
  1947. }
  1948. goto on_error;
  1949. }
  1950. list_add_tail(&rule->entry, &trigger->sysvar_list);
  1951. return 0;
  1952. on_error:
  1953. sysvar_rule_free(rule);
  1954. return Error_Unexpect;
  1955. }
  1956. static int load_sysvar_rule(evt_engine_t *engine, evt_trigger_t *trigger, scew_element *sysvar_elem)
  1957. {
  1958. evt_sysvar_rule_t *rule = ZALLOC_T(evt_sysvar_rule_t);
  1959. scew_list* state_list = NULL;
  1960. scew_attribute *attr = scew_element_attribute_by_name(sysvar_elem, "Code");
  1961. if (attr) {
  1962. char *code = (char*)scew_attribute_value(attr);
  1963. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sysvar code is %s.", code);
  1964. evt_sysvar_key_t key;
  1965. key.code = code;
  1966. key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1967. evt_sysvar_t *sysvar = sysvar_find(engine->sysvar_ht, &key);
  1968. if (!sysvar) {
  1969. sysvar = ZALLOC_T(evt_sysvar_t);
  1970. INIT_HLIST_NODE(&sysvar->hentry);
  1971. sysvar->arr_ref_rule = array_make(-1, sizeof(evt_sysvar_rule_t*));
  1972. sysvar->parent = engine;
  1973. sysvar->key.code = _strdup(code);
  1974. sysvar->key.index_hash_code = key.index_hash_code;
  1975. sysvar_add(engine->sysvar_ht, sysvar);
  1976. }
  1977. ARRAY_PUSH(sysvar->arr_ref_rule, evt_sysvar_rule_t*) = rule;
  1978. rule->ref_sysvar = sysvar;
  1979. }
  1980. else {
  1981. if (nIslog){
  1982. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load sysvar rule, undefine code attr!");
  1983. }
  1984. goto on_error;
  1985. }
  1986. attr = scew_element_attribute_by_name(sysvar_elem, "Positive");
  1987. if (attr) {
  1988. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sysvar Positive is %s.", (char*)scew_attribute_value(attr));
  1989. rule->positive = parse_bool((char*)scew_attribute_value(attr));
  1990. }
  1991. else {
  1992. rule->positive = 1;
  1993. }
  1994. rule->parent = trigger;
  1995. rule->arr_state = array_make(0, sizeof(char*));
  1996. state_list = scew_element_children(sysvar_elem);
  1997. if (state_list) {
  1998. for (scew_list *it = scew_list_first(state_list); it; it = scew_list_next(it)) {
  1999. scew_element *state_elem = (scew_element *)scew_list_data(it);
  2000. const char *state = scew_element_contents(state_elem);
  2001. if (state) {
  2002. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("add sysvar state %s.", state);
  2003. ARRAY_PUSH(rule->arr_state, char*) = _strdup(state);
  2004. }
  2005. else {
  2006. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sysvar state is NULL, add it.");
  2007. ARRAY_PUSH(rule->arr_state, char*) = NULL;
  2008. }
  2009. }
  2010. scew_list_first(state_list);
  2011. }
  2012. else {
  2013. if (nIslog){
  2014. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger sysvar does not have state children!");
  2015. }
  2016. goto on_error;
  2017. }
  2018. list_add_tail(&rule->entry, &trigger->sysvar_list);
  2019. return 0;
  2020. on_error:
  2021. sysvar_rule_free(rule);
  2022. return Error_Unexpect;
  2023. }
  2024. void SetLogType(int nIslog)
  2025. {
  2026. nIslog = nIslog;
  2027. }
  2028. static int load_trigger_arrays(evt_engine_t* engine, const char* ns, rvc_trigger_t* trigger_elem)
  2029. {
  2030. evt_trigger_t* trigger = ZALLOC_T(evt_trigger_t);
  2031. INIT_LIST_HEAD(&trigger->slot_rule_list);
  2032. INIT_LIST_HEAD(&trigger->sysvar_list);
  2033. if (trigger_elem->strLogType) {
  2034. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("LogType value is %s.", trigger_elem->strLogType);
  2035. trigger->log_type = parse_log_type(trigger_elem->strLogType);
  2036. if (trigger->log_type == -1) {
  2037. if (nIslog) {
  2038. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger log type parse failed!");
  2039. }
  2040. goto on_error;
  2041. }
  2042. }
  2043. else {
  2044. if (nIslog) {
  2045. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  2046. }
  2047. goto on_error;
  2048. }
  2049. if (trigger_elem->strSeverityLevel) {
  2050. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SeverityLevel value is %s.", trigger_elem->strSeverityLevel);
  2051. trigger->severity_level = parse_severity(trigger_elem->strSeverityLevel);
  2052. if (trigger->severity_level == -1) {
  2053. if (nIslog) {
  2054. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse severity level failed!");
  2055. }
  2056. goto on_error;
  2057. }
  2058. }
  2059. else {
  2060. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error) {
  2061. if (nIslog) {
  2062. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  2063. }
  2064. goto on_error;
  2065. }
  2066. }
  2067. if (trigger_elem->strSysError) {
  2068. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SysError value is %s.", trigger_elem->strSysError);
  2069. trigger->sys_code = parse_sys_code(trigger_elem->strSysError);
  2070. if (trigger->sys_code == -1) {
  2071. if (nIslog) {
  2072. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code failed! sys_code: %s", trigger_elem->strSysError);
  2073. }
  2074. goto on_error;
  2075. }
  2076. }
  2077. else {
  2078. if (trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  2079. if (nIslog) {
  2080. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code undefined!");
  2081. }
  2082. goto on_error;
  2083. }
  2084. }
  2085. if (trigger_elem->strUserCode) {
  2086. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UserCode value is %s.", trigger_elem->strUserCode);
  2087. trigger->user_code = parse_usr_code(trigger_elem->strUserCode);
  2088. }
  2089. else {
  2090. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  2091. if (nIslog) {
  2092. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse user code undefined!");
  2093. }
  2094. goto on_error;
  2095. }
  2096. }
  2097. if (trigger_elem->strMessage) {
  2098. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Message value is %s.", trigger_elem->strMessage);
  2099. trigger->msg = _strdup(trigger_elem->strMessage);
  2100. }
  2101. int slots_arr_length = sizeof(trigger_elem->Slots) / sizeof(rvc_triggerslot_t);
  2102. if (slots_arr_length > 0) {
  2103. for (int islot = 0; islot < slots_arr_length; islot++) {
  2104. int rc = load_slot_element_rule(trigger, ns, &trigger_elem->Slots[islot]);
  2105. if (rc != 0) {
  2106. break;
  2107. }
  2108. }
  2109. }
  2110. int sysvars_arr_length = sizeof(trigger_elem->SysVars) / sizeof(rvc_triggersysvar_t);
  2111. if (sysvars_arr_length > 0) {
  2112. for (int isysvar = 0; isysvar < sysvars_arr_length; isysvar++) {
  2113. int rc = load_sysvar_element_rule(engine, trigger, &trigger_elem->SysVars[isysvar]);
  2114. if (rc != 0) {
  2115. break;
  2116. }
  2117. }
  2118. }
  2119. if (trigger_elem->strDelayer) {
  2120. trigger->delay_ms = parse_timeout_value(trigger_elem->strDelayer);
  2121. trigger->delay_timer_id = -1;
  2122. }
  2123. else {
  2124. trigger->delay_ms = 0;
  2125. trigger->delay_timer_id = -1;
  2126. }
  2127. trigger->parent = engine;
  2128. list_add_tail(&trigger->entry, &engine->trigger_list);
  2129. return 0;
  2130. on_error:
  2131. trigger_free(trigger);
  2132. return Error_Unexpect;
  2133. }
  2134. static int load_trigger(evt_engine_t *engine, const char *ns, scew_element *trigger_elem)
  2135. {
  2136. evt_trigger_t *trigger = ZALLOC_T(evt_trigger_t);
  2137. scew_attribute *attr;
  2138. scew_list *slot_list, *sysvar_list;
  2139. scew_element *delayer;
  2140. INIT_LIST_HEAD(&trigger->slot_rule_list);
  2141. INIT_LIST_HEAD(&trigger->sysvar_list);
  2142. attr = scew_element_attribute_by_name(trigger_elem, "LogType");
  2143. if (attr) {
  2144. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("LogType value is %s.", scew_attribute_value(attr));
  2145. trigger->log_type = parse_log_type(scew_attribute_value(attr));
  2146. if (trigger->log_type == -1) {
  2147. if (nIslog){
  2148. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger log type parse failed!");
  2149. }
  2150. goto on_error;
  2151. }
  2152. }
  2153. else {
  2154. if (nIslog){
  2155. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  2156. }
  2157. goto on_error;
  2158. }
  2159. attr = scew_element_attribute_by_name(trigger_elem, "SeverityLevel");
  2160. if (attr) {
  2161. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SeverityLevel value is %s.", scew_attribute_value(attr));
  2162. trigger->severity_level = parse_severity(scew_attribute_value(attr));
  2163. if (trigger->severity_level == -1) {
  2164. if (nIslog){
  2165. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse severity level failed!");
  2166. }
  2167. goto on_error;
  2168. }
  2169. }
  2170. else {
  2171. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error) {
  2172. if (nIslog){
  2173. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  2174. }
  2175. goto on_error;
  2176. }
  2177. }
  2178. attr = scew_element_attribute_by_name(trigger_elem, "SysError");
  2179. if (attr) {
  2180. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SysError value is %s.", scew_attribute_value(attr));
  2181. trigger->sys_code = parse_sys_code(scew_attribute_value(attr));
  2182. if (trigger->sys_code == -1) {
  2183. if (nIslog){
  2184. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code failed! sys_code: %s", scew_attribute_value(attr));
  2185. }
  2186. goto on_error;
  2187. }
  2188. }
  2189. else {
  2190. if (trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  2191. if (nIslog){
  2192. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code undefined!");
  2193. }
  2194. goto on_error;
  2195. }
  2196. }
  2197. attr = scew_element_attribute_by_name(trigger_elem, "UserCode");
  2198. if (attr) {
  2199. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UserCode value is %s.", scew_attribute_value(attr));
  2200. trigger->user_code = parse_usr_code(scew_attribute_value(attr));
  2201. }
  2202. else {
  2203. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  2204. if (nIslog){
  2205. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse user code undefined!");
  2206. }
  2207. goto on_error;
  2208. }
  2209. }
  2210. attr = scew_element_attribute_by_name(trigger_elem, "Message");
  2211. if (attr) {
  2212. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Message value is %s.", scew_attribute_value(attr));
  2213. trigger->msg = _strdup(scew_attribute_value(attr));
  2214. }
  2215. slot_list = scew_element_list_by_name(trigger_elem, "Slot");
  2216. if (slot_list) {
  2217. for (scew_list *it = scew_list_first(slot_list); it; it = scew_list_next(it)) {
  2218. scew_element *slot_elem = (scew_element*)scew_list_data(it);
  2219. int rc = load_slot_rule(trigger, ns, slot_elem);
  2220. if (rc != 0) {
  2221. if (nIslog){
  2222. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot rule failed!");
  2223. }
  2224. scew_list_free(slot_list);
  2225. goto on_error;
  2226. }
  2227. }
  2228. scew_list_free(slot_list);
  2229. }
  2230. sysvar_list = scew_element_list_by_name(trigger_elem, "SysVar");
  2231. if (sysvar_list) {
  2232. for (scew_list *it = scew_list_first(sysvar_list); it; it = scew_list_next(it)) {
  2233. scew_element *sysvar_elem = (scew_element*)scew_list_data(it);
  2234. int rc = load_sysvar_rule(engine, trigger, sysvar_elem);
  2235. if (rc != 0) {
  2236. if (nIslog){
  2237. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load sysvar rule failed!");
  2238. }
  2239. scew_list_free(sysvar_list);
  2240. goto on_error;
  2241. }
  2242. }
  2243. scew_list_free(sysvar_list);
  2244. }
  2245. delayer = scew_element_by_name(trigger_elem, "Delayer");
  2246. if (delayer) {
  2247. trigger->delay_ms = parse_timeout_value(scew_element_contents(delayer));
  2248. trigger->delay_timer_id = -1;
  2249. }
  2250. else {
  2251. trigger->delay_ms = 0;
  2252. trigger->delay_timer_id = -1;
  2253. }
  2254. trigger->parent = engine;
  2255. list_add_tail(&trigger->entry, &engine->trigger_list);
  2256. return 0;
  2257. on_error:
  2258. trigger_free(trigger);
  2259. return Error_Unexpect;
  2260. }
  2261. static int load_file(evt_engine_t *engine, const char *filename)
  2262. {
  2263. scew_reader *reader = NULL;
  2264. scew_parser *parser = NULL;
  2265. scew_tree *tree = NULL;
  2266. scew_element *root;
  2267. const char *ns;
  2268. char tmp_ns[MAX_PATH];
  2269. int rc = Error_Param;
  2270. scew_attribute* attr = NULL;
  2271. scew_element* elem = NULL;
  2272. reader = scew_reader_file_create(filename);
  2273. if (!reader) {
  2274. if (nIslog){
  2275. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open file %s failed!", filename);
  2276. }
  2277. goto on_error;
  2278. }
  2279. parser = scew_parser_create();
  2280. tree = scew_parser_load(parser, reader);
  2281. if (!tree) {
  2282. if (nIslog){
  2283. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("read file %s failed! parser xml failed", filename);
  2284. }
  2285. goto on_error;
  2286. }
  2287. root = scew_tree_root(tree);
  2288. if (!root) {
  2289. if (nIslog){
  2290. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s file does not have root element!", filename);
  2291. }
  2292. goto on_error;
  2293. }
  2294. attr = scew_element_attribute_by_name(root, "xmlns");
  2295. if (attr) {
  2296. ns = (const char*)scew_attribute_value(attr);
  2297. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("scew_element_attribute_by_name xmlns success, ns is %s.", ns);
  2298. }
  2299. else {
  2300. const char *s = strrchr(filename, SPLIT_SLASH)+1;
  2301. const char *e = strrchr(filename, '.');
  2302. memcpy(tmp_ns, s, e-s);
  2303. tmp_ns[e-s] = 0;
  2304. ns = tmp_ns;
  2305. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("scew_element_attribute_by_name xmlns failed, ns is %s.", ns);
  2306. }
  2307. elem = scew_element_by_name(root, "SlotList");
  2308. if (elem) {
  2309. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("element SlotList contents is %s.", scew_element_contents(elem));
  2310. scew_list *slot_list = scew_element_children(elem);
  2311. if (slot_list) {
  2312. for (scew_list *it = scew_list_first(slot_list); it; it = scew_list_next(it)) {
  2313. scew_element *slot_elem = (scew_element *)scew_list_data(it);
  2314. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("slot_elem element name is %s, count is %d.", scew_element_name(slot_elem), scew_element_count(slot_elem));
  2315. if (load_slot(engine, ns, slot_elem) != 0) {
  2316. if (nIslog){
  2317. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot failed!");
  2318. }
  2319. goto on_error;
  2320. }
  2321. }
  2322. }
  2323. }
  2324. elem = scew_element_by_name(root, "TriggerList");
  2325. if (elem) {
  2326. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("element TriggerList contents is %s.", scew_element_contents(elem));
  2327. scew_list *trigger_list = scew_element_children(elem);
  2328. if (trigger_list) {
  2329. for (scew_list *it = scew_list_first(trigger_list); it; it = scew_list_next(it)) {
  2330. scew_element *trigger_elem = (scew_element*)scew_list_data(it);
  2331. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the number of children of %s is %d.", scew_element_name(trigger_elem), scew_element_count(trigger_elem));
  2332. if (load_trigger(engine, ns, trigger_elem) != 0) {
  2333. if (nIslog){
  2334. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load trigger failed!");
  2335. }
  2336. goto on_error;
  2337. }
  2338. }
  2339. }
  2340. }
  2341. rc = 0;
  2342. on_error:
  2343. if (tree) {
  2344. scew_tree_free(tree);
  2345. }
  2346. if (parser) {
  2347. scew_parser_free(parser);
  2348. }
  2349. if (reader) {
  2350. scew_reader_close(reader);
  2351. }
  2352. return rc;
  2353. }
  2354. static int load_strategy_array(evt_engine_t* engine, slot_trigger_elem_t* pelement)
  2355. {
  2356. const char* ns = pelement->slotns;
  2357. int rc = Error_Param;
  2358. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ns = %s.", pelement->slotns);
  2359. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sizeof(pelement->slotarr) = %d.", sizeof(pelement->slotarr));
  2360. for (int islot = 0; islot < sizeof(pelement->slotarr) / sizeof(rvc_slot_t); islot++) {
  2361. if (load_slot_arrays(engine, ns, &pelement->slotarr[islot]) != 0) {
  2362. if (nIslog) {
  2363. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot array failed!");
  2364. }
  2365. return rc;
  2366. }
  2367. }
  2368. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sizeof(pelement->triggerarr) = %d.", sizeof(pelement->triggerarr));
  2369. for (int itrigger = 0; itrigger < sizeof(pelement->triggerarr) / sizeof(rvc_trigger_t); itrigger++) {
  2370. if (load_trigger_arrays(engine, ns, &pelement->triggerarr[itrigger]) != 0) {
  2371. if (nIslog) {
  2372. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load trigger array failed!");
  2373. }
  2374. return rc;
  2375. }
  2376. }
  2377. rc = 0;
  2378. return rc;
  2379. }
  2380. int evt_engine_create(const evt_engine_callback_t *callback, evt_engine_t **p_engine)
  2381. {
  2382. evt_engine_t *engine = MALLOC_T(evt_engine_t);
  2383. engine->filter_ht = htable_create(0);
  2384. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->filter_ht->size = %d.", __FUNCTION__, __LINE__, engine->filter_ht->size);
  2385. engine->sysvar_ht = htable_create(0);
  2386. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->sysvar_ht->size = %d.", __FUNCTION__, __LINE__, engine->sysvar_ht->size);
  2387. engine->slot_ht = htable_create(0);
  2388. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size);
  2389. INIT_LIST_HEAD(&engine->trigger_list);
  2390. spinlock_init(&engine->lock);
  2391. memcpy(&engine->cb, callback, sizeof(evt_engine_callback_t));
  2392. *p_engine = engine;
  2393. return 0;
  2394. }
  2395. void evt_engine_destroy(evt_engine_t *engine)
  2396. {
  2397. assert(engine->filter_ht->count == 0);
  2398. assert(engine->slot_ht->count == 0);
  2399. assert(engine->sysvar_ht->count == 0);
  2400. htable_destroy(engine->filter_ht);
  2401. htable_destroy(engine->slot_ht);
  2402. htable_destroy(engine->sysvar_ht);
  2403. FREE(engine);
  2404. }
  2405. int evt_engine_load(evt_engine_t *engine, int nfile, const char **files)
  2406. {
  2407. int i;
  2408. int rc = 0;
  2409. for (i = 0; i < nfile; ++i) {
  2410. const char* filename = files[i];
  2411. assert(filename);
  2412. rc = load_file(engine, filename);
  2413. if (rc != 0) {
  2414. if (nIslog) {
  2415. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load file %s failed!", filename);
  2416. }
  2417. return rc;
  2418. }
  2419. else {
  2420. if (nIslog) {
  2421. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s loaded!", filename);
  2422. }
  2423. }
  2424. }
  2425. rc = build_ref(engine);
  2426. if (rc != 0) {
  2427. if (nIslog){
  2428. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("build ref failed!");
  2429. }
  2430. return rc;
  2431. }
  2432. if (nIslog){
  2433. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("build ref ok!");
  2434. }
  2435. return rc;
  2436. }
  2437. int evt_engine_load(evt_engine_t* engine, int icount, slot_trigger_elem_t* parr)
  2438. {
  2439. int rc = 0;
  2440. for (int i = 0; i < icount; ++i) {
  2441. rc = load_strategy_array(engine, &parr[i]);
  2442. if (rc != 0) {
  2443. if (nIslog) {
  2444. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load strategy array failed!");
  2445. }
  2446. return rc;
  2447. }
  2448. else {
  2449. if (nIslog) {
  2450. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load strategy array success!");
  2451. }
  2452. }
  2453. }
  2454. rc = build_ref(engine);
  2455. if (rc != 0) {
  2456. if (nIslog) {
  2457. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("build ref failed!");
  2458. }
  2459. return rc;
  2460. }
  2461. if (nIslog) {
  2462. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("build ref ok!");
  2463. }
  2464. return rc;
  2465. }
  2466. int evt_engine_unload(evt_engine_t *engine)
  2467. {
  2468. int i;
  2469. struct hlist_node *pos, *n;
  2470. evt_trigger_t *trigger, *tmp;
  2471. for (i = 0; i < engine->slot_ht->size; ++i) {
  2472. evt_slot_t *slot;
  2473. hlist_for_each_entry_safe(slot, pos, n, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  2474. hlist_del(pos);
  2475. slot_free(slot);
  2476. engine->slot_ht->count--;
  2477. }
  2478. }
  2479. for (i = 0; i < engine->sysvar_ht->size; ++i) {
  2480. evt_sysvar_t *sysvar;
  2481. hlist_for_each_entry_safe(sysvar, pos, n, &engine->sysvar_ht->buckets[i], evt_sysvar_t, hentry) {
  2482. hlist_del(pos);
  2483. sysvar_free(sysvar);
  2484. engine->sysvar_ht->count--;
  2485. }
  2486. }
  2487. list_for_each_entry_safe(trigger, tmp, &engine->trigger_list, evt_trigger_t, entry) {
  2488. list_del(&trigger->entry);
  2489. trigger_free(trigger);
  2490. }
  2491. return 0;
  2492. }
  2493. int evt_engine_process_log(evt_engine_t *engine,
  2494. const CAutoArray<CUUID> &SubIDs,
  2495. unsigned long long nLogID,
  2496. LogTypeEnum eLogType,
  2497. SeverityLevelEnum eLevel,
  2498. DWORD dwSysError,
  2499. DWORD dwUserCode,
  2500. DWORD dwEntityId,
  2501. const char *pszEntityName,
  2502. const char *pszModuleName,
  2503. const char *pszMessage)
  2504. {
  2505. return process_log(engine, SubIDs, (int)eLogType, (int)dwEntityId, (int)eLevel, (int)dwSysError, (int)dwUserCode, pszMessage);
  2506. }
  2507. int evt_engine_process_sysvar(evt_engine_t *engine,
  2508. const char *pszKey,
  2509. const char *pszValue,
  2510. const char *pszOldValue,
  2511. const char *pszEntityName)
  2512. {
  2513. if (!pszKey){
  2514. return Error_Param;
  2515. }
  2516. evt_sysvar_key_t key;
  2517. key.code = const_cast<char*>(pszKey);
  2518. key.index_hash_code = hash32_str(pszKey, HASH32_STR_INIT);
  2519. evt_sysvar_t *sysvar = sysvar_find(engine->sysvar_ht, &key);
  2520. if (sysvar) {
  2521. return process_sysvar(engine, sysvar, pszOldValue, pszValue);
  2522. }
  2523. else {
  2524. return Error_NotExist;
  2525. }
  2526. }
  2527. int evt_engine_start(evt_engine_t *engine)
  2528. {
  2529. int i;
  2530. int rc = engine->cb.subscribe_sysevent(engine, engine->cb.user_data);
  2531. if (rc != 0) {
  2532. if (nIslog){
  2533. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("subscribe sysevent failed!");
  2534. }
  2535. return rc;
  2536. }
  2537. if (nIslog){
  2538. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe sysevent ok!");
  2539. }
  2540. for (i = 0; i < engine->sysvar_ht->size; ++i) {
  2541. evt_sysvar_t *tpos;
  2542. struct hlist_node *pos;
  2543. hlist_for_each_entry(tpos, pos, &engine->sysvar_ht->buckets[i], evt_sysvar_t, hentry) {
  2544. CSimpleStringA strValue;
  2545. rc = engine->cb.get_sysevent(engine, tpos->key.code, strValue, engine->cb.user_data);
  2546. if (rc != 0) {
  2547. if (nIslog){
  2548. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get sysvar %s failed! Error = %d", tpos->key.code, rc);
  2549. }
  2550. return rc;
  2551. }
  2552. else {
  2553. if (nIslog){
  2554. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get sysvar %s ok! value=%s", tpos->key.code, strValue.GetData());
  2555. }
  2556. rc = process_sysvar(engine, tpos, NULL, strValue);
  2557. if (rc != 0) {
  2558. if (nIslog){
  2559. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process sysvar %s failed! value = %s", tpos->key.code, strValue.GetData());
  2560. }
  2561. return rc;
  2562. }
  2563. else {
  2564. if (nIslog){
  2565. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("process sysvar %s ok! key = %s, value = %s", tpos->key.code, tpos->key.code, strValue.GetData());
  2566. }
  2567. }
  2568. }
  2569. }
  2570. }
  2571. for (i = 0; i < engine->slot_ht->size; ++i) {
  2572. evt_slot_t *slot;
  2573. struct hlist_node *pos;
  2574. hlist_for_each_entry(slot, pos, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  2575. int kk;
  2576. for (kk = 0; kk < slot->arr_filter->nelts; ++kk) {
  2577. evt_filter_t *filter = ARRAY_IDX(slot->arr_filter, kk, evt_filter_t*);
  2578. rc = engine->cb.subscribe_log(engine, &filter->key.listen_id,
  2579. (LogTypeEnum)filter->log_type, filter->entity, (SeverityLevelEnum)filter->severity, (ErrorCodeEnum)filter->sys_code, filter->user_code, filter->content_to_var ? false : true, engine->cb.user_data);
  2580. if (rc != 0) {
  2581. if (nIslog){
  2582. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("subscribe log failed!");
  2583. }
  2584. return rc;
  2585. }
  2586. else {
  2587. if (nIslog){
  2588. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe log ok, id = %d", filter->key.listen_id);
  2589. }
  2590. }
  2591. filter_add(engine->filter_ht, filter);
  2592. }
  2593. }
  2594. }
  2595. if (nIslog){
  2596. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe started!");
  2597. }
  2598. return rc;
  2599. }
  2600. int evt_engine_stop(evt_engine_t *engine)
  2601. {
  2602. int rc;
  2603. int i;
  2604. for (i = 0; i < engine->slot_ht->size; ++i) {
  2605. evt_slot_t *slot;
  2606. struct hlist_node *pos;
  2607. hlist_for_each_entry(slot, pos, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  2608. int kk;
  2609. for (kk = 0; kk < slot->arr_filter->nelts; ++kk) {
  2610. evt_filter_t *filter = ARRAY_IDX(slot->arr_filter, kk, evt_filter_t*);
  2611. rc = engine->cb.unsubscribe_log(engine, filter->key.listen_id, engine->cb.user_data);
  2612. if (rc != 0) {
  2613. if (nIslog){
  2614. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unsubscribe log failed, slot = %s, log listen_id = %s", slot->key.code, filter->key.listen_id);
  2615. }
  2616. return rc;
  2617. }
  2618. filter_remove(engine->filter_ht, filter);
  2619. }
  2620. }
  2621. }
  2622. rc = engine->cb.unsubscribe_sysevent(engine, engine->cb.user_data);
  2623. if (rc != 0) {
  2624. if (nIslog){
  2625. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unsubscibe sysevent failed!");
  2626. }
  2627. return rc;
  2628. }
  2629. if (nIslog){
  2630. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unsubscibe sysevent ok!");
  2631. }
  2632. return rc;
  2633. }