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
;