📄 mtetrigger.c
字号:
/* * DisMan Event MIB: * Core implementation of the trigger handling behaviour */#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include "disman/event/mteTrigger.h"#include "disman/event/mteEvent.h"netsnmp_tdata *trigger_table_data;oid _sysUpTime_instance[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };size_t _sysUpTime_inst_len = OID_LENGTH(_sysUpTime_instance);long mteTriggerFailures; /* * Initialize the container for the (combined) mteTrigger*Table, * regardless of which table initialisation routine is called first. */voidinit_trigger_table_data(void){ DEBUGMSGTL(("disman:event:init", "init trigger container\n")); if (!trigger_table_data) { trigger_table_data = netsnmp_tdata_create_table("mteTriggerTable", 0); if (!trigger_table_data) { snmp_log(LOG_ERR, "failed to create mteTriggerTable"); return; } DEBUGMSGTL(("disman:event:init", "create trigger container (%x)\n", trigger_table_data)); } mteTriggerFailures = 0;}/** Initializes the mteTrigger module */voidinit_mteTrigger(void){ init_trigger_table_data();} /* =================================================== * * APIs for maintaining the contents of the (combined) * mteTrigger*Table container. * * =================================================== */void_mteTrigger_dump(void){ struct mteTrigger *entry; netsnmp_tdata_row *row; int i = 0; for (row = netsnmp_tdata_row_first(trigger_table_data); row; row = netsnmp_tdata_row_next(trigger_table_data, row)) { entry = (struct mteTrigger *)row->data; DEBUGMSGTL(("disman:event:dump", "TriggerTable entry %d: ", i)); DEBUGMSGOID(("disman:event:dump", row->oid_index.oids, row->oid_index.len)); DEBUGMSG(("disman:event:dump", "(%s, %s)", row->indexes->val.string, row->indexes->next_variable->val.string)); DEBUGMSG(("disman:event:dump", ": %x, %x\n", row, entry)); i++; } DEBUGMSGTL(("disman:event:dump", "TriggerTable %d entries\n", i));}/* * Create a new row in the trigger table */netsnmp_tdata_row *mteTrigger_createEntry(char *mteOwner, char *mteTName, int fixed){ struct mteTrigger *entry; netsnmp_tdata_row *row; size_t mteOwner_len = (mteOwner) ? strlen(mteOwner) : 0; size_t mteTName_len = (mteTName) ? strlen(mteTName) : 0; DEBUGMSGTL(("disman:event:table", "Create trigger entry (%s, %s)\n", mteOwner, mteTName)); /* * Create the mteTrigger entry, and the * (table-independent) row wrapper structure... */ entry = SNMP_MALLOC_TYPEDEF(struct mteTrigger); if (!entry) return NULL; row = netsnmp_tdata_create_row(); if (!row) { SNMP_FREE(entry); return NULL; } row->data = entry; /* * ... initialize this row with the indexes supplied * and the default values for the row... */ if (mteOwner) memcpy(entry->mteOwner, mteOwner, mteOwner_len); netsnmp_table_row_add_index(row, ASN_OCTET_STR, entry->mteOwner, mteOwner_len); if (mteTName) memcpy(entry->mteTName, mteTName, mteTName_len); netsnmp_table_row_add_index(row, ASN_PRIV_IMPLIED_OCTET_STR, entry->mteTName, mteTName_len); /* entry->mteTriggerTest = MTE_TRIGGER_BOOLEAN; */ entry->mteTriggerValueID_len = 2; /* .0.0 */ entry->mteTriggerFrequency = 600; memcpy(entry->mteDeltaDiscontID, _sysUpTime_instance, sizeof(_sysUpTime_instance)); entry->mteDeltaDiscontID_len = _sysUpTime_inst_len; entry->mteDeltaDiscontIDType = MTE_DELTAD_TTICKS; entry->flags |= MTE_TRIGGER_FLAG_SYSUPT; entry->mteTExTest = (MTE_EXIST_PRESENT | MTE_EXIST_ABSENT); entry->mteTExStartup = (MTE_EXIST_PRESENT | MTE_EXIST_ABSENT); entry->mteTBoolComparison = MTE_BOOL_UNEQUAL; entry->flags |= MTE_TRIGGER_FLAG_BSTART; entry->mteTThStartup = MTE_THRESH_START_RISEFALL; if (fixed) entry->flags |= MTE_TRIGGER_FLAG_FIXED; /* * ... and insert the row into the (common) table container */ netsnmp_tdata_add_row(trigger_table_data, row); DEBUGMSGTL(("disman:event:table", "Trigger entry created\n")); return row;}/* * Remove a row from the trigger table */voidmteTrigger_removeEntry(netsnmp_tdata_row *row){ struct mteTrigger *entry; if (!row) return; /* Nothing to remove */ entry = (struct mteTrigger *) netsnmp_tdata_remove_and_delete_row(trigger_table_data, row); if (entry) { mteTrigger_disable( entry ); SNMP_FREE(entry); }} /* =================================================== * * APIs for evaluating a trigger, * and firing the appropriate event * * =================================================== */const char *_ops[] = { "", "!=", /* MTE_BOOL_UNEQUAL */ "==", /* MTE_BOOL_EQUAL */ "<", /* MTE_BOOL_LESS */ "<=", /* MTE_BOOL_LESSEQUAL */ ">", /* MTE_BOOL_GREATER */ ">=" /* MTE_BOOL_GREATEREQUAL */ };void_mteTrigger_failure( /* int error, */ const char *msg ){ /* * XXX - Send an mteTriggerFailure trap * (if configured to do so) */ mteTriggerFailures++; snmp_log(LOG_ERR, "%s\n", msg ); return;}voidmteTrigger_run( unsigned int reg, void *clientarg){ struct mteTrigger *entry = (struct mteTrigger *)clientarg; netsnmp_variable_list *var, *vtmp; netsnmp_variable_list *vp1, *vp1_prev; netsnmp_variable_list *vp2, *vp2_prev; netsnmp_variable_list *dvar = NULL; netsnmp_variable_list *dv1 = NULL, *dv2 = NULL; netsnmp_variable_list sysUT_var; int cmp = 0, n, n2; long value; const char *reason; if (!entry) { snmp_alarm_unregister( reg ); return; } if (!(entry->flags & MTE_TRIGGER_FLAG_ENABLED ) || !(entry->flags & MTE_TRIGGER_FLAG_ACTIVE ) || !(entry->flags & MTE_TRIGGER_FLAG_VALID )) { return; } { extern netsnmp_agent_session *netsnmp_processing_set; if (netsnmp_processing_set) { /* * netsnmp_handle_request will not be responsive to our efforts to * Retrieve the requested MIB value(s)... * so we will skip it. * https://sourceforge.net/tracker/ * index.php?func=detail&aid=1557406&group_id=12694&atid=112694 */ DEBUGMSGTL(("disman:event:trigger:monitor", "Skipping trigger (%s) while netsnmp_processing_set\n", entry->mteTName)); return; } } /* * Retrieve the requested MIB value(s)... */ DEBUGMSGTL(( "disman:event:trigger:monitor", "Running trigger (%s)\n", entry->mteTName)); var = (netsnmp_variable_list *)SNMP_MALLOC_TYPEDEF( netsnmp_variable_list ); if (!var) { _mteTrigger_failure("failed to create mteTrigger query varbind"); return; } snmp_set_var_objid( var, entry->mteTriggerValueID, entry->mteTriggerValueID_len ); if ( entry->flags & MTE_TRIGGER_FLAG_VWILD ) { n = netsnmp_query_walk( var, entry->session ); } else { n = netsnmp_query_get( var, entry->session ); } if ( n != SNMP_ERR_NOERROR ) { DEBUGMSGTL(( "disman:event:trigger:monitor", "Trigger query (%s) failed: %d\n", (( entry->flags & MTE_TRIGGER_FLAG_VWILD ) ? "walk" : "get"), n)); _mteTrigger_failure( "failed to run mteTrigger query" ); return; } /* * ... canonicalise the results (to simplify later comparisons)... */ vp1 = var; vp1_prev = NULL; vp2 = entry->old_results; vp2_prev = NULL; entry->count=0; while (vp1) { /* * Flatten various missing values/exceptions into a single form */ switch (vp1->type) { case SNMP_NOSUCHINSTANCE: case SNMP_NOSUCHOBJECT: case ASN_PRIV_RETRY: /* Internal only ? */ vp1->type = ASN_NULL; } /* * Keep track of how many entries have been retrieved. */ entry->count++; /* * Ensure previous and current result match * (with corresponding entries in both lists) * and set the flags indicating which triggers are armed */ if (vp2) { cmp = snmp_oid_compare(vp1->name, vp1->name_length, vp2->name, vp2->name_length); if ( cmp < 0 ) { /* * If a new value has appeared, insert a matching * dummy entry into the previous result list. * * XXX - check how this is best done. */ vtmp = SNMP_MALLOC_TYPEDEF( netsnmp_variable_list ); if (!vtmp) { _mteTrigger_failure( "failed to create mteTrigger temp varbind");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -