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

📄 mtetrigger.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 4 页
字号:
                    return;                }                vtmp->type = ASN_NULL;                snmp_set_var_objid( vtmp, vp1->name, vp1->name_length );                vtmp->next_variable = vp2;                if (vp2_prev) {                    vp2_prev->next_variable = vtmp;                } else {                    entry->old_results      = vtmp;                }                vp2_prev   = vtmp;                vp1->index = MTE_ARMED_ALL;	/* XXX - plus a new flag */                vp1_prev   = vp1;                vp1        = vp1->next_variable;            }            else if ( cmp == 0 ) {                /*                 * If it's a continuing entry, just copy across the armed flags                 */                vp1->index = vp2->index;                vp1_prev   = vp1;                vp1        = vp1->next_variable;                vp2_prev   = vp2;                vp2        = vp2->next_variable;            } else {                /*                 * If a value has just disappeared, insert a                 * matching dummy entry into the current result list.                 *                 * XXX - check how this is best done.                 *                 */                if ( vp2->type != ASN_NULL ) {                    vtmp = SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );                    if (!vtmp) {                        _mteTrigger_failure(                                 "failed to create mteTrigger temp varbind");                        return;                    }                    vtmp->type = ASN_NULL;                    snmp_set_var_objid( vtmp, vp2->name, vp2->name_length );                    vtmp->next_variable = vp1;                    if (vp1_prev) {                        vp1_prev->next_variable = vtmp;                    } else {                        entry->old_results      = vtmp;                    }                    vp1_prev = vtmp;                    vp2_prev = vp2;                    vp2      = vp2->next_variable;                } else {                    /*                     * But only if this entry has *just* disappeared.  If the                     * entry from the last run was a dummy too, then remove it.                     *   (leaving vp2_prev unchanged)                     */                    vtmp = vp2;                    if (vp2_prev) {                        vp2_prev->next_variable = vp2->next_variable;                    } else {                        entry->old_results      = vp2->next_variable;                    }                    vp2  = vp2->next_variable;                    vtmp->next_variable = NULL;                    snmp_free_varbind( vtmp );                }            }        } else {            /*             * No more old results to compare.             * Either all remaining values have only just been created ...             *   (and we need to create dummy 'old' entries for them)             */            if ( vp2_prev ) {                vtmp = SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );                if (!vtmp) {                    _mteTrigger_failure(                             "failed to create mteTrigger temp varbind");                    return;                }                vtmp->type = ASN_NULL;                snmp_set_var_objid( vtmp, vp1->name, vp1->name_length );                vtmp->next_variable     = vp2_prev->next_variable;                vp2_prev->next_variable = vtmp;                vp2_prev                = vtmp;            }            /*             * ... or this is the first run through             *   (and there were no old results at all)             *             * In either case, mark the current entry as armed and new.             * Note that we no longer need to maintain 'vp1_prev'             */            vp1->index = MTE_ARMED_ALL;	/* XXX - plus a new flag */            vp1        = vp1->next_variable;        }    }    /*     * ... and then work through these result(s), deciding     *     whether or not to trigger the corresponding event.     *     *  Note that there's no point in evaluating Existence or     *    Boolean tests if there's no corresponding event.     *   (Even if the trigger matched, nothing would be done anyway).     */    if ((entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE) &&        (entry->mteTExEvent[0] != '\0' )) {        /*         * If we don't have a record of previous results,         * this must be the first time through, so consider         * the mteTriggerExistenceStartup tests.         */        if ( !entry->old_results ) {            /*             * With the 'present(0)' test, the trigger should fire             *   for each value in the varbind list returned             *   (whether the monitored value is wildcarded or not).             */            if (entry->mteTExTest & entry->mteTExStartup & MTE_EXIST_PRESENT) {                for (vp1 = var; vp1; vp1=vp1->next_variable) {                    DEBUGMSGTL(( "disman:event:trigger:fire",                                 "Firing initial existence test: "));                    DEBUGMSGOID(("disman:event:trigger:fire",                                 vp1->name, vp1->name_length));                    DEBUGMSG((   "disman:event:trigger:fire",                                 " (present)\n"));;                    entry->mteTriggerXOwner   = entry->mteTExObjOwner;                    entry->mteTriggerXObjects = entry->mteTExObjects;                    entry->mteTriggerFired    = vp1;                    n = entry->mteTriggerValueID_len;                    mteEvent_fire(entry->mteTExEvOwner, entry->mteTExEvent,                                   entry, vp1->name+n, vp1->name_length-n);                }            }            /*             * An initial 'absent(1)' test only makes sense when             *   monitoring a non-wildcarded OID (how would we know             *   which rows of the table "ought" to exist, but don't?)             */            if (entry->mteTExTest & entry->mteTExStartup & MTE_EXIST_ABSENT) {                if (!(entry->flags & MTE_TRIGGER_FLAG_VWILD) &&                    vp1->type == ASN_NULL ) {                    DEBUGMSGTL(( "disman:event:trigger:fire",                                 "Firing initial existence test: "));                    DEBUGMSGOID(("disman:event:trigger:fire",                                 var->name, var->name_length));                    DEBUGMSG((   "disman:event:trigger:fire",                                 " (absent)\n"));;                    entry->mteTriggerXOwner   = entry->mteTExObjOwner;                    entry->mteTriggerXObjects = entry->mteTExObjects;                    /*                     * It's unclear what value the 'mteHotValue' payload                     *  should take when a monitored instance does not                     *  exist on startup. The only sensible option is                     *  to report a NULL value, but this clashes with                     * the syntax of the mteHotValue MIB object.                     */                    entry->mteTriggerFired    = vp1;                    n = entry->mteTriggerValueID_len;                    mteEvent_fire(entry->mteTExEvOwner, entry->mteTExEvent,                                   entry, vp1->name+n, vp1->name_length-n);                }            }        } /* !old_results */            /*             * Otherwise, compare the current set of results with             * the previous ones, looking for changes.  We can             * assume that the two lists match (see above).             */        else {            for (vp1 = var, vp2 = entry->old_results;                 vp1;                 vp1=vp1->next_variable, vp2=vp2->next_variable) {                /* Use this field to indicate that the trigger should fire */                entry->mteTriggerFired = NULL;                reason                 = NULL;                if ((entry->mteTExTest & MTE_EXIST_PRESENT) &&                    (vp1->type != ASN_NULL) &&                    (vp2->type == ASN_NULL)) {                    /* A new instance has appeared */                    entry->mteTriggerFired = vp1;                    reason = "(present)";                } else if ((entry->mteTExTest & MTE_EXIST_ABSENT) &&                    (vp1->type == ASN_NULL) &&                    (vp2->type != ASN_NULL)) {                    /*                     * A previous instance has disappeared.                     *                     * It's unclear what value the 'mteHotValue' payload                     *  should take when this happens - the previous                     *  value (vp2), or a NULL value (vp1) ?                     * NULL makes more sense logically, but clashes                     *  with the syntax of the mteHotValue MIB object.                     */                    entry->mteTriggerFired = vp2;                    reason = "(absent)";                } else if ((entry->mteTExTest & MTE_EXIST_CHANGED) &&                    ((vp1->val_len != vp2->val_len) ||                      (memcmp( vp1->val.string, vp2->val.string,                              vp1->val_len) != 0 ))) {                    /*                     * This comparison detects changes in *any* type                     *  of value, numeric or string (or even OID).                     *                     * Unfortunately, the default 'mteTriggerFired'                     *  notification payload can't report non-numeric                     *  changes properly (see syntax of 'mteHotValue')                     */                    entry->mteTriggerFired = vp1;                    reason = "(changed)";                }                if ( entry->mteTriggerFired ) {                    /*                     * One of the above tests has matched,                     *   so fire the trigger.                     */                    DEBUGMSGTL(( "disman:event:trigger:fire",                                 "Firing existence test: "));                    DEBUGMSGOID(("disman:event:trigger:fire",                                 vp1->name, vp1->name_length));                    DEBUGMSG((   "disman:event:trigger:fire",                                 " %s\n", reason));;                    entry->mteTriggerXOwner   = entry->mteTExObjOwner;                    entry->mteTriggerXObjects = entry->mteTExObjects;                    n = entry->mteTriggerValueID_len;                    mteEvent_fire(entry->mteTExEvOwner, entry->mteTExEvent,                                   entry, vp1->name+n, vp1->name_length-n);                }            }        } /* !old_results - end of else block */    } /* MTE_TRIGGER_EXISTENCE */    if (( entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN   ) ||        ( entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD )) {        /*         * Although Existence tests can work with any syntax values,         * Boolean and Threshold tests are integer-only.  Ensure that         * the returned value(s) are appropriate.         *         * Note that we only need to check the first value, since all         *  instances of a given object should have the same syntax.         */        switch (var->type) {        case ASN_INTEGER:        case ASN_COUNTER:        case ASN_GAUGE:        case ASN_TIMETICKS:        case ASN_UINTEGER:        case ASN_COUNTER64:#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES        case ASN_OPAQUE_COUNTER64:        case ASN_OPAQUE_U64:        case ASN_OPAQUE_I64:#endif            /* OK */            break;        default:            /*             * Other syntax values can't be used for Boolean/Theshold             * tests. Report this as an error, and then rotate the             * results ready for the next run, (which will presumably             * also detect this as an error once again!)             */            DEBUGMSGTL(( "disman:event:trigger:fire",                         "Returned non-integer result(s): "));            DEBUGMSGOID(("disman:event:trigger:fire",                         var->name, var->name_length));            DEBUGMSG((   "disman:event:trigger:fire",                         " (boolean/threshold) %d\n", var->type));;            snmp_free_varbind( entry->old_results );            entry->old_results = var;            return;        }        /*         * Retrieve the discontinuity markers for delta-valued samples.         * (including sysUpTime.0 if not specified explicitly).         */        if ( entry->flags & MTE_TRIGGER_FLAG_DELTA ) {            /*             * We'll need sysUpTime.0 regardless...             */            DEBUGMSGTL(("disman:event:delta", "retrieve sysUpTime.0\n"));            memset( &sysUT_var, 0, sizeof( netsnmp_variable_list ));            snmp_set_var_objid( &sysUT_var, _sysUpTime_instance,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -