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

📄 mtetrigger.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * DisMan Event MIB: *     Core implementation of the trigger 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/mteTrigger.h"#include "disman/event/mteEvent.h"netsnmp_tdata *trigger_table_data;oid    _sysUpTime_instance[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 };size_t _sysUpTime_inst_len   = OID_LENGTH(_sysUpTime_instance);long mteTriggerFailures;    /*     * Initialize the container for the (combined) mteTrigger*Table,     * regardless of which table initialisation routine is called first.     */voidinit_trigger_table_data(void){    DEBUGMSGTL(("disman:event:init", "init trigger container\n"));    if (!trigger_table_data) {        trigger_table_data = netsnmp_tdata_create_table("mteTriggerTable", 0);        if (!trigger_table_data) {            snmp_log(LOG_ERR, "failed to create mteTriggerTable");            return;        }        DEBUGMSGTL(("disman:event:init", "create trigger container (%x)\n",                                          trigger_table_data));    }    mteTriggerFailures = 0;}/** Initializes the mteTrigger module */voidinit_mteTrigger(void){    init_trigger_table_data();}    /* ===================================================     *     * APIs for maintaining the contents of the (combined)     *    mteTrigger*Table container.     *     * =================================================== */void_mteTrigger_dump(void){    struct mteTrigger *entry;    netsnmp_tdata_row *row;    int i = 0;    for (row = netsnmp_tdata_row_first(trigger_table_data);         row;         row = netsnmp_tdata_row_next(trigger_table_data, row)) {        entry = (struct mteTrigger *)row->data;        DEBUGMSGTL(("disman:event:dump", "TriggerTable 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", "TriggerTable %d entries\n", i));}/* * Create a new row in the trigger table  */netsnmp_tdata_row *mteTrigger_createEntry(char *mteOwner, char *mteTName, int fixed){    struct mteTrigger *entry;    netsnmp_tdata_row *row;    size_t mteOwner_len = (mteOwner) ? strlen(mteOwner) : 0;    size_t mteTName_len = (mteTName) ? strlen(mteTName) : 0;    DEBUGMSGTL(("disman:event:table", "Create trigger entry (%s, %s)\n",                                       mteOwner, mteTName));    /*     * Create the mteTrigger entry, and the     * (table-independent) row wrapper structure...     */    entry = SNMP_MALLOC_TYPEDEF(struct mteTrigger);    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 (mteTName)        memcpy(entry->mteTName, mteTName, mteTName_len);    netsnmp_table_row_add_index(row, ASN_PRIV_IMPLIED_OCTET_STR,                                entry->mteTName, mteTName_len);  /* entry->mteTriggerTest         = MTE_TRIGGER_BOOLEAN; */    entry->mteTriggerValueID_len  = 2;  /* .0.0 */    entry->mteTriggerFrequency    = 600;    memcpy(entry->mteDeltaDiscontID, _sysUpTime_instance,                              sizeof(_sysUpTime_instance));    entry->mteDeltaDiscontID_len  =  _sysUpTime_inst_len;    entry->mteDeltaDiscontIDType  = MTE_DELTAD_TTICKS;    entry->flags                 |= MTE_TRIGGER_FLAG_SYSUPT;    entry->mteTExTest             = (MTE_EXIST_PRESENT | MTE_EXIST_ABSENT);    entry->mteTExStartup          = (MTE_EXIST_PRESENT | MTE_EXIST_ABSENT);    entry->mteTBoolComparison     = MTE_BOOL_UNEQUAL;    entry->flags                 |= MTE_TRIGGER_FLAG_BSTART;    entry->mteTThStartup          = MTE_THRESH_START_RISEFALL;    if (fixed)        entry->flags |= MTE_TRIGGER_FLAG_FIXED;    /*     * ... and insert the row into the (common) table container     */    netsnmp_tdata_add_row(trigger_table_data, row);    DEBUGMSGTL(("disman:event:table", "Trigger entry created\n"));    return row;}/* * Remove a row from the trigger table  */voidmteTrigger_removeEntry(netsnmp_tdata_row *row){    struct mteTrigger *entry;    if (!row)        return;                 /* Nothing to remove */    entry = (struct mteTrigger *)        netsnmp_tdata_remove_and_delete_row(trigger_table_data, row);    if (entry) {        mteTrigger_disable( entry );        SNMP_FREE(entry);    }}    /* ===================================================     *     * APIs for evaluating a trigger,     *   and firing the appropriate event     *     * =================================================== */const char *_ops[] = { "",                "!=", /* MTE_BOOL_UNEQUAL      */                "==", /* MTE_BOOL_EQUAL        */                "<",  /* MTE_BOOL_LESS         */                "<=", /* MTE_BOOL_LESSEQUAL    */                ">",  /* MTE_BOOL_GREATER      */                ">="  /* MTE_BOOL_GREATEREQUAL */  };void_mteTrigger_failure( /* int error, */ const char *msg ){    /*     * XXX - Send an mteTriggerFailure trap     *           (if configured to do so)     */    mteTriggerFailures++;    snmp_log(LOG_ERR, "%s\n", msg );    return;}voidmteTrigger_run( unsigned int reg, void *clientarg){    struct mteTrigger *entry = (struct mteTrigger *)clientarg;    netsnmp_variable_list *var, *vtmp;    netsnmp_variable_list *vp1, *vp1_prev;    netsnmp_variable_list *vp2, *vp2_prev;    netsnmp_variable_list *dvar = NULL;    netsnmp_variable_list *dv1  = NULL, *dv2 = NULL;    netsnmp_variable_list sysUT_var;    int  cmp = 0, n, n2;    long value;    const char *reason;    if (!entry) {        snmp_alarm_unregister( reg );        return;    }    if (!(entry->flags & MTE_TRIGGER_FLAG_ENABLED ) ||        !(entry->flags & MTE_TRIGGER_FLAG_ACTIVE  ) ||        !(entry->flags & MTE_TRIGGER_FLAG_VALID  )) {        return;    }    {	extern netsnmp_agent_session *netsnmp_processing_set;	if (netsnmp_processing_set) {	    /*	     * netsnmp_handle_request will not be responsive to our efforts to	     *	Retrieve the requested MIB value(s)...	     * so we will skip it.	     * https://sourceforge.net/tracker/	     *	index.php?func=detail&aid=1557406&group_id=12694&atid=112694	     */	    DEBUGMSGTL(("disman:event:trigger:monitor",		"Skipping trigger (%s) while netsnmp_processing_set\n",		entry->mteTName));	    return;	}    }    /*     * Retrieve the requested MIB value(s)...     */    DEBUGMSGTL(( "disman:event:trigger:monitor", "Running trigger (%s)\n", entry->mteTName));    var = (netsnmp_variable_list *)SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );    if (!var) {        _mteTrigger_failure("failed to create mteTrigger query varbind");        return;    }    snmp_set_var_objid( var, entry->mteTriggerValueID,                             entry->mteTriggerValueID_len );    if ( entry->flags & MTE_TRIGGER_FLAG_VWILD ) {        n = netsnmp_query_walk( var, entry->session );    } else {        n = netsnmp_query_get(  var, entry->session );    }    if ( n != SNMP_ERR_NOERROR ) {        DEBUGMSGTL(( "disman:event:trigger:monitor", "Trigger query (%s) failed: %d\n",                           (( entry->flags & MTE_TRIGGER_FLAG_VWILD ) ? "walk" : "get"), n));        _mteTrigger_failure( "failed to run mteTrigger query" );        return;    }    /*     * ... canonicalise the results (to simplify later comparisons)...     */    vp1 = var;                vp1_prev = NULL;    vp2 = entry->old_results; vp2_prev = NULL;    entry->count=0;    while (vp1) {           /*            * Flatten various missing values/exceptions into a single form            */ 	switch (vp1->type) {        case SNMP_NOSUCHINSTANCE:        case SNMP_NOSUCHOBJECT:        case ASN_PRIV_RETRY:   /* Internal only ? */            vp1->type = ASN_NULL;        }           /*            * Keep track of how many entries have been retrieved.            */            entry->count++;                   /*            * Ensure previous and current result match            *  (with corresponding entries in both lists)            * and set the flags indicating which triggers are armed            */         if (vp2) {            cmp = snmp_oid_compare(vp1->name, vp1->name_length,                                   vp2->name, vp2->name_length);            if ( cmp < 0 ) {                /*                 * If a new value has appeared, insert a matching                 * dummy entry into the previous result list.                 *                 * XXX - check how this is best done.                 */                vtmp = SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );                if (!vtmp) {                    _mteTrigger_failure(                          "failed to create mteTrigger temp varbind");

⌨️ 快捷键说明

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