📄 mteevent.c
字号:
/* * DisMan Event MIB: * Core implementation of the event 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/mteEvent.h"#include "disman/event/mteTrigger.h"#include "disman/event/mteObjects.h"netsnmp_tdata *event_table_data; /* * Initialize the container for the (combined) mteEvent*Table, * regardless of which table initialisation routine is called first. */voidinit_event_table_data(void){ DEBUGMSGTL(("disman:event:init", "init event container\n")); if (!event_table_data) { event_table_data = netsnmp_tdata_create_table("mteEventTable", 0); DEBUGMSGTL(("disman:event:init", "create event container (%x)\n", event_table_data)); }}void _init_default_mteEvent( const char *event, const char *oname, int specific );void _init_link_mteEvent( const char *event, const char *oname, int specific );void _init_builtin_mteEvent( const char *event, const char *oname, oid *trapOID, size_t trapOID_len );/** Initializes the mteEvent module */voidinit_mteEvent(void){ static int _defaults_init = 0; init_event_table_data(); /* * Insert fixed events for the default trigger notifications */ if ( _defaults_init) return; _init_default_mteEvent( "mteTriggerFired", "_triggerFire", 1 ); _init_default_mteEvent( "mteTriggerRising", "_triggerFire", 2 ); _init_default_mteEvent( "mteTriggerFalling", "_triggerFire", 3 ); _init_default_mteEvent( "mteTriggerFailure", "_triggerFail", 4 ); _init_link_mteEvent( "linkDown", "_linkUpDown", 3 ); _init_link_mteEvent( "linkUp", "_linkUpDown", 4 ); _defaults_init = 1;}void_init_builtin_mteEvent( const char *event, const char *oname, oid *trapOID, size_t trapOID_len ){ char ename[ MTE_STR1_LEN+1 ]; netsnmp_tdata_row *row; struct mteEvent *entry; memset(ename, 0, sizeof(ename)); ename[0] = '_'; memcpy(ename+1, event, strlen(event)); row = mteEvent_createEntry( "_snmpd", ename, 1 ); if (!row || !row->data) return; entry = (struct mteEvent *)row->data; entry->mteEventActions = MTE_EVENT_NOTIFICATION; entry->mteNotification_len = trapOID_len; memcpy( entry->mteNotification, trapOID, trapOID_len*sizeof(oid)); memcpy( entry->mteNotifyOwner, "_snmpd", 6 ); memcpy( entry->mteNotifyObjects, oname, strlen(oname)); entry->flags |= MTE_EVENT_FLAG_ENABLED| MTE_EVENT_FLAG_ACTIVE| MTE_EVENT_FLAG_VALID;}void_init_default_mteEvent( const char *event, const char *oname, int specific ){ oid mteTrapOID[] = {1, 3, 6, 1, 2, 1, 88, 2, 0, 99 /* placeholder */}; size_t mteTrapOID_len = OID_LENGTH(mteTrapOID); mteTrapOID[ mteTrapOID_len-1 ] = specific; _init_builtin_mteEvent( event, oname, mteTrapOID, mteTrapOID_len );}void_init_link_mteEvent( const char *event, const char *oname, int specific ){ oid mteTrapOID[] = {1, 3, 6, 1, 6, 3, 1, 1, 5, 99 /* placeholder */}; size_t mteTrapOID_len = OID_LENGTH(mteTrapOID); mteTrapOID[ mteTrapOID_len-1 ] = specific; _init_builtin_mteEvent( event, oname, mteTrapOID, mteTrapOID_len );} /* =================================================== * * APIs for maintaining the contents of the (combined) * mteEvent*Table container. * * =================================================== */void_mteEvent_dump(void){ struct mteEvent *entry; netsnmp_tdata_row *row; int i = 0; for (row = netsnmp_tdata_row_first(event_table_data); row; row = netsnmp_tdata_row_next(event_table_data, row)) { entry = (struct mteEvent *)row->data; DEBUGMSGTL(("disman:event:dump", "EventTable 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", "EventTable %d entries\n", i));}/* * Create a new row in the event table */netsnmp_tdata_row *mteEvent_createEntry(const char *mteOwner, const char *mteEName, int fixed){ struct mteEvent *entry; netsnmp_tdata_row *row; size_t mteOwner_len = (mteOwner) ? strlen(mteOwner) : 0; size_t mteEName_len = (mteEName) ? strlen(mteEName) : 0; DEBUGMSGTL(("disman:event:table", "Create event entry (%s, %s)\n", mteOwner, mteEName)); /* * Create the mteEvent entry, and the * (table-independent) row wrapper structure... */ entry = SNMP_MALLOC_TYPEDEF(struct mteEvent); 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 (mteEName) memcpy(entry->mteEName, mteEName, mteEName_len); netsnmp_table_row_add_index(row, ASN_PRIV_IMPLIED_OCTET_STR, entry->mteEName, mteEName_len); entry->mteNotification_len = 2; /* .0.0 */ if (fixed) entry->flags |= MTE_EVENT_FLAG_FIXED; /* * ... and insert the row into the (common) table container */ netsnmp_tdata_add_row(event_table_data, row); DEBUGMSGTL(("disman:event:table", "Event entry created\n")); return row;}/* * Remove a row from the event table */voidmteEvent_removeEntry(netsnmp_tdata_row *row){ struct mteEvent *entry; if (!row) return; /* Nothing to remove */ entry = (struct mteEvent *) netsnmp_tdata_remove_and_delete_row(event_table_data, row); if (entry) SNMP_FREE(entry);} /* =================================================== * * APIs for processing the firing of an event * * =================================================== */int_mteEvent_fire_notify( struct mteEvent *event, struct mteTrigger *trigger, oid *suffix, size_t sfx_len );int_mteEvent_fire_set( struct mteEvent *event, struct mteTrigger *trigger, oid *suffix, size_t sfx_len );intmteEvent_fire( char *owner, char *event, /* Event to invoke */ struct mteTrigger *trigger, /* Trigger that fired */ oid *suffix, size_t s_len ) /* Matching instance */{ struct mteEvent *entry; int fired = 0; netsnmp_variable_list owner_var, event_var; DEBUGMSGTL(("disman:event:fire", "Event fired (%s, %s)\n", owner, event)); /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -