📄 mtetriggerconf.c
字号:
object = mteObjects_addOID( "snmpd.conf", tname, idx, buf, 0 ); if (!object) { snmp_log(LOG_ERR, "Unknown payload OID: %s\n", buf); config_perror("Unknown payload OID"); mteObjects_removeEntries( "snmpd.conf", tname ); } else idx = object->mteOIndex; break; case 'o': /* object */ idx++; cp = copy_nword(cp, buf, SPRINT_MAX_LEN); object = mteObjects_addOID( "snmpd.conf", tname, idx, buf, 1 ); if (!object) { snmp_log(LOG_ERR, "Unknown payload OID: %s\n", buf); config_perror("Unknown payload OID"); mteObjects_removeEntries( "snmpd.conf", tname ); } else idx = object->mteOIndex; break; case 'r': /* repeat frequency */ cp = copy_nword(cp, buf, SPRINT_MAX_LEN); repeat = strtoul(buf, NULL, 0); break; case 'S': /* disable startup tests */ startup = 0; break; case 's': /* enable startup tests (default?) */ startup = 1; break; case 't': /* threshold test - already handled */ break; case 'u': /* user */ cp = copy_nword(cp, buf, SPRINT_MAX_LEN); sess = netsnmp_iquery_user_session(buf); if (NULL == sess) { snmp_log(LOG_ERR, "user name %s not found\n", buf); config_perror("Unknown user name\n"); mteObjects_removeEntries( "snmpd.conf", tname ); return; } break; } } else { /* * Skip the first non-option token - the trigger * name (which has already been processed earlier). */ if ( !seen_name ) { seen_name = 1; } else { /* * But the next non-option token encountered will * mark the start of the expression to be monitored. * * There are three possible expression formats: * [op] OID (existence tests) * OID op value (boolean tests) * OID val val [val val] (threshold tests) * * Extract the OID, operation and (first) value. */ switch ( test ) { case MTE_TRIGGER_EXISTENCE: /* * Identify the existence operator (if any)... */ op = MTE_EXIST_PRESENT; if (buf[0] == '!') { if (buf[1] == '=') { op = MTE_EXIST_CHANGED; } else { op = MTE_EXIST_ABSENT; } cp = copy_nword(cp, buf, SPRINT_MAX_LEN); } /* * ... then extract the monitored OID. * (ignoring anything that remains) */ memcpy(oid_name_buf, buf, SPRINT_MAX_LEN); cp = NULL; /* To terminate the processing loop */ DEBUGMSGTL(("disman:event:conf", "%s: Exist (%s, %d)\n", tname, oid_name_buf, op)); break; case MTE_TRIGGER_BOOLEAN: /* * Extract the monitored OID, and * identify the boolean operator ... */ memcpy(oid_name_buf, buf, SPRINT_MAX_LEN); cp = copy_nword(cp, buf, SPRINT_MAX_LEN); if (buf[0] == '!') { op = MTE_BOOL_UNEQUAL; } else if (buf[0] == '=') { op = MTE_BOOL_EQUAL; } else if (buf[0] == '<') { if (buf[1] == '=') { op = MTE_BOOL_LESSEQUAL; } else { op = MTE_BOOL_LESS; } } else if (buf[0] == '>') { if (buf[1] == '=') { op = MTE_BOOL_GREATEREQUAL; } else { op = MTE_BOOL_GREATER; } } /* * ... then extract the comparison value. * (ignoring anything that remains) */ cp = copy_nword(cp, buf, SPRINT_MAX_LEN); value = strtol(buf, NULL, 0); cp = NULL; /* To terminate the processing loop */ DEBUGMSGTL(("disman:event:conf", "%s: Bool (%s, %d, %d)\n", tname, oid_name_buf, op, value)); break; case MTE_TRIGGER_THRESHOLD: /* * Extract the monitored OID, and * the first comparison value... */ memcpy(oid_name_buf, buf, SPRINT_MAX_LEN); memset( buf, 0, SPRINT_MAX_LEN); cp = copy_nword(cp, buf, SPRINT_MAX_LEN); if ( buf[0] != '-' ) value = strtol(buf, NULL, 0); /* * ... then save the rest of the line for later. */ memset( buf, 0, strlen(buf)); memcpy( buf, cp, strlen(cp)); cp = NULL; /* To terminate the processing loop */ DEBUGMSGTL(("disman:event:conf", "%s: Thresh (%s, %d, %s)\n", tname, oid_name_buf, op, buf)); break; } } } if (!cp) break; } if (NULL == sess) { sess = netsnmp_query_get_default_session(); if (NULL == sess) { config_perror ("You must specify a default user name using the agentSecName token\n"); mteObjects_removeEntries( "snmpd.conf", tname ); return; } } /* * ... and then create the new trigger entry... */ entry = _find_typed_mteTrigger_entry( "snmpd.conf", tname+2, test ); if (!entry) { /* mteObjects_removeEntries( "snmpd.conf", tname ); */ return; } /* * ... populate the type-independent fields... * (setting the delta discontinuity OID first) */ if ( (flags & MTE_TRIGGER_FLAG_DELTA) && !(flags & MTE_TRIGGER_FLAG_SYSUPT)) { memset( entry->mteDeltaDiscontID, 0, sizeof(entry->mteDeltaDiscontID)); memcpy( entry->mteDeltaDiscontID, name_buf, name_buf_len*sizeof(oid)); entry->mteDeltaDiscontID_len = name_buf_len; } name_buf_len = MAX_OID_LEN; if (!snmp_parse_oid(oid_name_buf, name_buf, &name_buf_len)) { snmp_log(LOG_ERR, "trigger OID: %s\n", oid_name_buf); config_perror("unknown monitor OID"); mteObjects_removeEntries( "snmpd.conf", tname ); return; } entry->session = sess; entry->flags |= flags; entry->mteTriggerTest |= test; entry->mteTriggerFrequency = repeat; entry->mteTriggerValueID_len = name_buf_len; memcpy(entry->mteTriggerValueID, name_buf, name_buf_len*sizeof(oid)); /* * ... and the relevant test-specific fields. */ switch (test) { case MTE_TRIGGER_EXISTENCE: entry->mteTExTest = op; if (op != MTE_EXIST_CHANGED && startup) entry->mteTExStartup = op; if ( idx > 0 ) { /* * Refer to the objects for this trigger (if any)... */ memset(entry->mteTExObjOwner, 0, MTE_STR1_LEN+1); memcpy(entry->mteTExObjOwner, "snmpd.conf", 10); memcpy(entry->mteTExObjects, tname, MTE_STR1_LEN+1); } if ( ename[0] ) { /* * ... and the specified event... */ memset(entry->mteTExEvOwner, 0, MTE_STR1_LEN+1); if ( ename[0] == '_' ) memcpy(entry->mteTExEvOwner, "_snmpd", 6); else memcpy(entry->mteTExEvOwner, "snmpd.conf", 10); memcpy(entry->mteTExEvent, ename, MTE_STR1_LEN+1); } else { /* * ... or the hardcoded default event. */ memset(entry->mteTExEvOwner, 0, MTE_STR1_LEN+1); memset(entry->mteTExEvent, 0, MTE_STR1_LEN+1); memcpy(entry->mteTExEvOwner, "_snmpd", 6); memcpy(entry->mteTExEvent, "_mteTriggerFired", 16); } break; case MTE_TRIGGER_BOOLEAN: entry->mteTBoolComparison = op; entry->mteTBoolValue = value; if (!startup) entry->flags &= ~MTE_TRIGGER_FLAG_BSTART; if ( idx > 0 ) { /* * Refer to the objects for this trigger (if any)... */ memset(entry->mteTBoolObjOwner, 0, MTE_STR1_LEN+1); memcpy(entry->mteTBoolObjOwner, "snmpd.conf", 10); memcpy(entry->mteTBoolObjects, tname, MTE_STR1_LEN+1); } if ( ename[0] ) { /* * ... and the specified event... */ memset(entry->mteTBoolEvOwner, 0, MTE_STR1_LEN+1); if ( ename[0] == '_' ) memcpy(entry->mteTBoolEvOwner, "_snmpd", 6); else memcpy(entry->mteTBoolEvOwner, "snmpd.conf", 10); memcpy(entry->mteTBoolEvent, ename, MTE_STR1_LEN+1); } else { /* * ... or the hardcoded default event. */ memset(entry->mteTBoolEvOwner, 0, MTE_STR1_LEN+1); memset(entry->mteTBoolEvent, 0, MTE_STR1_LEN+1); memcpy(entry->mteTBoolEvOwner, "_snmpd", 6); memcpy(entry->mteTBoolEvent, "_mteTriggerFired", 16); } break; case MTE_TRIGGER_THRESHOLD: if ( buf[0] != '-' ) { entry->mteTThFallValue = value; value = strtol(buf, NULL, 0); entry->mteTThRiseValue = value; if (!startup) entry->mteTThStartup = 0; if ( idx > 0 ) { /* * Refer to the objects for this trigger (if any)... */ memset(entry->mteTThObjOwner, 0, MTE_STR1_LEN+1); memcpy(entry->mteTThObjOwner, "snmpd.conf", 10); memcpy(entry->mteTThObjects, tname, MTE_STR1_LEN+1); } if ( ename[0] ) { /* * ... and the specified event... * (using the same event for all triggers) */ memset(entry->mteTThRiseOwner, 0, MTE_STR1_LEN+1); if ( ename[0] == '_' ) memcpy(entry->mteTThRiseOwner, "_snmpd", 6); else memcpy(entry->mteTThRiseOwner, "snmpd.conf", 10); memcpy(entry->mteTThRiseEvent, ename, MTE_STR1_LEN+1); memset(entry->mteTThFallOwner, 0, MTE_STR1_LEN+1); if ( ename[0] == '_' ) memcpy(entry->mteTThFallOwner, "_snmpd", 6); else memcpy(entry->mteTThFallOwner, "snmpd.conf", 10); memcpy(entry->mteTThFallEvent, ename, MTE_STR1_LEN+1); } else { /* * ... or the hardcoded default events. */ memset(entry->mteTThRiseOwner, 0, MTE_STR1_LEN+1); memset(entry->mteTThFallOwner, 0, MTE_STR1_LEN+1); memset(entry->mteTThRiseEvent, 0, MTE_STR1_LEN+1); memset(entry->mteTThFallEvent, 0, MTE_STR1_LEN+1); memcpy(entry->mteTThRiseOwner, "_snmpd", 6); memcpy(entry->mteTThFallOwner, "_snmpd", 6); memcpy(entry->mteTThRiseEvent, "_mteTriggerRising", 17); memcpy(entry->mteTThFallEvent, "_mteTriggerFalling", 18); } cp = skip_token(buf); /* skip riseThreshold value */ } else { /* Skip absolute threshold placeholders */ cp = skip_token(buf); } /* * Parse and set (optional) Delta thresholds & events */ if ( cp && *cp != '\0' ) { if (entry->flags & MTE_TRIGGER_FLAG_DELTA) { config_perror("Delta-threshold on delta-samples not supported"); mteObjects_removeEntries( "snmpd.conf", tname ); return; } value = strtol(cp, NULL, 0); entry->mteTThDFallValue = value; cp = skip_token(cp); value = strtol(cp, NULL, 0); entry->mteTThDRiseValue = value; /* * Set the events in the same way as before */ if ( ename[0] ) { memset(entry->mteTThDRiseOwner, 0, MTE_STR1_LEN+1); if ( ename[0] == '_' ) memcpy(entry->mteTThDRiseOwner, "_snmpd", 6); else memcpy(entry->mteTThDRiseOwner, "snmpd.conf", 10); memcpy(entry->mteTThDRiseEvent, ename, MTE_STR1_LEN+1); memset(entry->mteTThDFallOwner, 0, MTE_STR1_LEN+1); if ( ename[0] == '_' ) memcpy(entry->mteTThDFallOwner, "_snmpd", 6); else memcpy(entry->mteTThDFallOwner, "snmpd.conf", 10); memcpy(entry->mteTThDFallEvent, ename, MTE_STR1_LEN+1); } else { memset(entry->mteTThDRiseOwner, 0, MTE_STR1_LEN+1); memset(entry->mteTThDFallOwner, 0, MTE_STR1_LEN+1); memset(entry->mteTThDRiseEvent, 0, MTE_STR1_LEN+1); memset(entry->mteTThDFallEvent, 0, MTE_STR1_LEN+1); memcpy(entry->mteTThDRiseOwner, "_snmpd", 6); memcpy(entry->mteTThDFallOwner, "_snmpd", 6); memcpy(entry->mteTThDRiseEvent, "_mteTriggerRising", 17); memcpy(entry->mteTThDFallEvent, "_mteTriggerFalling", 18); } } break; } snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_POST_READ_CONFIG, _mteTrigger_callback_enable, entry ); return;}voidparse_linkUpDown_traps(const char *token, char *line){ /* * XXX - This isn't strictly correct according to the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -