⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mteevent.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
     * 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 + -