| /* |
| * This file was generated by mib2c and is intended for use as |
| * a mib module for the ucd-snmp snmpd agent. |
| */ |
| |
| |
| /* |
| * This should always be included first before anything else |
| */ |
| #include <net-snmp/net-snmp-config.h> |
| #include <net-snmp/net-snmp-features.h> |
| #if HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| #if HAVE_STRING_H |
| #include <string.h> |
| #else |
| #include <strings.h> |
| #endif |
| #ifdef HAVE_LIMITS_H |
| #include <limits.h> |
| #endif |
| |
| netsnmp_feature_require(mib_snprint_variable) |
| netsnmp_feature_require(tdomain_support) |
| netsnmp_feature_require(check_vb_uint) |
| netsnmp_feature_require(string_time_to_secs) |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| netsnmp_feature_require(header_complex_find_entry) |
| #endif /* NETSNMP_NO_WRITE_SUPPORT */ |
| |
| /* |
| * minimal include directives |
| */ |
| #include <net-snmp/net-snmp-includes.h> |
| #include <net-snmp/agent/net-snmp-agent-includes.h> |
| |
| #include "header_complex.h" |
| #include "mteTriggerTable.h" |
| #include "mteTriggerBooleanTable.h" |
| #include "mteTriggerDeltaTable.h" |
| #include "mteTriggerExistenceTable.h" |
| #include "mteTriggerThresholdTable.h" |
| #include "mteEventTable.h" |
| #include "mteObjectsTable.h" |
| |
| /* |
| * mteTriggerTable_variables_oid: |
| * this is the top level oid that we want to register under. This |
| * is essentially a prefix, with the suffix appearing in the |
| * variable below. |
| */ |
| |
| /* |
| * trap definitions |
| */ |
| oid mteTriggerFired[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 1 }; |
| oid mteTriggerRising[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 2 }; |
| oid mteTriggerFalling[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 3 }; |
| oid mteTriggerFailure[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 4 }; |
| oid mteEventSetFailure[] = { 1, 3, 6, 1, 2, 1, 88, 2, 0, 5 }; |
| |
| /* |
| * trap objects |
| */ |
| oid mteHotTrigger[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 1 }; |
| oid mteHotTargetName[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 2 }; |
| oid mteHotContextName[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 3 }; |
| oid mteHotOID[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 4 }; |
| oid mteHotValue[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 5 }; |
| oid mteFailedReason[] = { 1, 3, 6, 1, 2, 1, 88, 2, 1, 6 }; |
| |
| /* |
| * For discontinuity checking. |
| */ |
| oid sysUpTimeInstance[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 }; |
| |
| oid mteTriggerTable_variables_oid[] = |
| { 1, 3, 6, 1, 2, 1, 88, 1, 2, 2 }; |
| |
| |
| /* |
| * variable2 mteTriggerTable_variables: |
| * this variable defines function callbacks and type return information |
| * for the mteTriggerTable mib section |
| */ |
| |
| |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| struct variable2 mteTriggerTable_variables[] = { |
| /* |
| * magic number , variable type , ro/rw , callback fn , L, oidsuffix |
| */ |
| #define MTETRIGGERCOMMENT 5 |
| {MTETRIGGERCOMMENT, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 3}}, |
| #define MTETRIGGERTEST 6 |
| {MTETRIGGERTEST, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 4}}, |
| #define MTETRIGGERSAMPLETYPE 7 |
| {MTETRIGGERSAMPLETYPE, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 5}}, |
| #define MTETRIGGERVALUEID 8 |
| {MTETRIGGERVALUEID, ASN_OBJECT_ID, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 6}}, |
| #define MTETRIGGERVALUEIDWILDCARD 9 |
| {MTETRIGGERVALUEIDWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 7}}, |
| #define MTETRIGGERTARGETTAG 10 |
| {MTETRIGGERTARGETTAG, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 8}}, |
| #define MTETRIGGERCONTEXTNAME 11 |
| {MTETRIGGERCONTEXTNAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 9}}, |
| #define MTETRIGGERCONTEXTNAMEWILDCARD 12 |
| {MTETRIGGERCONTEXTNAMEWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 10}}, |
| #define MTETRIGGERFREQUENCY 13 |
| {MTETRIGGERFREQUENCY, ASN_UNSIGNED, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 11}}, |
| #define MTETRIGGEROBJECTSOWNER 14 |
| {MTETRIGGEROBJECTSOWNER, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 12}}, |
| #define MTETRIGGEROBJECTS 15 |
| {MTETRIGGEROBJECTS, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 13}}, |
| #define MTETRIGGERENABLED 16 |
| {MTETRIGGERENABLED, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 14}}, |
| #define MTETRIGGERENTRYSTATUS 17 |
| {MTETRIGGERENTRYSTATUS, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, |
| var_mteTriggerTable, 2, {1, 15}}, |
| }; |
| #else /* !NETSNMP_NO_WRITE_SUPPORT */ |
| struct variable2 mteTriggerTable_variables[] = { |
| /* |
| * magic number , variable type , ro/rw , callback fn , L, oidsuffix |
| */ |
| #define MTETRIGGERCOMMENT 5 |
| {MTETRIGGERCOMMENT, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 3}}, |
| #define MTETRIGGERTEST 6 |
| {MTETRIGGERTEST, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 4}}, |
| #define MTETRIGGERSAMPLETYPE 7 |
| {MTETRIGGERSAMPLETYPE, ASN_INTEGER, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 5}}, |
| #define MTETRIGGERVALUEID 8 |
| {MTETRIGGERVALUEID, ASN_OBJECT_ID, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 6}}, |
| #define MTETRIGGERVALUEIDWILDCARD 9 |
| {MTETRIGGERVALUEIDWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 7}}, |
| #define MTETRIGGERTARGETTAG 10 |
| {MTETRIGGERTARGETTAG, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 8}}, |
| #define MTETRIGGERCONTEXTNAME 11 |
| {MTETRIGGERCONTEXTNAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 9}}, |
| #define MTETRIGGERCONTEXTNAMEWILDCARD 12 |
| {MTETRIGGERCONTEXTNAMEWILDCARD, ASN_INTEGER, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 10}}, |
| #define MTETRIGGERFREQUENCY 13 |
| {MTETRIGGERFREQUENCY, ASN_UNSIGNED, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 11}}, |
| #define MTETRIGGEROBJECTSOWNER 14 |
| {MTETRIGGEROBJECTSOWNER, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 12}}, |
| #define MTETRIGGEROBJECTS 15 |
| {MTETRIGGEROBJECTS, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 13}}, |
| #define MTETRIGGERENABLED 16 |
| {MTETRIGGERENABLED, ASN_INTEGER, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 14}}, |
| #define MTETRIGGERENTRYSTATUS 17 |
| {MTETRIGGERENTRYSTATUS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY, |
| var_mteTriggerTable, 2, {1, 15}}, |
| }; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| |
| /* |
| * (L = length of the oidsuffix) |
| */ |
| |
| |
| /* |
| * global storage of our data, saved in and configured by header_complex() |
| */ |
| struct header_complex_index *mteTriggerTableStorage = NULL; |
| |
| netsnmp_session *mte_callback_sess = NULL; |
| extern int callback_master_num; |
| |
| /* |
| * init_mteTriggerTable(): |
| * Initialization routine. This is called when the agent starts up. |
| * At a minimum, registration of your variables should take place here. |
| */ |
| void |
| init_mteTriggerTable(void) |
| { |
| DEBUGMSGTL(("mteTriggerTable", "initializing... ")); |
| |
| #ifndef NETSNMP_TRANSPORT_CALLBACK_DOMAIN |
| snmp_log(LOG_WARNING,"mteTriggerTable has been disabled because " |
| "the callback transport is not available.\n"); |
| return; |
| #endif |
| |
| /* |
| * register ourselves with the agent to handle our mib tree |
| */ |
| REGISTER_MIB("mteTriggerTable", mteTriggerTable_variables, variable2, |
| mteTriggerTable_variables_oid); |
| |
| |
| /* |
| * register our config handler(s) to deal with registrations |
| */ |
| snmpd_register_config_handler("mteTriggerTable", parse_mteTriggerTable, |
| NULL, NULL); |
| |
| snmpd_register_config_handler("monitor", parse_simple_monitor, NULL, |
| "[options] monitor_expression [see \"man snmpd.conf\"]"); |
| snmpd_register_config_handler("defaultMonitors", |
| parse_default_monitors, NULL, "yes|no"); |
| |
| /* |
| * we need to be called back later to store our data |
| */ |
| snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA, |
| store_mteTriggerTable, NULL); |
| |
| |
| /* |
| * place any other initialization junk you need here |
| */ |
| se_add_pair_to_slist("mteBooleanOperators", strdup("!="), |
| MTETRIGGERBOOLEANCOMPARISON_UNEQUAL); |
| se_add_pair_to_slist("mteBooleanOperators", strdup("=="), |
| MTETRIGGERBOOLEANCOMPARISON_EQUAL); |
| se_add_pair_to_slist("mteBooleanOperators", strdup("<"), |
| MTETRIGGERBOOLEANCOMPARISON_LESS); |
| se_add_pair_to_slist("mteBooleanOperators", strdup("<="), |
| MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL); |
| se_add_pair_to_slist("mteBooleanOperators", strdup(">"), |
| MTETRIGGERBOOLEANCOMPARISON_GREATER); |
| se_add_pair_to_slist("mteBooleanOperators", strdup(">="), |
| MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL); |
| |
| DEBUGMSGTL(("mteTriggerTable", "done.\n")); |
| } |
| |
| struct mteTriggerTable_data * |
| create_mteTriggerTable_data(void) |
| { |
| struct mteTriggerTable_data *StorageNew; |
| |
| StorageNew = SNMP_MALLOC_STRUCT(mteTriggerTable_data); |
| |
| /* |
| * fill in default row values here into StorageNew |
| */ |
| /* |
| * fill in values for all tables (even if not |
| * appropriate), since its easier to do here than anywhere |
| * else |
| */ |
| StorageNew->mteTriggerComment = strdup(""); |
| StorageNew->mteTriggerTest = strdup(""); |
| StorageNew->mteTriggerTest[0] |= (char) MTETRIGGERTEST_BOOLEAN; |
| StorageNew->mteTriggerTestLen = 1; |
| StorageNew->mteTriggerSampleType = MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE; |
| StorageNew->mteTriggerValueID = calloc(1, sizeof(oid) * sizeof(2)); /* 0.0 */ |
| StorageNew->mteTriggerValueIDLen = 2; |
| StorageNew->mteTriggerValueIDWildcard = |
| MTETRIGGERVALUEIDWILDCARD_FALSE; |
| StorageNew->mteTriggerTargetTag = strdup(""); |
| StorageNew->mteTriggerContextName = strdup(""); |
| StorageNew->mteTriggerContextNameWildcard = |
| MTETRIGGERCONTEXTNAMEWILDCARD_FALSE; |
| StorageNew->mteTriggerFrequency = 600; |
| StorageNew->mteTriggerObjectsOwner = strdup(""); |
| StorageNew->mteTriggerObjects = strdup(""); |
| StorageNew->mteTriggerEnabled = MTETRIGGERENABLED_FALSE; |
| StorageNew->mteTriggerDeltaDiscontinuityID = |
| netsnmp_memdup(sysUpTimeInstance, sizeof(sysUpTimeInstance)); |
| StorageNew->mteTriggerDeltaDiscontinuityIDLen = |
| sizeof(sysUpTimeInstance) / sizeof(oid); |
| StorageNew->mteTriggerDeltaDiscontinuityIDWildcard = TV_FALSE; |
| StorageNew->mteTriggerDeltaDiscontinuityIDType = |
| MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMETICKS; |
| StorageNew->mteTriggerExistenceTest = strdup(""); |
| StorageNew->mteTriggerExistenceTest[0] = |
| (char) (MTETRIGGEREXISTENCETEST_PRESENT | |
| MTETRIGGEREXISTENCETEST_ABSENT); |
| StorageNew->mteTriggerExistenceTestLen = 1; |
| StorageNew->mteTriggerExistenceStartup = strdup(""); |
| StorageNew->mteTriggerExistenceStartup[0] = |
| (char) (MTETRIGGEREXISTENCESTARTUP_PRESENT); |
| StorageNew->mteTriggerExistenceStartupLen = 1; |
| StorageNew->mteTriggerExistenceObjectsOwner = strdup(""); |
| StorageNew->mteTriggerExistenceObjects = strdup(""); |
| StorageNew->mteTriggerExistenceEventOwner = strdup(""); |
| StorageNew->mteTriggerExistenceEvent = strdup(""); |
| StorageNew->mteTriggerBooleanComparison = |
| MTETRIGGERBOOLEANCOMPARISON_UNEQUAL; |
| StorageNew->mteTriggerBooleanStartup = MTETRIGGERBOOLEANSTARTUP_TRUE; |
| StorageNew->mteTriggerBooleanObjectsOwner = strdup(""); |
| StorageNew->mteTriggerBooleanObjects = strdup(""); |
| StorageNew->mteTriggerBooleanEventOwner = strdup(""); |
| StorageNew->mteTriggerBooleanEvent = strdup(""); |
| StorageNew->mteTriggerThresholdStartup = |
| MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING; |
| StorageNew->mteTriggerThresholdObjectsOwner = strdup(""); |
| StorageNew->mteTriggerThresholdObjects = strdup(""); |
| StorageNew->mteTriggerThresholdRisingEventOwner = strdup(""); |
| StorageNew->mteTriggerThresholdRisingEvent = strdup(""); |
| StorageNew->mteTriggerThresholdFallingEventOwner = strdup(""); |
| StorageNew->mteTriggerThresholdFallingEvent = strdup(""); |
| StorageNew->mteTriggerThresholdDeltaRisingEventOwner = strdup(""); |
| StorageNew->mteTriggerThresholdDeltaRisingEvent = strdup(""); |
| StorageNew->mteTriggerThresholdDeltaFallingEventOwner = strdup(""); |
| StorageNew->mteTriggerThresholdDeltaFallingEvent = strdup(""); |
| StorageNew->lastboolresult = -1; |
| StorageNew->storageType = ST_NONVOLATILE; |
| StorageNew->prevDiscoTicks = 0; |
| StorageNew->prevUptimeTicks = 0; |
| return StorageNew; |
| } |
| |
| /* |
| * mteTriggerTable_add(): adds a structure node to our data set |
| */ |
| int |
| mteTriggerTable_add(struct mteTriggerTable_data *thedata) |
| { |
| netsnmp_variable_list *vars = NULL; |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", "adding data... ")); |
| /* |
| * add the index variables to the varbind list, which is |
| * used by header_complex to index the data |
| */ |
| |
| |
| snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->mteOwner, thedata->mteOwnerLen); /* mteOwner */ |
| snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OCTET_STR, (char *) thedata->mteTriggerName, thedata->mteTriggerNameLen); /* mteTriggerName */ |
| |
| |
| |
| header_complex_add_data(&mteTriggerTableStorage, vars, thedata); |
| DEBUGMSGTL(("mteTriggerTable", "registered an entry\n")); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", "done.\n")); |
| return SNMPERR_SUCCESS; |
| } |
| |
| |
| #define MTE_PROCESS_LINE(line) \ |
| snprintf(buf, SPRINT_MAX_LEN, "-u %s %s", mte_default_user, line); \ |
| parse_simple_monitor("monitor", buf); |
| |
| void |
| parse_default_monitors(const char *token, char *line) |
| { |
| char buf[SPRINT_MAX_LEN]; |
| char *mte_default_user = |
| netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME); |
| |
| if (strncmp(line, "yes", 3) == 0) { |
| |
| DEBUGMSGTL(("mteTriggerTable", "registering default monitors\n")); |
| |
| if (mte_default_user == NULL) { |
| config_perror |
| ("You must specify a user name first using the agentSecName token\n"); |
| return; |
| } |
| |
| /* |
| * we don't include many additional objects here as most of |
| * the error messages are complete with the needed |
| * information |
| */ |
| MTE_PROCESS_LINE |
| ("-o prNames -o prErrMessage \"process table\" prErrorFlag != 0"); |
| MTE_PROCESS_LINE |
| ("-o memErrorName -o memSwapErrorMsg \"memory\" memSwapError != 0"); |
| MTE_PROCESS_LINE |
| ("-o extNames -o extOutput \"extTable\" extResult != 0"); |
| MTE_PROCESS_LINE |
| ("-o dskPath -o dskErrorMsg \"dskTable\" dskErrorFlag != 0"); |
| MTE_PROCESS_LINE |
| ("-o laNames -o laErrMessage \"laTable\" laErrorFlag != 0"); |
| MTE_PROCESS_LINE |
| ("-o fileName -o fileErrorMsg \"fileTable\" fileErrorFlag != 0"); |
| /* |
| * this one is not *all* that useful, because the error is |
| * only kept for 30 seconds at most. Maybe scan it every 30 |
| * seconds, but I'm not doing so without seeking other peoples |
| * opinions first. |
| */ |
| MTE_PROCESS_LINE |
| ("-o snmperrErrMessage \"snmperrs\" snmperrErrorFlag != 0"); |
| } |
| } |
| |
| static int monitor_call_count = 0; |
| void |
| parse_simple_monitor(const char *token, char *line) |
| { |
| char buf[SPRINT_MAX_LEN], *cp, eventname[64]; |
| oid obuf[MAX_OID_LEN]; |
| size_t obufLen; |
| struct mteTriggerTable_data *StorageNew; |
| |
| monitor_call_count++; |
| eventname[0] = '\0'; |
| |
| StorageNew = create_mteTriggerTable_data(); |
| StorageNew->storageType = ST_READONLY; |
| StorageNew->mteTriggerEnabled = MTETRIGGERENABLED_TRUE; |
| StorageNew->mteTriggerEntryStatus = RS_ACTIVE; |
| StorageNew->mteTriggerValueIDWildcard = MTETRIGGERVALUEIDWILDCARD_TRUE; |
| StorageNew->mteTriggerBooleanStartup = MTETRIGGERBOOLEANSTARTUP_TRUE; |
| StorageNew->mteTriggerThresholdStartup = |
| MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING; |
| StorageNew->mteTriggerExistenceTest[0] = 0; |
| |
| /* |
| * owner = snmpd.conf, why not? |
| */ |
| StorageNew->mteOwner = strdup("snmpd.conf"); |
| StorageNew->mteOwnerLen = strlen(StorageNew->mteOwner); |
| StorageNew->pdu_version = SNMP_VERSION_3; |
| StorageNew->pdu_securityModel = SNMP_SEC_MODEL_USM; |
| StorageNew->pdu_securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV; |
| |
| cp = line; |
| |
| while (cp && *cp == '-') { |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| switch (buf[1]) { |
| case 't': |
| /* |
| * Threshold toggle |
| */ |
| StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_THRESHOLD; |
| break; |
| case 'i': |
| /* |
| * Single instance |
| */ |
| StorageNew->mteTriggerValueIDWildcard = MTETRIGGERVALUEIDWILDCARD_FALSE; |
| break; |
| case 'r': |
| if (cp) { |
| int freq; |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| freq = netsnmp_string_time_to_secs(buf); |
| if (freq == -1) { |
| config_perror("Invalid -r value\n"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| StorageNew->mteTriggerFrequency = (unsigend long) freq; |
| } else { |
| config_perror("No parameter after -r given\n"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| break; |
| case 'u': |
| if (cp) { |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| StorageNew->pdu_securityName = strdup(buf); |
| StorageNew->pdu_securityNameLen = strlen(buf); |
| } else { |
| config_perror("No parameter after -u given\n"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| break; |
| case 'e': |
| if (cp) { |
| cp = copy_nword(cp, eventname, sizeof(eventname)); |
| } else { |
| config_perror("No parameter after -e given\n"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| break; |
| case 'o': |
| /* |
| * oid |
| */ |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| obufLen = MAX_OID_LEN; |
| if (!snmp_parse_oid(buf, obuf, &obufLen)) { |
| netsnmp_config_error("unable to parse oid: %s", buf); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| sprintf(buf, "snmpd.conf%d", monitor_call_count); |
| mte_add_object_to_table("snmpd.conf", buf, obuf, obufLen, 1); |
| |
| if (StorageNew->mteTriggerObjectsOwnerLen == 0) { |
| SNMP_FREE(StorageNew->mteTriggerObjectsOwner); |
| StorageNew->mteTriggerObjectsOwner = strdup("snmpd.conf"); |
| StorageNew->mteTriggerObjectsOwnerLen = |
| strlen("snmpd.conf"); |
| } |
| |
| if (StorageNew->mteTriggerObjectsLen == 0) { |
| SNMP_FREE(StorageNew->mteTriggerObjects); |
| StorageNew->mteTriggerObjects = strdup(buf); |
| StorageNew->mteTriggerObjectsLen = strlen(buf); |
| } |
| break; |
| } |
| } |
| |
| if (StorageNew->pdu_securityNameLen == 0) { |
| char *mte_default_user = |
| netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_INTERNAL_SECNAME); |
| if (mte_default_user) { |
| StorageNew->pdu_securityName = strdup(mte_default_user); |
| StorageNew->pdu_securityNameLen = strlen(mte_default_user); |
| } else { |
| config_perror("-u USER parameter required\n"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| } |
| |
| /* |
| * name |
| */ |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| if (!cp) { |
| config_perror("illegal monitor: no name specified"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| |
| StorageNew->mteTriggerName = strdup(buf); |
| StorageNew->mteTriggerNameLen = strlen(StorageNew->mteTriggerName); |
| |
| /* |
| * oid |
| */ |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| obufLen = MAX_OID_LEN; |
| if (!snmp_parse_oid(buf, obuf, &obufLen)) { |
| netsnmp_config_error("unable to parse oid: %s", buf); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| if (StorageNew->mteTriggerValueID) |
| free(StorageNew->mteTriggerValueID); |
| StorageNew->mteTriggerValueID = snmp_duplicate_objid(obuf, obufLen); |
| StorageNew->mteTriggerValueIDLen = obufLen; |
| |
| if (StorageNew->mteTriggerTest[0] == MTETRIGGERTEST_THRESHOLD) { |
| /* |
| * it's a threshold |
| * grab 'low' and 'high' params |
| */ |
| if (!cp) { |
| config_perror("no lower threshold value specified"); |
| } |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| StorageNew->mteTriggerThresholdFalling = strtol(buf, NULL, 0); |
| |
| if (!cp) { |
| config_perror("no upper threshold value specified"); |
| } |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| StorageNew->mteTriggerThresholdRising = strtol(buf, NULL, 0); |
| } else { |
| /* |
| * if nothing beyond here, it's an existence test |
| */ |
| if (!cp) { |
| StorageNew->mteTriggerTest[0] = (u_char)MTETRIGGERTEST_EXISTENCE; |
| if (eventname[0] != '\0') { |
| StorageNew->mteTriggerExistenceEventOwner = |
| strdup("snmpd.conf"); |
| StorageNew->mteTriggerExistenceEventOwnerLen = |
| strlen(StorageNew->mteTriggerExistenceEventOwner); |
| StorageNew->mteTriggerExistenceEvent = |
| strdup(eventname); |
| StorageNew->mteTriggerExistenceEventLen = |
| strlen(eventname); |
| } |
| mteTriggerTable_add(StorageNew); |
| return; |
| } |
| |
| /* |
| * assume boolean (need to deal with threshold statements) |
| */ |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| if ((StorageNew->mteTriggerBooleanComparison = |
| se_find_value_in_slist("mteBooleanOperators", buf)) == -1) { |
| config_perror("illegal boolean operator"); |
| return; |
| } |
| |
| /* |
| * XXX: add threshold |
| */ |
| StorageNew->mteTriggerTest[0] = MTETRIGGERTEST_BOOLEAN; |
| if (!cp) { |
| config_perror("no comparison value specified"); |
| /* |
| * XXX: free StorageNew |
| */ |
| return; |
| } |
| |
| cp = copy_nword(cp, buf, sizeof(buf)); |
| StorageNew->mteTriggerBooleanValue = strtol(buf, NULL, 0); |
| |
| if (eventname[0] != '\0') { |
| StorageNew->mteTriggerBooleanEventOwner = |
| strdup("snmpd.conf"); |
| StorageNew->mteTriggerBooleanEventOwnerLen = |
| strlen(StorageNew->mteTriggerBooleanEventOwner); |
| StorageNew->mteTriggerBooleanEvent = |
| strdup(eventname); |
| StorageNew->mteTriggerBooleanEventLen = |
| strlen(eventname); |
| } |
| } |
| mteTriggerTable_add(StorageNew); |
| mte_enable_trigger(StorageNew); |
| |
| DEBUGMSGTL(("mteTriggerTable", "added simple monitor: %s\n", |
| StorageNew->mteTriggerName)); |
| } /* parse_simple_monitor */ |
| |
| |
| /* |
| * parse_mteTriggerTable(): |
| * parses .conf file entries needed to configure the mib. |
| */ |
| void |
| parse_mteTriggerTable(const char *token, char *line) |
| { |
| size_t tmpint; |
| oid *tmpoid = NULL; |
| struct mteTriggerTable_data *StorageTmp = |
| SNMP_MALLOC_STRUCT(mteTriggerTable_data); |
| |
| DEBUGMSGTL(("mteTriggerTable", "parsing config... ")); |
| |
| if (StorageTmp == NULL) { |
| config_perror("malloc failure"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, &StorageTmp->mteOwner, |
| &StorageTmp->mteOwnerLen); |
| if (StorageTmp->mteOwner == NULL) { |
| config_perror("invalid specification for mteOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerName, |
| &StorageTmp->mteTriggerNameLen); |
| if (StorageTmp->mteTriggerName == NULL) { |
| config_perror("invalid specification for mteTriggerName"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerComment, |
| &StorageTmp->mteTriggerCommentLen); |
| if (StorageTmp->mteTriggerComment == NULL) { |
| config_perror("invalid specification for mteTriggerComment"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerTest, |
| &StorageTmp->mteTriggerTestLen); |
| if (StorageTmp->mteTriggerTest == NULL) { |
| config_perror("invalid specification for mteTriggerTest"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerSampleType, &tmpint); |
| |
| line = |
| read_config_read_data(ASN_OBJECT_ID, line, |
| &StorageTmp->mteTriggerValueID, |
| &StorageTmp->mteTriggerValueIDLen); |
| if (StorageTmp->mteTriggerValueID == NULL) { |
| config_perror("invalid specification for mteTriggerValueID"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerValueIDWildcard, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerTargetTag, |
| &StorageTmp->mteTriggerTargetTagLen); |
| if (StorageTmp->mteTriggerTargetTag == NULL) { |
| config_perror("invalid specification for mteTriggerTargetTag"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerContextName, |
| &StorageTmp->mteTriggerContextNameLen); |
| if (StorageTmp->mteTriggerContextName == NULL) { |
| config_perror("invalid specification for mteTriggerContextName"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerContextNameWildcard, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_UNSIGNED, line, |
| &StorageTmp->mteTriggerFrequency, &tmpint); |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerObjectsOwner, |
| &StorageTmp->mteTriggerObjectsOwnerLen); |
| if (StorageTmp->mteTriggerObjectsOwner == NULL) { |
| config_perror("invalid specification for mteTriggerObjectsOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerObjects, |
| &StorageTmp->mteTriggerObjectsLen); |
| if (StorageTmp->mteTriggerObjects == NULL) { |
| config_perror("invalid specification for mteTriggerObjects"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerEnabled, &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerEntryStatus, &tmpint); |
| |
| /* |
| * delta table |
| */ |
| line = |
| read_config_read_data(ASN_OBJECT_ID, line, |
| &StorageTmp->mteTriggerDeltaDiscontinuityID, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityIDLen); |
| if (StorageTmp->mteTriggerDeltaDiscontinuityID == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerDeltaDiscontinuityID"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityIDWildcard, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityIDType, &tmpint); |
| |
| /* |
| * existence table |
| */ |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerExistenceTest, |
| &StorageTmp->mteTriggerExistenceTestLen); |
| if (StorageTmp->mteTriggerExistenceTest == NULL) { |
| config_perror("invalid specification for mteTriggerExistenceTest"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerExistenceStartup, |
| &StorageTmp->mteTriggerExistenceStartupLen); |
| if (StorageTmp->mteTriggerExistenceStartup == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerExistenceStartup"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerExistenceObjectsOwner, |
| &StorageTmp-> |
| mteTriggerExistenceObjectsOwnerLen); |
| if (StorageTmp->mteTriggerExistenceObjectsOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerExistenceObjectsOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerExistenceObjects, |
| &StorageTmp->mteTriggerExistenceObjectsLen); |
| if (StorageTmp->mteTriggerExistenceObjects == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerExistenceObjects"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerExistenceEventOwner, |
| &StorageTmp-> |
| mteTriggerExistenceEventOwnerLen); |
| if (StorageTmp->mteTriggerExistenceEventOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerExistenceEventOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerExistenceEvent, |
| &StorageTmp->mteTriggerExistenceEventLen); |
| if (StorageTmp->mteTriggerExistenceEvent == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerExistenceEvent"); |
| return; |
| } |
| |
| /* |
| * boolean table |
| */ |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerBooleanComparison, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerBooleanValue, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerBooleanStartup, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerBooleanObjectsOwner, |
| &StorageTmp-> |
| mteTriggerBooleanObjectsOwnerLen); |
| if (StorageTmp->mteTriggerBooleanObjectsOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerBooleanObjectsOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerBooleanObjects, |
| &StorageTmp->mteTriggerBooleanObjectsLen); |
| if (StorageTmp->mteTriggerBooleanObjects == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerBooleanObjects"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerBooleanEventOwner, |
| &StorageTmp->mteTriggerBooleanEventOwnerLen); |
| if (StorageTmp->mteTriggerBooleanEventOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerBooleanEventOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerBooleanEvent, |
| &StorageTmp->mteTriggerBooleanEventLen); |
| if (StorageTmp->mteTriggerBooleanEvent == NULL) { |
| config_perror("invalid specification for mteTriggerBooleanEvent"); |
| return; |
| } |
| |
| /* |
| * threshold table |
| */ |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerThresholdStartup, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerThresholdRising, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerThresholdFalling, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerThresholdDeltaRising, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->mteTriggerThresholdDeltaFalling, |
| &tmpint); |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerThresholdObjectsOwner, |
| &StorageTmp-> |
| mteTriggerThresholdObjectsOwnerLen); |
| if (StorageTmp->mteTriggerThresholdObjectsOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdObjectsOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerThresholdObjects, |
| &StorageTmp->mteTriggerThresholdObjectsLen); |
| if (StorageTmp->mteTriggerThresholdObjects == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdObjects"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEventOwnerLen); |
| if (StorageTmp->mteTriggerThresholdRisingEventOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdRisingEventOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerThresholdRisingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEventLen); |
| if (StorageTmp->mteTriggerThresholdRisingEvent == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdRisingEvent"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEventOwnerLen); |
| if (StorageTmp->mteTriggerThresholdFallingEventOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdFallingEventOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->mteTriggerThresholdFallingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEventLen); |
| if (StorageTmp->mteTriggerThresholdFallingEvent == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdFallingEvent"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEventOwnerLen); |
| if (StorageTmp->mteTriggerThresholdDeltaRisingEventOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdDeltaRisingEventOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEventLen); |
| if (StorageTmp->mteTriggerThresholdDeltaRisingEvent == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdDeltaRisingEvent"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEventOwnerLen); |
| if (StorageTmp->mteTriggerThresholdDeltaFallingEventOwner == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdDeltaFallingEventOwner"); |
| return; |
| } |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEventLen); |
| if (StorageTmp->mteTriggerThresholdDeltaFallingEvent == NULL) { |
| config_perror |
| ("invalid specification for mteTriggerThresholdDeltaFallingEvent"); |
| return; |
| } |
| |
| /* |
| * local internal variables |
| */ |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->have_copied_auth_info, &tmpint); |
| if (StorageTmp->have_copied_auth_info) { |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->pdu_version, &tmpint); |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->pdu_securityModel, &tmpint); |
| line = |
| read_config_read_data(ASN_INTEGER, line, |
| &StorageTmp->pdu_securityLevel, &tmpint); |
| line = |
| read_config_read_data(ASN_OBJECT_ID, line, &tmpoid, &tmpint); |
| if (!netsnmp_tdomain_support |
| (tmpoid, tmpint, &StorageTmp->pdu_tDomain, |
| &StorageTmp->pdu_tDomainLen)) { |
| config_perror |
| ("unsupported transport domain for mteTriggerEntry"); |
| return; |
| } |
| if (tmpoid != NULL) { |
| free(tmpoid); |
| } |
| |
| /* |
| * can be NULL? Yes. |
| */ |
| line = read_config_read_data(ASN_OCTET_STR, line, |
| &(StorageTmp->pdu_transport), |
| &StorageTmp->pdu_transportLen); |
| |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->pdu_community, |
| &StorageTmp->pdu_community_len); |
| if (StorageTmp->pdu_community == NULL) { |
| config_perror("invalid specification for pdu_community"); |
| return; |
| } |
| line = |
| read_config_read_data(ASN_OCTET_STR, line, |
| &StorageTmp->pdu_securityName, |
| &StorageTmp->pdu_securityNameLen); |
| if (StorageTmp->pdu_securityName == NULL) { |
| config_perror("invalid specification for pdu_securityName"); |
| return; |
| } |
| } |
| StorageTmp->storageType = ST_NONVOLATILE; /* the only type stored */ |
| |
| mteTriggerTable_add(StorageTmp); |
| |
| /* |
| * technically this is too early |
| */ |
| if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE && |
| StorageTmp->mteTriggerEntryStatus == RS_ACTIVE) |
| mte_enable_trigger(StorageTmp); |
| |
| DEBUGMSGTL(("mteTriggerTable", "done.\n")); |
| } /* parse_mteTriggerTable */ |
| |
| |
| /* |
| * store_mteTriggerTable(): |
| * stores .conf file entries needed to configure the mib. |
| */ |
| int |
| store_mteTriggerTable(int majorID, int minorID, void *serverarg, |
| void *clientarg) |
| { |
| char line[SNMP_MAXBUF]; |
| char *cptr; |
| size_t tmpint; |
| struct mteTriggerTable_data *StorageTmp; |
| struct header_complex_index *hcindex; |
| |
| DEBUGMSGTL(("mteTriggerTable", "storing data... ")); |
| |
| for (hcindex = mteTriggerTableStorage; hcindex != NULL; |
| hcindex = hcindex->next) { |
| StorageTmp = (struct mteTriggerTable_data *) hcindex->data; |
| |
| |
| if (StorageTmp->storageType == ST_NONVOLATILE) { |
| |
| memset(line, 0, sizeof(line)); |
| strcat(line, "mteTriggerTable "); |
| cptr = line + strlen(line); |
| |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteOwner, |
| &StorageTmp->mteOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerName, |
| &StorageTmp->mteTriggerNameLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerComment, |
| &StorageTmp->mteTriggerCommentLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerTest, |
| &StorageTmp->mteTriggerTestLen); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->mteTriggerSampleType, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_OBJECT_ID, cptr, |
| &StorageTmp->mteTriggerValueID, |
| &StorageTmp->mteTriggerValueIDLen); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerValueIDWildcard, &tmpint); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerTargetTag, |
| &StorageTmp-> |
| mteTriggerTargetTagLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerContextName, |
| &StorageTmp-> |
| mteTriggerContextNameLen); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerContextNameWildcard, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_UNSIGNED, cptr, |
| &StorageTmp->mteTriggerFrequency, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerObjectsOwner, |
| &StorageTmp-> |
| mteTriggerObjectsOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerObjects, |
| &StorageTmp->mteTriggerObjectsLen); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->mteTriggerEnabled, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->mteTriggerEntryStatus, |
| &tmpint); |
| |
| /* |
| * delta table |
| */ |
| cptr = |
| read_config_store_data(ASN_OBJECT_ID, cptr, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityID, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityIDLen); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityIDWildcard, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerDeltaDiscontinuityIDType, |
| &tmpint); |
| |
| /* |
| * existence table |
| */ |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerExistenceTest, |
| &StorageTmp-> |
| mteTriggerExistenceTestLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerExistenceStartup, |
| &StorageTmp-> |
| mteTriggerExistenceStartupLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerExistenceObjectsOwner, |
| &StorageTmp-> |
| mteTriggerExistenceObjectsOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerExistenceObjects, |
| &StorageTmp-> |
| mteTriggerExistenceObjectsLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerExistenceEventOwner, |
| &StorageTmp-> |
| mteTriggerExistenceEventOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerExistenceEvent, |
| &StorageTmp-> |
| mteTriggerExistenceEventLen); |
| |
| /* |
| * boolean table |
| */ |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerBooleanComparison, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->mteTriggerBooleanValue, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerBooleanStartup, &tmpint); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerBooleanObjectsOwner, |
| &StorageTmp-> |
| mteTriggerBooleanObjectsOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerBooleanObjects, |
| &StorageTmp-> |
| mteTriggerBooleanObjectsLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerBooleanEventOwner, |
| &StorageTmp-> |
| mteTriggerBooleanEventOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->mteTriggerBooleanEvent, |
| &StorageTmp-> |
| mteTriggerBooleanEventLen); |
| |
| /* |
| * threshold table |
| */ |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdStartup, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdRising, &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdFalling, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRising, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFalling, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdObjectsOwner, |
| &StorageTmp-> |
| mteTriggerThresholdObjectsOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdObjects, |
| &StorageTmp-> |
| mteTriggerThresholdObjectsLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEventOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdRisingEventLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEventOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdFallingEventLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEventOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaRisingEventLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEventOwner, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEventOwnerLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEvent, |
| &StorageTmp-> |
| mteTriggerThresholdDeltaFallingEventLen); |
| |
| /* |
| * local internal variables |
| */ |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->have_copied_auth_info, |
| &tmpint); |
| if (StorageTmp->have_copied_auth_info) { |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->pdu_version, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->pdu_securityModel, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_INTEGER, cptr, |
| &StorageTmp->pdu_securityLevel, |
| &tmpint); |
| cptr = |
| read_config_store_data(ASN_OBJECT_ID, cptr, |
| (void *)(&StorageTmp->pdu_tDomain), |
| &StorageTmp->pdu_tDomainLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->pdu_transport, |
| &StorageTmp->pdu_transportLen); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->pdu_community, |
| &StorageTmp->pdu_community_len); |
| cptr = |
| read_config_store_data(ASN_OCTET_STR, cptr, |
| &StorageTmp->pdu_securityName, |
| &StorageTmp-> |
| pdu_securityNameLen); |
| } |
| |
| snmpd_store_config(line); |
| } |
| } |
| DEBUGMSGTL(("mteTriggerTable", "done.\n")); |
| return SNMPERR_SUCCESS; |
| } |
| |
| |
| |
| |
| /* |
| * var_mteTriggerTable(): |
| * Handle this table separately from the scalar value case. |
| * The workings of this are basically the same as for var_mteTriggerTable above. |
| */ |
| unsigned char * |
| var_mteTriggerTable(struct variable *vp, |
| oid * name, |
| size_t * length, |
| int exact, |
| size_t * var_len, WriteMethod ** write_method) |
| { |
| |
| |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "var_mteTriggerTable: Entering... \n")); |
| |
| /* set default value */ |
| *write_method = NULL; |
| |
| /* |
| * this assumes you have registered all your data properly |
| */ |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, vp, name, length, exact, |
| var_len, write_method)) == NULL) { |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| if (vp->magic == MTETRIGGERENTRYSTATUS) |
| *write_method = write_mteTriggerEntryStatus; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| return NULL; |
| } |
| |
| |
| /* |
| * this is where we do the value assignments for the mib results. |
| */ |
| switch (vp->magic) { |
| |
| |
| case MTETRIGGERCOMMENT: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerComment; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerCommentLen; |
| return (u_char *) StorageTmp->mteTriggerComment; |
| |
| case MTETRIGGERTEST: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerTest; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerTestLen; |
| return (u_char *) StorageTmp->mteTriggerTest; |
| |
| case MTETRIGGERSAMPLETYPE: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerSampleType; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = sizeof(StorageTmp->mteTriggerSampleType); |
| return (u_char *) & StorageTmp->mteTriggerSampleType; |
| |
| case MTETRIGGERVALUEID: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerValueID; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerValueIDLen * sizeof(oid); |
| return (u_char *) StorageTmp->mteTriggerValueID; |
| |
| case MTETRIGGERVALUEIDWILDCARD: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerValueIDWildcard; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = sizeof(StorageTmp->mteTriggerValueIDWildcard); |
| return (u_char *) & StorageTmp->mteTriggerValueIDWildcard; |
| |
| case MTETRIGGERTARGETTAG: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerTargetTag; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerTargetTagLen; |
| return (u_char *) StorageTmp->mteTriggerTargetTag; |
| |
| case MTETRIGGERCONTEXTNAME: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerContextName; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerContextNameLen; |
| return (u_char *) StorageTmp->mteTriggerContextName; |
| |
| case MTETRIGGERCONTEXTNAMEWILDCARD: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerContextNameWildcard; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = sizeof(StorageTmp->mteTriggerContextNameWildcard); |
| return (u_char *) & StorageTmp->mteTriggerContextNameWildcard; |
| |
| case MTETRIGGERFREQUENCY: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerFrequency; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = sizeof(StorageTmp->mteTriggerFrequency); |
| return (u_char *) & StorageTmp->mteTriggerFrequency; |
| |
| case MTETRIGGEROBJECTSOWNER: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerObjectsOwner; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerObjectsOwnerLen; |
| return (u_char *) StorageTmp->mteTriggerObjectsOwner; |
| |
| case MTETRIGGEROBJECTS: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerObjects; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = StorageTmp->mteTriggerObjectsLen; |
| return (u_char *) StorageTmp->mteTriggerObjects; |
| |
| case MTETRIGGERENABLED: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerEnabled; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = sizeof(StorageTmp->mteTriggerEnabled); |
| return (u_char *) & StorageTmp->mteTriggerEnabled; |
| |
| case MTETRIGGERENTRYSTATUS: |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| *write_method = write_mteTriggerEntryStatus; |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| *var_len = sizeof(StorageTmp->mteTriggerEntryStatus); |
| return (u_char *) & StorageTmp->mteTriggerEntryStatus; |
| |
| |
| default: |
| ERROR_MSG(""); |
| } |
| return NULL; |
| } |
| |
| |
| |
| #ifndef NETSNMP_NO_WRITE_SUPPORT |
| int |
| write_mteTriggerComment(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static char *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerComment entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OCTET_STR) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerComment not ASN_OCTET_STR\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in string for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerComment; |
| tmplen = StorageTmp->mteTriggerCommentLen; |
| StorageTmp->mteTriggerComment = netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerCommentLen = var_val_len; |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerComment); |
| StorageTmp->mteTriggerComment = tmpvar; |
| StorageTmp->mteTriggerCommentLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerComment */ |
| |
| |
| |
| int |
| write_mteTriggerTest(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static char *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerTest entering action=%d... \n", action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OCTET_STR) { |
| snmp_log(LOG_ERR, "write to mteTriggerTest not ASN_OCTET_STR\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in string for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerTest; |
| tmplen = StorageTmp->mteTriggerTestLen; |
| StorageTmp->mteTriggerTest = netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerTestLen = var_val_len; |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerTest); |
| StorageTmp->mteTriggerTest = tmpvar; |
| StorageTmp->mteTriggerTestLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerTest */ |
| |
| |
| |
| int |
| write_mteTriggerSampleType(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static int tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerSampleType entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_INTEGER) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerSampleType not ASN_INTEGER\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in long_ret for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerSampleType; |
| StorageTmp->mteTriggerSampleType = *((long *) var_val); |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| StorageTmp->mteTriggerSampleType = tmpvar; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerSampleType */ |
| |
| |
| |
| int |
| write_mteTriggerValueID(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static oid *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerValueID entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OBJECT_ID) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerValueID not ASN_OBJECT_ID\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in objid for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerValueID; |
| tmplen = StorageTmp->mteTriggerValueIDLen; |
| StorageTmp->mteTriggerValueID = netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerValueIDLen = var_val_len / sizeof(oid); |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerValueID); |
| StorageTmp->mteTriggerValueID = tmpvar; |
| StorageTmp->mteTriggerValueIDLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| |
| /* |
| * XXX: if the valueID has actually changed, shouldn't we dump any |
| * previous values, as these are from a different object? |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerValueID */ |
| |
| |
| |
| int |
| write_mteTriggerValueIDWildcard(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, |
| oid * name, size_t name_len) |
| { |
| static int tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerValueIDWildcard entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_INTEGER) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerValueIDWildcard not ASN_INTEGER\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in long_ret for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerValueIDWildcard; |
| StorageTmp->mteTriggerValueIDWildcard = *((long *) var_val); |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| StorageTmp->mteTriggerValueIDWildcard = tmpvar; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerValueIDWildcard */ |
| |
| |
| |
| int |
| write_mteTriggerTargetTag(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static char *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerTargetTag entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OCTET_STR) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerTargetTag not ASN_OCTET_STR\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in string for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerTargetTag; |
| tmplen = StorageTmp->mteTriggerTargetTagLen; |
| StorageTmp->mteTriggerTargetTag = netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerTargetTagLen = var_val_len; |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerTargetTag); |
| StorageTmp->mteTriggerTargetTag = tmpvar; |
| StorageTmp->mteTriggerTargetTagLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerTargetTag */ |
| |
| |
| |
| int |
| write_mteTriggerContextName(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static char *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerContextName entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OCTET_STR) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerContextName not ASN_OCTET_STR\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in string for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerContextName; |
| tmplen = StorageTmp->mteTriggerContextNameLen; |
| StorageTmp->mteTriggerContextName = |
| netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerContextNameLen = var_val_len; |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerContextName); |
| StorageTmp->mteTriggerContextName = tmpvar; |
| StorageTmp->mteTriggerContextNameLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerContextName */ |
| |
| |
| |
| int |
| write_mteTriggerContextNameWildcard(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, |
| oid * name, size_t name_len) |
| { |
| static int tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerContextNameWildcard entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_INTEGER) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerContextNameWildcard not ASN_INTEGER\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in long_ret for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerContextNameWildcard; |
| StorageTmp->mteTriggerContextNameWildcard = *((long *) var_val); |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| StorageTmp->mteTriggerContextNameWildcard = tmpvar; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerContextNameWildcard */ |
| |
| |
| |
| int |
| write_mteTriggerFrequency(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static int tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerFrequency entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_UNSIGNED) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerFrequency not ASN_UNSIGNED\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in ulong_ret for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerFrequency; |
| StorageTmp->mteTriggerFrequency = *((unsigned long *) var_val); |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| StorageTmp->mteTriggerFrequency = tmpvar; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE && |
| StorageTmp->mteTriggerEntryStatus == RS_ACTIVE) |
| mte_enable_trigger(StorageTmp); |
| |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerFrequency */ |
| |
| |
| |
| int |
| write_mteTriggerObjectsOwner(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static char *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerObjectsOwner entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OCTET_STR) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerObjectsOwner not ASN_OCTET_STR\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in string for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerObjectsOwner; |
| tmplen = StorageTmp->mteTriggerObjectsOwnerLen; |
| StorageTmp->mteTriggerObjectsOwner = |
| netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerObjectsOwnerLen = var_val_len; |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerObjectsOwner); |
| StorageTmp->mteTriggerObjectsOwner = tmpvar; |
| StorageTmp->mteTriggerObjectsOwnerLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerObjectsOwner */ |
| |
| |
| |
| int |
| write_mteTriggerObjects(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static char *tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static size_t tmplen; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerObjects entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_OCTET_STR) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerObjects not ASN_OCTET_STR\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in string for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerObjects; |
| tmplen = StorageTmp->mteTriggerObjectsLen; |
| StorageTmp->mteTriggerObjects = netsnmp_memdup(var_val, var_val_len); |
| StorageTmp->mteTriggerObjectsLen = var_val_len; |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| SNMP_FREE(StorageTmp->mteTriggerObjects); |
| StorageTmp->mteTriggerObjects = tmpvar; |
| StorageTmp->mteTriggerObjectsLen = tmplen; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| SNMP_FREE(tmpvar); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerObjects */ |
| |
| |
| |
| int |
| write_mteTriggerEnabled(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| static int tmpvar; |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "write_mteTriggerEnabled entering action=%d... \n", |
| action)); |
| if ((StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, |
| NULL)) == NULL) |
| return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */ |
| |
| |
| switch (action) { |
| case RESERVE1: |
| if (var_val_type != ASN_INTEGER) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerEnabled not ASN_INTEGER\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| break; |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| break; |
| |
| |
| case FREE: |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in long_ret for |
| * you to use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in the UNDO case |
| */ |
| tmpvar = StorageTmp->mteTriggerEnabled; |
| StorageTmp->mteTriggerEnabled = *((long *) var_val); |
| break; |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| StorageTmp->mteTriggerEnabled = tmpvar; |
| break; |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE && |
| StorageTmp->mteTriggerEntryStatus == RS_ACTIVE) |
| mte_enable_trigger(StorageTmp); |
| else if (StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_FALSE) |
| mte_disable_trigger(StorageTmp); |
| |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerEnabled */ |
| |
| |
| |
| int |
| write_mteTriggerEntryStatus(int action, |
| u_char * var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char * statP, oid * name, size_t name_len) |
| { |
| struct mteTriggerTable_data *StorageTmp = NULL; |
| static struct mteTriggerTable_data *StorageNew, *StorageDel; |
| size_t newlen = |
| name_len - (sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 3 - 1); |
| static int old_value; |
| int set_value; |
| static netsnmp_variable_list *vars, *vp; |
| struct header_complex_index *hciptr; |
| |
| StorageTmp = |
| header_complex(mteTriggerTableStorage, NULL, |
| &name[sizeof(mteTriggerTable_variables_oid) / |
| sizeof(oid) + 3 - 1], &newlen, 1, NULL, NULL); |
| |
| |
| |
| |
| if (var_val_type != ASN_INTEGER || var_val == NULL) { |
| snmp_log(LOG_ERR, |
| "write to mteTriggerEntryStatus not ASN_INTEGER\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| set_value = *((long *) var_val); |
| |
| |
| /* |
| * check legal range, and notReady is reserved for us, not a user |
| */ |
| if (set_value < 1 || set_value > 6 || set_value == RS_NOTREADY) |
| return SNMP_ERR_INCONSISTENTVALUE; |
| |
| |
| switch (action) { |
| case RESERVE1: |
| /* |
| * stage one: test validity |
| */ |
| if (StorageTmp == NULL) { |
| /* |
| * create the row now? |
| */ |
| |
| |
| /* |
| * ditch illegal values now |
| */ |
| if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE) |
| return SNMP_ERR_INCONSISTENTVALUE; |
| |
| |
| /* |
| * destroying a non-existent row is actually legal |
| */ |
| if (set_value == RS_DESTROY) { |
| return SNMP_ERR_NOERROR; |
| } |
| |
| |
| /* |
| * illegal creation values |
| */ |
| if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE) { |
| return SNMP_ERR_INCONSISTENTVALUE; |
| } |
| } else { |
| /* |
| * row exists. Check for a valid state change |
| */ |
| if (set_value == RS_CREATEANDGO |
| || set_value == RS_CREATEANDWAIT) { |
| /* |
| * can't create a row that exists |
| */ |
| return SNMP_ERR_INCONSISTENTVALUE; |
| } |
| |
| if (StorageTmp->mteTriggerEntryStatus == RS_ACTIVE && |
| set_value != RS_DESTROY) { |
| /* |
| * "Once made active an entry may not be modified except to |
| * delete it." XXX: doesn't this in fact apply to ALL |
| * columns of the table and not just this one? |
| */ |
| return SNMP_ERR_INCONSISTENTVALUE; |
| } |
| if (StorageTmp->storageType != ST_NONVOLATILE) |
| return SNMP_ERR_NOTWRITABLE; |
| } |
| break; |
| |
| |
| |
| |
| case RESERVE2: |
| /* |
| * memory reseveration, final preparation... |
| */ |
| if (StorageTmp == NULL) { |
| /* |
| * creation |
| */ |
| vars = NULL; |
| |
| |
| snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, NULL, 0); /* mteOwner */ |
| snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OCTET_STR, NULL, 0); /* mteTriggerName */ |
| |
| |
| |
| if (header_complex_parse_oid |
| (& |
| (name |
| [sizeof(mteTriggerTable_variables_oid) / sizeof(oid) + |
| 2]), newlen, vars) != SNMPERR_SUCCESS) { |
| /* |
| * XXX: free, zero vars |
| */ |
| return SNMP_ERR_INCONSISTENTNAME; |
| } |
| vp = vars; |
| |
| |
| StorageNew = create_mteTriggerTable_data(); |
| |
| StorageNew->mteOwner = malloc(vp->val_len + 1); |
| memcpy(StorageNew->mteOwner, vp->val.string, vp->val_len); |
| StorageNew->mteOwner[vp->val_len] = '\0'; |
| StorageNew->mteOwnerLen = vp->val_len; |
| |
| vp = vp->next_variable; |
| StorageNew->mteTriggerName = malloc(vp->val_len + 1); |
| memcpy(StorageNew->mteTriggerName, vp->val.string, |
| vp->val_len); |
| StorageNew->mteTriggerName[vp->val_len] = '\0'; |
| StorageNew->mteTriggerNameLen = vp->val_len; |
| |
| vp = vp->next_variable; |
| |
| StorageNew->mteTriggerEntryStatus = set_value; |
| |
| } |
| |
| |
| break; |
| |
| |
| |
| |
| case FREE: |
| /* |
| * XXX: free, zero vars |
| */ |
| /* |
| * Release any resources that have been allocated |
| */ |
| break; |
| |
| |
| |
| |
| case ACTION: |
| /* |
| * The variable has been stored in set_value for you to |
| * use, and you have just been asked to do something with |
| * it. Note that anything done here must be reversable in |
| * the UNDO case |
| */ |
| |
| |
| if (StorageTmp == NULL) { |
| /* |
| * row creation, so add it |
| */ |
| if (StorageNew != NULL) |
| mteTriggerTable_add(StorageNew); |
| /* |
| * XXX: ack, and if it is NULL? |
| */ |
| } else if (set_value != RS_DESTROY) { |
| /* |
| * set the flag? |
| */ |
| old_value = StorageTmp->mteTriggerEntryStatus; |
| StorageTmp->mteTriggerEntryStatus = *((long *) var_val); |
| } else { |
| /* |
| * destroy... extract it for now |
| */ |
| hciptr = |
| header_complex_find_entry(mteTriggerTableStorage, |
| StorageTmp); |
| StorageDel = |
| header_complex_extract_entry(&mteTriggerTableStorage, |
| hciptr); |
| } |
| break; |
| |
| |
| |
| |
| case UNDO: |
| /* |
| * Back out any changes made in the ACTION case |
| */ |
| if (StorageTmp == NULL) { |
| /* |
| * row creation, so remove it again |
| */ |
| hciptr = |
| header_complex_find_entry(mteTriggerTableStorage, |
| StorageTmp); |
| StorageDel = |
| header_complex_extract_entry(&mteTriggerTableStorage, |
| hciptr); |
| /* |
| * XXX: free it |
| */ |
| } else if (StorageDel != NULL) { |
| /* |
| * row deletion, so add it again |
| */ |
| mteTriggerTable_add(StorageDel); |
| } else { |
| StorageTmp->mteTriggerEntryStatus = old_value; |
| } |
| break; |
| |
| |
| |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| if (StorageDel != NULL) { |
| mte_disable_trigger(StorageDel); |
| StorageDel = 0; |
| /* |
| * XXX: free it, its dead |
| */ |
| } else { |
| if (StorageTmp |
| && StorageTmp->mteTriggerEntryStatus == RS_CREATEANDGO) { |
| StorageTmp->mteTriggerEntryStatus = RS_ACTIVE; |
| } else if (StorageTmp && |
| StorageTmp->mteTriggerEntryStatus == |
| RS_CREATEANDWAIT) { |
| StorageTmp->mteTriggerEntryStatus = RS_NOTINSERVICE; |
| } |
| } |
| if (StorageTmp && |
| StorageTmp->mteTriggerEntryStatus == RS_ACTIVE && |
| !StorageTmp->have_copied_auth_info) { |
| |
| netsnmp_agent_session *asp = |
| netsnmp_get_current_agent_session(); |
| netsnmp_pdu *pdu = NULL; |
| |
| if (!asp) { |
| snmp_log(LOG_ERR, |
| "snmpTriggerTable: can't get master session for authentication params\n"); |
| } else { |
| pdu = asp->orig_pdu; |
| if (!pdu) { |
| snmp_log(LOG_ERR, |
| "snmpTriggerTable: can't get master pdu for authentication params\n"); |
| } |
| } |
| |
| if (pdu) { |
| DEBUGMSGTL(("mteTriggerTest", "copying PDU auth info\n")); |
| StorageTmp->pdu_version = pdu->version; |
| StorageTmp->pdu_securityModel = pdu->securityModel; |
| StorageTmp->pdu_securityLevel = pdu->securityLevel; |
| StorageTmp->pdu_tDomain = pdu->tDomain; |
| StorageTmp->pdu_tDomainLen = pdu->tDomainLen; |
| if (pdu->transport_data != NULL) { |
| StorageTmp->pdu_transport = |
| malloc(pdu->transport_data_length); |
| memcpy(StorageTmp->pdu_transport, pdu->transport_data, |
| pdu->transport_data_length); |
| } |
| StorageTmp->pdu_transportLen = pdu->transport_data_length; |
| if (pdu->community) { |
| StorageTmp->pdu_community = |
| calloc(1, pdu->community_len + 1); |
| memcpy(StorageTmp->pdu_community, pdu->community, |
| pdu->community_len); |
| StorageTmp->pdu_community_len = pdu->community_len; |
| } else { |
| StorageTmp->pdu_community = NULL; |
| StorageTmp->pdu_community_len = 0; |
| } |
| if (pdu->securityName) { |
| StorageTmp->pdu_securityName = |
| calloc(1, pdu->securityNameLen + 1); |
| memcpy(StorageTmp->pdu_securityName, pdu->securityName, |
| pdu->securityNameLen); |
| StorageTmp->pdu_securityNameLen = pdu->securityNameLen; |
| } else { |
| StorageTmp->pdu_securityName = NULL; |
| StorageTmp->pdu_securityNameLen = 0; |
| } |
| StorageTmp->have_copied_auth_info = 1; |
| } |
| } |
| |
| if (StorageTmp && |
| StorageTmp->mteTriggerEnabled == MTETRIGGERENABLED_TRUE && |
| StorageTmp->mteTriggerEntryStatus == RS_ACTIVE) |
| mte_enable_trigger(StorageTmp); |
| snmp_store_needed(NULL); |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } /* write_mteTriggerEntryStatus */ |
| |
| #endif /* !NETSNMP_NO_WRITE_SUPPORT */ |
| |
| |
| |
| /* |
| * send trap |
| */ |
| void |
| send_mte_trap(struct mteTriggerTable_data *item, |
| oid * trap_oid, size_t trap_oid_len, |
| oid * name_oid, size_t name_oid_len, |
| long *value, const char *objowner, const char *objname, |
| const char *reason) |
| { |
| static oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; /* snmpTrapIOD.0 */ |
| |
| netsnmp_variable_list *var_list = NULL; |
| |
| /* |
| * snmpTrap oid |
| */ |
| snmp_varlist_add_variable(&var_list, objid_snmptrap, |
| sizeof(objid_snmptrap) / sizeof(oid), |
| ASN_OBJECT_ID, (u_char *) trap_oid, |
| trap_oid_len * sizeof(oid)); |
| |
| /* |
| * mteHotTrigger |
| */ |
| snmp_varlist_add_variable(&var_list, mteHotTrigger, |
| sizeof(mteHotTrigger) / sizeof(oid), |
| ASN_OCTET_STR, |
| (u_char *) item->mteTriggerName, |
| item->mteTriggerNameLen); |
| |
| /* |
| * mteHotTargetName |
| */ |
| snmp_varlist_add_variable(&var_list, mteHotTargetName, sizeof(mteHotTargetName) / sizeof(oid), ASN_OCTET_STR, (u_char *) item->mteTriggerTargetTag, /*XXX: targetName,not tag */ |
| item->mteTriggerTargetTagLen); /*XXX */ |
| |
| /* |
| * mteHotContextName |
| */ |
| snmp_varlist_add_variable(&var_list, mteHotContextName, |
| sizeof(mteHotContextName) / sizeof(oid), |
| ASN_OCTET_STR, |
| (u_char *) item->mteTriggerContextName, |
| item->mteTriggerContextNameLen); |
| |
| snmp_varlist_add_variable(&var_list, mteHotOID, |
| sizeof(mteHotOID) / sizeof(oid), |
| ASN_OBJECT_ID, (u_char *) name_oid, |
| sizeof(oid) * name_oid_len); |
| |
| if (trap_oid == mteTriggerFailure || trap_oid == mteEventSetFailure) { |
| /* |
| * mteFailedReason |
| */ |
| snmp_varlist_add_variable(&var_list, mteFailedReason, |
| sizeof(mteFailedReason) / sizeof(oid), |
| ASN_INTEGER, (u_char *) value, |
| sizeof(value)); |
| } else { |
| /* |
| * mteHotValue |
| */ |
| snmp_varlist_add_variable(&var_list, mteHotValue, |
| sizeof(mteHotValue) / sizeof(oid), |
| ASN_INTEGER, (u_char *) value, |
| sizeof(value)); |
| } |
| |
| /* |
| * add in traps from main table |
| */ |
| mte_add_objects(var_list, item, item->mteTriggerObjectsOwner, |
| item->mteTriggerObjects, |
| name_oid + item->mteTriggerValueIDLen, |
| name_oid_len - item->mteTriggerValueIDLen); |
| /* |
| * add in traps from sub table |
| */ |
| mte_add_objects(var_list, item, objowner, objname, |
| name_oid + item->mteTriggerValueIDLen, |
| name_oid_len - item->mteTriggerValueIDLen); |
| |
| /* |
| * XXX: stuff based on event table |
| */ |
| DEBUGMSGTL(("mteTriggerTest:send_mte_trap", "sending the trap (%s): ", |
| reason)); |
| DEBUGMSGOID(("mteTriggerTest:send_mte_trap", name_oid, name_oid_len)); |
| DEBUGMSG(("mteTriggerTest:send_mte_trap", " = %ld\n", *value)); |
| |
| send_v2trap(var_list); |
| snmp_free_varbind(var_list); |
| } /* send_mte_trap */ |
| |
| |
| void |
| last_state_clean(void *data) |
| { |
| struct last_state *cleanme = (struct last_state *) data; |
| SNMP_FREE(cleanme->value); |
| SNMP_FREE(cleanme); |
| } |
| |
| |
| /* |
| * retrieves requested info in pdu from the current target |
| */ |
| netsnmp_pdu * |
| mte_get_response(struct mteTriggerTable_data *item, netsnmp_pdu *pdu) |
| { |
| netsnmp_pdu *response = NULL; |
| int status = 0; |
| char buf[SPRINT_MAX_LEN]; |
| |
| /* |
| * local agent check |
| */ |
| pdu->errstat = SNMPERR_SUCCESS; |
| pdu->errindex = 0; |
| pdu->version = item->pdu_version; |
| pdu->securityModel = item->pdu_securityModel; |
| pdu->securityLevel = item->pdu_securityLevel; |
| pdu->tDomain = item->pdu_tDomain; |
| pdu->tDomainLen = item->pdu_tDomainLen; |
| pdu->transport_data = netsnmp_memdup(item->pdu_transport, |
| item->pdu_transportLen); |
| pdu->transport_data_length = item->pdu_transportLen; |
| pdu->community = netsnmp_memdup(item->pdu_community, |
| item->pdu_community_len); |
| pdu->community_len = item->pdu_community_len; |
| pdu->contextName = netsnmp_memdup(item->mteTriggerContextName, |
| item->mteTriggerContextNameLen); |
| pdu->contextNameLen = item->mteTriggerContextNameLen; |
| pdu->securityName = netsnmp_memdup(item->pdu_securityName, |
| item->pdu_securityNameLen); |
| pdu->securityNameLen = item->pdu_securityNameLen; |
| DEBUGMSGTL(("mteTriggerTable", |
| "accessing locally with secName \"%s\" community \"%s\"\n", |
| item->pdu_securityName ? (char *) item-> |
| pdu_securityName : "[NIL]", |
| item->pdu_community ? (char *) item-> |
| pdu_community : "[NIL]")); |
| |
| if (item->mteTriggerTargetTagLen == 0) { |
| /* |
| * send to the local agent |
| */ |
| |
| if (mte_callback_sess == NULL) |
| mte_callback_sess = netsnmp_query_get_default_session(); |
| if (!mte_callback_sess) |
| return NULL; |
| |
| status = snmp_synch_response(mte_callback_sess, pdu, &response); |
| |
| if (status != SNMP_ERR_NOERROR || |
| response->errstat != SNMP_ERR_NOERROR) { |
| /* |
| * xxx |
| */ |
| char *errstr; |
| snmp_error(mte_callback_sess, 0, 0, &errstr); |
| if (response) { |
| DEBUGMSGTL(("mteTriggerTable", |
| "Error received: status=%d, sess_error=%s, pduerr=%d/%s, pdu version=%d\n", |
| status, errstr, |
| response->errstat, |
| snmp_api_errstring(response->errstat), |
| response->version)); |
| } else { |
| DEBUGMSGTL(("mteTriggerTable", |
| "Error received: status=%d, sess_error=%s [no response pointer]\n", |
| status, errstr)); |
| } |
| if (errstr) |
| free(errstr); |
| return NULL; /* XXX: proper failure, trap sent, etc */ |
| } |
| } else { |
| /* |
| * remote target list |
| */ |
| /* |
| * XXX |
| */ |
| } |
| if (response->variables) |
| snprint_variable(buf, sizeof(buf), response->variables->name, |
| response->variables->name_length, |
| response->variables); |
| else |
| strcpy(buf, "empty"); |
| buf[sizeof(buf) - 1] = '\0'; |
| DEBUGMSGTL(("mteTriggerTable", "got a variables: %s\n", buf)); |
| return response; |
| } /* mte_get_response */ |
| |
| |
| /* |
| * Return 1 if `type' is an integer type; specifically, to quote RFC 2981, |
| * p. 13, "anything that ends up encoded for transmission (that is, in BER, |
| * not ASN.1) as an integer". Return 0 for all other types. |
| */ |
| |
| int |
| mte_is_integer_type(unsigned char type) |
| { |
| switch (type) { |
| case ASN_INTEGER: |
| case ASN_COUNTER: |
| case ASN_GAUGE: |
| case ASN_TIMETICKS: |
| case ASN_UINTEGER: |
| case ASN_COUNTER64: |
| #ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES |
| case ASN_OPAQUE_COUNTER64: |
| case ASN_OPAQUE_U64: |
| case ASN_OPAQUE_I64: |
| #endif /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */ |
| return 1; |
| default: |
| return 0; |
| } |
| } |
| |
| |
| /* |
| * Return 0 if the discontinuity object was checked and no discontinuity has |
| * occurred, 1 if the discontinuity object was checked and a discontinuity |
| * has occurred or -1 if the discontinuity object is not accessible. |
| */ |
| |
| int |
| mte_discontinuity_occurred(struct mteTriggerTable_data *item) |
| { |
| netsnmp_pdu *pdu = NULL, *response = NULL; |
| unsigned long discoTicks = 0; /* cool var name */ |
| |
| if (item->mteTriggerDeltaDiscontinuityIDLen == 0 || |
| (snmp_oid_compare(item->mteTriggerDeltaDiscontinuityID, |
| item->mteTriggerDeltaDiscontinuityIDLen, |
| sysUpTimeInstance, |
| sizeof(sysUpTimeInstance) / sizeof(oid)) == 0)) { |
| DEBUGMSGTL(("mte_disco", |
| "discoID either zero-length or sysUpTimeInstance\n")); |
| } else { |
| if (item->mteTriggerValueIDWildcard == TV_TRUE) { |
| pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); |
| } else { |
| pdu = snmp_pdu_create(SNMP_MSG_GET); |
| } |
| snmp_add_null_var(pdu, item->mteTriggerDeltaDiscontinuityID, |
| item->mteTriggerDeltaDiscontinuityIDLen); |
| response = mte_get_response(item, pdu); |
| if (response == NULL) { |
| /* |
| * XXX: send a mteTriggerFailure notification with the appropriate |
| * error code here. |
| */ |
| /* |
| * "If the object identified is not accessible the sample attempt is in |
| * error, with the error code as from an SNMP request." |
| */ |
| DEBUGMSGTL(("mte_disco", "failure (auth?) getting discoID\n")); |
| return -1; |
| } else { |
| if (item->mteTriggerDeltaDiscontinuityIDType == |
| MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMETICKS || |
| item->mteTriggerDeltaDiscontinuityIDType == |
| MTETRIGGERDELTADISCONTINUITYIDTYPE_TIMESTAMP) { |
| if (response->errstat == SNMPERR_SUCCESS) { |
| if (response->variables != NULL && |
| response->variables->type == ASN_TIMETICKS) { |
| DEBUGMSGTL(("mte_disco", |
| "got ASN_TIMETICKS-valued variable\n")); |
| discoTicks = |
| *((unsigned long *) response->variables->val. |
| integer); |
| if (item->prevDiscoTicks != 0) { |
| if (discoTicks != item->prevDiscoTicks) { |
| /* |
| * Danger Will Robinson: there has been a discontinuity! |
| */ |
| DEBUGMSGTL(("mte_disco", |
| "a discontinuity has occurred\n")); |
| item->prevDiscoTicks = discoTicks; |
| snmp_free_pdu(response); |
| return 1; |
| } |
| } |
| item->prevDiscoTicks = discoTicks; |
| } else { |
| /* |
| * XXX: send a mteTriggerFailure notification with the |
| * appropriate error code here. |
| */ |
| if (response->variables != NULL && |
| (response->variables->type == SNMP_NOSUCHOBJECT |
| || response->variables->type == |
| SNMP_NOSUCHINSTANCE |
| || response->variables->type == |
| SNMP_ENDOFMIBVIEW)) { |
| /* |
| * noSuchName I guess. |
| */ |
| } else { |
| /* |
| * badType. |
| */ |
| } |
| DEBUGMSGTL(("mte_disco", |
| "failure getting discoID\n")); |
| snmp_free_pdu(response); |
| return -1; |
| } |
| } else { |
| /* |
| * XXX: send a mteTriggerFailure notification with the appropriate |
| * error code (just use response->errstat) here. |
| */ |
| DEBUGMSGTL(("mte_disco", "failure getting discoID\n")); |
| snmp_free_pdu(response); |
| return -1; |
| } |
| } else { |
| /* |
| * Don't handle dateAndTime type queries yet. |
| */ |
| DEBUGMSGTL(("mte_disco", |
| "dateAndTime query UNIMPLEMENTED\n")); |
| } |
| snmp_free_pdu(response); |
| } |
| } |
| |
| /* |
| * "...if this object does not point to sysUpTime discontinuity checking |
| * MUST still check sysUpTime for an overall discontinuity." |
| */ |
| if (snmp_oid_compare(item->mteTriggerDeltaDiscontinuityID, |
| item->mteTriggerDeltaDiscontinuityIDLen, |
| sysUpTimeInstance, |
| sizeof(sysUpTimeInstance) / sizeof(oid)) != 0) { |
| DEBUGMSGTL(("mte_disco", "discoID != sysUpTimeInstance\n")); |
| /* |
| * At the moment we only support checking the local system so there's no |
| * point doing anything extra here. |
| */ |
| } |
| |
| /* |
| * Well if we got all the way to here, then there has been neither a |
| * discontinuity nor an error. |
| */ |
| DEBUGMSGTL(("mte_disco", "no discontinuity\n")); |
| return 0; |
| } /* mte_discontinuity_occurred */ |
| |
| |
| void |
| mte_run_trigger(unsigned int clientreg, void *clientarg) |
| { |
| |
| struct mteTriggerTable_data *item = |
| (struct mteTriggerTable_data *) clientarg; |
| netsnmp_pdu *pdu = NULL, *response = NULL; |
| char buf[SPRINT_MAX_LEN]; |
| int msg_type = SNMP_MSG_GET, disco; |
| |
| oid *next_oid; |
| size_t next_oid_len; |
| long *value, *old_value, x; |
| struct last_state *laststate; |
| char lastbool = 0, boolresult = 0, lastthresh = 0; |
| |
| if (!item) { |
| /* |
| * ack |
| */ |
| snmp_alarm_unregister(clientreg); |
| return; |
| } |
| DEBUGMSGTL(("mteTriggertable", "Running trigger for %s/%s\n", |
| item->mteOwner, item->mteTriggerName)); |
| |
| next_oid = item->mteTriggerValueID; |
| next_oid_len = item->mteTriggerValueIDLen; |
| if (item->mteTriggerValueIDWildcard == TV_TRUE) |
| msg_type = SNMP_MSG_GETNEXT; |
| |
| item->hc_storage_old = item->hc_storage; |
| item->hc_storage = NULL; |
| do { |
| pdu = snmp_pdu_create(msg_type); |
| snmp_add_null_var(pdu, next_oid, next_oid_len); |
| |
| if(response) |
| snmp_free_pdu(response); |
| |
| response = mte_get_response(item, pdu); |
| if (!response) |
| break; /* XXX: proper failure */ |
| |
| if (item->mteTriggerValueIDWildcard == TV_TRUE && |
| ((response->variables->type >= SNMP_NOSUCHOBJECT && |
| response->variables->type <= SNMP_ENDOFMIBVIEW) || |
| snmp_oid_compare(item->mteTriggerValueID, |
| item->mteTriggerValueIDLen, |
| response->variables->name, |
| item->mteTriggerValueIDLen) != 0)) { |
| DEBUGMSGTL(("mteTriggerTable", |
| "DONE, last varbind processed\n")); |
| break; |
| } |
| |
| /* |
| * shorter pointers |
| */ |
| next_oid = response->variables->name; |
| next_oid_len = response->variables->name_length; |
| |
| /* |
| * Send a "bad type" notification if the type of the target object is |
| * non-INTEGER and the test type is either `boolean' or `threshold' |
| * (which want to do arithmetic). |
| */ |
| if (((item->mteTriggerTest[0] & MTETRIGGERTEST_BOOLEAN) || |
| (item->mteTriggerTest[0] & MTETRIGGERTEST_THRESHOLD)) && |
| response->errstat == SNMPERR_SUCCESS && |
| !mte_is_integer_type(response->variables->type)) { |
| long failure = MTE_FAILURE_BADTYPE; |
| send_mte_trap(item, mteTriggerFailure, |
| sizeof(mteTriggerFailure) / sizeof(oid), |
| next_oid, next_oid_len, &failure, |
| NULL, NULL, "failure: bad type"); |
| /* |
| * RFC2981, p.15: "If the value syntax of those objects |
| * [returned by a getNext-style match] is not usable, that |
| * results in a `badType' error THAT TERMINATES THE SCAN." |
| * (my emphasis). |
| */ |
| break; |
| } |
| |
| /* |
| * Clone the value. XXX: What happens if it's an unsigned type? Or a |
| * 64-bit type, or an OCTET STRING for the sake of argument. Do |
| * everything in 64-bit arithmetic perhaps? Generate "bad type" |
| * notifications for non-INTEGER cases (except for existence). |
| */ |
| if (response->errstat == SNMPERR_SUCCESS && |
| response->variables->val.integer) |
| value = netsnmp_memdup(response->variables->val.integer, |
| sizeof(*response->variables->val.integer)); |
| else |
| value = NULL; |
| |
| snprint_variable(buf, sizeof(buf), |
| next_oid, next_oid_len, response->variables); |
| buf[sizeof(buf) - 1] = '\0'; |
| DEBUGMSGTL(("mteTriggerTable", "received %s (type %d)\n", buf, |
| response->variables->type)); |
| |
| /* |
| * see if we have old values for this |
| */ |
| laststate = header_complex_get_from_oid(item->hc_storage_old, |
| next_oid, next_oid_len); |
| if (laststate) { |
| old_value = laststate->value; |
| lastbool = laststate->lastbool; |
| lastthresh = laststate->lastthreshold; |
| } else { |
| old_value = NULL; |
| lastthresh = MTE_THRESHOLD_BEGIN; |
| } |
| |
| /* |
| * deal with existence tests |
| */ |
| if (item->mteTriggerTest[0] & MTETRIGGERTEST_EXISTENCE) { |
| if ((item->mteTriggerExistenceTest[0] & |
| MTETRIGGEREXISTENCETEST_PRESENT) |
| && value && !old_value && |
| (item->started || |
| (item->mteTriggerExistenceStartup[0] & |
| MTETRIGGEREXISTENCESTARTUP_PRESENT))) { |
| /* |
| * XXX: if mteTriggerExistenceTest is not "present", for |
| * example, and then turned on when has been previously |
| * off, do we respect the value of the last known |
| * existence status? |
| */ |
| send_mte_trap(item, mteTriggerFired, |
| sizeof(mteTriggerFired) / sizeof(oid), |
| next_oid, next_oid_len, |
| value, item->mteTriggerExistenceObjectsOwner, |
| item->mteTriggerExistenceObjects, |
| "existence: present"); |
| run_mte_events(item, next_oid, next_oid_len, |
| item->mteTriggerExistenceEventOwner, |
| item->mteTriggerExistenceEvent); |
| } |
| |
| if ((item->mteTriggerExistenceTest[0] & |
| MTETRIGGEREXISTENCETEST_CHANGED) |
| && value && old_value && *old_value != *value) { |
| /* |
| * XXX: if mteTriggerExistenceTest is not "present", for |
| * example, and then turned on when has been previously |
| * off, do we respect the value of the last known |
| * existence status? |
| */ |
| send_mte_trap(item, mteTriggerFired, |
| sizeof(mteTriggerFired) / sizeof(oid), |
| next_oid, next_oid_len, |
| value, item->mteTriggerExistenceObjectsOwner, |
| item->mteTriggerExistenceObjects, |
| "existence: changed"); |
| run_mte_events(item, next_oid, next_oid_len, |
| item->mteTriggerExistenceEventOwner, |
| item->mteTriggerExistenceEvent); |
| } |
| } |
| |
| /* |
| * Deal with boolean tests. |
| */ |
| if ((item->mteTriggerTest[0] & MTETRIGGERTEST_BOOLEAN) && |
| ((item->mteTriggerSampleType == |
| MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE && value) |
| || (item->mteTriggerSampleType == |
| MTETRIGGERSAMPLETYPE_DELTAVALUE && value && old_value))) { |
| if (item->mteTriggerSampleType == |
| MTETRIGGERSAMPLETYPE_DELTAVALUE) { |
| /* |
| * XXX: Must check the discontinuity OID here. |
| */ |
| disco = mte_discontinuity_occurred(item); |
| if (disco == -1) { |
| /* |
| * An error notification has already been sent; just bail |
| * out now. |
| */ |
| /* |
| * XXX: should save values here? |
| */ |
| return; |
| } else if (disco == 1) { |
| /* |
| * A discontinuity has occurred; the right thing to do here |
| * depends on the exact type. FOR NOW, assume long. |
| */ |
| x = *((long *) value) + (INT_MAX - |
| *((long *) old_value)); |
| } else { |
| x = *((long *) value) - *((long *) old_value); |
| } |
| } else { |
| x = *((long *) value); |
| } |
| |
| switch (item->mteTriggerBooleanComparison) { |
| case MTETRIGGERBOOLEANCOMPARISON_UNEQUAL: |
| boolresult = (x != item->mteTriggerBooleanValue); |
| break; |
| |
| case MTETRIGGERBOOLEANCOMPARISON_EQUAL: |
| boolresult = (x == item->mteTriggerBooleanValue); |
| break; |
| |
| case MTETRIGGERBOOLEANCOMPARISON_LESS: |
| boolresult = (x < item->mteTriggerBooleanValue); |
| break; |
| |
| case MTETRIGGERBOOLEANCOMPARISON_LESSOREQUAL: |
| boolresult = (x <= item->mteTriggerBooleanValue); |
| break; |
| |
| case MTETRIGGERBOOLEANCOMPARISON_GREATER: |
| boolresult = (x > item->mteTriggerBooleanValue); |
| break; |
| |
| case MTETRIGGERBOOLEANCOMPARISON_GREATEROREQUAL: |
| boolresult = (x >= item->mteTriggerBooleanValue); |
| break; |
| |
| default: |
| snmp_log(LOG_WARNING, |
| "illegal value in mteTriggerBooleanComparison object: %ld", |
| item->mteTriggerBooleanComparison); |
| boolresult = item->lastboolresult; /* to fail next test */ |
| } |
| |
| if (boolresult && |
| ((item->mteTriggerBooleanStartup == |
| MTETRIGGERBOOLEANSTARTUP_TRUE |
| && lastbool == (char)-1) || lastbool != boolresult)) { |
| send_mte_trap(item, mteTriggerFired, |
| sizeof(mteTriggerFired) / sizeof(oid), |
| next_oid, next_oid_len, |
| &x, item->mteTriggerBooleanObjectsOwner, |
| item->mteTriggerBooleanObjects, |
| "boolean: true"); |
| run_mte_events(item, next_oid, next_oid_len, |
| item->mteTriggerBooleanEventOwner, |
| item->mteTriggerBooleanEvent); |
| } |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "value: %d %ld %lu x: %d %ld %lu\n", *value, |
| *value, *value, x, x, x)); |
| |
| DEBUGMSGTL(("mteTriggerTable", |
| "boolean result: x=%d %s configured=%d = %d\n", |
| x, |
| se_find_label_in_slist("mteBooleanOperators", |
| item-> |
| mteTriggerBooleanComparison), |
| item->mteTriggerBooleanValue, boolresult)); |
| } |
| |
| /* |
| * Deal with threshold tests. XXX: doesn't handle "delta-type" |
| * sampling. |
| */ |
| if ((item->mteTriggerTest[0] & MTETRIGGERTEST_THRESHOLD) && |
| ((item->mteTriggerSampleType == |
| MTETRIGGERSAMPLETYPE_ABSOLUTEVALUE && value) |
| || (item->mteTriggerSampleType == |
| MTETRIGGERSAMPLETYPE_DELTAVALUE && value && old_value))) { |
| /* |
| * XXX: correct intepretation of mteTriggerThresholdStartup? |
| */ |
| /* |
| * only fires when passed and just set to active? What |
| * about a newly discovered node that is past a |
| * threshold once we've been active for a turn at least? |
| */ |
| /* |
| * XXX: Check notions of > vs >= |
| */ |
| if (((item->started == MTE_STARTED && laststate && |
| lastthresh == MTE_THRESHOLD_LOW) || |
| (item->started != MTE_STARTED && |
| (item->mteTriggerThresholdStartup == |
| MTETRIGGERTHRESHOLDSTARTUP_RISING |
| || item->mteTriggerThresholdStartup == |
| MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING))) |
| && (*value >= item->mteTriggerThresholdRising)) { |
| send_mte_trap(item, mteTriggerRising, |
| sizeof(mteTriggerRising) / sizeof(oid), |
| next_oid, next_oid_len, value, |
| item->mteTriggerThresholdObjectsOwner, |
| item->mteTriggerThresholdObjects, |
| "threshold: rising"); |
| run_mte_events(item, next_oid, next_oid_len, |
| item->mteTriggerThresholdRisingEventOwner, |
| item->mteTriggerThresholdRisingEvent); |
| } |
| if (((item->started == MTE_STARTED && laststate && |
| lastthresh == MTE_THRESHOLD_HIGH) || |
| (item->started != MTE_STARTED && |
| (item->mteTriggerThresholdStartup == |
| MTETRIGGERTHRESHOLDSTARTUP_FALLING |
| || item->mteTriggerThresholdStartup == |
| MTETRIGGERTHRESHOLDSTARTUP_RISINGORFALLING))) |
| && (*value <= item->mteTriggerThresholdFalling)) { |
| send_mte_trap(item, mteTriggerFalling, |
| sizeof(mteTriggerFalling) / sizeof(oid), |
| next_oid, next_oid_len, value, |
| item->mteTriggerThresholdObjectsOwner, |
| item->mteTriggerThresholdObjects, |
| "threshold: falling"); |
| run_mte_events(item, next_oid, next_oid_len, |
| item->mteTriggerThresholdFallingEventOwner, |
| item->mteTriggerThresholdFallingEvent); |
| } |
| |
| } |
| |
| if (value) { |
| struct last_state *new_last_state = |
| SNMP_MALLOC_STRUCT(last_state); |
| new_last_state->value = value; |
| new_last_state->lastbool = boolresult; |
| header_complex_add_data_by_oid(&item->hc_storage, next_oid, |
| next_oid_len, new_last_state); |
| |
| /* |
| * set our notion of the current known threshold state |
| */ |
| if (lastthresh == MTE_THRESHOLD_LOW && |
| *value >= item->mteTriggerThresholdRising && |
| *value > item->mteTriggerThresholdFalling) |
| new_last_state->lastthreshold = MTE_THRESHOLD_HIGH; |
| else if (lastthresh == MTE_THRESHOLD_HIGH && |
| *value < item->mteTriggerThresholdRising && |
| *value <= item->mteTriggerThresholdFalling) |
| new_last_state->lastthreshold = MTE_THRESHOLD_LOW; |
| else if (lastthresh == MTE_THRESHOLD_BEGIN) { |
| if (*value >= item->mteTriggerThresholdRising) |
| new_last_state->lastthreshold = MTE_THRESHOLD_HIGH; |
| else if (*value <= item->mteTriggerThresholdFalling) |
| new_last_state->lastthreshold = MTE_THRESHOLD_LOW; |
| /* |
| * XXX: else??? in between? undefined? |
| */ |
| } else { |
| new_last_state->lastthreshold = lastthresh; |
| } |
| } |
| |
| /* |
| * extract from old hc storage |
| */ |
| if (laststate) { |
| header_complex_extract_entry(&item->hc_storage_old, |
| header_complex_find_entry(item-> |
| hc_storage_old, |
| (void *) |
| laststate)); |
| last_state_clean(laststate); |
| } |
| |
| } while (item->mteTriggerValueIDWildcard == TV_TRUE); |
| |
| if(response) |
| snmp_free_pdu(response); |
| |
| /* |
| * loop through old values for DNE cases |
| */ |
| if (item->mteTriggerExistenceTest[0] & MTETRIGGEREXISTENCETEST_ABSENT) { |
| |
| struct header_complex_index *iter; |
| |
| /* |
| * XXX: broken |
| */ |
| if ((item->mteTriggerExistenceStartup[0] & |
| MTETRIGGEREXISTENCESTARTUP_ABSENT)) { |
| /* |
| * XXX: send trap that nothing was found? |
| */ |
| /* |
| * only if !wild? (see mib) |
| */ |
| } |
| for (iter = item->hc_storage_old; iter; iter = iter->next) { |
| laststate = (struct last_state *) iter->data; |
| send_mte_trap(item, mteTriggerFired, |
| sizeof(mteTriggerFired) / sizeof(oid), |
| iter->name, iter->namelen, laststate->value, |
| item->mteTriggerExistenceObjectsOwner, |
| item->mteTriggerExistenceObjects, |
| "existence: absent"); |
| } |
| header_complex_free_all(item->hc_storage_old, last_state_clean); |
| item->hc_storage_old = NULL; |
| } |
| |
| item->started = MTE_STARTED; |
| } /* mte_run_trigger */ |
| |
| |
| |
| /* |
| * handling routines |
| */ |
| void |
| mte_enable_trigger(struct mteTriggerTable_data *item) |
| { |
| if (!item) |
| return; |
| |
| if (item->alarmreg) |
| snmp_alarm_unregister(item->alarmreg); |
| |
| if (item->mteTriggerFrequency > 0) { |
| DEBUGMSGTL(("mteTriggertable", "Enabling trigger for %s/%s @ %u\n", |
| item->mteOwner, item->mteTriggerName, |
| item->mteTriggerFrequency)); |
| item->alarmreg = |
| snmp_alarm_register(item->mteTriggerFrequency, SA_REPEAT, |
| mte_run_trigger, item); |
| } |
| } |
| |
| void |
| mte_disable_trigger(struct mteTriggerTable_data *item) |
| { |
| if (!item) |
| return; |
| |
| if (item->alarmreg) { |
| DEBUGMSGTL(("mteTriggertable", "Disabling trigger for %s/%s\n", |
| item->mteOwner, item->mteTriggerName)); |
| snmp_alarm_unregister(item->alarmreg); |
| item->alarmreg = 0; |
| } |
| item->started = MTE_NOTSTARTED; |
| } |