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

📄 mtetrigger.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 4 页
字号:
                                            _sysUpTime_inst_len );            netsnmp_query_get(  &sysUT_var, entry->session );            if (!(entry->flags & MTE_TRIGGER_FLAG_SYSUPT)) {                /*                 * ... but only retrieve the configured discontinuity                 *      marker(s) if they refer to something different.                 */                DEBUGMSGTL(( "disman:event:delta",                             "retrieve discontinuity marker(s): "));                DEBUGMSGOID(("disman:event:delta", entry->mteDeltaDiscontID,                                               entry->mteDeltaDiscontID_len ));                DEBUGMSG((   "disman:event:delta", " %s\n",                      (entry->flags & MTE_TRIGGER_FLAG_DWILD ? " (wild)" : "")));                dvar = (netsnmp_variable_list *)                                SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );                if (!dvar) {                    _mteTrigger_failure(                            "failed to create mteTrigger delta query varbind");                    return;                }                snmp_set_var_objid( dvar, entry->mteDeltaDiscontID,                                          entry->mteDeltaDiscontID_len );                if ( entry->flags & MTE_TRIGGER_FLAG_DWILD ) {                    netsnmp_query_walk( dvar, entry->session );                } else {                    netsnmp_query_get(  dvar, entry->session );                }                if ( n != SNMP_ERR_NOERROR ) {                    _mteTrigger_failure( "failed to run mteTrigger delta query" );                    snmp_free_varbind( dvar );                    return;                }            }            /*             * We can't calculate delta values the first time through,             *  so there's no point in evaluating the remaining tests.             *             * Save the results (and discontinuity markers),             *   ready for the next run.             */            if ( !entry->old_results ) {                entry->old_results =  var;                entry->old_deltaDs = dvar;                entry->sysUpTime   = *sysUT_var.val.integer;                return;            }            /*             * If the sysUpTime marker has been reset (or strictly,             *   has advanced by less than the monitor frequency),             *  there's no point in trying the remaining tests.             */            if (*sysUT_var.val.integer < entry->sysUpTime) {                DEBUGMSGTL(( "disman:event:delta",                             "single discontinuity: (sysUT)\n"));                snmp_free_varbind( entry->old_results );                snmp_free_varbind( entry->old_deltaDs );                entry->old_results =  var;                entry->old_deltaDs = dvar;                entry->sysUpTime   = *sysUT_var.val.integer;                return;            }            /*             * Similarly if a separate (non-wildcarded) discontinuity             *  marker has changed, then there's no             *  point in trying to evaluate these tests either.             */            if (!(entry->flags & MTE_TRIGGER_FLAG_DWILD)  &&                !(entry->flags & MTE_TRIGGER_FLAG_SYSUPT) &&                  (!entry->old_deltaDs ||                   (entry->old_deltaDs->val.integer != dvar->val.integer))) {                DEBUGMSGTL((  "disman:event:delta", "single discontinuity: ("));                DEBUGMSGOID(( "disman:event:delta", entry->mteDeltaDiscontID,                                           entry->mteDeltaDiscontID_len));                DEBUGMSG((    "disman:event:delta", ")\n"));                snmp_free_varbind( entry->old_results );                snmp_free_varbind( entry->old_deltaDs );                entry->old_results =  var;                entry->old_deltaDs = dvar;                entry->sysUpTime   = *sysUT_var.val.integer;                return;            }            /*             * Ensure that the list of (wildcarded) discontinuity              *  markers matches the list of monitored values             *  (inserting/removing discontinuity varbinds as needed)             *             * XXX - An alternative approach would be to use the list             *    of monitored values (instance subidentifiers) to build             *    the exact list of delta markers to retrieve earlier.             */            if (entry->flags & MTE_TRIGGER_FLAG_DWILD) {                vp1      =  var;                vp2      = dvar;                vp2_prev = NULL;                n  = entry->mteTriggerValueID_len;                n2 = entry->mteDeltaDiscontID_len;                while (vp1) {                    /*                     * For each monitored instance, check whether                     *   there's a matching discontinuity entry.                     */                    cmp = snmp_oid_compare(vp1->name+n,  vp1->name_length-n,                                           vp2->name+n2, vp2->name_length-n2 );                    if ( cmp < 0 ) {                        /*                         * If a discontinuity entry is missing,                         *   insert a (dummy) varbind.                         * The corresponding delta calculation will                         *   fail, but this simplifies the later code.                         */                        vtmp = (netsnmp_variable_list *)                                SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );                        if (!vtmp) {                            _mteTrigger_failure(                                  "failed to create mteTrigger discontinuity varbind");                            return;                        }                        snmp_set_var_objid(vtmp, entry->mteDeltaDiscontID,                                                 entry->mteDeltaDiscontID_len);                            /* XXX - append instance subids */                        vtmp->next_variable     = vp2;                        vp2_prev->next_variable = vtmp;                        vp2_prev                = vtmp;                        vp1 = vp1->next_variable;                    } else if ( cmp == 0 ) {                        /*                         * Matching discontinuity entry -  all OK.                         */                        vp2_prev = vp2;                        vp2      = vp2->next_variable;                        vp1      = vp1->next_variable;                    } else {                        /*                         * Remove unneeded discontinuity entry                         */                        vtmp = vp2;                        vp2_prev->next_variable = vp2->next_variable;                        vp2                     = vp2->next_variable;                        vtmp->next_variable = NULL;                        snmp_free_varbind( vtmp );                    }                }                /*                 * XXX - Now need to ensure that the old list of                 *   delta discontinuity markers matches as well.                 */            }        } /* delta samples */    } /* Boolean/Threshold test checks */    /*     * Only run the Boolean tests if there's an event to be triggered     */    if ((entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN) &&        (entry->mteTBoolEvent[0] != '\0' )) {        if (entry->flags & MTE_TRIGGER_FLAG_DELTA) {            vp2 = entry->old_results;            if (entry->flags & MTE_TRIGGER_FLAG_DWILD) {                dv1 = dvar;                dv2 = entry->old_deltaDs;            }        }        for ( vp1 = var; vp1; vp1=vp1->next_variable ) {            /*             * Determine the value to be monitored...             */            if ( !vp1->val.integer ) {  /* No value */                if ( vp2 )                    vp2 = vp2->next_variable;                continue;            }            if (entry->flags & MTE_TRIGGER_FLAG_DELTA) {                if (entry->flags & MTE_TRIGGER_FLAG_DWILD) {                    /*                     * We've already checked any non-wildcarded                     *   discontinuity markers (inc. sysUpTime.0).                     * Validate this particular sample against                     *   the relevant wildcarded marker...                     */                    if ((dv1->type == ASN_NULL)  ||                        (dv1->type != dv2->type) ||                        (*dv1->val.integer != *dv2->val.integer)) {                        /*                         * Bogus or changed discontinuity marker.                         * Need to skip this sample.                         */    DEBUGMSGTL(( "disman:event:delta", "discontinuity occurred: "));    DEBUGMSGOID(("disman:event:delta", vp1->name,                                       vp1->name_length ));    DEBUGMSG((   "disman:event:delta", " \n" ));                        vp2 = vp2->next_variable;                        continue;                    }                }                /*                 * ... and check there is a previous sample to calculate                 *   the delta value against (regardless of whether the                 *   discontinuity marker was wildcarded or not).                 */                if (vp2->type == ASN_NULL) {    DEBUGMSGTL(( "disman:event:delta", "missing sample: "));    DEBUGMSGOID(("disman:event:delta", vp1->name,                                       vp1->name_length ));    DEBUGMSG((   "disman:event:delta", " \n" ));                    vp2 = vp2->next_variable;                    continue;                }                value = (*vp1->val.integer - *vp2->val.integer);    DEBUGMSGTL(( "disman:event:delta", "delta sample: "));    DEBUGMSGOID(("disman:event:delta", vp1->name,                                       vp1->name_length ));    DEBUGMSG((   "disman:event:delta", " (%d - %d) = %d\n",                *vp1->val.integer,  *vp2->val.integer, value));                vp2 = vp2->next_variable;            } else {                value = *vp1->val.integer;            }            /*             * ... evaluate the comparison ...             */            switch (entry->mteTBoolComparison) {            case MTE_BOOL_UNEQUAL:                cmp = ( value != entry->mteTBoolValue );                break;            case MTE_BOOL_EQUAL:                cmp = ( value == entry->mteTBoolValue );                break;            case MTE_BOOL_LESS:                cmp = ( value <  entry->mteTBoolValue );                break;            case MTE_BOOL_LESSEQUAL:                cmp = ( value <= entry->mteTBoolValue );                break;            case MTE_BOOL_GREATER:                cmp = ( value >  entry->mteTBoolValue );                break;            case MTE_BOOL_GREATEREQUAL:                cmp = ( value >= entry->mteTBoolValue );                break;            }    DEBUGMSGTL(( "disman:event:delta", "Bool comparison: (%d %s %d) %d\n",                          value, _ops[entry->mteTBoolComparison],                          entry->mteTBoolValue, cmp));            /*             * ... and decide whether to trigger the event.             *    (using the 'index' field of the varbind structure             *     to remember whether the trigger has already fired)             */            if ( cmp ) {                if ((entry->old_results ||                     (entry->flags & MTE_TRIGGER_FLAG_BSTART)) &&                    (vp1->index & MTE_ARMED_BOOLEAN )) {                    DEBUGMSGTL(( "disman:event:trigger:fire",                                 "Firing boolean test: "));                    DEBUGMSGOID(("disman:event:trigger:fire",                                 vp1->name, vp1->name_length));                    DEBUGMSG((   "disman:event:trigger:fire", "%s\n",                                  (entry->old_results ? "" : " (startup)")));                    vp1->index &= ~MTE_ARMED_BOOLEAN;                    entry->mteTriggerXOwner   = entry->mteTBoolObjOwner;                    entry->mteTriggerXObjects = entry->mteTBoolObjects;                    /*                     * XXX - when firing a delta-based trigger, should                     *   'mteHotValue' report the actual value sampled                     *   (as here), or the delta that triggered the event ?                     */                    entry->mteTriggerFired    = vp1;                    n = entry->mteTriggerValueID_len;                    mteEvent_fire(entry->mteTBoolEvOwner, entry->mteTBoolEvent,                                   entry, vp1->name+n, vp1->name_length-n);                }            } else {                vp1->index |= MTE_ARMED_BOOLEAN;            }        }    }    /*     * Only run the basic threshold tests if there's an event to     *    be triggered.  (Either rising or falling will do)     */    if (( entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD ) &&

⌨️ 快捷键说明

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