2 * This file was generated by mib2c and is intended for use as
3 * a mib module for the ucd-snmp snmpd agent.
8 * This should always be included first before anything else
10 #include <net-snmp/net-snmp-config.h>
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
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 };
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,
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,
93 #define MTETRIGGERVALUEID 8
94 {MTETRIGGERVALUEID, ASN_OBJECT_ID, RWRITE, var_mteTriggerTable, 2,
96 #define MTETRIGGERVALUEIDWILDCARD 9
97 {MTETRIGGERVALUEIDWILDCARD, ASN_INTEGER, RWRITE, var_mteTriggerTable,
99 #define MTETRIGGERTARGETTAG 10
100 {MTETRIGGERTARGETTAG, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
102 #define MTETRIGGERCONTEXTNAME 11
103 {MTETRIGGERCONTEXTNAME, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
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,
111 #define MTETRIGGEROBJECTSOWNER 14
112 {MTETRIGGEROBJECTSOWNER, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
114 #define MTETRIGGEROBJECTS 15
115 {MTETRIGGEROBJECTS, ASN_OCTET_STR, RWRITE, var_mteTriggerTable, 2,
117 #define MTETRIGGERENABLED 16
118 {MTETRIGGERENABLED, ASN_INTEGER, RWRITE, var_mteTriggerTable, 2,
120 #define MTETRIGGERENTRYSTATUS 17
121 {MTETRIGGERENTRYSTATUS, ASN_INTEGER, RWRITE, var_mteTriggerTable, 2,
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.
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,
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,
198 DEBUGMSGTL(("mteTriggerTable", "created callback session = %08x\n",
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
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;
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);
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) {
330 ("You must specify a user name first using the agentSecName token\n");
335 * we don't include many additional objects here as most of
336 * the error messages are complete with the needed
340 ("-o prNames -o prErrMessage \"process table\" prErrorFlag != 0");
342 ("-o memErrorName -o memSwapErrorMsg \"memory\" memSwapError != 0");
344 ("-o extNames -o extOutput \"extTable\" extResult != 0");
346 ("-o dskPath -o dskErrorMsg \"dskTable\" dskErrorFlag != 0");
348 ("-o laNames -o laErrMessage \"laTable\" laErrorFlag != 0");
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
358 ("-o snmperrErrMessage \"snmperrs\" snmperrErrorFlag != 0");
362 static int monitor_call_count = 0;
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];
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;
392 while (cp && *cp == '-') {
393 cp = copy_nword(cp, buf, sizeof(buf));
397 cp = copy_nword(cp, buf, sizeof(buf));
398 StorageNew->mteTriggerFrequency = strtoul(buf, NULL, 0);
400 config_perror("No parameter after -r given\n");
402 * XXX: free StorageNew
409 cp = copy_nword(cp, buf, sizeof(buf));
410 StorageNew->pdu_securityName = strdup(buf);
411 StorageNew->pdu_securityNameLen = strlen(buf);
413 config_perror("No parameter after -u given\n");
415 * XXX: free StorageNew
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);
430 * XXX: free StorageNew
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);
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);
460 config_perror("-u USER parameter required\n");
462 * XXX: free StorageNew
471 cp = copy_nword(cp, buf, sizeof(buf));
473 config_perror("illegal monitor: no name specified");
475 * XXX: free StorageNew
480 StorageNew->mteTriggerName = strdup(buf);
481 StorageNew->mteTriggerNameLen = strlen(StorageNew->mteTriggerName);
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);
492 * XXX: free StorageNew
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
505 StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_EXISTENCE;
506 mteTriggerTable_add(StorageNew);
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");
523 StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_BOOLEAN;
525 config_perror("no comparison value specified");
527 * XXX: free StorageNew
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.
548 parse_mteTriggerTable(const char *token, char *line)
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");
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");
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");
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");
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");
598 read_config_read_data(ASN_INTEGER, line,
599 &StorageTmp->mteTriggerSampleType, &tmpint);
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");
611 read_config_read_data(ASN_INTEGER, line,
612 &StorageTmp->mteTriggerValueIDWildcard,
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");
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");
634 read_config_read_data(ASN_INTEGER, line,
635 &StorageTmp->mteTriggerContextNameWildcard,
639 read_config_read_data(ASN_UNSIGNED, line,
640 &StorageTmp->mteTriggerFrequency, &tmpint);
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");
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");
661 read_config_read_data(ASN_INTEGER, line,
662 &StorageTmp->mteTriggerEnabled, &tmpint);
665 read_config_read_data(ASN_INTEGER, line,
666 &StorageTmp->mteTriggerEntryStatus, &tmpint);
672 read_config_read_data(ASN_OBJECT_ID, line,
673 &StorageTmp->mteTriggerDeltaDiscontinuityID,
675 mteTriggerDeltaDiscontinuityIDLen);
676 if (StorageTmp->mteTriggerDeltaDiscontinuityID == NULL) {
678 ("invalid specification for mteTriggerDeltaDiscontinuityID");
683 read_config_read_data(ASN_INTEGER, line,
685 mteTriggerDeltaDiscontinuityIDWildcard,
689 read_config_read_data(ASN_INTEGER, line,
691 mteTriggerDeltaDiscontinuityIDType, &tmpint);
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");
706 read_config_read_data(ASN_OCTET_STR, line,
707 &StorageTmp->mteTriggerExistenceStartup,
708 &StorageTmp->mteTriggerExistenceStartupLen);
709 if (StorageTmp->mteTriggerExistenceStartup == NULL) {
711 ("invalid specification for mteTriggerExistenceStartup");
716 read_config_read_data(ASN_OCTET_STR, line,
717 &StorageTmp->mteTriggerExistenceObjectsOwner,
719 mteTriggerExistenceObjectsOwnerLen);
720 if (StorageTmp->mteTriggerExistenceObjectsOwner == NULL) {
722 ("invalid specification for mteTriggerExistenceObjectsOwner");
727 read_config_read_data(ASN_OCTET_STR, line,
728 &StorageTmp->mteTriggerExistenceObjects,
729 &StorageTmp->mteTriggerExistenceObjectsLen);
730 if (StorageTmp->mteTriggerExistenceObjects == NULL) {
732 ("invalid specification for mteTriggerExistenceObjects");
737 read_config_read_data(ASN_OCTET_STR, line,
738 &StorageTmp->mteTriggerExistenceEventOwner,
740 mteTriggerExistenceEventOwnerLen);
741 if (StorageTmp->mteTriggerExistenceEventOwner == NULL) {
743 ("invalid specification for mteTriggerExistenceEventOwner");
748 read_config_read_data(ASN_OCTET_STR, line,
749 &StorageTmp->mteTriggerExistenceEvent,
750 &StorageTmp->mteTriggerExistenceEventLen);
751 if (StorageTmp->mteTriggerExistenceEvent == NULL) {
753 ("invalid specification for mteTriggerExistenceEvent");
761 read_config_read_data(ASN_INTEGER, line,
762 &StorageTmp->mteTriggerBooleanComparison,
766 read_config_read_data(ASN_INTEGER, line,
767 &StorageTmp->mteTriggerBooleanValue,
771 read_config_read_data(ASN_INTEGER, line,
772 &StorageTmp->mteTriggerBooleanStartup,
776 read_config_read_data(ASN_OCTET_STR, line,
777 &StorageTmp->mteTriggerBooleanObjectsOwner,
779 mteTriggerBooleanObjectsOwnerLen);
780 if (StorageTmp->mteTriggerBooleanObjectsOwner == NULL) {
782 ("invalid specification for mteTriggerBooleanObjectsOwner");
787 read_config_read_data(ASN_OCTET_STR, line,
788 &StorageTmp->mteTriggerBooleanObjects,
789 &StorageTmp->mteTriggerBooleanObjectsLen);
790 if (StorageTmp->mteTriggerBooleanObjects == NULL) {
792 ("invalid specification for mteTriggerBooleanObjects");
797 read_config_read_data(ASN_OCTET_STR, line,
798 &StorageTmp->mteTriggerBooleanEventOwner,
799 &StorageTmp->mteTriggerBooleanEventOwnerLen);
800 if (StorageTmp->mteTriggerBooleanEventOwner == NULL) {
802 ("invalid specification for mteTriggerBooleanEventOwner");
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");
819 read_config_read_data(ASN_INTEGER, line,
820 &StorageTmp->mteTriggerThresholdStartup,
824 read_config_read_data(ASN_INTEGER, line,
825 &StorageTmp->mteTriggerThresholdRising,
829 read_config_read_data(ASN_INTEGER, line,
830 &StorageTmp->mteTriggerThresholdFalling,
834 read_config_read_data(ASN_INTEGER, line,
835 &StorageTmp->mteTriggerThresholdDeltaRising,
839 read_config_read_data(ASN_INTEGER, line,
840 &StorageTmp->mteTriggerThresholdDeltaFalling,
844 read_config_read_data(ASN_OCTET_STR, line,
845 &StorageTmp->mteTriggerThresholdObjectsOwner,
847 mteTriggerThresholdObjectsOwnerLen);
848 if (StorageTmp->mteTriggerThresholdObjectsOwner == NULL) {
850 ("invalid specification for mteTriggerThresholdObjectsOwner");
855 read_config_read_data(ASN_OCTET_STR, line,
856 &StorageTmp->mteTriggerThresholdObjects,
857 &StorageTmp->mteTriggerThresholdObjectsLen);
858 if (StorageTmp->mteTriggerThresholdObjects == NULL) {
860 ("invalid specification for mteTriggerThresholdObjects");
865 read_config_read_data(ASN_OCTET_STR, line,
867 mteTriggerThresholdRisingEventOwner,
869 mteTriggerThresholdRisingEventOwnerLen);
870 if (StorageTmp->mteTriggerThresholdRisingEventOwner == NULL) {
872 ("invalid specification for mteTriggerThresholdRisingEventOwner");
877 read_config_read_data(ASN_OCTET_STR, line,
878 &StorageTmp->mteTriggerThresholdRisingEvent,
880 mteTriggerThresholdRisingEventLen);
881 if (StorageTmp->mteTriggerThresholdRisingEvent == NULL) {
883 ("invalid specification for mteTriggerThresholdRisingEvent");
888 read_config_read_data(ASN_OCTET_STR, line,
890 mteTriggerThresholdFallingEventOwner,
892 mteTriggerThresholdFallingEventOwnerLen);
893 if (StorageTmp->mteTriggerThresholdFallingEventOwner == NULL) {
895 ("invalid specification for mteTriggerThresholdFallingEventOwner");
900 read_config_read_data(ASN_OCTET_STR, line,
901 &StorageTmp->mteTriggerThresholdFallingEvent,
903 mteTriggerThresholdFallingEventLen);
904 if (StorageTmp->mteTriggerThresholdFallingEvent == NULL) {
906 ("invalid specification for mteTriggerThresholdFallingEvent");
911 read_config_read_data(ASN_OCTET_STR, line,
913 mteTriggerThresholdDeltaRisingEventOwner,
915 mteTriggerThresholdDeltaRisingEventOwnerLen);
916 if (StorageTmp->mteTriggerThresholdDeltaRisingEventOwner == NULL) {
918 ("invalid specification for mteTriggerThresholdDeltaRisingEventOwner");
923 read_config_read_data(ASN_OCTET_STR, line,
925 mteTriggerThresholdDeltaRisingEvent,
927 mteTriggerThresholdDeltaRisingEventLen);
928 if (StorageTmp->mteTriggerThresholdDeltaRisingEvent == NULL) {
930 ("invalid specification for mteTriggerThresholdDeltaRisingEvent");
935 read_config_read_data(ASN_OCTET_STR, line,
937 mteTriggerThresholdDeltaFallingEventOwner,
939 mteTriggerThresholdDeltaFallingEventOwnerLen);
940 if (StorageTmp->mteTriggerThresholdDeltaFallingEventOwner == NULL) {
942 ("invalid specification for mteTriggerThresholdDeltaFallingEventOwner");
947 read_config_read_data(ASN_OCTET_STR, line,
949 mteTriggerThresholdDeltaFallingEvent,
951 mteTriggerThresholdDeltaFallingEventLen);
952 if (StorageTmp->mteTriggerThresholdDeltaFallingEvent == NULL) {
954 ("invalid specification for mteTriggerThresholdDeltaFallingEvent");
959 * local internal variables
962 read_config_read_data(ASN_INTEGER, line,
963 &StorageTmp->have_copied_auth_info, &tmpint);
964 if (StorageTmp->have_copied_auth_info) {
966 read_config_read_data(ASN_INTEGER, line,
967 &StorageTmp->pdu_version, &tmpint);
969 read_config_read_data(ASN_INTEGER, line,
970 &StorageTmp->pdu_securityModel, &tmpint);
972 read_config_read_data(ASN_INTEGER, line,
973 &StorageTmp->pdu_securityLevel, &tmpint);
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)) {
980 ("unsupported transport domain for mteTriggerEntry");
983 if (tmpoid != NULL) {
990 line = read_config_read_data(ASN_OCTET_STR, line,
991 &(StorageTmp->pdu_transport),
992 &StorageTmp->pdu_transportLen);
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");
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");
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,
1036 char line[SNMP_MAXBUF];
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);
1056 read_config_store_data(ASN_OCTET_STR, cptr,
1057 &StorageTmp->mteOwner,
1058 &StorageTmp->mteOwnerLen);
1060 read_config_store_data(ASN_OCTET_STR, cptr,
1061 &StorageTmp->mteTriggerName,
1062 &StorageTmp->mteTriggerNameLen);
1064 read_config_store_data(ASN_OCTET_STR, cptr,
1065 &StorageTmp->mteTriggerComment,
1066 &StorageTmp->mteTriggerCommentLen);
1068 read_config_store_data(ASN_OCTET_STR, cptr,
1069 &StorageTmp->mteTriggerTest,
1070 &StorageTmp->mteTriggerTestLen);
1072 read_config_store_data(ASN_INTEGER, cptr,
1073 &StorageTmp->mteTriggerSampleType,
1076 read_config_store_data(ASN_OBJECT_ID, cptr,
1077 &StorageTmp->mteTriggerValueID,
1078 &StorageTmp->mteTriggerValueIDLen);
1080 read_config_store_data(ASN_INTEGER, cptr,
1082 mteTriggerValueIDWildcard, &tmpint);
1084 read_config_store_data(ASN_OCTET_STR, cptr,
1085 &StorageTmp->mteTriggerTargetTag,
1087 mteTriggerTargetTagLen);
1089 read_config_store_data(ASN_OCTET_STR, cptr,
1090 &StorageTmp->mteTriggerContextName,
1092 mteTriggerContextNameLen);
1094 read_config_store_data(ASN_INTEGER, cptr,
1096 mteTriggerContextNameWildcard,
1099 read_config_store_data(ASN_UNSIGNED, cptr,
1100 &StorageTmp->mteTriggerFrequency,
1103 read_config_store_data(ASN_OCTET_STR, cptr,
1104 &StorageTmp->mteTriggerObjectsOwner,
1106 mteTriggerObjectsOwnerLen);
1108 read_config_store_data(ASN_OCTET_STR, cptr,
1109 &StorageTmp->mteTriggerObjects,
1110 &StorageTmp->mteTriggerObjectsLen);
1112 read_config_store_data(ASN_INTEGER, cptr,
1113 &StorageTmp->mteTriggerEnabled,
1116 read_config_store_data(ASN_INTEGER, cptr,
1117 &StorageTmp->mteTriggerEntryStatus,
1124 read_config_store_data(ASN_OBJECT_ID, cptr,
1126 mteTriggerDeltaDiscontinuityID,
1128 mteTriggerDeltaDiscontinuityIDLen);
1130 read_config_store_data(ASN_INTEGER, cptr,
1132 mteTriggerDeltaDiscontinuityIDWildcard,
1135 read_config_store_data(ASN_INTEGER, cptr,
1137 mteTriggerDeltaDiscontinuityIDType,
1144 read_config_store_data(ASN_OCTET_STR, cptr,
1146 mteTriggerExistenceTest,
1148 mteTriggerExistenceTestLen);
1150 read_config_store_data(ASN_OCTET_STR, cptr,
1152 mteTriggerExistenceStartup,
1154 mteTriggerExistenceStartupLen);
1156 read_config_store_data(ASN_OCTET_STR, cptr,
1158 mteTriggerExistenceObjectsOwner,
1160 mteTriggerExistenceObjectsOwnerLen);
1162 read_config_store_data(ASN_OCTET_STR, cptr,
1164 mteTriggerExistenceObjects,
1166 mteTriggerExistenceObjectsLen);
1168 read_config_store_data(ASN_OCTET_STR, cptr,
1170 mteTriggerExistenceEventOwner,
1172 mteTriggerExistenceEventOwnerLen);
1174 read_config_store_data(ASN_OCTET_STR, cptr,
1176 mteTriggerExistenceEvent,
1178 mteTriggerExistenceEventLen);
1184 read_config_store_data(ASN_INTEGER, cptr,
1186 mteTriggerBooleanComparison,
1189 read_config_store_data(ASN_INTEGER, cptr,
1190 &StorageTmp->mteTriggerBooleanValue,
1193 read_config_store_data(ASN_INTEGER, cptr,
1195 mteTriggerBooleanStartup, &tmpint);
1197 read_config_store_data(ASN_OCTET_STR, cptr,
1199 mteTriggerBooleanObjectsOwner,
1201 mteTriggerBooleanObjectsOwnerLen);
1203 read_config_store_data(ASN_OCTET_STR, cptr,
1205 mteTriggerBooleanObjects,
1207 mteTriggerBooleanObjectsLen);
1209 read_config_store_data(ASN_OCTET_STR, cptr,
1211 mteTriggerBooleanEventOwner,
1213 mteTriggerBooleanEventOwnerLen);
1215 read_config_store_data(ASN_OCTET_STR, cptr,
1216 &StorageTmp->mteTriggerBooleanEvent,
1218 mteTriggerBooleanEventLen);
1224 read_config_store_data(ASN_INTEGER, cptr,
1226 mteTriggerThresholdStartup,
1229 read_config_store_data(ASN_INTEGER, cptr,
1231 mteTriggerThresholdRising, &tmpint);
1233 read_config_store_data(ASN_INTEGER, cptr,
1235 mteTriggerThresholdFalling,
1238 read_config_store_data(ASN_INTEGER, cptr,
1240 mteTriggerThresholdDeltaRising,
1243 read_config_store_data(ASN_INTEGER, cptr,
1245 mteTriggerThresholdDeltaFalling,
1248 read_config_store_data(ASN_OCTET_STR, cptr,
1250 mteTriggerThresholdObjectsOwner,
1252 mteTriggerThresholdObjectsOwnerLen);
1254 read_config_store_data(ASN_OCTET_STR, cptr,
1256 mteTriggerThresholdObjects,
1258 mteTriggerThresholdObjectsLen);
1260 read_config_store_data(ASN_OCTET_STR, cptr,
1262 mteTriggerThresholdRisingEventOwner,
1264 mteTriggerThresholdRisingEventOwnerLen);
1266 read_config_store_data(ASN_OCTET_STR, cptr,
1268 mteTriggerThresholdRisingEvent,
1270 mteTriggerThresholdRisingEventLen);
1272 read_config_store_data(ASN_OCTET_STR, cptr,
1274 mteTriggerThresholdFallingEventOwner,
1276 mteTriggerThresholdFallingEventOwnerLen);
1278 read_config_store_data(ASN_OCTET_STR, cptr,
1280 mteTriggerThresholdFallingEvent,
1282 mteTriggerThresholdFallingEventLen);
1284 read_config_store_data(ASN_OCTET_STR, cptr,
1286 mteTriggerThresholdDeltaRisingEventOwner,
1288 mteTriggerThresholdDeltaRisingEventOwnerLen);
1290 read_config_store_data(ASN_OCTET_STR, cptr,
1292 mteTriggerThresholdDeltaRisingEvent,
1294 mteTriggerThresholdDeltaRisingEventLen);
1296 read_config_store_data(ASN_OCTET_STR, cptr,
1298 mteTriggerThresholdDeltaFallingEventOwner,
1300 mteTriggerThresholdDeltaFallingEventOwnerLen);
1302 read_config_store_data(ASN_OCTET_STR, cptr,
1304 mteTriggerThresholdDeltaFallingEvent,
1306 mteTriggerThresholdDeltaFallingEventLen);
1309 * local internal variables
1312 read_config_store_data(ASN_INTEGER, cptr,
1313 &StorageTmp->have_copied_auth_info,
1315 if (StorageTmp->have_copied_auth_info) {
1317 read_config_store_data(ASN_INTEGER, cptr,
1318 &StorageTmp->pdu_version,
1321 read_config_store_data(ASN_INTEGER, cptr,
1322 &StorageTmp->pdu_securityModel,
1325 read_config_store_data(ASN_INTEGER, cptr,
1326 &StorageTmp->pdu_securityLevel,
1329 read_config_store_data(ASN_OBJECT_ID, cptr,
1330 &StorageTmp->pdu_tDomain,
1331 &StorageTmp->pdu_tDomainLen);
1333 read_config_store_data(ASN_OCTET_STR, cptr,
1334 &StorageTmp->pdu_transport,
1335 &StorageTmp->pdu_transportLen);
1337 read_config_store_data(ASN_OCTET_STR, cptr,
1338 &StorageTmp->pdu_community,
1339 &StorageTmp->pdu_community_len);
1341 read_config_store_data(ASN_OCTET_STR, cptr,
1342 &StorageTmp->pdu_securityName,
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.
1363 var_mteTriggerTable(struct variable *vp,
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
1380 header_complex(mteTriggerTableStorage, vp, name, length, exact,
1381 var_len, write_method)) == NULL) {
1382 if (vp->magic == MTETRIGGERENTRYSTATUS)
1383 *write_method = write_mteTriggerEntryStatus;
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;
1470 write_mteTriggerComment(int action,
1472 u_char var_val_type,
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;
1480 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1484 DEBUGMSGTL(("mteTriggerTable",
1485 "write_mteTriggerComment entering action=%d... \n",
1488 header_complex(mteTriggerTableStorage, NULL,
1489 &name[sizeof(mteTriggerTable_variables_oid) /
1490 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1492 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1497 if (var_val_type != ASN_OCTET_STR) {
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;
1510 * memory reseveration, final preparation...
1517 * Release any resources that have been allocated
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,
1532 StorageTmp->mteTriggerCommentLen = var_val_len;
1538 * Back out any changes made in the ACTION case
1540 SNMP_FREE(StorageTmp->mteTriggerComment);
1541 StorageTmp->mteTriggerComment = tmpvar;
1542 StorageTmp->mteTriggerCommentLen = tmplen;
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!
1554 return SNMP_ERR_NOERROR;
1560 write_mteTriggerTest(int action,
1562 u_char var_val_type,
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;
1570 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1574 DEBUGMSGTL(("mteTriggerTable",
1575 "write_mteTriggerTest entering action=%d... \n", action));
1577 header_complex(mteTriggerTableStorage, NULL,
1578 &name[sizeof(mteTriggerTable_variables_oid) /
1579 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1581 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
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;
1597 * memory reseveration, final preparation...
1604 * Release any resources that have been allocated
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,
1619 StorageTmp->mteTriggerTestLen = var_val_len;
1625 * Back out any changes made in the ACTION case
1627 SNMP_FREE(StorageTmp->mteTriggerTest);
1628 StorageTmp->mteTriggerTest = tmpvar;
1629 StorageTmp->mteTriggerTestLen = tmplen;
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!
1641 return SNMP_ERR_NOERROR;
1647 write_mteTriggerSampleType(int action,
1649 u_char var_val_type,
1651 u_char * statP, oid * name, size_t name_len)
1654 struct mteTriggerTable_data *StorageTmp = NULL;
1656 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1660 DEBUGMSGTL(("mteTriggerTable",
1661 "write_mteTriggerSampleType entering action=%d... \n",
1664 header_complex(mteTriggerTableStorage, NULL,
1665 &name[sizeof(mteTriggerTable_variables_oid) /
1666 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1668 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1673 if (var_val_type != ASN_INTEGER) {
1675 "write to mteTriggerSampleType not ASN_INTEGER\n");
1676 return SNMP_ERR_WRONGTYPE;
1678 if (StorageTmp->storageType != ST_NONVOLATILE)
1679 return SNMP_ERR_NOTWRITABLE;
1685 * memory reseveration, final preparation...
1692 * Release any resources that have been allocated
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);
1710 * Back out any changes made in the ACTION case
1712 StorageTmp->mteTriggerSampleType = tmpvar;
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!
1724 return SNMP_ERR_NOERROR;
1730 write_mteTriggerValueID(int action,
1732 u_char var_val_type,
1734 u_char * statP, oid * name, size_t name_len)
1737 struct mteTriggerTable_data *StorageTmp = NULL;
1738 static size_t tmplen;
1740 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1744 DEBUGMSGTL(("mteTriggerTable",
1745 "write_mteTriggerValueID entering action=%d... \n",
1748 header_complex(mteTriggerTableStorage, NULL,
1749 &name[sizeof(mteTriggerTable_variables_oid) /
1750 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1752 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1757 if (var_val_type != ASN_OBJECT_ID) {
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;
1769 * memory reseveration, final preparation...
1776 * Release any resources that have been allocated
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,
1791 StorageTmp->mteTriggerValueIDLen = var_val_len / sizeof(oid);
1797 * Back out any changes made in the ACTION case
1799 SNMP_FREE(StorageTmp->mteTriggerValueID);
1800 StorageTmp->mteTriggerValueID = tmpvar;
1801 StorageTmp->mteTriggerValueIDLen = tmplen;
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?
1818 return SNMP_ERR_NOERROR;
1824 write_mteTriggerValueIDWildcard(int action,
1826 u_char var_val_type,
1829 oid * name, size_t name_len)
1832 struct mteTriggerTable_data *StorageTmp = NULL;
1834 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1838 DEBUGMSGTL(("mteTriggerTable",
1839 "write_mteTriggerValueIDWildcard entering action=%d... \n",
1842 header_complex(mteTriggerTableStorage, NULL,
1843 &name[sizeof(mteTriggerTable_variables_oid) /
1844 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1846 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1851 if (var_val_type != ASN_INTEGER) {
1853 "write to mteTriggerValueIDWildcard not ASN_INTEGER\n");
1854 return SNMP_ERR_WRONGTYPE;
1856 if (StorageTmp->storageType != ST_NONVOLATILE)
1857 return SNMP_ERR_NOTWRITABLE;
1863 * memory reseveration, final preparation...
1870 * Release any resources that have been allocated
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);
1888 * Back out any changes made in the ACTION case
1890 StorageTmp->mteTriggerValueIDWildcard = tmpvar;
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!
1902 return SNMP_ERR_NOERROR;
1908 write_mteTriggerTargetTag(int action,
1910 u_char var_val_type,
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;
1918 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
1922 DEBUGMSGTL(("mteTriggerTable",
1923 "write_mteTriggerTargetTag entering action=%d... \n",
1926 header_complex(mteTriggerTableStorage, NULL,
1927 &name[sizeof(mteTriggerTable_variables_oid) /
1928 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
1930 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
1935 if (var_val_type != ASN_OCTET_STR) {
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;
1947 * memory reseveration, final preparation...
1954 * Release any resources that have been allocated
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,
1969 StorageTmp->mteTriggerTargetTagLen = var_val_len;
1975 * Back out any changes made in the ACTION case
1977 SNMP_FREE(StorageTmp->mteTriggerTargetTag);
1978 StorageTmp->mteTriggerTargetTag = tmpvar;
1979 StorageTmp->mteTriggerTargetTagLen = tmplen;
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!
1991 return SNMP_ERR_NOERROR;
1997 write_mteTriggerContextName(int action,
1999 u_char var_val_type,
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;
2007 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2011 DEBUGMSGTL(("mteTriggerTable",
2012 "write_mteTriggerContextName entering action=%d... \n",
2015 header_complex(mteTriggerTableStorage, NULL,
2016 &name[sizeof(mteTriggerTable_variables_oid) /
2017 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2019 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2024 if (var_val_type != ASN_OCTET_STR) {
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;
2036 * memory reseveration, final preparation...
2043 * Release any resources that have been allocated
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,
2058 StorageTmp->mteTriggerContextNameLen = var_val_len;
2064 * Back out any changes made in the ACTION case
2066 SNMP_FREE(StorageTmp->mteTriggerContextName);
2067 StorageTmp->mteTriggerContextName = tmpvar;
2068 StorageTmp->mteTriggerContextNameLen = tmplen;
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!
2080 return SNMP_ERR_NOERROR;
2086 write_mteTriggerContextNameWildcard(int action,
2088 u_char var_val_type,
2091 oid * name, size_t name_len)
2094 struct mteTriggerTable_data *StorageTmp = NULL;
2096 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2100 DEBUGMSGTL(("mteTriggerTable",
2101 "write_mteTriggerContextNameWildcard entering action=%d... \n",
2104 header_complex(mteTriggerTableStorage, NULL,
2105 &name[sizeof(mteTriggerTable_variables_oid) /
2106 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2108 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2113 if (var_val_type != ASN_INTEGER) {
2115 "write to mteTriggerContextNameWildcard not ASN_INTEGER\n");
2116 return SNMP_ERR_WRONGTYPE;
2118 if (StorageTmp->storageType != ST_NONVOLATILE)
2119 return SNMP_ERR_NOTWRITABLE;
2125 * memory reseveration, final preparation...
2132 * Release any resources that have been allocated
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);
2150 * Back out any changes made in the ACTION case
2152 StorageTmp->mteTriggerContextNameWildcard = tmpvar;
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!
2164 return SNMP_ERR_NOERROR;
2170 write_mteTriggerFrequency(int action,
2172 u_char var_val_type,
2174 u_char * statP, oid * name, size_t name_len)
2177 struct mteTriggerTable_data *StorageTmp = NULL;
2179 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2183 DEBUGMSGTL(("mteTriggerTable",
2184 "write_mteTriggerFrequency entering action=%d... \n",
2187 header_complex(mteTriggerTableStorage, NULL,
2188 &name[sizeof(mteTriggerTable_variables_oid) /
2189 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2191 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2196 if (var_val_type != ASN_UNSIGNED) {
2198 "write to mteTriggerFrequency not ASN_UNSIGNED\n");
2199 return SNMP_ERR_WRONGTYPE;
2201 if (StorageTmp->storageType != ST_NONVOLATILE)
2202 return SNMP_ERR_NOTWRITABLE;
2208 * memory reseveration, final preparation...
2215 * Release any resources that have been allocated
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);
2233 * Back out any changes made in the ACTION case
2235 StorageTmp->mteTriggerFrequency = tmpvar;
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);
2250 return SNMP_ERR_NOERROR;
2256 write_mteTriggerObjectsOwner(int action,
2258 u_char var_val_type,
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;
2266 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2270 DEBUGMSGTL(("mteTriggerTable",
2271 "write_mteTriggerObjectsOwner entering action=%d... \n",
2274 header_complex(mteTriggerTableStorage, NULL,
2275 &name[sizeof(mteTriggerTable_variables_oid) /
2276 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2278 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2283 if (var_val_type != ASN_OCTET_STR) {
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;
2295 * memory reseveration, final preparation...
2302 * Release any resources that have been allocated
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,
2317 StorageTmp->mteTriggerObjectsOwnerLen = var_val_len;
2323 * Back out any changes made in the ACTION case
2325 SNMP_FREE(StorageTmp->mteTriggerObjectsOwner);
2326 StorageTmp->mteTriggerObjectsOwner = tmpvar;
2327 StorageTmp->mteTriggerObjectsOwnerLen = tmplen;
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!
2339 return SNMP_ERR_NOERROR;
2345 write_mteTriggerObjects(int action,
2347 u_char var_val_type,
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;
2355 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2359 DEBUGMSGTL(("mteTriggerTable",
2360 "write_mteTriggerObjects entering action=%d... \n",
2363 header_complex(mteTriggerTableStorage, NULL,
2364 &name[sizeof(mteTriggerTable_variables_oid) /
2365 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2367 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2372 if (var_val_type != ASN_OCTET_STR) {
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;
2384 * memory reseveration, final preparation...
2391 * Release any resources that have been allocated
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,
2406 StorageTmp->mteTriggerObjectsLen = var_val_len;
2412 * Back out any changes made in the ACTION case
2414 SNMP_FREE(StorageTmp->mteTriggerObjects);
2415 StorageTmp->mteTriggerObjects = tmpvar;
2416 StorageTmp->mteTriggerObjectsLen = tmplen;
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!
2428 return SNMP_ERR_NOERROR;
2434 write_mteTriggerEnabled(int action,
2436 u_char var_val_type,
2438 u_char * statP, oid * name, size_t name_len)
2441 struct mteTriggerTable_data *StorageTmp = NULL;
2443 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2447 DEBUGMSGTL(("mteTriggerTable",
2448 "write_mteTriggerEnabled entering action=%d... \n",
2451 header_complex(mteTriggerTableStorage, NULL,
2452 &name[sizeof(mteTriggerTable_variables_oid) /
2453 sizeof(oid) + 3 - 1], &newlen, 1, NULL,
2455 return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
2460 if (var_val_type != ASN_INTEGER) {
2462 "write to mteTriggerEnabled not ASN_INTEGER\n");
2463 return SNMP_ERR_WRONGTYPE;
2465 if (StorageTmp->storageType != ST_NONVOLATILE)
2466 return SNMP_ERR_NOTWRITABLE;
2472 * memory reseveration, final preparation...
2479 * Release any resources that have been allocated
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);
2497 * Back out any changes made in the ACTION case
2499 StorageTmp->mteTriggerEnabled = tmpvar;
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);
2517 return SNMP_ERR_NOERROR;
2526 write_mteTriggerEntryStatus(int action,
2528 u_char var_val_type,
2530 u_char * statP, oid * name, size_t name_len)
2532 struct mteTriggerTable_data *StorageTmp = NULL;
2533 static struct mteTriggerTable_data *StorageNew, *StorageDel;
2535 name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2537 static int old_value;
2539 static netsnmp_variable_list *vars, *vp;
2540 struct header_complex_index *hciptr;
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) {
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;
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;
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;
2628 * memory reseveration, final preparation...
2630 if (StorageTmp == 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
2645 [sizeof(mteTriggerTable_variables_oid) / sizeof(oid) +
2646 2]), newlen, vars) != SNMPERR_SUCCESS) {
2648 * XXX: free, zero vars
2650 return SNMP_ERR_INCONSISTENTNAME;
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,
2666 StorageNew->mteTriggerName[vp->val_len] = '\0';
2667 StorageNew->mteTriggerNameLen = vp->val_len;
2669 vp = vp->next_variable;
2671 StorageNew->mteTriggerEntryStatus = set_value;
2683 * XXX: free, zero vars
2686 * Release any resources that have been allocated
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
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) {
2715 old_value = StorageTmp->mteTriggerEntryStatus;
2716 StorageTmp->mteTriggerEntryStatus = *((long *) var_val);
2719 * destroy... extract it for now
2722 header_complex_find_entry(mteTriggerTableStorage,
2725 header_complex_extract_entry(&mteTriggerTableStorage,
2735 * Back out any changes made in the ACTION case
2737 if (StorageTmp == NULL) {
2739 * row creation, so remove it again
2742 header_complex_find_entry(mteTriggerTableStorage,
2745 header_complex_extract_entry(&mteTriggerTableStorage,
2750 } else if (StorageDel != NULL) {
2752 * row deletion, so add it again
2754 mteTriggerTable_add(StorageDel);
2756 StorageTmp->mteTriggerEntryStatus = old_value;
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);
2772 * XXX: free it, its dead
2776 && StorageTmp->mteTriggerEntryStatus == RS_CREATEANDGO) {
2777 StorageTmp->mteTriggerEntryStatus = RS_ACTIVE;
2778 } else if (StorageTmp &&
2779 StorageTmp->mteTriggerEntryStatus ==
2781 StorageTmp->mteTriggerEntryStatus = RS_NOTINSERVICE;
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;
2794 "snmpTriggerTable: can't get master session for authentication params\n");
2796 pdu = asp->orig_pdu;
2799 "snmpTriggerTable: can't get master pdu for authentication params\n");
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;
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;
2834 StorageTmp->pdu_securityName = NULL;
2835 StorageTmp->pdu_securityNameLen = 0;
2837 StorageTmp->have_copied_auth_info = 1;
2842 StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE &&
2843 StorageTmp->mteTriggerEntryStatus == RS_ACTIVE)
2844 mte_enable_trigger(StorageTmp);
2847 return SNMP_ERR_NOERROR;
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,
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;
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));
2875 snmp_varlist_add_variable(&var_list, mteHotTrigger,
2876 sizeof(mteHotTrigger) / sizeof(oid),
2878 (u_char *) item->mteTriggerName,
2879 item->mteTriggerNameLen);
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 */
2890 snmp_varlist_add_variable(&var_list, mteHotContextName,
2891 sizeof(mteHotContextName) / sizeof(oid),
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) {
2905 snmp_varlist_add_variable(&var_list, mteFailedReason,
2906 sizeof(mteFailedReason) / sizeof(oid),
2907 ASN_INTEGER, (u_char *) value,
2913 snmp_varlist_add_variable(&var_list, mteHotValue,
2914 sizeof(mteHotValue) / sizeof(oid),
2915 ASN_INTEGER, (u_char *) 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): ",
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);
2946 last_state_clean(void *data)
2948 struct last_state *cleanme = (struct last_state *) data;
2949 SNMP_FREE(cleanme->value);
2954 * retrieves requested info in pdu from the current target
2957 mte_get_response(struct mteTriggerTable_data *item, netsnmp_pdu *pdu)
2959 netsnmp_pdu *response = NULL;
2961 char buf[SPRINT_MAX_LEN];
2966 pdu->errstat = SNMPERR_SUCCESS;
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) {
3004 snmp_error(mte_callback_sess, 0, 0, &errstr);
3006 DEBUGMSGTL(("mteTriggerTable",
3007 "Error received: status=%d, sess_error=%s, pduerr=%d/%s, pdu version=%d\n",
3010 snmp_api_errstring(response->errstat),
3011 response->version));
3013 DEBUGMSGTL(("mteTriggerTable",
3014 "Error received: status=%d, sess_error=%s [no response pointer]\n",
3019 return NULL; /* XXX: proper failure, trap sent, etc */
3023 * remote target list
3029 if (response->variables)
3030 snprint_variable(buf, sizeof(buf), response->variables->name,
3031 response->variables->name_length,
3032 response->variables);
3034 strcpy(buf, "empty");
3035 buf[sizeof(buf) - 1] = '\0';
3036 DEBUGMSGTL(("mteTriggerTable", "got a variables: %s\n", buf));
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)
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 */
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,
3086 sizeof(sysUpTimeInstance) / sizeof(oid)) == 0)) {
3087 DEBUGMSGTL(("mte_disco",
3088 "discoID either zero-length or sysUpTimeInstance\n"));
3090 if (item->mteTriggerValueIDWildcard == TV_TRUE) {
3091 pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
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
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"));
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"));
3120 *((unsigned long *) response->variables->val.
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);
3134 item->prevDiscoTicks = discoTicks;
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 ==
3144 || response->variables->type ==
3145 SNMP_ENDOFMIBVIEW)) {
3147 * noSuchName I guess.
3154 DEBUGMSGTL(("mte_disco",
3155 "failure getting discoID\n"));
3156 snmp_free_pdu(response);
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);
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,
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"));
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;
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;
3223 snmp_alarm_unregister(clientreg);
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;
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);
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);
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."
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));
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);
3312 old_value = laststate->value;
3313 lastbool = laststate->lastbool;
3314 lastthresh = laststate->lastthreshold;
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 &&
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
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);
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
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);
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);
3386 * An error notification has already been sent; just bail
3390 * XXX: should save values here?
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));
3401 x = *((long *) value) - *((long *) old_value);
3404 x = *((long *) value);
3407 switch (item->mteTriggerBooleanComparison) {
3408 case MTETRIGGERBOOLEANCOMPARISON_UNEQUAL:
3409 boolresult = (x != item->mteTriggerBooleanValue);
3412 case MTETRIGGERBOOLEANCOMPARISON_EQUAL:
3413 boolresult = (x == item->mteTriggerBooleanValue);
3416 case MTETRIGGERBOOLEANCOMPARISON_LESS:
3417 boolresult = (x < item->mteTriggerBooleanValue);
3420 case MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL:
3421 boolresult = (x <= item->mteTriggerBooleanValue);
3424 case MTETRIGGERBOOLEANCOMPARISON_GREATER:
3425 boolresult = (x > item->mteTriggerBooleanValue);
3428 case MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL:
3429 boolresult = (x >= item->mteTriggerBooleanValue);
3433 snmp_log(LOG_WARNING,
3434 "illegal value in mteTriggerBooleanComparison object: %d",
3435 item->mteTriggerBooleanComparison);
3436 boolresult = item->lastboolresult; /* to fail next test */
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,
3449 run_mte_events(item, next_oid, next_oid_len,
3450 item->mteTriggerBooleanEventOwner,
3451 item->mteTriggerBooleanEvent);
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",
3464 mteTriggerBooleanComparison),
3465 item->mteTriggerBooleanValue, boolresult));
3469 * Deal with threshold tests. XXX: doesn't handle "delta-type"
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);
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);
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?
3557 new_last_state->lastthreshold = lastthresh;
3562 * extract from old hc storage
3565 header_complex_extract_entry(&item->hc_storage_old,
3566 header_complex_find_entry(item->
3570 last_state_clean(laststate);
3574 * We are now done with the response PDU.
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;
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;
3622 mte_enable_trigger(struct mteTriggerTable_data *item)
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));
3635 snmp_alarm_register(item->mteTriggerFrequency, SA_REPEAT,
3636 mte_run_trigger, item);
3641 mte_disable_trigger(struct mteTriggerTable_data *item)
3646 if (item->alarmreg) {
3647 DEBUGMSGTL(("mteTriggertable", "Disabling trigger for %s/%s\n",
3648 item->mteOwner, item->mteTriggerName));
3649 snmp_alarm_unregister(item->alarmreg);
3652 item->started = MTE_NOTSTARTED;