Updates to Tomato RAF including NGINX && PHP
[tomato.git] / release / src / router / snmp / agent / mibgroup / disman / mteTriggerTable.c
blob132638c07ed8186ab2d1dfe8e7bb13be43351aaa
1 /*
2 * This file was generated by mib2c and is intended for use as
3 * a mib module for the ucd-snmp snmpd agent.
4 */
7 /*
8 * This should always be included first before anything else
9 */
10 #include <net-snmp/net-snmp-config.h>
11 #if HAVE_STDLIB_H
12 #include <stdlib.h>
13 #endif
14 #if HAVE_STRING_H
15 #include <string.h>
16 #else
17 #include <strings.h>
18 #endif
19 #ifdef HAVE_LIMITS_H
20 #include <limits.h>
21 #endif
25 * minimal include directives
27 #include <net-snmp/net-snmp-includes.h>
28 #include <net-snmp/agent/net-snmp-agent-includes.h>
30 #include "header_complex.h"
31 #include "mteTriggerTable.h"
32 #include "mteTriggerBooleanTable.h"
33 #include "mteTriggerDeltaTable.h"
34 #include "mteTriggerExistenceTable.h"
35 #include "mteTriggerThresholdTable.h"
36 #include "mteEventTable.h"
37 #include "mteObjectsTable.h"
40 * mteTriggerTable_variables_oid:
41 * this is the top level oid that we want to register under. This
42 * is essentially a prefix, with the suffix appearing in the
43 * variable below.
47 * trap definitions
49 oid mteTriggerFired[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 1 };
50 oid mteTriggerRising[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 2 };
51 oid mteTriggerFalling[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 3 };
52 oid mteTriggerFailure[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 4 };
53 oid mteEventSetFailure[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 5 };
56 * trap objects
58 oid mteHotTrigger[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 1 };
59 oid mteHotTargetName[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 2 };
60 oid mteHotContextName[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 3 };
61 oid mteHotOID[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 4 };
62 oid mteHotValue[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 5 };
63 oid mteFailedReason[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 6 };
66 * For discontinuity checking.
68 oid sysUpTimeInstance[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };
70 oid mteTriggerTable_variables_oid[] =
71 { 1, 3, 6, 1, 2, 1, 88, 1, 2, 2 };
75 * variable2 mteTriggerTable_variables:
76 * this variable defines function callbacks and type return information
77 * for the mteTriggerTable mib section
81 struct variable2 mteTriggerTable_variables[] = {
83 * magic number , variable type , ro/rw , callback fn , L, oidsuffix
85 #define MTETRIGGERCOMMENT 5
86 {MTETRIGGERCOMMENT, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
87 {1, 3}},
88 #define MTETRIGGERTEST 6
89 {MTETRIGGERTEST, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2, {1, 4}},
90 #define MTETRIGGERSAMPLETYPE 7
91 {MTETRIGGERSAMPLETYPE, ASN_INTEGER, RWRITE, var_mteTriggerTable, 2,
92 {1, 5}},
93 #define MTETRIGGERVALUEID 8
94 {MTETRIGGERVALUEID, ASN_OBJECT_ID, RWRITE, var_mteTriggerTable, 2,
95 {1, 6}},
96 #define MTETRIGGERVALUEIDWILDCARD 9
97 {MTETRIGGERVALUEIDWILDCARD, ASN_INTEGER, RWRITE, var_mteTriggerTable,
98 2, {1, 7}},
99 #define MTETRIGGERTARGETTAG 10
100 {MTETRIGGERTARGETTAG, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
101 {1, 8}},
102 #define MTETRIGGERCONTEXTNAME 11
103 {MTETRIGGERCONTEXTNAME, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
104 {1, 9}},
105 #define MTETRIGGERCONTEXTNAMEWILDCARD 12
106 {MTETRIGGERCONTEXTNAMEWILDCARD, ASN_INTEGER, RWRITE,
107 var_mteTriggerTable, 2, {1, 10}},
108 #define MTETRIGGERFREQUENCY 13
109 {MTETRIGGERFREQUENCY, ASN_UNSIGNED, RWRITE, var_mteTriggerTable, 2,
110 {1, 11}},
111 #define MTETRIGGEROBJECTSOWNER 14
112 {MTETRIGGEROBJECTSOWNER, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
113 {1, 12}},
114 #define MTETRIGGEROBJECTS 15
115 {MTETRIGGEROBJECTS, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
116 {1, 13}},
117 #define MTETRIGGERENABLED 16
118 {MTETRIGGERENABLED, ASN_INTEGER, RWRITE, var_mteTriggerTable, 2,
119 {1, 14}},
120 #define MTETRIGGERENTRYSTATUS 17
121 {MTETRIGGERENTRYSTATUS, ASN_INTEGER, RWRITE, var_mteTriggerTable, 2,
122 {1, 15}},
126 * (L = length of the oidsuffix)
131 * global storage of our data, saved in and configured by header_complex()
133 struct header_complex_index *mteTriggerTableStorage = NULL;
135 netsnmp_session *mte_callback_sess = NULL;
136 extern int callback_master_num;
139 * init_mteTriggerTable():
140 * Initialization routine. This is called when the agent starts up.
141 * At a minimum, registration of your variables should take place here.
143 void
144 init_mteTriggerTable(void)
146 DEBUGMSGTL(("mteTriggerTable", "initializing... "));
150 * register ourselves with the agent to handle our mib tree
152 REGISTER_MIB("mteTriggerTable", mteTriggerTable_variables, variable2,
153 mteTriggerTable_variables_oid);
157 * register our config handler(s) to deal with registrations
159 snmpd_register_config_handler("mteTriggerTable", parse_mteTriggerTable,
160 NULL, NULL);
162 snmpd_register_config_handler("monitor", parse_simple_monitor, NULL,
163 "[options] monitor_expression [see \"man snmpd.conf\"]");
164 snmpd_register_config_handler("defaultMonitors",
165 parse_default_monitors, NULL, "yes|no");
166 netsnmp_ds_register_config(ASN_OCTET_STR, "snmpd", "agentSecName",
167 NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME);
170 * we need to be called back later to store our data
172 snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
173 store_mteTriggerTable, NULL);
177 * place any other initialization junk you need here
179 se_add_pair_to_slist("mteBooleanOperators", strdup("!="),
180 MTETRIGGERBOOLEANCOMPARISON_UNEQUAL);
181 se_add_pair_to_slist("mteBooleanOperators", strdup("=="),
182 MTETRIGGERBOOLEANCOMPARISON_EQUAL);
183 se_add_pair_to_slist("mteBooleanOperators", strdup("<"),
184 MTETRIGGERBOOLEANCOMPARISON_LESS);
185 se_add_pair_to_slist("mteBooleanOperators", strdup("<="),
186 MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL);
187 se_add_pair_to_slist("mteBooleanOperators", strdup(">"),
188 MTETRIGGERBOOLEANCOMPARISON_GREATER);
189 se_add_pair_to_slist("mteBooleanOperators", strdup(">="),
190 MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL);
193 * open a 'callback' session to the main agent
195 if (mte_callback_sess == NULL) {
196 mte_callback_sess = netsnmp_callback_open(callback_master_num,
197 NULL, NULL, NULL);
198 DEBUGMSGTL(("mteTriggerTable", "created callback session = %08x\n",
199 mte_callback_sess));
201 DEBUGMSGTL(("mteTriggerTable", "done.\n"));
204 struct mteTriggerTable_data *
205 create_mteTriggerTable_data(void)
207 struct mteTriggerTable_data *StorageNew;
209 StorageNew = SNMP_MALLOC_STRUCT(mteTriggerTable_data);
212 * fill in default row values here into StorageNew
215 * fill in values for all tables (even if not
216 * appropriate), since its easier to do here than anywhere
217 * else
219 StorageNew->mteTriggerComment = strdup("");
220 StorageNew->mteTriggerTest = strdup("");
221 StorageNew->mteTriggerTest[0] |= (char) MTETRIGGERTEST_BOOLEAN;
222 StorageNew->mteTriggerTestLen = 1;
223 StorageNew->mteTriggerSampleType = MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE;
224 StorageNew->mteTriggerValueID = calloc(1, sizeof(oid) * sizeof(2)); /* 0.0 */
225 StorageNew->mteTriggerValueIDLen = 2;
226 StorageNew->mteTriggerValueIDWildcard =
227 MTETRIGGERVALUEIDWILDCARD_FALSE;
228 StorageNew->mteTriggerTargetTag = strdup("");
229 StorageNew->mteTriggerContextName = strdup("");
230 StorageNew->mteTriggerContextNameWildcard =
231 MTETRIGGERCONTEXTNAMEWILDCARD_FALSE;
232 StorageNew->mteTriggerFrequency = 600;
233 StorageNew->mteTriggerObjectsOwner = strdup("");
234 StorageNew->mteTriggerObjects = strdup("");
235 StorageNew->mteTriggerEnabled = MTETRIGGERENABLED_FALSE;
236 memdup((unsigned char **)
237 &(StorageNew->mteTriggerDeltaDiscontinuityID),
238 (unsigned char *) sysUpTimeInstance, sizeof(sysUpTimeInstance));
239 StorageNew->mteTriggerDeltaDiscontinuityIDLen =
240 sizeof(sysUpTimeInstance) / sizeof(oid);
241 StorageNew->mteTriggerDeltaDiscontinuityIDWildcard = TV_FALSE;
242 StorageNew->mteTriggerDeltaDiscontinuityIDType =
243 MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMETICKS;
244 StorageNew->mteTriggerExistenceTest = strdup("");
245 StorageNew->mteTriggerExistenceTest[0] =
246 (char) (MTETRIGGEREXISTENCETEST_PRESENT |
247 MTETRIGGEREXISTENCETEST_ABSENT);
248 StorageNew->mteTriggerExistenceTestLen = 1;
249 StorageNew->mteTriggerExistenceStartup = strdup("");
250 StorageNew->mteTriggerExistenceStartup[0] =
251 (char) (MTETRIGGEREXISTENCESTARTUP_PRESENT);
252 StorageNew->mteTriggerExistenceStartupLen = 1;
253 StorageNew->mteTriggerExistenceObjectsOwner = strdup("");
254 StorageNew->mteTriggerExistenceObjects = strdup("");
255 StorageNew->mteTriggerExistenceEventOwner = strdup("");
256 StorageNew->mteTriggerExistenceEvent = strdup("");
257 StorageNew->mteTriggerBooleanComparison =
258 MTETRIGGERBOOLEANCOMPARISON_UNEQUAL;
259 StorageNew->mteTriggerBooleanStartup = MTETRIGGERBOOLEANSTARTUP_TRUE;
260 StorageNew->mteTriggerBooleanObjectsOwner = strdup("");
261 StorageNew->mteTriggerBooleanObjects = strdup("");
262 StorageNew->mteTriggerBooleanEventOwner = strdup("");
263 StorageNew->mteTriggerBooleanEvent = strdup("");
264 StorageNew->mteTriggerThresholdStartup =
265 MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING;
266 StorageNew->mteTriggerThresholdObjectsOwner = strdup("");
267 StorageNew->mteTriggerThresholdObjects = strdup("");
268 StorageNew->mteTriggerThresholdRisingEventOwner = strdup("");
269 StorageNew->mteTriggerThresholdRisingEvent = strdup("");
270 StorageNew->mteTriggerThresholdFallingEventOwner = strdup("");
271 StorageNew->mteTriggerThresholdFallingEvent = strdup("");
272 StorageNew->mteTriggerThresholdDeltaRisingEventOwner = strdup("");
273 StorageNew->mteTriggerThresholdDeltaRisingEvent = strdup("");
274 StorageNew->mteTriggerThresholdDeltaFallingEventOwner = strdup("");
275 StorageNew->mteTriggerThresholdDeltaFallingEvent = strdup("");
276 StorageNew->lastboolresult = -1;
277 StorageNew->storageType = ST_NONVOLATILE;
278 StorageNew->prevDiscoTicks = 0;
279 StorageNew->prevUptimeTicks = 0;
280 return StorageNew;
284 * mteTriggerTable_add(): adds a structure node to our data set
287 mteTriggerTable_add(struct mteTriggerTable_data *thedata)
289 netsnmp_variable_list *vars = NULL;
292 DEBUGMSGTL(("mteTriggerTable", "adding data... "));
294 * add the index variables to the varbind list, which is
295 * used by header_complex to index the data
299 snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->mteOwner, thedata->mteOwnerLen); /* mteOwner */
300 snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OCTET_STR, (char *) thedata->mteTriggerName, thedata->mteTriggerNameLen); /* mteTriggerName */
304 header_complex_add_data(&mteTriggerTableStorage, vars, thedata);
305 DEBUGMSGTL(("mteTriggerTable", "registered an entry\n"));
308 DEBUGMSGTL(("mteTriggerTable", "done.\n"));
309 return SNMPERR_SUCCESS;
313 #define MTE_PROCESS_LINE(line) \
314 snprintf(buf, SPRINT_MAX_LEN, "-u %s %s", mte_default_user, line); \
315 parse_simple_monitor("monitor", buf);
317 void
318 parse_default_monitors(const char *token, char *line)
320 char buf[SPRINT_MAX_LEN];
321 char *mte_default_user =
322 netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME);
324 if (strncmp(line, "yes", 3) == 0) {
326 DEBUGMSGTL(("mteTriggerTable", "registering default monitors\n"));
328 if (mte_default_user == NULL) {
329 config_perror
330 ("You must specify a user name first using the agentSecName token\n");
331 return;
335 * we don't include many additional objects here as most of
336 * the error messages are complete with the needed
337 * information
339 MTE_PROCESS_LINE
340 ("-o prNames -o prErrMessage \"process table\" prErrorFlag != 0");
341 MTE_PROCESS_LINE
342 ("-o memErrorName -o memSwapErrorMsg \"memory\" memSwapError != 0");
343 MTE_PROCESS_LINE
344 ("-o extNames -o extOutput \"extTable\" extResult != 0");
345 MTE_PROCESS_LINE
346 ("-o dskPath -o dskErrorMsg \"dskTable\" dskErrorFlag != 0");
347 MTE_PROCESS_LINE
348 ("-o laNames -o laErrMessage \"laTable\" laErrorFlag != 0");
349 MTE_PROCESS_LINE
350 ("-o fileName -o fileErrorMsg \"fileTable\" fileErrorFlag != 0");
352 * this one is not *all* that useful, because the error is
353 * only kept for 30 seconds at most. Maybe scan it every 30
354 * seconds, but I'm not doing so without seeking other peoples
355 * opinions first.
357 MTE_PROCESS_LINE
358 ("-o snmperrErrMessage \"snmperrs\" snmperrErrorFlag != 0");
362 static int monitor_call_count = 0;
363 void
364 parse_simple_monitor(const char *token, char *line)
366 char buf[SPRINT_MAX_LEN], *cp, ebuf[SPRINT_MAX_LEN];
367 oid obuf[MAX_OID_LEN];
368 size_t obufLen;
369 struct mteTriggerTable_data *StorageNew;
371 monitor_call_count++;
373 StorageNew = create_mteTriggerTable_data();
374 StorageNew->storageType = ST_READONLY;
375 StorageNew->mteTriggerEnabled = MTETRIGGERENABLED_TRUE;
376 StorageNew->mteTriggerEntryStatus = RS_ACTIVE;
377 StorageNew->mteTriggerValueIDWildcard = MTETRIGGERVALUEIDWILDCARD_TRUE;
378 StorageNew->mteTriggerBooleanStartup = MTETRIGGERBOOLEANSTARTUP_TRUE;
379 StorageNew->mteTriggerThresholdStartup =
380 MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING;
382 * owner = snmpd.conf, why not?
384 StorageNew->mteOwner = strdup("snmpd.conf");
385 StorageNew->mteOwnerLen = strlen(StorageNew->mteOwner);
386 StorageNew->pdu_version = SNMP_VERSION_3;
387 StorageNew->pdu_securityModel = SNMP_SEC_MODEL_USM;
388 StorageNew->pdu_securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;
390 cp = line;
392 while (cp && *cp == '-') {
393 cp = copy_nword(cp, buf, sizeof(buf));
394 switch (buf[1]) {
395 case 'r':
396 if (cp) {
397 cp = copy_nword(cp, buf, sizeof(buf));
398 StorageNew->mteTriggerFrequency = strtoul(buf, NULL, 0);
399 } else {
400 config_perror("No parameter after -r given\n");
402 * XXX: free StorageNew
404 return;
406 break;
407 case 'u':
408 if (cp) {
409 cp = copy_nword(cp, buf, sizeof(buf));
410 StorageNew->pdu_securityName = strdup(buf);
411 StorageNew->pdu_securityNameLen = strlen(buf);
412 } else {
413 config_perror("No parameter after -u given\n");
415 * XXX: free StorageNew
417 return;
419 break;
420 case 'o':
422 * oid
424 cp = copy_nword(cp, buf, sizeof(buf));
425 obufLen = MAX_OID_LEN;
426 if (!snmp_parse_oid(buf, obuf, &obufLen)) {
427 sprintf(ebuf, "unable to parse oid: %s", buf);
428 config_perror(ebuf);
430 * XXX: free StorageNew
432 return;
434 sprintf(buf, "snmpd.conf%d", monitor_call_count);
435 mte_add_object_to_table("snmpd.conf", buf, obuf, obufLen, 1);
437 if (StorageNew->mteTriggerObjectsOwnerLen == 0) {
438 SNMP_FREE(StorageNew->mteTriggerObjectsOwner);
439 StorageNew->mteTriggerObjectsOwner = strdup("snmpd.conf");
440 StorageNew->mteTriggerObjectsOwnerLen =
441 strlen("snmpd.conf");
444 if (StorageNew->mteTriggerObjectsLen == 0) {
445 SNMP_FREE(StorageNew->mteTriggerObjects);
446 StorageNew->mteTriggerObjects = strdup(buf);
447 StorageNew->mteTriggerObjectsLen = strlen(buf);
449 break;
453 if (StorageNew->pdu_securityNameLen == 0) {
454 char *mte_default_user =
455 netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME);
456 if (mte_default_user) {
457 StorageNew->pdu_securityName = strdup(mte_default_user);
458 StorageNew->pdu_securityNameLen = strlen(mte_default_user);
459 } else {
460 config_perror("-u USER parameter required\n");
462 * XXX: free StorageNew
464 return;
469 * name
471 cp = copy_nword(cp, buf, sizeof(buf));
472 if (!cp) {
473 config_perror("illegal monitor: no name specified");
475 * XXX: free StorageNew
477 return;
480 StorageNew->mteTriggerName = strdup(buf);
481 StorageNew->mteTriggerNameLen = strlen(StorageNew->mteTriggerName);
484 * oid
486 cp = copy_nword(cp, buf, sizeof(buf));
487 obufLen = MAX_OID_LEN;
488 if (!snmp_parse_oid(buf, obuf, &obufLen)) {
489 sprintf(ebuf, "unable to parse oid: %s", buf);
490 config_perror(ebuf);
492 * XXX: free StorageNew
494 return;
496 if (StorageNew->mteTriggerValueID)
497 free(StorageNew->mteTriggerValueID);
498 StorageNew->mteTriggerValueID = snmp_duplicate_objid(obuf, obufLen);
499 StorageNew->mteTriggerValueIDLen = obufLen;
502 * if nothing beyond here, it's an existence test
504 if (!cp) {
505 StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_EXISTENCE;
506 mteTriggerTable_add(StorageNew);
507 return;
511 * assume boolean (need to deal with threshold statements)
513 cp = copy_nword(cp, buf, sizeof(buf));
514 if ((StorageNew->mteTriggerBooleanComparison =
515 se_find_value_in_slist("mteBooleanOperators", buf)) == -1) {
516 config_perror("illegal boolean operator");
517 return;
521 * XXX: add threshold
523 StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_BOOLEAN;
524 if (!cp) {
525 config_perror("no comparison value specified");
527 * XXX: free StorageNew
529 return;
532 cp = copy_nword(cp, buf, sizeof(buf));
533 StorageNew->mteTriggerBooleanValue = strtol(buf, NULL, 0);
535 mteTriggerTable_add(StorageNew);
536 mte_enable_trigger(StorageNew);
538 DEBUGMSGTL(("mteTriggerTable", "added simple monitor: %s\n",
539 StorageNew->mteTriggerName));
544 * parse_mteTriggerTable():
545 * parses .conf file entries needed to configure the mib.
547 void
548 parse_mteTriggerTable(const char *token, char *line)
550 size_t tmpint;
551 oid *tmpoid = NULL;
552 struct mteTriggerTable_data *StorageTmp =
553 SNMP_MALLOC_STRUCT(mteTriggerTable_data);
555 DEBUGMSGTL(("mteTriggerTable", "parsing config... "));
557 if (StorageTmp == NULL) {
558 config_perror("malloc failure");
559 return;
562 line =
563 read_config_read_data(ASN_OCTET_STR, line, &StorageTmp->mteOwner,
564 &StorageTmp->mteOwnerLen);
565 if (StorageTmp->mteOwner == NULL) {
566 config_perror("invalid specification for mteOwner");
567 return;
570 line =
571 read_config_read_data(ASN_OCTET_STR, line,
572 &StorageTmp->mteTriggerName,
573 &StorageTmp->mteTriggerNameLen);
574 if (StorageTmp->mteTriggerName == NULL) {
575 config_perror("invalid specification for mteTriggerName");
576 return;
579 line =
580 read_config_read_data(ASN_OCTET_STR, line,
581 &StorageTmp->mteTriggerComment,
582 &StorageTmp->mteTriggerCommentLen);
583 if (StorageTmp->mteTriggerComment == NULL) {
584 config_perror("invalid specification for mteTriggerComment");
585 return;
588 line =
589 read_config_read_data(ASN_OCTET_STR, line,
590 &StorageTmp->mteTriggerTest,
591 &StorageTmp->mteTriggerTestLen);
592 if (StorageTmp->mteTriggerTest == NULL) {
593 config_perror("invalid specification for mteTriggerTest");
594 return;
597 line =
598 read_config_read_data(ASN_INTEGER, line,
599 &StorageTmp->mteTriggerSampleType, &tmpint);
601 line =
602 read_config_read_data(ASN_OBJECT_ID, line,
603 &StorageTmp->mteTriggerValueID,
604 &StorageTmp->mteTriggerValueIDLen);
605 if (StorageTmp->mteTriggerValueID == NULL) {
606 config_perror("invalid specification for mteTriggerValueID");
607 return;
610 line =
611 read_config_read_data(ASN_INTEGER, line,
612 &StorageTmp->mteTriggerValueIDWildcard,
613 &tmpint);
615 line =
616 read_config_read_data(ASN_OCTET_STR, line,
617 &StorageTmp->mteTriggerTargetTag,
618 &StorageTmp->mteTriggerTargetTagLen);
619 if (StorageTmp->mteTriggerTargetTag == NULL) {
620 config_perror("invalid specification for mteTriggerTargetTag");
621 return;
624 line =
625 read_config_read_data(ASN_OCTET_STR, line,
626 &StorageTmp->mteTriggerContextName,
627 &StorageTmp->mteTriggerContextNameLen);
628 if (StorageTmp->mteTriggerContextName == NULL) {
629 config_perror("invalid specification for mteTriggerContextName");
630 return;
633 line =
634 read_config_read_data(ASN_INTEGER, line,
635 &StorageTmp->mteTriggerContextNameWildcard,
636 &tmpint);
638 line =
639 read_config_read_data(ASN_UNSIGNED, line,
640 &StorageTmp->mteTriggerFrequency, &tmpint);
642 line =
643 read_config_read_data(ASN_OCTET_STR, line,
644 &StorageTmp->mteTriggerObjectsOwner,
645 &StorageTmp->mteTriggerObjectsOwnerLen);
646 if (StorageTmp->mteTriggerObjectsOwner == NULL) {
647 config_perror("invalid specification for mteTriggerObjectsOwner");
648 return;
651 line =
652 read_config_read_data(ASN_OCTET_STR, line,
653 &StorageTmp->mteTriggerObjects,
654 &StorageTmp->mteTriggerObjectsLen);
655 if (StorageTmp->mteTriggerObjects == NULL) {
656 config_perror("invalid specification for mteTriggerObjects");
657 return;
660 line =
661 read_config_read_data(ASN_INTEGER, line,
662 &StorageTmp->mteTriggerEnabled, &tmpint);
664 line =
665 read_config_read_data(ASN_INTEGER, line,
666 &StorageTmp->mteTriggerEntryStatus, &tmpint);
669 * delta table
671 line =
672 read_config_read_data(ASN_OBJECT_ID, line,
673 &StorageTmp->mteTriggerDeltaDiscontinuityID,
674 &StorageTmp->
675 mteTriggerDeltaDiscontinuityIDLen);
676 if (StorageTmp->mteTriggerDeltaDiscontinuityID == NULL) {
677 config_perror
678 ("invalid specification for mteTriggerDeltaDiscontinuityID");
679 return;
682 line =
683 read_config_read_data(ASN_INTEGER, line,
684 &StorageTmp->
685 mteTriggerDeltaDiscontinuityIDWildcard,
686 &tmpint);
688 line =
689 read_config_read_data(ASN_INTEGER, line,
690 &StorageTmp->
691 mteTriggerDeltaDiscontinuityIDType, &tmpint);
694 * existence table
696 line =
697 read_config_read_data(ASN_OCTET_STR, line,
698 &StorageTmp->mteTriggerExistenceTest,
699 &StorageTmp->mteTriggerExistenceTestLen);
700 if (StorageTmp->mteTriggerExistenceTest == NULL) {
701 config_perror("invalid specification for mteTriggerExistenceTest");
702 return;
705 line =
706 read_config_read_data(ASN_OCTET_STR, line,
707 &StorageTmp->mteTriggerExistenceStartup,
708 &StorageTmp->mteTriggerExistenceStartupLen);
709 if (StorageTmp->mteTriggerExistenceStartup == NULL) {
710 config_perror
711 ("invalid specification for mteTriggerExistenceStartup");
712 return;
715 line =
716 read_config_read_data(ASN_OCTET_STR, line,
717 &StorageTmp->mteTriggerExistenceObjectsOwner,
718 &StorageTmp->
719 mteTriggerExistenceObjectsOwnerLen);
720 if (StorageTmp->mteTriggerExistenceObjectsOwner == NULL) {
721 config_perror
722 ("invalid specification for mteTriggerExistenceObjectsOwner");
723 return;
726 line =
727 read_config_read_data(ASN_OCTET_STR, line,
728 &StorageTmp->mteTriggerExistenceObjects,
729 &StorageTmp->mteTriggerExistenceObjectsLen);
730 if (StorageTmp->mteTriggerExistenceObjects == NULL) {
731 config_perror
732 ("invalid specification for mteTriggerExistenceObjects");
733 return;
736 line =
737 read_config_read_data(ASN_OCTET_STR, line,
738 &StorageTmp->mteTriggerExistenceEventOwner,
739 &StorageTmp->
740 mteTriggerExistenceEventOwnerLen);
741 if (StorageTmp->mteTriggerExistenceEventOwner == NULL) {
742 config_perror
743 ("invalid specification for mteTriggerExistenceEventOwner");
744 return;
747 line =
748 read_config_read_data(ASN_OCTET_STR, line,
749 &StorageTmp->mteTriggerExistenceEvent,
750 &StorageTmp->mteTriggerExistenceEventLen);
751 if (StorageTmp->mteTriggerExistenceEvent == NULL) {
752 config_perror
753 ("invalid specification for mteTriggerExistenceEvent");
754 return;
758 * boolean table
760 line =
761 read_config_read_data(ASN_INTEGER, line,
762 &StorageTmp->mteTriggerBooleanComparison,
763 &tmpint);
765 line =
766 read_config_read_data(ASN_INTEGER, line,
767 &StorageTmp->mteTriggerBooleanValue,
768 &tmpint);
770 line =
771 read_config_read_data(ASN_INTEGER, line,
772 &StorageTmp->mteTriggerBooleanStartup,
773 &tmpint);
775 line =
776 read_config_read_data(ASN_OCTET_STR, line,
777 &StorageTmp->mteTriggerBooleanObjectsOwner,
778 &StorageTmp->
779 mteTriggerBooleanObjectsOwnerLen);
780 if (StorageTmp->mteTriggerBooleanObjectsOwner == NULL) {
781 config_perror
782 ("invalid specification for mteTriggerBooleanObjectsOwner");
783 return;
786 line =
787 read_config_read_data(ASN_OCTET_STR, line,
788 &StorageTmp->mteTriggerBooleanObjects,
789 &StorageTmp->mteTriggerBooleanObjectsLen);
790 if (StorageTmp->mteTriggerBooleanObjects == NULL) {
791 config_perror
792 ("invalid specification for mteTriggerBooleanObjects");
793 return;
796 line =
797 read_config_read_data(ASN_OCTET_STR, line,
798 &StorageTmp->mteTriggerBooleanEventOwner,
799 &StorageTmp->mteTriggerBooleanEventOwnerLen);
800 if (StorageTmp->mteTriggerBooleanEventOwner == NULL) {
801 config_perror
802 ("invalid specification for mteTriggerBooleanEventOwner");
803 return;
806 line =
807 read_config_read_data(ASN_OCTET_STR, line,
808 &StorageTmp->mteTriggerBooleanEvent,
809 &StorageTmp->mteTriggerBooleanEventLen);
810 if (StorageTmp->mteTriggerBooleanEvent == NULL) {
811 config_perror("invalid specification for mteTriggerBooleanEvent");
812 return;
816 * threshold table
818 line =
819 read_config_read_data(ASN_INTEGER, line,
820 &StorageTmp->mteTriggerThresholdStartup,
821 &tmpint);
823 line =
824 read_config_read_data(ASN_INTEGER, line,
825 &StorageTmp->mteTriggerThresholdRising,
826 &tmpint);
828 line =
829 read_config_read_data(ASN_INTEGER, line,
830 &StorageTmp->mteTriggerThresholdFalling,
831 &tmpint);
833 line =
834 read_config_read_data(ASN_INTEGER, line,
835 &StorageTmp->mteTriggerThresholdDeltaRising,
836 &tmpint);
838 line =
839 read_config_read_data(ASN_INTEGER, line,
840 &StorageTmp->mteTriggerThresholdDeltaFalling,
841 &tmpint);
843 line =
844 read_config_read_data(ASN_OCTET_STR, line,
845 &StorageTmp->mteTriggerThresholdObjectsOwner,
846 &StorageTmp->
847 mteTriggerThresholdObjectsOwnerLen);
848 if (StorageTmp->mteTriggerThresholdObjectsOwner == NULL) {
849 config_perror
850 ("invalid specification for mteTriggerThresholdObjectsOwner");
851 return;
854 line =
855 read_config_read_data(ASN_OCTET_STR, line,
856 &StorageTmp->mteTriggerThresholdObjects,
857 &StorageTmp->mteTriggerThresholdObjectsLen);
858 if (StorageTmp->mteTriggerThresholdObjects == NULL) {
859 config_perror
860 ("invalid specification for mteTriggerThresholdObjects");
861 return;
864 line =
865 read_config_read_data(ASN_OCTET_STR, line,
866 &StorageTmp->
867 mteTriggerThresholdRisingEventOwner,
868 &StorageTmp->
869 mteTriggerThresholdRisingEventOwnerLen);
870 if (StorageTmp->mteTriggerThresholdRisingEventOwner == NULL) {
871 config_perror
872 ("invalid specification for mteTriggerThresholdRisingEventOwner");
873 return;
876 line =
877 read_config_read_data(ASN_OCTET_STR, line,
878 &StorageTmp->mteTriggerThresholdRisingEvent,
879 &StorageTmp->
880 mteTriggerThresholdRisingEventLen);
881 if (StorageTmp->mteTriggerThresholdRisingEvent == NULL) {
882 config_perror
883 ("invalid specification for mteTriggerThresholdRisingEvent");
884 return;
887 line =
888 read_config_read_data(ASN_OCTET_STR, line,
889 &StorageTmp->
890 mteTriggerThresholdFallingEventOwner,
891 &StorageTmp->
892 mteTriggerThresholdFallingEventOwnerLen);
893 if (StorageTmp->mteTriggerThresholdFallingEventOwner == NULL) {
894 config_perror
895 ("invalid specification for mteTriggerThresholdFallingEventOwner");
896 return;
899 line =
900 read_config_read_data(ASN_OCTET_STR, line,
901 &StorageTmp->mteTriggerThresholdFallingEvent,
902 &StorageTmp->
903 mteTriggerThresholdFallingEventLen);
904 if (StorageTmp->mteTriggerThresholdFallingEvent == NULL) {
905 config_perror
906 ("invalid specification for mteTriggerThresholdFallingEvent");
907 return;
910 line =
911 read_config_read_data(ASN_OCTET_STR, line,
912 &StorageTmp->
913 mteTriggerThresholdDeltaRisingEventOwner,
914 &StorageTmp->
915 mteTriggerThresholdDeltaRisingEventOwnerLen);
916 if (StorageTmp->mteTriggerThresholdDeltaRisingEventOwner == NULL) {
917 config_perror
918 ("invalid specification for mteTriggerThresholdDeltaRisingEventOwner");
919 return;
922 line =
923 read_config_read_data(ASN_OCTET_STR, line,
924 &StorageTmp->
925 mteTriggerThresholdDeltaRisingEvent,
926 &StorageTmp->
927 mteTriggerThresholdDeltaRisingEventLen);
928 if (StorageTmp->mteTriggerThresholdDeltaRisingEvent == NULL) {
929 config_perror
930 ("invalid specification for mteTriggerThresholdDeltaRisingEvent");
931 return;
934 line =
935 read_config_read_data(ASN_OCTET_STR, line,
936 &StorageTmp->
937 mteTriggerThresholdDeltaFallingEventOwner,
938 &StorageTmp->
939 mteTriggerThresholdDeltaFallingEventOwnerLen);
940 if (StorageTmp->mteTriggerThresholdDeltaFallingEventOwner == NULL) {
941 config_perror
942 ("invalid specification for mteTriggerThresholdDeltaFallingEventOwner");
943 return;
946 line =
947 read_config_read_data(ASN_OCTET_STR, line,
948 &StorageTmp->
949 mteTriggerThresholdDeltaFallingEvent,
950 &StorageTmp->
951 mteTriggerThresholdDeltaFallingEventLen);
952 if (StorageTmp->mteTriggerThresholdDeltaFallingEvent == NULL) {
953 config_perror
954 ("invalid specification for mteTriggerThresholdDeltaFallingEvent");
955 return;
959 * local internal variables
961 line =
962 read_config_read_data(ASN_INTEGER, line,
963 &StorageTmp->have_copied_auth_info, &tmpint);
964 if (StorageTmp->have_copied_auth_info) {
965 line =
966 read_config_read_data(ASN_INTEGER, line,
967 &StorageTmp->pdu_version, &tmpint);
968 line =
969 read_config_read_data(ASN_INTEGER, line,
970 &StorageTmp->pdu_securityModel, &tmpint);
971 line =
972 read_config_read_data(ASN_INTEGER, line,
973 &StorageTmp->pdu_securityLevel, &tmpint);
974 line =
975 read_config_read_data(ASN_OBJECT_ID, line, &tmpoid, &tmpint);
976 if (!netsnmp_tdomain_support
977 (tmpoid, tmpint, &StorageTmp->pdu_tDomain,
978 &StorageTmp->pdu_tDomainLen)) {
979 config_perror
980 ("unsupported transport domain for mteTriggerEntry");
981 return;
983 if (tmpoid != NULL) {
984 free(tmpoid);
988 * can be NULL? Yes.
990 line = read_config_read_data(ASN_OCTET_STR, line,
991 &(StorageTmp->pdu_transport),
992 &StorageTmp->pdu_transportLen);
994 line =
995 read_config_read_data(ASN_OCTET_STR, line,
996 &StorageTmp->pdu_community,
997 &StorageTmp->pdu_community_len);
998 if (StorageTmp->pdu_community == NULL) {
999 config_perror("invalid specification for pdu_community");
1000 return;
1002 line =
1003 read_config_read_data(ASN_OCTET_STR, line,
1004 &StorageTmp->pdu_securityName,
1005 &StorageTmp->pdu_securityNameLen);
1006 if (StorageTmp->pdu_securityName == NULL) {
1007 config_perror("invalid specification for pdu_securityName");
1008 return;
1011 StorageTmp->storageType = ST_NONVOLATILE; /* the only type stored */
1013 mteTriggerTable_add(StorageTmp);
1016 * technically this is too early
1018 if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
1019 StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
1020 mte_enable_trigger(StorageTmp);
1022 DEBUGMSGTL(("mteTriggerTable", "done.\n"));
1029 * store_mteTriggerTable():
1030 * stores .conf file entries needed to configure the mib.
1033 store_mteTriggerTable(int majorID, int minorID, void *serverarg,
1034 void *clientarg)
1036 char line[SNMP_MAXBUF];
1037 char *cptr;
1038 size_t tmpint;
1039 struct mteTriggerTable_data *StorageTmp;
1040 struct header_complex_index *hcindex;
1042 DEBUGMSGTL(("mteTriggerTable", "storing data... "));
1044 for (hcindex = mteTriggerTableStorage; hcindex != NULL;
1045 hcindex = hcindex->next) {
1046 StorageTmp = (struct mteTriggerTable_data *) hcindex->data;
1049 if (StorageTmp->storageType == ST_NONVOLATILE) {
1051 memset(line, 0, sizeof(line));
1052 strcat(line, "mteTriggerTable ");
1053 cptr = line + strlen(line);
1055 cptr =
1056 read_config_store_data(ASN_OCTET_STR, cptr,
1057 &StorageTmp->mteOwner,
1058 &StorageTmp->mteOwnerLen);
1059 cptr =
1060 read_config_store_data(ASN_OCTET_STR, cptr,
1061 &StorageTmp->mteTriggerName,
1062 &StorageTmp->mteTriggerNameLen);
1063 cptr =
1064 read_config_store_data(ASN_OCTET_STR, cptr,
1065 &StorageTmp->mteTriggerComment,
1066 &StorageTmp->mteTriggerCommentLen);
1067 cptr =
1068 read_config_store_data(ASN_OCTET_STR, cptr,
1069 &StorageTmp->mteTriggerTest,
1070 &StorageTmp->mteTriggerTestLen);
1071 cptr =
1072 read_config_store_data(ASN_INTEGER, cptr,
1073 &StorageTmp->mteTriggerSampleType,
1074 &tmpint);
1075 cptr =
1076 read_config_store_data(ASN_OBJECT_ID, cptr,
1077 &StorageTmp->mteTriggerValueID,
1078 &StorageTmp->mteTriggerValueIDLen);
1079 cptr =
1080 read_config_store_data(ASN_INTEGER, cptr,
1081 &StorageTmp->
1082 mteTriggerValueIDWildcard, &tmpint);
1083 cptr =
1084 read_config_store_data(ASN_OCTET_STR, cptr,
1085 &StorageTmp->mteTriggerTargetTag,
1086 &StorageTmp->
1087 mteTriggerTargetTagLen);
1088 cptr =
1089 read_config_store_data(ASN_OCTET_STR, cptr,
1090 &StorageTmp->mteTriggerContextName,
1091 &StorageTmp->
1092 mteTriggerContextNameLen);
1093 cptr =
1094 read_config_store_data(ASN_INTEGER, cptr,
1095 &StorageTmp->
1096 mteTriggerContextNameWildcard,
1097 &tmpint);
1098 cptr =
1099 read_config_store_data(ASN_UNSIGNED, cptr,
1100 &StorageTmp->mteTriggerFrequency,
1101 &tmpint);
1102 cptr =
1103 read_config_store_data(ASN_OCTET_STR, cptr,
1104 &StorageTmp->mteTriggerObjectsOwner,
1105 &StorageTmp->
1106 mteTriggerObjectsOwnerLen);
1107 cptr =
1108 read_config_store_data(ASN_OCTET_STR, cptr,
1109 &StorageTmp->mteTriggerObjects,
1110 &StorageTmp->mteTriggerObjectsLen);
1111 cptr =
1112 read_config_store_data(ASN_INTEGER, cptr,
1113 &StorageTmp->mteTriggerEnabled,
1114 &tmpint);
1115 cptr =
1116 read_config_store_data(ASN_INTEGER, cptr,
1117 &StorageTmp->mteTriggerEntryStatus,
1118 &tmpint);
1121 * delta table
1123 cptr =
1124 read_config_store_data(ASN_OBJECT_ID, cptr,
1125 &StorageTmp->
1126 mteTriggerDeltaDiscontinuityID,
1127 &StorageTmp->
1128 mteTriggerDeltaDiscontinuityIDLen);
1129 cptr =
1130 read_config_store_data(ASN_INTEGER, cptr,
1131 &StorageTmp->
1132 mteTriggerDeltaDiscontinuityIDWildcard,
1133 &tmpint);
1134 cptr =
1135 read_config_store_data(ASN_INTEGER, cptr,
1136 &StorageTmp->
1137 mteTriggerDeltaDiscontinuityIDType,
1138 &tmpint);
1141 * existence table
1143 cptr =
1144 read_config_store_data(ASN_OCTET_STR, cptr,
1145 &StorageTmp->
1146 mteTriggerExistenceTest,
1147 &StorageTmp->
1148 mteTriggerExistenceTestLen);
1149 cptr =
1150 read_config_store_data(ASN_OCTET_STR, cptr,
1151 &StorageTmp->
1152 mteTriggerExistenceStartup,
1153 &StorageTmp->
1154 mteTriggerExistenceStartupLen);
1155 cptr =
1156 read_config_store_data(ASN_OCTET_STR, cptr,
1157 &StorageTmp->
1158 mteTriggerExistenceObjectsOwner,
1159 &StorageTmp->
1160 mteTriggerExistenceObjectsOwnerLen);
1161 cptr =
1162 read_config_store_data(ASN_OCTET_STR, cptr,
1163 &StorageTmp->
1164 mteTriggerExistenceObjects,
1165 &StorageTmp->
1166 mteTriggerExistenceObjectsLen);
1167 cptr =
1168 read_config_store_data(ASN_OCTET_STR, cptr,
1169 &StorageTmp->
1170 mteTriggerExistenceEventOwner,
1171 &StorageTmp->
1172 mteTriggerExistenceEventOwnerLen);
1173 cptr =
1174 read_config_store_data(ASN_OCTET_STR, cptr,
1175 &StorageTmp->
1176 mteTriggerExistenceEvent,
1177 &StorageTmp->
1178 mteTriggerExistenceEventLen);
1181 * boolean table
1183 cptr =
1184 read_config_store_data(ASN_INTEGER, cptr,
1185 &StorageTmp->
1186 mteTriggerBooleanComparison,
1187 &tmpint);
1188 cptr =
1189 read_config_store_data(ASN_INTEGER, cptr,
1190 &StorageTmp->mteTriggerBooleanValue,
1191 &tmpint);
1192 cptr =
1193 read_config_store_data(ASN_INTEGER, cptr,
1194 &StorageTmp->
1195 mteTriggerBooleanStartup, &tmpint);
1196 cptr =
1197 read_config_store_data(ASN_OCTET_STR, cptr,
1198 &StorageTmp->
1199 mteTriggerBooleanObjectsOwner,
1200 &StorageTmp->
1201 mteTriggerBooleanObjectsOwnerLen);
1202 cptr =
1203 read_config_store_data(ASN_OCTET_STR, cptr,
1204 &StorageTmp->
1205 mteTriggerBooleanObjects,
1206 &StorageTmp->
1207 mteTriggerBooleanObjectsLen);
1208 cptr =
1209 read_config_store_data(ASN_OCTET_STR, cptr,
1210 &StorageTmp->
1211 mteTriggerBooleanEventOwner,
1212 &StorageTmp->
1213 mteTriggerBooleanEventOwnerLen);
1214 cptr =
1215 read_config_store_data(ASN_OCTET_STR, cptr,
1216 &StorageTmp->mteTriggerBooleanEvent,
1217 &StorageTmp->
1218 mteTriggerBooleanEventLen);
1221 * threshold table
1223 cptr =
1224 read_config_store_data(ASN_INTEGER, cptr,
1225 &StorageTmp->
1226 mteTriggerThresholdStartup,
1227 &tmpint);
1228 cptr =
1229 read_config_store_data(ASN_INTEGER, cptr,
1230 &StorageTmp->
1231 mteTriggerThresholdRising, &tmpint);
1232 cptr =
1233 read_config_store_data(ASN_INTEGER, cptr,
1234 &StorageTmp->
1235 mteTriggerThresholdFalling,
1236 &tmpint);
1237 cptr =
1238 read_config_store_data(ASN_INTEGER, cptr,
1239 &StorageTmp->
1240 mteTriggerThresholdDeltaRising,
1241 &tmpint);
1242 cptr =
1243 read_config_store_data(ASN_INTEGER, cptr,
1244 &StorageTmp->
1245 mteTriggerThresholdDeltaFalling,
1246 &tmpint);
1247 cptr =
1248 read_config_store_data(ASN_OCTET_STR, cptr,
1249 &StorageTmp->
1250 mteTriggerThresholdObjectsOwner,
1251 &StorageTmp->
1252 mteTriggerThresholdObjectsOwnerLen);
1253 cptr =
1254 read_config_store_data(ASN_OCTET_STR, cptr,
1255 &StorageTmp->
1256 mteTriggerThresholdObjects,
1257 &StorageTmp->
1258 mteTriggerThresholdObjectsLen);
1259 cptr =
1260 read_config_store_data(ASN_OCTET_STR, cptr,
1261 &StorageTmp->
1262 mteTriggerThresholdRisingEventOwner,
1263 &StorageTmp->
1264 mteTriggerThresholdRisingEventOwnerLen);
1265 cptr =
1266 read_config_store_data(ASN_OCTET_STR, cptr,
1267 &StorageTmp->
1268 mteTriggerThresholdRisingEvent,
1269 &StorageTmp->
1270 mteTriggerThresholdRisingEventLen);
1271 cptr =
1272 read_config_store_data(ASN_OCTET_STR, cptr,
1273 &StorageTmp->
1274 mteTriggerThresholdFallingEventOwner,
1275 &StorageTmp->
1276 mteTriggerThresholdFallingEventOwnerLen);
1277 cptr =
1278 read_config_store_data(ASN_OCTET_STR, cptr,
1279 &StorageTmp->
1280 mteTriggerThresholdFallingEvent,
1281 &StorageTmp->
1282 mteTriggerThresholdFallingEventLen);
1283 cptr =
1284 read_config_store_data(ASN_OCTET_STR, cptr,
1285 &StorageTmp->
1286 mteTriggerThresholdDeltaRisingEventOwner,
1287 &StorageTmp->
1288 mteTriggerThresholdDeltaRisingEventOwnerLen);
1289 cptr =
1290 read_config_store_data(ASN_OCTET_STR, cptr,
1291 &StorageTmp->
1292 mteTriggerThresholdDeltaRisingEvent,
1293 &StorageTmp->
1294 mteTriggerThresholdDeltaRisingEventLen);
1295 cptr =
1296 read_config_store_data(ASN_OCTET_STR, cptr,
1297 &StorageTmp->
1298 mteTriggerThresholdDeltaFallingEventOwner,
1299 &StorageTmp->
1300 mteTriggerThresholdDeltaFallingEventOwnerLen);
1301 cptr =
1302 read_config_store_data(ASN_OCTET_STR, cptr,
1303 &StorageTmp->
1304 mteTriggerThresholdDeltaFallingEvent,
1305 &StorageTmp->
1306 mteTriggerThresholdDeltaFallingEventLen);
1309 * local internal variables
1311 cptr =
1312 read_config_store_data(ASN_INTEGER, cptr,
1313 &StorageTmp->have_copied_auth_info,
1314 &tmpint);
1315 if (StorageTmp->have_copied_auth_info) {
1316 cptr =
1317 read_config_store_data(ASN_INTEGER, cptr,
1318 &StorageTmp->pdu_version,
1319 &tmpint);
1320 cptr =
1321 read_config_store_data(ASN_INTEGER, cptr,
1322 &StorageTmp->pdu_securityModel,
1323 &tmpint);
1324 cptr =
1325 read_config_store_data(ASN_INTEGER, cptr,
1326 &StorageTmp->pdu_securityLevel,
1327 &tmpint);
1328 cptr =
1329 read_config_store_data(ASN_OBJECT_ID, cptr,
1330 &StorageTmp->pdu_tDomain,
1331 &StorageTmp->pdu_tDomainLen);
1332 cptr =
1333 read_config_store_data(ASN_OCTET_STR, cptr,
1334 &StorageTmp->pdu_transport,
1335 &StorageTmp->pdu_transportLen);
1336 cptr =
1337 read_config_store_data(ASN_OCTET_STR, cptr,
1338 &StorageTmp->pdu_community,
1339 &StorageTmp->pdu_community_len);
1340 cptr =
1341 read_config_store_data(ASN_OCTET_STR, cptr,
1342 &StorageTmp->pdu_securityName,
1343 &StorageTmp->
1344 pdu_securityNameLen);
1347 snmpd_store_config(line);
1350 DEBUGMSGTL(("mteTriggerTable", "done.\n"));
1351 return SNMPERR_SUCCESS;
1358 * var_mteTriggerTable():
1359 * Handle this table separately from the scalar value case.
1360 * The workings of this are basically the same as for var_mteTriggerTable above.
1362 unsigned char *
1363 var_mteTriggerTable(struct variable *vp,
1364 oid * name,
1365 size_t * length,
1366 int exact,
1367 size_t * var_len, WriteMethod ** write_method)
1371 struct mteTriggerTable_data *StorageTmp = NULL;
1374 DEBUGMSGTL(("mteTriggerTable",
1375 "var_mteTriggerTable: Entering... \n"));
1377 * this assumes you have registered all your data properly
1379 if ((StorageTmp =
1380 header_complex(mteTriggerTableStorage, vp, name, length, exact,
1381 var_len, write_method)) == NULL) {
1382 if (vp->magic == MTETRIGGERENTRYSTATUS)
1383 *write_method = write_mteTriggerEntryStatus;
1384 return NULL;
1389 * this is where we do the value assignments for the mib results.
1391 switch (vp->magic) {
1394 case MTETRIGGERCOMMENT:
1395 *write_method = write_mteTriggerComment;
1396 *var_len = StorageTmp->mteTriggerCommentLen;
1397 return (u_char *) StorageTmp->mteTriggerComment;
1399 case MTETRIGGERTEST:
1400 *write_method = write_mteTriggerTest;
1401 *var_len = StorageTmp->mteTriggerTestLen;
1402 return (u_char *) StorageTmp->mteTriggerTest;
1404 case MTETRIGGERSAMPLETYPE:
1405 *write_method = write_mteTriggerSampleType;
1406 *var_len = sizeof(StorageTmp->mteTriggerSampleType);
1407 return (u_char *) & StorageTmp->mteTriggerSampleType;
1409 case MTETRIGGERVALUEID:
1410 *write_method = write_mteTriggerValueID;
1411 *var_len = StorageTmp->mteTriggerValueIDLen * sizeof(oid);
1412 return (u_char *) StorageTmp->mteTriggerValueID;
1414 case MTETRIGGERVALUEIDWILDCARD:
1415 *write_method = write_mteTriggerValueIDWildcard;
1416 *var_len = sizeof(StorageTmp->mteTriggerValueIDWildcard);
1417 return (u_char *) & StorageTmp->mteTriggerValueIDWildcard;
1419 case MTETRIGGERTARGETTAG:
1420 *write_method = write_mteTriggerTargetTag;
1421 *var_len = StorageTmp->mteTriggerTargetTagLen;
1422 return (u_char *) StorageTmp->mteTriggerTargetTag;
1424 case MTETRIGGERCONTEXTNAME:
1425 *write_method = write_mteTriggerContextName;
1426 *var_len = StorageTmp->mteTriggerContextNameLen;
1427 return (u_char *) StorageTmp->mteTriggerContextName;
1429 case MTETRIGGERCONTEXTNAMEWILDCARD:
1430 *write_method = write_mteTriggerContextNameWildcard;
1431 *var_len = sizeof(StorageTmp->mteTriggerContextNameWildcard);
1432 return (u_char *) & StorageTmp->mteTriggerContextNameWildcard;
1434 case MTETRIGGERFREQUENCY:
1435 *write_method = write_mteTriggerFrequency;
1436 *var_len = sizeof(StorageTmp->mteTriggerFrequency);
1437 return (u_char *) & StorageTmp->mteTriggerFrequency;
1439 case MTETRIGGEROBJECTSOWNER:
1440 *write_method = write_mteTriggerObjectsOwner;
1441 *var_len = StorageTmp->mteTriggerObjectsOwnerLen;
1442 return (u_char *) StorageTmp->mteTriggerObjectsOwner;
1444 case MTETRIGGEROBJECTS:
1445 *write_method = write_mteTriggerObjects;
1446 *var_len = StorageTmp->mteTriggerObjectsLen;
1447 return (u_char *) StorageTmp->mteTriggerObjects;
1449 case MTETRIGGERENABLED:
1450 *write_method = write_mteTriggerEnabled;
1451 *var_len = sizeof(StorageTmp->mteTriggerEnabled);
1452 return (u_char *) & StorageTmp->mteTriggerEnabled;
1454 case MTETRIGGERENTRYSTATUS:
1455 *write_method = write_mteTriggerEntryStatus;
1456 *var_len = sizeof(StorageTmp->mteTriggerEntryStatus);
1457 return (u_char *) & StorageTmp->mteTriggerEntryStatus;
1460 default:
1461 ERROR_MSG("");
1463 return NULL;
1470 write_mteTriggerComment(int action,
1471 u_char * var_val,
1472 u_char var_val_type,
1473 size_t var_val_len,
1474 u_char * statP, oid * name, size_t name_len)
1476 static char *tmpvar;
1477 struct mteTriggerTable_data *StorageTmp = NULL;
1478 static size_t tmplen;
1479 size_t newlen =
1480 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1481 3 - 1);
1484 DEBUGMSGTL(("mteTriggerTable",
1485 "write_mteTriggerComment entering action=%d... \n",
1486 action));
1487 if ((StorageTmp =
1488 header_complex(mteTriggerTableStorage, NULL,
1489 &name[sizeof(mteTriggerTable_variables_oid) /
1490 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1491 NULL)) == NULL)
1492 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1495 switch (action) {
1496 case RESERVE1:
1497 if (var_val_type != ASN_OCTET_STR) {
1498 snmp_log(LOG_ERR,
1499 "write to mteTriggerComment not ASN_OCTET_STR\n");
1500 return SNMP_ERR_WRONGTYPE;
1502 if (StorageTmp->storageType != ST_NONVOLATILE)
1503 return SNMP_ERR_NOTWRITABLE;
1505 break;
1508 case RESERVE2:
1510 * memory reseveration, final preparation...
1512 break;
1515 case FREE:
1517 * Release any resources that have been allocated
1519 break;
1522 case ACTION:
1524 * The variable has been stored in string for
1525 * you to use, and you have just been asked to do something with
1526 * it. Note that anything done here must be reversable in the UNDO case
1528 tmpvar = StorageTmp->mteTriggerComment;
1529 tmplen = StorageTmp->mteTriggerCommentLen;
1530 memdup((u_char **) & StorageTmp->mteTriggerComment, var_val,
1531 var_val_len);
1532 StorageTmp->mteTriggerCommentLen = var_val_len;
1533 break;
1536 case UNDO:
1538 * Back out any changes made in the ACTION case
1540 SNMP_FREE(StorageTmp->mteTriggerComment);
1541 StorageTmp->mteTriggerComment = tmpvar;
1542 StorageTmp->mteTriggerCommentLen = tmplen;
1543 break;
1546 case COMMIT:
1548 * Things are working well, so it's now safe to make the change
1549 * permanently. Make sure that anything done here can't fail!
1551 SNMP_FREE(tmpvar);
1552 break;
1554 return SNMP_ERR_NOERROR;
1560 write_mteTriggerTest(int action,
1561 u_char * var_val,
1562 u_char var_val_type,
1563 size_t var_val_len,
1564 u_char * statP, oid * name, size_t name_len)
1566 static char *tmpvar;
1567 struct mteTriggerTable_data *StorageTmp = NULL;
1568 static size_t tmplen;
1569 size_t newlen =
1570 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1571 3 - 1);
1574 DEBUGMSGTL(("mteTriggerTable",
1575 "write_mteTriggerTest entering action=%d... \n", action));
1576 if ((StorageTmp =
1577 header_complex(mteTriggerTableStorage, NULL,
1578 &name[sizeof(mteTriggerTable_variables_oid) /
1579 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1580 NULL)) == NULL)
1581 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1584 switch (action) {
1585 case RESERVE1:
1586 if (var_val_type != ASN_OCTET_STR) {
1587 snmp_log(LOG_ERR, "write to mteTriggerTest not ASN_OCTET_STR\n");
1588 return SNMP_ERR_WRONGTYPE;
1590 if (StorageTmp->storageType != ST_NONVOLATILE)
1591 return SNMP_ERR_NOTWRITABLE;
1592 break;
1595 case RESERVE2:
1597 * memory reseveration, final preparation...
1599 break;
1602 case FREE:
1604 * Release any resources that have been allocated
1606 break;
1609 case ACTION:
1611 * The variable has been stored in string for
1612 * you to use, and you have just been asked to do something with
1613 * it. Note that anything done here must be reversable in the UNDO case
1615 tmpvar = StorageTmp->mteTriggerTest;
1616 tmplen = StorageTmp->mteTriggerTestLen;
1617 memdup((u_char **) & StorageTmp->mteTriggerTest, var_val,
1618 var_val_len);
1619 StorageTmp->mteTriggerTestLen = var_val_len;
1620 break;
1623 case UNDO:
1625 * Back out any changes made in the ACTION case
1627 SNMP_FREE(StorageTmp->mteTriggerTest);
1628 StorageTmp->mteTriggerTest = tmpvar;
1629 StorageTmp->mteTriggerTestLen = tmplen;
1630 break;
1633 case COMMIT:
1635 * Things are working well, so it's now safe to make the change
1636 * permanently. Make sure that anything done here can't fail!
1638 SNMP_FREE(tmpvar);
1639 break;
1641 return SNMP_ERR_NOERROR;
1647 write_mteTriggerSampleType(int action,
1648 u_char * var_val,
1649 u_char var_val_type,
1650 size_t var_val_len,
1651 u_char * statP, oid * name, size_t name_len)
1653 static int tmpvar;
1654 struct mteTriggerTable_data *StorageTmp = NULL;
1655 size_t newlen =
1656 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1657 3 - 1);
1660 DEBUGMSGTL(("mteTriggerTable",
1661 "write_mteTriggerSampleType entering action=%d... \n",
1662 action));
1663 if ((StorageTmp =
1664 header_complex(mteTriggerTableStorage, NULL,
1665 &name[sizeof(mteTriggerTable_variables_oid) /
1666 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1667 NULL)) == NULL)
1668 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1671 switch (action) {
1672 case RESERVE1:
1673 if (var_val_type != ASN_INTEGER) {
1674 snmp_log(LOG_ERR,
1675 "write to mteTriggerSampleType not ASN_INTEGER\n");
1676 return SNMP_ERR_WRONGTYPE;
1678 if (StorageTmp->storageType != ST_NONVOLATILE)
1679 return SNMP_ERR_NOTWRITABLE;
1680 break;
1683 case RESERVE2:
1685 * memory reseveration, final preparation...
1687 break;
1690 case FREE:
1692 * Release any resources that have been allocated
1694 break;
1697 case ACTION:
1699 * The variable has been stored in long_ret for
1700 * you to use, and you have just been asked to do something with
1701 * it. Note that anything done here must be reversable in the UNDO case
1703 tmpvar = StorageTmp->mteTriggerSampleType;
1704 StorageTmp->mteTriggerSampleType = *((long *) var_val);
1705 break;
1708 case UNDO:
1710 * Back out any changes made in the ACTION case
1712 StorageTmp->mteTriggerSampleType = tmpvar;
1713 break;
1716 case COMMIT:
1718 * Things are working well, so it's now safe to make the change
1719 * permanently. Make sure that anything done here can't fail!
1722 break;
1724 return SNMP_ERR_NOERROR;
1730 write_mteTriggerValueID(int action,
1731 u_char * var_val,
1732 u_char var_val_type,
1733 size_t var_val_len,
1734 u_char * statP, oid * name, size_t name_len)
1736 static oid *tmpvar;
1737 struct mteTriggerTable_data *StorageTmp = NULL;
1738 static size_t tmplen;
1739 size_t newlen =
1740 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1741 3 - 1);
1744 DEBUGMSGTL(("mteTriggerTable",
1745 "write_mteTriggerValueID entering action=%d... \n",
1746 action));
1747 if ((StorageTmp =
1748 header_complex(mteTriggerTableStorage, NULL,
1749 &name[sizeof(mteTriggerTable_variables_oid) /
1750 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1751 NULL)) == NULL)
1752 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1755 switch (action) {
1756 case RESERVE1:
1757 if (var_val_type != ASN_OBJECT_ID) {
1758 snmp_log(LOG_ERR,
1759 "write to mteTriggerValueID not ASN_OBJECT_ID\n");
1760 return SNMP_ERR_WRONGTYPE;
1762 if (StorageTmp->storageType != ST_NONVOLATILE)
1763 return SNMP_ERR_NOTWRITABLE;
1764 break;
1767 case RESERVE2:
1769 * memory reseveration, final preparation...
1771 break;
1774 case FREE:
1776 * Release any resources that have been allocated
1778 break;
1781 case ACTION:
1783 * The variable has been stored in objid for
1784 * you to use, and you have just been asked to do something with
1785 * it. Note that anything done here must be reversable in the UNDO case
1787 tmpvar = StorageTmp->mteTriggerValueID;
1788 tmplen = StorageTmp->mteTriggerValueIDLen;
1789 memdup((u_char **) & StorageTmp->mteTriggerValueID, var_val,
1790 var_val_len);
1791 StorageTmp->mteTriggerValueIDLen = var_val_len / sizeof(oid);
1792 break;
1795 case UNDO:
1797 * Back out any changes made in the ACTION case
1799 SNMP_FREE(StorageTmp->mteTriggerValueID);
1800 StorageTmp->mteTriggerValueID = tmpvar;
1801 StorageTmp->mteTriggerValueIDLen = tmplen;
1802 break;
1805 case COMMIT:
1807 * Things are working well, so it's now safe to make the change
1808 * permanently. Make sure that anything done here can't fail!
1812 * XXX: if the valueID has actually changed, shouldn't we dump any
1813 * previous values, as these are from a different object?
1815 SNMP_FREE(tmpvar);
1816 break;
1818 return SNMP_ERR_NOERROR;
1824 write_mteTriggerValueIDWildcard(int action,
1825 u_char * var_val,
1826 u_char var_val_type,
1827 size_t var_val_len,
1828 u_char * statP,
1829 oid * name, size_t name_len)
1831 static int tmpvar;
1832 struct mteTriggerTable_data *StorageTmp = NULL;
1833 size_t newlen =
1834 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1835 3 - 1);
1838 DEBUGMSGTL(("mteTriggerTable",
1839 "write_mteTriggerValueIDWildcard entering action=%d... \n",
1840 action));
1841 if ((StorageTmp =
1842 header_complex(mteTriggerTableStorage, NULL,
1843 &name[sizeof(mteTriggerTable_variables_oid) /
1844 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1845 NULL)) == NULL)
1846 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1849 switch (action) {
1850 case RESERVE1:
1851 if (var_val_type != ASN_INTEGER) {
1852 snmp_log(LOG_ERR,
1853 "write to mteTriggerValueIDWildcard not ASN_INTEGER\n");
1854 return SNMP_ERR_WRONGTYPE;
1856 if (StorageTmp->storageType != ST_NONVOLATILE)
1857 return SNMP_ERR_NOTWRITABLE;
1858 break;
1861 case RESERVE2:
1863 * memory reseveration, final preparation...
1865 break;
1868 case FREE:
1870 * Release any resources that have been allocated
1872 break;
1875 case ACTION:
1877 * The variable has been stored in long_ret for
1878 * you to use, and you have just been asked to do something with
1879 * it. Note that anything done here must be reversable in the UNDO case
1881 tmpvar = StorageTmp->mteTriggerValueIDWildcard;
1882 StorageTmp->mteTriggerValueIDWildcard = *((long *) var_val);
1883 break;
1886 case UNDO:
1888 * Back out any changes made in the ACTION case
1890 StorageTmp->mteTriggerValueIDWildcard = tmpvar;
1891 break;
1894 case COMMIT:
1896 * Things are working well, so it's now safe to make the change
1897 * permanently. Make sure that anything done here can't fail!
1900 break;
1902 return SNMP_ERR_NOERROR;
1908 write_mteTriggerTargetTag(int action,
1909 u_char * var_val,
1910 u_char var_val_type,
1911 size_t var_val_len,
1912 u_char * statP, oid * name, size_t name_len)
1914 static char *tmpvar;
1915 struct mteTriggerTable_data *StorageTmp = NULL;
1916 static size_t tmplen;
1917 size_t newlen =
1918 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1919 3 - 1);
1922 DEBUGMSGTL(("mteTriggerTable",
1923 "write_mteTriggerTargetTag entering action=%d... \n",
1924 action));
1925 if ((StorageTmp =
1926 header_complex(mteTriggerTableStorage, NULL,
1927 &name[sizeof(mteTriggerTable_variables_oid) /
1928 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1929 NULL)) == NULL)
1930 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1933 switch (action) {
1934 case RESERVE1:
1935 if (var_val_type != ASN_OCTET_STR) {
1936 snmp_log(LOG_ERR,
1937 "write to mteTriggerTargetTag not ASN_OCTET_STR\n");
1938 return SNMP_ERR_WRONGTYPE;
1940 if (StorageTmp->storageType != ST_NONVOLATILE)
1941 return SNMP_ERR_NOTWRITABLE;
1942 break;
1945 case RESERVE2:
1947 * memory reseveration, final preparation...
1949 break;
1952 case FREE:
1954 * Release any resources that have been allocated
1956 break;
1959 case ACTION:
1961 * The variable has been stored in string for
1962 * you to use, and you have just been asked to do something with
1963 * it. Note that anything done here must be reversable in the UNDO case
1965 tmpvar = StorageTmp->mteTriggerTargetTag;
1966 tmplen = StorageTmp->mteTriggerTargetTagLen;
1967 memdup((u_char **) & StorageTmp->mteTriggerTargetTag, var_val,
1968 var_val_len);
1969 StorageTmp->mteTriggerTargetTagLen = var_val_len;
1970 break;
1973 case UNDO:
1975 * Back out any changes made in the ACTION case
1977 SNMP_FREE(StorageTmp->mteTriggerTargetTag);
1978 StorageTmp->mteTriggerTargetTag = tmpvar;
1979 StorageTmp->mteTriggerTargetTagLen = tmplen;
1980 break;
1983 case COMMIT:
1985 * Things are working well, so it's now safe to make the change
1986 * permanently. Make sure that anything done here can't fail!
1988 SNMP_FREE(tmpvar);
1989 break;
1991 return SNMP_ERR_NOERROR;
1997 write_mteTriggerContextName(int action,
1998 u_char * var_val,
1999 u_char var_val_type,
2000 size_t var_val_len,
2001 u_char * statP, oid * name, size_t name_len)
2003 static char *tmpvar;
2004 struct mteTriggerTable_data *StorageTmp = NULL;
2005 static size_t tmplen;
2006 size_t newlen =
2007 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2008 3 - 1);
2011 DEBUGMSGTL(("mteTriggerTable",
2012 "write_mteTriggerContextName entering action=%d... \n",
2013 action));
2014 if ((StorageTmp =
2015 header_complex(mteTriggerTableStorage, NULL,
2016 &name[sizeof(mteTriggerTable_variables_oid) /
2017 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2018 NULL)) == NULL)
2019 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2022 switch (action) {
2023 case RESERVE1:
2024 if (var_val_type != ASN_OCTET_STR) {
2025 snmp_log(LOG_ERR,
2026 "write to mteTriggerContextName not ASN_OCTET_STR\n");
2027 return SNMP_ERR_WRONGTYPE;
2029 if (StorageTmp->storageType != ST_NONVOLATILE)
2030 return SNMP_ERR_NOTWRITABLE;
2031 break;
2034 case RESERVE2:
2036 * memory reseveration, final preparation...
2038 break;
2041 case FREE:
2043 * Release any resources that have been allocated
2045 break;
2048 case ACTION:
2050 * The variable has been stored in string for
2051 * you to use, and you have just been asked to do something with
2052 * it. Note that anything done here must be reversable in the UNDO case
2054 tmpvar = StorageTmp->mteTriggerContextName;
2055 tmplen = StorageTmp->mteTriggerContextNameLen;
2056 memdup((u_char **) & StorageTmp->mteTriggerContextName, var_val,
2057 var_val_len);
2058 StorageTmp->mteTriggerContextNameLen = var_val_len;
2059 break;
2062 case UNDO:
2064 * Back out any changes made in the ACTION case
2066 SNMP_FREE(StorageTmp->mteTriggerContextName);
2067 StorageTmp->mteTriggerContextName = tmpvar;
2068 StorageTmp->mteTriggerContextNameLen = tmplen;
2069 break;
2072 case COMMIT:
2074 * Things are working well, so it's now safe to make the change
2075 * permanently. Make sure that anything done here can't fail!
2077 SNMP_FREE(tmpvar);
2078 break;
2080 return SNMP_ERR_NOERROR;
2086 write_mteTriggerContextNameWildcard(int action,
2087 u_char * var_val,
2088 u_char var_val_type,
2089 size_t var_val_len,
2090 u_char * statP,
2091 oid * name, size_t name_len)
2093 static int tmpvar;
2094 struct mteTriggerTable_data *StorageTmp = NULL;
2095 size_t newlen =
2096 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2097 3 - 1);
2100 DEBUGMSGTL(("mteTriggerTable",
2101 "write_mteTriggerContextNameWildcard entering action=%d... \n",
2102 action));
2103 if ((StorageTmp =
2104 header_complex(mteTriggerTableStorage, NULL,
2105 &name[sizeof(mteTriggerTable_variables_oid) /
2106 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2107 NULL)) == NULL)
2108 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2111 switch (action) {
2112 case RESERVE1:
2113 if (var_val_type != ASN_INTEGER) {
2114 snmp_log(LOG_ERR,
2115 "write to mteTriggerContextNameWildcard not ASN_INTEGER\n");
2116 return SNMP_ERR_WRONGTYPE;
2118 if (StorageTmp->storageType != ST_NONVOLATILE)
2119 return SNMP_ERR_NOTWRITABLE;
2120 break;
2123 case RESERVE2:
2125 * memory reseveration, final preparation...
2127 break;
2130 case FREE:
2132 * Release any resources that have been allocated
2134 break;
2137 case ACTION:
2139 * The variable has been stored in long_ret for
2140 * you to use, and you have just been asked to do something with
2141 * it. Note that anything done here must be reversable in the UNDO case
2143 tmpvar = StorageTmp->mteTriggerContextNameWildcard;
2144 StorageTmp->mteTriggerContextNameWildcard = *((long *) var_val);
2145 break;
2148 case UNDO:
2150 * Back out any changes made in the ACTION case
2152 StorageTmp->mteTriggerContextNameWildcard = tmpvar;
2153 break;
2156 case COMMIT:
2158 * Things are working well, so it's now safe to make the change
2159 * permanently. Make sure that anything done here can't fail!
2162 break;
2164 return SNMP_ERR_NOERROR;
2170 write_mteTriggerFrequency(int action,
2171 u_char * var_val,
2172 u_char var_val_type,
2173 size_t var_val_len,
2174 u_char * statP, oid * name, size_t name_len)
2176 static int tmpvar;
2177 struct mteTriggerTable_data *StorageTmp = NULL;
2178 size_t newlen =
2179 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2180 3 - 1);
2183 DEBUGMSGTL(("mteTriggerTable",
2184 "write_mteTriggerFrequency entering action=%d... \n",
2185 action));
2186 if ((StorageTmp =
2187 header_complex(mteTriggerTableStorage, NULL,
2188 &name[sizeof(mteTriggerTable_variables_oid) /
2189 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2190 NULL)) == NULL)
2191 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2194 switch (action) {
2195 case RESERVE1:
2196 if (var_val_type != ASN_UNSIGNED) {
2197 snmp_log(LOG_ERR,
2198 "write to mteTriggerFrequency not ASN_UNSIGNED\n");
2199 return SNMP_ERR_WRONGTYPE;
2201 if (StorageTmp->storageType != ST_NONVOLATILE)
2202 return SNMP_ERR_NOTWRITABLE;
2203 break;
2206 case RESERVE2:
2208 * memory reseveration, final preparation...
2210 break;
2213 case FREE:
2215 * Release any resources that have been allocated
2217 break;
2220 case ACTION:
2222 * The variable has been stored in ulong_ret for
2223 * you to use, and you have just been asked to do something with
2224 * it. Note that anything done here must be reversable in the UNDO case
2226 tmpvar = StorageTmp->mteTriggerFrequency;
2227 StorageTmp->mteTriggerFrequency = *((unsigned long *) var_val);
2228 break;
2231 case UNDO:
2233 * Back out any changes made in the ACTION case
2235 StorageTmp->mteTriggerFrequency = tmpvar;
2236 break;
2239 case COMMIT:
2241 * Things are working well, so it's now safe to make the change
2242 * permanently. Make sure that anything done here can't fail!
2244 if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
2245 StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
2246 mte_enable_trigger(StorageTmp);
2248 break;
2250 return SNMP_ERR_NOERROR;
2256 write_mteTriggerObjectsOwner(int action,
2257 u_char * var_val,
2258 u_char var_val_type,
2259 size_t var_val_len,
2260 u_char * statP, oid * name, size_t name_len)
2262 static char *tmpvar;
2263 struct mteTriggerTable_data *StorageTmp = NULL;
2264 static size_t tmplen;
2265 size_t newlen =
2266 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2267 3 - 1);
2270 DEBUGMSGTL(("mteTriggerTable",
2271 "write_mteTriggerObjectsOwner entering action=%d... \n",
2272 action));
2273 if ((StorageTmp =
2274 header_complex(mteTriggerTableStorage, NULL,
2275 &name[sizeof(mteTriggerTable_variables_oid) /
2276 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2277 NULL)) == NULL)
2278 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2281 switch (action) {
2282 case RESERVE1:
2283 if (var_val_type != ASN_OCTET_STR) {
2284 snmp_log(LOG_ERR,
2285 "write to mteTriggerObjectsOwner not ASN_OCTET_STR\n");
2286 return SNMP_ERR_WRONGTYPE;
2288 if (StorageTmp->storageType != ST_NONVOLATILE)
2289 return SNMP_ERR_NOTWRITABLE;
2290 break;
2293 case RESERVE2:
2295 * memory reseveration, final preparation...
2297 break;
2300 case FREE:
2302 * Release any resources that have been allocated
2304 break;
2307 case ACTION:
2309 * The variable has been stored in string for
2310 * you to use, and you have just been asked to do something with
2311 * it. Note that anything done here must be reversable in the UNDO case
2313 tmpvar = StorageTmp->mteTriggerObjectsOwner;
2314 tmplen = StorageTmp->mteTriggerObjectsOwnerLen;
2315 memdup((u_char **) & StorageTmp->mteTriggerObjectsOwner, var_val,
2316 var_val_len);
2317 StorageTmp->mteTriggerObjectsOwnerLen = var_val_len;
2318 break;
2321 case UNDO:
2323 * Back out any changes made in the ACTION case
2325 SNMP_FREE(StorageTmp->mteTriggerObjectsOwner);
2326 StorageTmp->mteTriggerObjectsOwner = tmpvar;
2327 StorageTmp->mteTriggerObjectsOwnerLen = tmplen;
2328 break;
2331 case COMMIT:
2333 * Things are working well, so it's now safe to make the change
2334 * permanently. Make sure that anything done here can't fail!
2336 SNMP_FREE(tmpvar);
2337 break;
2339 return SNMP_ERR_NOERROR;
2345 write_mteTriggerObjects(int action,
2346 u_char * var_val,
2347 u_char var_val_type,
2348 size_t var_val_len,
2349 u_char * statP, oid * name, size_t name_len)
2351 static char *tmpvar;
2352 struct mteTriggerTable_data *StorageTmp = NULL;
2353 static size_t tmplen;
2354 size_t newlen =
2355 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2356 3 - 1);
2359 DEBUGMSGTL(("mteTriggerTable",
2360 "write_mteTriggerObjects entering action=%d... \n",
2361 action));
2362 if ((StorageTmp =
2363 header_complex(mteTriggerTableStorage, NULL,
2364 &name[sizeof(mteTriggerTable_variables_oid) /
2365 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2366 NULL)) == NULL)
2367 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2370 switch (action) {
2371 case RESERVE1:
2372 if (var_val_type != ASN_OCTET_STR) {
2373 snmp_log(LOG_ERR,
2374 "write to mteTriggerObjects not ASN_OCTET_STR\n");
2375 return SNMP_ERR_WRONGTYPE;
2377 if (StorageTmp->storageType != ST_NONVOLATILE)
2378 return SNMP_ERR_NOTWRITABLE;
2379 break;
2382 case RESERVE2:
2384 * memory reseveration, final preparation...
2386 break;
2389 case FREE:
2391 * Release any resources that have been allocated
2393 break;
2396 case ACTION:
2398 * The variable has been stored in string for
2399 * you to use, and you have just been asked to do something with
2400 * it. Note that anything done here must be reversable in the UNDO case
2402 tmpvar = StorageTmp->mteTriggerObjects;
2403 tmplen = StorageTmp->mteTriggerObjectsLen;
2404 memdup((u_char **) & StorageTmp->mteTriggerObjects, var_val,
2405 var_val_len);
2406 StorageTmp->mteTriggerObjectsLen = var_val_len;
2407 break;
2410 case UNDO:
2412 * Back out any changes made in the ACTION case
2414 SNMP_FREE(StorageTmp->mteTriggerObjects);
2415 StorageTmp->mteTriggerObjects = tmpvar;
2416 StorageTmp->mteTriggerObjectsLen = tmplen;
2417 break;
2420 case COMMIT:
2422 * Things are working well, so it's now safe to make the change
2423 * permanently. Make sure that anything done here can't fail!
2425 SNMP_FREE(tmpvar);
2426 break;
2428 return SNMP_ERR_NOERROR;
2434 write_mteTriggerEnabled(int action,
2435 u_char * var_val,
2436 u_char var_val_type,
2437 size_t var_val_len,
2438 u_char * statP, oid * name, size_t name_len)
2440 static int tmpvar;
2441 struct mteTriggerTable_data *StorageTmp = NULL;
2442 size_t newlen =
2443 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2444 3 - 1);
2447 DEBUGMSGTL(("mteTriggerTable",
2448 "write_mteTriggerEnabled entering action=%d... \n",
2449 action));
2450 if ((StorageTmp =
2451 header_complex(mteTriggerTableStorage, NULL,
2452 &name[sizeof(mteTriggerTable_variables_oid) /
2453 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2454 NULL)) == NULL)
2455 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2458 switch (action) {
2459 case RESERVE1:
2460 if (var_val_type != ASN_INTEGER) {
2461 snmp_log(LOG_ERR,
2462 "write to mteTriggerEnabled not ASN_INTEGER\n");
2463 return SNMP_ERR_WRONGTYPE;
2465 if (StorageTmp->storageType != ST_NONVOLATILE)
2466 return SNMP_ERR_NOTWRITABLE;
2467 break;
2470 case RESERVE2:
2472 * memory reseveration, final preparation...
2474 break;
2477 case FREE:
2479 * Release any resources that have been allocated
2481 break;
2484 case ACTION:
2486 * The variable has been stored in long_ret for
2487 * you to use, and you have just been asked to do something with
2488 * it. Note that anything done here must be reversable in the UNDO case
2490 tmpvar = StorageTmp->mteTriggerEnabled;
2491 StorageTmp->mteTriggerEnabled = *((long *) var_val);
2492 break;
2495 case UNDO:
2497 * Back out any changes made in the ACTION case
2499 StorageTmp->mteTriggerEnabled = tmpvar;
2500 break;
2503 case COMMIT:
2505 * Things are working well, so it's now safe to make the change
2506 * permanently. Make sure that anything done here can't fail!
2508 if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
2509 StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
2510 mte_enable_trigger(StorageTmp);
2511 else if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_FALSE)
2512 mte_disable_trigger(StorageTmp);
2515 break;
2517 return SNMP_ERR_NOERROR;
2526 write_mteTriggerEntryStatus(int action,
2527 u_char * var_val,
2528 u_char var_val_type,
2529 size_t var_val_len,
2530 u_char * statP, oid * name, size_t name_len)
2532 struct mteTriggerTable_data *StorageTmp = NULL;
2533 static struct mteTriggerTable_data *StorageNew, *StorageDel;
2534 size_t newlen =
2535 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2536 3 - 1);
2537 static int old_value;
2538 int set_value;
2539 static netsnmp_variable_list *vars, *vp;
2540 struct header_complex_index *hciptr;
2542 StorageTmp =
2543 header_complex(mteTriggerTableStorage, NULL,
2544 &name[sizeof(mteTriggerTable_variables_oid) /
2545 sizeof(oid) + 3 - 1], &newlen, 1, NULL, NULL);
2550 if (var_val_type != ASN_INTEGER || var_val == NULL) {
2551 snmp_log(LOG_ERR,
2552 "write to mteTriggerEntryStatus not ASN_INTEGER\n");
2553 return SNMP_ERR_WRONGTYPE;
2555 set_value = *((long *) var_val);
2559 * check legal range, and notReady is reserved for us, not a user
2561 if (set_value < 1 || set_value > 6 || set_value == RS_NOTREADY)
2562 return SNMP_ERR_INCONSISTENTVALUE;
2565 switch (action) {
2566 case RESERVE1:
2568 * stage one: test validity
2570 if (StorageTmp == NULL) {
2572 * create the row now?
2577 * ditch illegal values now
2579 if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE)
2580 return SNMP_ERR_INCONSISTENTVALUE;
2584 * destroying a non-existent row is actually legal
2586 if (set_value == RS_DESTROY) {
2587 return SNMP_ERR_NOERROR;
2592 * illegal creation values
2594 if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE) {
2595 return SNMP_ERR_INCONSISTENTVALUE;
2597 } else {
2599 * row exists. Check for a valid state change
2601 if (set_value == RS_CREATEANDGO
2602 || set_value == RS_CREATEANDWAIT) {
2604 * can't create a row that exists
2606 return SNMP_ERR_INCONSISTENTVALUE;
2609 if (StorageTmp->mteTriggerEntryStatus == RS_ACTIVE &&
2610 set_value != RS_DESTROY) {
2612 * "Once made active an entry may not be modified except to
2613 * delete it." XXX: doesn't this in fact apply to ALL
2614 * columns of the table and not just this one?
2616 return SNMP_ERR_INCONSISTENTVALUE;
2618 if (StorageTmp->storageType != ST_NONVOLATILE)
2619 return SNMP_ERR_NOTWRITABLE;
2621 break;
2626 case RESERVE2:
2628 * memory reseveration, final preparation...
2630 if (StorageTmp == NULL) {
2632 * creation
2634 vars = NULL;
2637 snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, NULL, 0); /* mteOwner */
2638 snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OCTET_STR, NULL, 0); /* mteTriggerName */
2642 if (header_complex_parse_oid
2644 (name
2645 [sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2646 2]), newlen, vars) != SNMPERR_SUCCESS) {
2648 * XXX: free, zero vars
2650 return SNMP_ERR_INCONSISTENTNAME;
2652 vp = vars;
2655 StorageNew = create_mteTriggerTable_data();
2657 StorageNew->mteOwner = malloc(vp->val_len + 1);
2658 memcpy(StorageNew->mteOwner, vp->val.string, vp->val_len);
2659 StorageNew->mteOwner[vp->val_len] = '\0';
2660 StorageNew->mteOwnerLen = vp->val_len;
2662 vp = vp->next_variable;
2663 StorageNew->mteTriggerName = malloc(vp->val_len + 1);
2664 memcpy(StorageNew->mteTriggerName, vp->val.string,
2665 vp->val_len);
2666 StorageNew->mteTriggerName[vp->val_len] = '\0';
2667 StorageNew->mteTriggerNameLen = vp->val_len;
2669 vp = vp->next_variable;
2671 StorageNew->mteTriggerEntryStatus = set_value;
2676 break;
2681 case FREE:
2683 * XXX: free, zero vars
2686 * Release any resources that have been allocated
2688 break;
2693 case ACTION:
2695 * The variable has been stored in set_value for you to
2696 * use, and you have just been asked to do something with
2697 * it. Note that anything done here must be reversable in
2698 * the UNDO case
2702 if (StorageTmp == NULL) {
2704 * row creation, so add it
2706 if (StorageNew != NULL)
2707 mteTriggerTable_add(StorageNew);
2709 * XXX: ack, and if it is NULL?
2711 } else if (set_value != RS_DESTROY) {
2713 * set the flag?
2715 old_value = StorageTmp->mteTriggerEntryStatus;
2716 StorageTmp->mteTriggerEntryStatus = *((long *) var_val);
2717 } else {
2719 * destroy... extract it for now
2721 hciptr =
2722 header_complex_find_entry(mteTriggerTableStorage,
2723 StorageTmp);
2724 StorageDel =
2725 header_complex_extract_entry(&mteTriggerTableStorage,
2726 hciptr);
2728 break;
2733 case UNDO:
2735 * Back out any changes made in the ACTION case
2737 if (StorageTmp == NULL) {
2739 * row creation, so remove it again
2741 hciptr =
2742 header_complex_find_entry(mteTriggerTableStorage,
2743 StorageTmp);
2744 StorageDel =
2745 header_complex_extract_entry(&mteTriggerTableStorage,
2746 hciptr);
2748 * XXX: free it
2750 } else if (StorageDel != NULL) {
2752 * row deletion, so add it again
2754 mteTriggerTable_add(StorageDel);
2755 } else {
2756 StorageTmp->mteTriggerEntryStatus = old_value;
2758 break;
2763 case COMMIT:
2765 * Things are working well, so it's now safe to make the change
2766 * permanently. Make sure that anything done here can't fail!
2768 if (StorageDel != NULL) {
2769 mte_disable_trigger(StorageDel);
2770 StorageDel = 0;
2772 * XXX: free it, its dead
2774 } else {
2775 if (StorageTmp
2776 && StorageTmp->mteTriggerEntryStatus == RS_CREATEANDGO) {
2777 StorageTmp->mteTriggerEntryStatus = RS_ACTIVE;
2778 } else if (StorageTmp &&
2779 StorageTmp->mteTriggerEntryStatus ==
2780 RS_CREATEANDWAIT) {
2781 StorageTmp->mteTriggerEntryStatus = RS_NOTINSERVICE;
2784 if (StorageTmp &&
2785 StorageTmp->mteTriggerEntryStatus == RS_ACTIVE &&
2786 !StorageTmp->have_copied_auth_info) {
2788 netsnmp_agent_session *asp =
2789 netsnmp_get_current_agent_session();
2790 netsnmp_pdu *pdu = NULL;
2792 if (!asp) {
2793 snmp_log(LOG_ERR,
2794 "snmpTriggerTable: can't get master session for authentication params\n");
2795 } else {
2796 pdu = asp->orig_pdu;
2797 if (!pdu) {
2798 snmp_log(LOG_ERR,
2799 "snmpTriggerTable: can't get master pdu for authentication params\n");
2803 if (pdu) {
2804 DEBUGMSGTL(("mteTriggerTest", "copying PDU auth info\n"));
2805 StorageTmp->pdu_version = pdu->version;
2806 StorageTmp->pdu_securityModel = pdu->securityModel;
2807 StorageTmp->pdu_securityLevel = pdu->securityLevel;
2808 StorageTmp->pdu_tDomain = pdu->tDomain;
2809 StorageTmp->pdu_tDomainLen = pdu->tDomainLen;
2810 if (pdu->transport_data != NULL) {
2811 StorageTmp->pdu_transport =
2812 malloc(pdu->transport_data_length);
2813 memcpy(StorageTmp->pdu_transport, pdu->transport_data,
2814 pdu->transport_data_length);
2816 StorageTmp->pdu_transportLen = pdu->transport_data_length;
2817 if (pdu->community) {
2818 StorageTmp->pdu_community =
2819 calloc(1, pdu->community_len + 1);
2820 memcpy(StorageTmp->pdu_community, pdu->community,
2821 pdu->community_len);
2822 StorageTmp->pdu_community_len = pdu->community_len;
2823 } else {
2824 StorageTmp->pdu_community = NULL;
2825 StorageTmp->pdu_community_len = 0;
2827 if (pdu->securityName) {
2828 StorageTmp->pdu_securityName =
2829 calloc(1, pdu->securityNameLen + 1);
2830 memcpy(StorageTmp->pdu_securityName, pdu->securityName,
2831 pdu->securityNameLen);
2832 StorageTmp->pdu_securityNameLen = pdu->securityNameLen;
2833 } else {
2834 StorageTmp->pdu_securityName = NULL;
2835 StorageTmp->pdu_securityNameLen = 0;
2837 StorageTmp->have_copied_auth_info = 1;
2841 if (StorageTmp &&
2842 StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
2843 StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
2844 mte_enable_trigger(StorageTmp);
2845 break;
2847 return SNMP_ERR_NOERROR;
2851 * send trap
2853 void
2854 send_mte_trap(struct mteTriggerTable_data *item,
2855 oid * trap_oid, size_t trap_oid_len,
2856 oid * name_oid, size_t name_oid_len,
2857 long *value, const char *objowner, const char *objname,
2858 const char *reason)
2860 static oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; /* snmpTrapIOD.0 */
2862 netsnmp_variable_list *var_list = NULL;
2865 * snmpTrap oid
2867 snmp_varlist_add_variable(&var_list, objid_snmptrap,
2868 sizeof(objid_snmptrap) / sizeof(oid),
2869 ASN_OBJECT_ID, (u_char *) trap_oid,
2870 trap_oid_len * sizeof(oid));
2873 * mteHotTrigger
2875 snmp_varlist_add_variable(&var_list, mteHotTrigger,
2876 sizeof(mteHotTrigger) / sizeof(oid),
2877 ASN_OCTET_STR,
2878 (u_char *) item->mteTriggerName,
2879 item->mteTriggerNameLen);
2882 * mteHotTargetName
2884 snmp_varlist_add_variable(&var_list, mteHotTargetName, sizeof(mteHotTargetName) / sizeof(oid), ASN_OCTET_STR, (u_char *) item->mteTriggerTargetTag, /*XXX: targetName,not tag */
2885 item->mteTriggerTargetTagLen); /*XXX */
2888 * mteHotContextName
2890 snmp_varlist_add_variable(&var_list, mteHotContextName,
2891 sizeof(mteHotContextName) / sizeof(oid),
2892 ASN_OCTET_STR,
2893 (u_char *) item->mteTriggerContextName,
2894 item->mteTriggerContextNameLen);
2896 snmp_varlist_add_variable(&var_list, mteHotOID,
2897 sizeof(mteHotOID) / sizeof(oid),
2898 ASN_OBJECT_ID, (u_char *) name_oid,
2899 sizeof(oid) * name_oid_len);
2901 if (trap_oid == mteTriggerFailure || trap_oid == mteEventSetFailure) {
2903 * mteFailedReason
2905 snmp_varlist_add_variable(&var_list, mteFailedReason,
2906 sizeof(mteFailedReason) / sizeof(oid),
2907 ASN_INTEGER, (u_char *) value,
2908 sizeof(value));
2909 } else {
2911 * mteHotValue
2913 snmp_varlist_add_variable(&var_list, mteHotValue,
2914 sizeof(mteHotValue) / sizeof(oid),
2915 ASN_INTEGER, (u_char *) value,
2916 sizeof(value));
2920 * add in traps from main table
2922 mte_add_objects(var_list, item, item->mteTriggerObjectsOwner,
2923 item->mteTriggerObjects,
2924 name_oid + item->mteTriggerValueIDLen,
2925 name_oid_len - item->mteTriggerValueIDLen);
2927 * add in traps from sub table
2929 mte_add_objects(var_list, item, objowner, objname,
2930 name_oid + item->mteTriggerValueIDLen,
2931 name_oid_len - item->mteTriggerValueIDLen);
2934 * XXX: stuff based on event table
2936 DEBUGMSGTL(("mteTriggerTest:send_mte_trap", "sending the trap (%s): ",
2937 reason));
2938 DEBUGMSGOID(("mteTriggerTest:send_mte_trap", name_oid, name_oid_len));
2939 DEBUGMSG(("mteTriggerTest:send_mte_trap", " = %ld\n", *value));
2941 send_v2trap(var_list);
2942 snmp_free_varbind(var_list);
2945 void
2946 last_state_clean(void *data)
2948 struct last_state *cleanme = (struct last_state *) data;
2949 SNMP_FREE(cleanme->value);
2950 SNMP_FREE(cleanme);
2954 * retrieves requested info in pdu from the current target
2956 netsnmp_pdu *
2957 mte_get_response(struct mteTriggerTable_data *item, netsnmp_pdu *pdu)
2959 netsnmp_pdu *response = NULL;
2960 int status = 0;
2961 char buf[SPRINT_MAX_LEN];
2964 * local agent check
2966 pdu->errstat = SNMPERR_SUCCESS;
2967 pdu->errindex = 0;
2968 pdu->version = item->pdu_version;
2969 pdu->securityModel = item->pdu_securityModel;
2970 pdu->securityLevel = item->pdu_securityLevel;
2971 pdu->tDomain = item->pdu_tDomain;
2972 pdu->tDomainLen = item->pdu_tDomainLen;
2973 memdup((u_char **) & pdu->transport_data, item->pdu_transport,
2974 item->pdu_transportLen);
2975 pdu->transport_data_length = item->pdu_transportLen;
2976 memdup(&pdu->community, item->pdu_community, item->pdu_community_len);
2977 pdu->community_len = item->pdu_community_len;
2978 memdup((u_char **) & pdu->contextName, item->mteTriggerContextName,
2979 item->mteTriggerContextNameLen);
2980 pdu->contextNameLen = item->mteTriggerContextNameLen;
2981 memdup((u_char **) & pdu->securityName, item->pdu_securityName,
2982 item->pdu_securityNameLen);
2983 pdu->securityNameLen = item->pdu_securityNameLen;
2984 DEBUGMSGTL(("mteTriggerTable",
2985 "accessing locally with secName \"%s\" community \"%s\"\n",
2986 item->pdu_securityName ? (char *) item->
2987 pdu_securityName : "[NIL]",
2988 item->pdu_community ? (char *) item->
2989 pdu_community : "[NIL]"));
2991 if (item->mteTriggerTargetTagLen == 0) {
2993 * send to the local agent
2996 status = snmp_synch_response(mte_callback_sess, pdu, &response);
2998 if (status != SNMP_ERR_NOERROR ||
2999 response->errstat != SNMP_ERR_NOERROR) {
3001 * xxx
3003 char *errstr;
3004 snmp_error(mte_callback_sess, 0, 0, &errstr);
3005 if (response) {
3006 DEBUGMSGTL(("mteTriggerTable",
3007 "Error received: status=%d, sess_error=%s, pduerr=%d/%s, pdu version=%d\n",
3008 status, errstr,
3009 response->errstat,
3010 snmp_api_errstring(response->errstat),
3011 response->version));
3012 } else {
3013 DEBUGMSGTL(("mteTriggerTable",
3014 "Error received: status=%d, sess_error=%s [no response pointer]\n",
3015 status, errstr));
3017 if (errstr)
3018 free(errstr);
3019 return NULL; /* XXX: proper failure, trap sent, etc */
3021 } else {
3023 * remote target list
3026 * XXX
3029 if (response->variables)
3030 snprint_variable(buf, sizeof(buf), response->variables->name,
3031 response->variables->name_length,
3032 response->variables);
3033 else
3034 strcpy(buf, "empty");
3035 buf[sizeof(buf) - 1] = '\0';
3036 DEBUGMSGTL(("mteTriggerTable", "got a variables: %s\n", buf));
3037 return response;
3042 * Return 1 if `type' is an integer type; specifically, to quote RFC 2981,
3043 * p. 13, "anything that ends up encoded for transmission (that is, in BER,
3044 * not ASN.1) as an integer". Return 0 for all other types.
3048 mte_is_integer_type(unsigned char type)
3050 switch (type) {
3051 case ASN_INTEGER:
3052 case ASN_COUNTER:
3053 case ASN_GAUGE:
3054 case ASN_TIMETICKS:
3055 case ASN_UINTEGER:
3056 case ASN_COUNTER64:
3057 #ifdef OPAQUE_SPECIAL_TYPES
3058 case ASN_OPAQUE_COUNTER64:
3059 case ASN_OPAQUE_U64:
3060 case ASN_OPAQUE_I64:
3061 #endif /* OPAQUE_SPECIAL_TYPES */
3062 return 1;
3063 default:
3064 return 0;
3071 * Return 0 if the discontinuity object was checked and no discontinuity has
3072 * occurred, 1 if the discontinuity object was checked and a discontinuity
3073 * has occurred or -1 if the discontinuity object is not accessible.
3077 mte_discontinuity_occurred(struct mteTriggerTable_data *item)
3079 netsnmp_pdu *pdu = NULL, *response = NULL;
3080 unsigned long discoTicks = 0; /* cool var name */
3082 if (item->mteTriggerDeltaDiscontinuityIDLen == 0 ||
3083 (snmp_oid_compare(item->mteTriggerDeltaDiscontinuityID,
3084 item->mteTriggerDeltaDiscontinuityIDLen,
3085 sysUpTimeInstance,
3086 sizeof(sysUpTimeInstance) / sizeof(oid)) == 0)) {
3087 DEBUGMSGTL(("mte_disco",
3088 "discoID either zero-length or sysUpTimeInstance\n"));
3089 } else {
3090 if (item->mteTriggerValueIDWildcard == TV_TRUE) {
3091 pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
3092 } else {
3093 pdu = snmp_pdu_create(SNMP_MSG_GET);
3095 snmp_add_null_var(pdu, item->mteTriggerDeltaDiscontinuityID,
3096 item->mteTriggerDeltaDiscontinuityIDLen);
3097 response = mte_get_response(item, pdu);
3098 if (response == NULL) {
3100 * XXX: send a mteTriggerFailure notification with the appropriate
3101 * error code here.
3104 * "If the object identified is not accessible the sample attempt is in
3105 * error, with the error code as from an SNMP request."
3107 DEBUGMSGTL(("mte_disco", "failure (auth?) getting discoID\n"));
3108 return -1;
3109 } else {
3110 if (item->mteTriggerDeltaDiscontinuityIDType ==
3111 MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMETICKS ||
3112 item->mteTriggerDeltaDiscontinuityIDType ==
3113 MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMESTAMP) {
3114 if (response->errstat == SNMPERR_SUCCESS) {
3115 if (response->variables != NULL &&
3116 response->variables->type == ASN_TIMETICKS) {
3117 DEBUGMSGTL(("mte_disco",
3118 "got ASN_TIMETICKS-valued variable\n"));
3119 discoTicks =
3120 *((unsigned long *) response->variables->val.
3121 integer);
3122 if (item->prevDiscoTicks != 0) {
3123 if (discoTicks != item->prevDiscoTicks) {
3125 * Danger Will Robinson: there has been a discontinuity!
3127 DEBUGMSGTL(("mte_disco",
3128 "a discontinuity has occurred\n"));
3129 item->prevDiscoTicks = discoTicks;
3130 snmp_free_pdu(response);
3131 return 1;
3134 item->prevDiscoTicks = discoTicks;
3135 } else {
3137 * XXX: send a mteTriggerFailure notification with the
3138 * appropriate error code here.
3140 if (response->variables != NULL &&
3141 (response->variables->type == SNMP_NOSUCHOBJECT
3142 || response->variables->type ==
3143 SNMP_NOSUCHINSTANCE
3144 || response->variables->type ==
3145 SNMP_ENDOFMIBVIEW)) {
3147 * noSuchName I guess.
3149 } else {
3151 * badType.
3154 DEBUGMSGTL(("mte_disco",
3155 "failure getting discoID\n"));
3156 snmp_free_pdu(response);
3157 return -1;
3159 } else {
3161 * XXX: send a mteTriggerFailure notification with the appropriate
3162 * error code (just use response->errstat) here.
3164 DEBUGMSGTL(("mte_disco", "failure getting discoID\n"));
3165 snmp_free_pdu(response);
3166 return -1;
3168 } else {
3170 * Don't handle dateAndTime type queries yet.
3172 DEBUGMSGTL(("mte_disco",
3173 "dateAndTime query UNIMPLEMENTED\n"));
3175 snmp_free_pdu(response);
3180 * "...if this object does not point to sysUpTime discontinuity checking
3181 * MUST still check sysUpTime for an overall discontinuity."
3183 if (snmp_oid_compare(item->mteTriggerDeltaDiscontinuityID,
3184 item->mteTriggerDeltaDiscontinuityIDLen,
3185 sysUpTimeInstance,
3186 sizeof(sysUpTimeInstance) / sizeof(oid)) != 0) {
3187 DEBUGMSGTL(("mte_disco", "discoID != sysUpTimeInstance\n"));
3189 * At the moment we only support checking the local system so there's no
3190 * point doing anything extra here.
3195 * Well if we got all the way to here, then there has been neither a
3196 * discontinuity nor an error.
3198 DEBUGMSGTL(("mte_disco", "no discontinuity\n"));
3199 return 0;
3203 void
3204 mte_run_trigger(unsigned int clientreg, void *clientarg)
3207 struct mteTriggerTable_data *item =
3208 (struct mteTriggerTable_data *) clientarg;
3209 netsnmp_pdu *pdu = NULL, *response = NULL;
3210 char buf[SPRINT_MAX_LEN];
3211 int msg_type = SNMP_MSG_GET, disco;
3213 oid *next_oid;
3214 size_t next_oid_len;
3215 long *value, *old_value, x;
3216 struct last_state *laststate;
3217 char lastbool = 0, boolresult = 0, lastthresh = 0, senttrap = 0;
3219 if (!item) {
3221 * ack
3223 snmp_alarm_unregister(clientreg);
3224 return;
3226 DEBUGMSGTL(("mteTriggertable", "Running trigger for %s/%s\n",
3227 item->mteOwner, item->mteTriggerName));
3229 next_oid = item->mteTriggerValueID;
3230 next_oid_len = item->mteTriggerValueIDLen;
3231 if (item->mteTriggerValueIDWildcard == TV_TRUE)
3232 msg_type = SNMP_MSG_GETNEXT;
3234 item->hc_storage_old = item->hc_storage;
3235 item->hc_storage = NULL;
3236 do {
3237 pdu = snmp_pdu_create(msg_type);
3238 snmp_add_null_var(pdu, next_oid, next_oid_len);
3239 response = mte_get_response(item, pdu);
3240 if (!response)
3241 break; /* XXX: proper failure */
3243 if (item->mteTriggerValueIDWildcard == TV_TRUE &&
3244 ((response->variables->type >= SNMP_NOSUCHOBJECT &&
3245 response->variables->type <= SNMP_ENDOFMIBVIEW) ||
3246 snmp_oid_compare(item->mteTriggerValueID,
3247 item->mteTriggerValueIDLen,
3248 response->variables->name,
3249 item->mteTriggerValueIDLen) != 0)) {
3250 DEBUGMSGTL(("mteTriggerTable",
3251 "DONE, last varbind processed\n"));
3252 snmp_free_pdu(response);
3253 break;
3257 * shorter pointers
3259 next_oid = response->variables->name;
3260 next_oid_len = response->variables->name_length;
3263 * Send a "bad type" notification if the type of the target object is
3264 * non-INTEGER and the test type is either `boolean' or `threshold'
3265 * (which want to do arithmetic).
3267 if (((item->mteTriggerTest[0] & MTETRIGGERTEST_BOOLEAN) ||
3268 (item->mteTriggerTest[0] & MTETRIGGERTEST_THRESHOLD)) &&
3269 response->errstat == SNMPERR_SUCCESS &&
3270 !mte_is_integer_type(response->variables->type)) {
3271 long failure = MTE_FAILURE_BADTYPE;
3272 send_mte_trap(item, mteTriggerFailure,
3273 sizeof(mteTriggerFailure) / sizeof(oid),
3274 next_oid, next_oid_len, &failure,
3275 NULL, NULL, "failure: bad type");
3276 snmp_free_pdu(response);
3278 * RFC2981, p.15: "If the value syntax of those objects
3279 * [returned by a getNext-style match] is not usable, that
3280 * results in a `badType' error THAT TERMINATES THE SCAN."
3281 * (my emphasis).
3283 break;
3287 * Clone the value. XXX: What happens if it's an unsigned type? Or a
3288 * 64-bit type, or an OCTET STRING for the sake of argument. Do
3289 * everything in 64-bit arithmetic perhaps? Generate "bad type"
3290 * notifications for non-INTEGER cases (except for existence).
3292 if (response->errstat == SNMPERR_SUCCESS &&
3293 response->variables->val.integer)
3294 memdup((unsigned char **) &value,
3295 (unsigned char *) response->variables->val.integer,
3296 sizeof(*response->variables->val.integer));
3297 else
3298 value = NULL;
3300 snprint_variable(buf, sizeof(buf),
3301 next_oid, next_oid_len, response->variables);
3302 buf[sizeof(buf) - 1] = '\0';
3303 DEBUGMSGTL(("mteTriggerTable", "received %s (type %d)\n", buf,
3304 response->variables->type));
3307 * see if we have old values for this
3309 laststate = header_complex_get_from_oid(item->hc_storage_old,
3310 next_oid, next_oid_len);
3311 if (laststate) {
3312 old_value = laststate->value;
3313 lastbool = laststate->lastbool;
3314 lastthresh = laststate->lastthreshold;
3315 } else {
3316 old_value = NULL;
3317 lastthresh = MTE_THRESHOLD_BEGIN;
3321 * deal with existence tests
3323 if (item->mteTriggerTest[0] & MTETRIGGERTEST_EXISTENCE) {
3324 if ((item->mteTriggerExistenceTest[0] &
3325 MTETRIGGEREXISTENCETEST_PRESENT)
3326 && value && !old_value &&
3327 (item->started ||
3328 (item->mteTriggerExistenceStartup[0] &
3329 MTETRIGGEREXISTENCESTARTUP_PRESENT))) {
3331 * XXX: if mteTriggerExistenceTest is not "present", for
3332 * example, and then turned on when has been previously
3333 * off, do we respect the value of the last known
3334 * existence status?
3336 send_mte_trap(item, mteTriggerFired,
3337 sizeof(mteTriggerFired) / sizeof(oid),
3338 next_oid, next_oid_len,
3339 value, item->mteTriggerExistenceObjectsOwner,
3340 item->mteTriggerExistenceObjects,
3341 "existence: present");
3342 run_mte_events(item, next_oid, next_oid_len,
3343 item->mteTriggerExistenceEventOwner,
3344 item->mteTriggerExistenceEvent);
3345 senttrap = 1;
3348 if ((item->mteTriggerExistenceTest[0] &
3349 MTETRIGGEREXISTENCETEST_CHANGED)
3350 && value && old_value && *old_value != *value) {
3352 * XXX: if mteTriggerExistenceTest is not "present", for
3353 * example, and then turned on when has been previously
3354 * off, do we respect the value of the last known
3355 * existence status?
3357 send_mte_trap(item, mteTriggerFired,
3358 sizeof(mteTriggerFired) / sizeof(oid),
3359 next_oid, next_oid_len,
3360 value, item->mteTriggerExistenceObjectsOwner,
3361 item->mteTriggerExistenceObjects,
3362 "existence: changed");
3363 run_mte_events(item, next_oid, next_oid_len,
3364 item->mteTriggerExistenceEventOwner,
3365 item->mteTriggerExistenceEvent);
3366 senttrap = 1;
3371 * Deal with boolean tests.
3373 if ((item->mteTriggerTest[0] & MTETRIGGERTEST_BOOLEAN) &&
3374 ((item->mteTriggerSampleType ==
3375 MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE && value)
3376 || (item->mteTriggerSampleType ==
3377 MTETRIGGERSAMPLETYPE_DELTAVALUE && value && old_value))) {
3378 if (item->mteTriggerSampleType ==
3379 MTETRIGGERSAMPLETYPE_DELTAVALUE) {
3381 * XXX: Must check the discontinuity OID here.
3383 disco = mte_discontinuity_occurred(item);
3384 if (disco == -1) {
3386 * An error notification has already been sent; just bail
3387 * out now.
3390 * XXX: should save values here?
3392 return;
3393 } else if (disco == 1) {
3395 * A discontinuity has occurred; the right thing to do here
3396 * depends on the exact type. FOR NOW, assume long.
3398 x = *((long *) value) + (INT_MAX -
3399 *((long *) old_value));
3400 } else {
3401 x = *((long *) value) - *((long *) old_value);
3403 } else {
3404 x = *((long *) value);
3407 switch (item->mteTriggerBooleanComparison) {
3408 case MTETRIGGERBOOLEANCOMPARISON_UNEQUAL:
3409 boolresult = (x != item->mteTriggerBooleanValue);
3410 break;
3412 case MTETRIGGERBOOLEANCOMPARISON_EQUAL:
3413 boolresult = (x == item->mteTriggerBooleanValue);
3414 break;
3416 case MTETRIGGERBOOLEANCOMPARISON_LESS:
3417 boolresult = (x < item->mteTriggerBooleanValue);
3418 break;
3420 case MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL:
3421 boolresult = (x <= item->mteTriggerBooleanValue);
3422 break;
3424 case MTETRIGGERBOOLEANCOMPARISON_GREATER:
3425 boolresult = (x > item->mteTriggerBooleanValue);
3426 break;
3428 case MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL:
3429 boolresult = (x >= item->mteTriggerBooleanValue);
3430 break;
3432 default:
3433 snmp_log(LOG_WARNING,
3434 "illegal value in mteTriggerBooleanComparison object: %d",
3435 item->mteTriggerBooleanComparison);
3436 boolresult = item->lastboolresult; /* to fail next test */
3439 if (boolresult &&
3440 ((item->mteTriggerBooleanStartup ==
3441 MTETRIGGERBOOLEANSTARTUP_TRUE
3442 && lastbool == -1) || lastbool != boolresult)) {
3443 send_mte_trap(item, mteTriggerFired,
3444 sizeof(mteTriggerFired) / sizeof(oid),
3445 next_oid, next_oid_len,
3446 &x, item->mteTriggerBooleanObjectsOwner,
3447 item->mteTriggerBooleanObjects,
3448 "boolean: true");
3449 run_mte_events(item, next_oid, next_oid_len,
3450 item->mteTriggerBooleanEventOwner,
3451 item->mteTriggerBooleanEvent);
3452 senttrap = 1;
3455 DEBUGMSGTL(("mteTriggerTable",
3456 "value: %d %ld %lu x: %d %ld %lu\n", *value,
3457 *value, *value, x, x, x));
3459 DEBUGMSGTL(("mteTriggerTable",
3460 "boolean result: x=%d %s configured=%d = %d\n",
3462 se_find_label_in_slist("mteBooleanOperators",
3463 item->
3464 mteTriggerBooleanComparison),
3465 item->mteTriggerBooleanValue, boolresult));
3469 * Deal with threshold tests. XXX: doesn't handle "delta-type"
3470 * sampling.
3472 if ((item->mteTriggerTest[0] & MTETRIGGERTEST_THRESHOLD) &&
3473 ((item->mteTriggerSampleType ==
3474 MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE && value)
3475 || (item->mteTriggerSampleType ==
3476 MTETRIGGERSAMPLETYPE_DELTAVALUE && value && old_value))) {
3478 * XXX: correct intepretation of mteTriggerThresholdStartup?
3481 * only fires when passed and just set to active? What
3482 * about a newly discovered node that is past a
3483 * threshold once we've been active for a turn at least?
3486 * XXX: Check notions of > vs >=
3488 if (((item->started == MTE_STARTED && laststate &&
3489 lastthresh == MTE_THRESHOLD_LOW) ||
3490 (item->started != MTE_STARTED &&
3491 (item->mteTriggerThresholdStartup ==
3492 MTETRIGGERTHRESHOLDSTARTUP_RISING
3493 || item->mteTriggerThresholdStartup ==
3494 MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING)))
3495 && (*value >= item->mteTriggerThresholdRising)) {
3496 send_mte_trap(item, mteTriggerRising,
3497 sizeof(mteTriggerRising) / sizeof(oid),
3498 next_oid, next_oid_len, value,
3499 item->mteTriggerThresholdObjectsOwner,
3500 item->mteTriggerThresholdObjects,
3501 "threshold: rising");
3502 run_mte_events(item, next_oid, next_oid_len,
3503 item->mteTriggerThresholdRisingEventOwner,
3504 item->mteTriggerThresholdRisingEvent);
3505 senttrap = 1;
3507 if (((item->started == MTE_STARTED && laststate &&
3508 lastthresh == MTE_THRESHOLD_HIGH) ||
3509 (item->started != MTE_STARTED &&
3510 (item->mteTriggerThresholdStartup ==
3511 MTETRIGGERTHRESHOLDSTARTUP_FALLING
3512 || item->mteTriggerThresholdStartup ==
3513 MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING)))
3514 && (*value <= item->mteTriggerThresholdFalling)) {
3515 send_mte_trap(item, mteTriggerFalling,
3516 sizeof(mteTriggerFalling) / sizeof(oid),
3517 next_oid, next_oid_len, value,
3518 item->mteTriggerThresholdObjectsOwner,
3519 item->mteTriggerThresholdObjects,
3520 "threshold: falling");
3521 run_mte_events(item, next_oid, next_oid_len,
3522 item->mteTriggerThresholdFallingEventOwner,
3523 item->mteTriggerThresholdFallingEvent);
3524 senttrap = 1;
3529 if (value) {
3530 struct last_state *new_last_state =
3531 SNMP_MALLOC_STRUCT(last_state);
3532 new_last_state->value = value;
3533 new_last_state->lastbool = boolresult;
3534 header_complex_add_data_by_oid(&item->hc_storage, next_oid,
3535 next_oid_len, new_last_state);
3538 * set our notion of the current known threshold state
3540 if (lastthresh == MTE_THRESHOLD_LOW &&
3541 *value >= item->mteTriggerThresholdRising &&
3542 *value > item->mteTriggerThresholdFalling)
3543 new_last_state->lastthreshold = MTE_THRESHOLD_HIGH;
3544 else if (lastthresh == MTE_THRESHOLD_HIGH &&
3545 *value < item->mteTriggerThresholdRising &&
3546 *value <= item->mteTriggerThresholdFalling)
3547 new_last_state->lastthreshold = MTE_THRESHOLD_LOW;
3548 else if (lastthresh == MTE_THRESHOLD_BEGIN) {
3549 if (*value >= item->mteTriggerThresholdRising)
3550 new_last_state->lastthreshold = MTE_THRESHOLD_HIGH;
3551 else if (*value <= item->mteTriggerThresholdFalling)
3552 new_last_state->lastthreshold = MTE_THRESHOLD_LOW;
3554 * XXX: else??? in between? undefined?
3556 } else {
3557 new_last_state->lastthreshold = lastthresh;
3562 * extract from old hc storage
3564 if (laststate) {
3565 header_complex_extract_entry(&item->hc_storage_old,
3566 header_complex_find_entry(item->
3567 hc_storage_old,
3568 (void *)
3569 laststate));
3570 last_state_clean(laststate);
3574 * We are now done with the response PDU.
3576 if (senttrap)
3577 senttrap = 0;
3578 else
3579 snmp_free_pdu(response);
3580 } while (item->mteTriggerValueIDWildcard == TV_TRUE);
3583 * loop through old values for DNE cases
3585 if (item->mteTriggerExistenceTest[0] & MTETRIGGEREXISTENCETEST_ABSENT) {
3587 struct header_complex_index *iter;
3590 * XXX: broken
3592 if ((item->mteTriggerExistenceStartup[0] &
3593 MTETRIGGEREXISTENCESTARTUP_ABSENT)) {
3595 * XXX: send trap that nothing was found?
3598 * only if !wild? (see mib)
3601 for (iter = item->hc_storage_old; iter; iter = iter->next) {
3602 laststate = (struct last_state *) iter->data;
3603 send_mte_trap(item, mteTriggerFired,
3604 sizeof(mteTriggerFired) / sizeof(oid),
3605 iter->name, iter->namelen, laststate->value,
3606 item->mteTriggerExistenceObjectsOwner,
3607 item->mteTriggerExistenceObjects,
3608 "existence: absent");
3610 header_complex_free_all(item->hc_storage_old, last_state_clean);
3611 item->hc_storage_old = NULL;
3614 item->started = MTE_STARTED;
3619 * handling routines
3621 void
3622 mte_enable_trigger(struct mteTriggerTable_data *item)
3624 if (!item)
3625 return;
3627 if (item->alarmreg)
3628 snmp_alarm_unregister(item->alarmreg);
3630 if (item->mteTriggerFrequency > 0) {
3631 DEBUGMSGTL(("mteTriggertable", "Enabling trigger for %s/%s @ %u\n",
3632 item->mteOwner, item->mteTriggerName,
3633 item->mteTriggerFrequency));
3634 item->alarmreg =
3635 snmp_alarm_register(item->mteTriggerFrequency, SA_REPEAT,
3636 mte_run_trigger, item);
3640 void
3641 mte_disable_trigger(struct mteTriggerTable_data *item)
3643 if (!item)
3644 return;
3646 if (item->alarmreg) {
3647 DEBUGMSGTL(("mteTriggertable", "Disabling trigger for %s/%s\n",
3648 item->mteOwner, item->mteTriggerName));
3649 snmp_alarm_unregister(item->alarmreg);
3650 item->alarmreg = 0;
3652 item->started = MTE_NOTSTARTED;