📄 mteevent.c
字号:
* Retrieve the entry for the specified event */ memset( &owner_var, 0, sizeof(owner_var)); memset( &event_var, 0, sizeof(event_var)); snmp_set_var_typed_value(&owner_var, ASN_OCTET_STR, owner, strlen(owner)); snmp_set_var_typed_value(&event_var, ASN_PRIV_IMPLIED_OCTET_STR, event, strlen(event)); owner_var.next_variable = &event_var; entry = (struct mteEvent *) netsnmp_tdata_row_entry( netsnmp_tdata_row_get_byidx( event_table_data, &owner_var )); if (!entry) { DEBUGMSGTL(("disman:event:fire", "No matching event\n")); return -1; } if (entry->mteEventActions & MTE_EVENT_NOTIFICATION) { DEBUGMSGTL(("disman:event:fire", "Firing notification event\n")); _mteEvent_fire_notify( entry, trigger, suffix, s_len ); fired = 1; } if (entry->mteEventActions & MTE_EVENT_SET) { DEBUGMSGTL(("disman:event:fire", "Firing set event\n")); _mteEvent_fire_set( entry, trigger, suffix, s_len ); fired = 1; } if (!fired) DEBUGMSGTL(("disman:event:fire", "Matched event is empty\n")); return fired;}void_insert_internal_objects( netsnmp_variable_list *vblist, char *oname, struct mteTrigger *trigger){ netsnmp_variable_list *var = NULL, *vp; oid mteHotTrigger[] = {1, 3, 6, 1, 2, 1, 88, 2, 1, 1, 0}; oid mteHotTarget[] = {1, 3, 6, 1, 2, 1, 88, 2, 1, 2, 0}; oid mteHotContext[] = {1, 3, 6, 1, 2, 1, 88, 2, 1, 3, 0}; oid mteHotOID[] = {1, 3, 6, 1, 2, 1, 88, 2, 1, 4, 0}; oid mteHotValue[] = {1, 3, 6, 1, 2, 1, 88, 2, 1, 5, 0}; /* * Construct the varbinds for this (internal) event... */ if ((!strcmp(oname, "_mteTriggerFired" )) || (!strcmp(oname, "_mteTriggerRising" )) || (!strcmp(oname, "_mteTriggerFalling")) || (!strcmp(oname, "_triggerFire"))) { snmp_varlist_add_variable( &var, mteHotTrigger, OID_LENGTH(mteHotTrigger), ASN_OCTET_STR, trigger->mteTName, strlen(trigger->mteTName)); snmp_varlist_add_variable( &var, mteHotTarget, OID_LENGTH(mteHotTarget), ASN_OCTET_STR, trigger->mteTriggerTarget, strlen(trigger->mteTriggerTarget)); snmp_varlist_add_variable( &var, mteHotContext, OID_LENGTH(mteHotContext), ASN_OCTET_STR, trigger->mteTriggerContext, strlen(trigger->mteTriggerContext)); snmp_varlist_add_variable( &var, mteHotOID, OID_LENGTH(mteHotOID), ASN_OBJECT_ID, (char *)trigger->mteTriggerFired->name, trigger->mteTriggerFired->name_length*sizeof(oid)); snmp_varlist_add_variable( &var, mteHotValue, OID_LENGTH(mteHotValue), trigger->mteTriggerFired->type, trigger->mteTriggerFired->val.string, trigger->mteTriggerFired->val_len); } else { DEBUGMSGTL(("disman:event:fire", "Unknown internal objects tag (%s)\n", oname)); return; } /* * ... and insert them into the main varbind list * (at the point specified) */ for (vp = var; vp && vp->next_variable; vp=vp->next_variable) ; vp->next_variable = vblist->next_variable; vblist->next_variable = var;}int_mteEvent_fire_notify( struct mteEvent *entry, /* The event to fire */ struct mteTrigger *trigger, /* Trigger that fired */ oid *suffix, size_t sfx_len ) /* Matching instance */{ netsnmp_variable_list *var, *v2; oid snmptrap_oid[] = { 1,3,6,1,6,3,1,1,4,1,0 }; size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid); /* * The Event-MIB specification says that objects from the * mteEventTable should come after those from the trigger, * but things actually work better if these come first. * Allow the agent to be configured either way. */ int strictOrdering = netsnmp_ds_get_boolean( NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_STRICT_DISMAN); var = (netsnmp_variable_list *)SNMP_MALLOC_TYPEDEF( netsnmp_variable_list ); if (!var) return -1; /* * Set the basic notification OID... */ memset(var, 0, sizeof(netsnmp_variable_list)); snmp_set_var_objid( var, snmptrap_oid, snmptrap_oid_len ); snmp_set_var_typed_value( var, ASN_OBJECT_ID, (u_char *)entry->mteNotification, entry->mteNotification_len*sizeof(oid)); /* * ... then add the specified objects from the Objects Table. * * Strictly speaking, the objects from the EventTable are meant * to be listed last (after the various trigger objects). * But logically things actually work better if the event objects * are placed first. So this code handles things either way :-) */ if (!strictOrdering) { DEBUGMSGTL(("disman:event:fire", "Adding event objects (first)\n")); if (strcmp(entry->mteNotifyOwner, "_snmpd") != 0) mteObjects_vblist( var, entry->mteNotifyOwner, entry->mteNotifyObjects, suffix, sfx_len ); } DEBUGMSGTL(("disman:event:fire", "Adding trigger objects (general)\n")); mteObjects_vblist( var, trigger->mteTriggerOOwner, trigger->mteTriggerObjects, suffix, sfx_len ); DEBUGMSGTL(("disman:event:fire", "Adding trigger objects (specific)\n")); mteObjects_vblist( var, trigger->mteTriggerXOwner, trigger->mteTriggerXObjects, suffix, sfx_len ); if (strictOrdering) { DEBUGMSGTL(("disman:event:fire", "Adding event objects (last)\n")); if (strcmp(entry->mteNotifyOwner, "_snmpd") != 0) mteObjects_vblist( var, entry->mteNotifyOwner, entry->mteNotifyObjects, suffix, sfx_len ); } /* * Query the agent to retrieve the necessary values... * (skipping the initial snmpTrapOID varbind) */ v2 = var->next_variable; if (entry->session) netsnmp_query_get( v2, entry->session ); else netsnmp_query_get( v2, trigger->session ); /* * ... add any "internal" objects... * (skipped by the processing above, and best handled directly) */ if (strcmp(entry->mteNotifyOwner, "_snmpd") == 0) { DEBUGMSGTL(("disman:event:fire", "Adding event objects (internal)\n")); if ( !strictOrdering ) { mteObjects_internal_vblist(var, entry->mteNotifyObjects, trigger); } else { for (v2 = var; v2 && v2->next_variable; v2=v2->next_variable) ; mteObjects_internal_vblist(v2, entry->mteNotifyObjects, trigger); } } /* * ... and send the resulting varbind list as a notification */ send_v2trap( var ); snmp_free_varbind( var ); return 0;}int_mteEvent_fire_set( struct mteEvent *entry, /* The event to fire */ struct mteTrigger *trigger, /* Trigger that fired */ oid *suffix, size_t sfx_len ) /* Matching instance */{ netsnmp_variable_list var; oid set_oid[ MAX_OID_LEN ]; size_t set_len; /* * Set the basic assignment OID... */ memset(set_oid, 0, sizeof(set_oid)); memcpy(set_oid, entry->mteSetOID, entry->mteSetOID_len*sizeof(oid)); set_len = entry->mteSetOID_len; /* * ... if the trigger value is wildcarded (sfx_len > 0), * *and* the SET event entry is wildcarded, * then add the supplied instance suffix... */ if (sfx_len && entry->flags & MTE_SET_FLAG_OBJWILD) { memcpy( &set_oid[set_len], suffix, sfx_len*sizeof(oid)); set_len += sfx_len; } /* * ... finally build the assignment varbind, * and pass it to be acted on. * * XXX: Need to handle (remote) targets and non-default contexts */ memset( &var, 0, sizeof(var)); snmp_set_var_objid( &var, set_oid, set_len ); snmp_set_var_typed_integer( &var, ASN_INTEGER, entry->mteSetValue ); if (entry->session) return netsnmp_query_set( &var, entry->session ); else return netsnmp_query_set( &var, trigger->session ); /* XXX - Need to check result */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -