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

📄 event.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
        return (unsigned char *) &long_ret;    case EVENTCOMMUNITY:        if (theEntry.event_community) {            *var_len = strlen(theEntry.event_community);            return (unsigned char *) theEntry.event_community;        } else {            *var_len = 0;            return (unsigned char *) "";        }    case EVENTLASTTIMESENT:        long_ret = theEntry.event_last_time_sent;        return (unsigned char *) &long_ret;    case EVENTOWNER:        if (hdr->owner) {            *var_len = strlen(hdr->owner);            return (unsigned char *) hdr->owner;        } else {            *var_len = 0;            return (unsigned char *) "";        }    case EVENTSTATUS:        long_ret = hdr->status;        return (unsigned char *) &long_ret;    default:        ag_trace("EventControlTable: unknown vp->magic=%d",                 (int) vp->magic);        ERROR_MSG("");    }    return NULL;}static SCROLLER_T *event_extract_scroller(void *v_body){    CRTL_ENTRY_T   *body = (CRTL_ENTRY_T *) v_body;    return &body->scrlr;}unsigned char  *var_logTable(struct variable *vp,             oid * name,             size_t * length,             int exact, size_t * var_len, WriteMethod ** write_method){    static long     long_ret;    static DATA_ENTRY_T theEntry;    RMON_ENTRY_T   *hdr;    CRTL_ENTRY_T   *ctrl;    *write_method = NULL;    hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len,                                      table_ptr,                                      &event_extract_scroller,                                      sizeof(DATA_ENTRY_T), &theEntry);    if (!hdr)        return NULL;    ctrl = (CRTL_ENTRY_T *) hdr->body;    *var_len = sizeof(long);    /* default */    switch (vp->magic) {    case LOGEVENTINDEX:        long_ret = hdr->ctrl_index;        return (unsigned char *) &long_ret;    case LOGINDEX:        long_ret = theEntry.data_index;        return (unsigned char *) &long_ret;    case LOGTIME:        long_ret = theEntry.log_time;        return (unsigned char *) &long_ret;    case LOGDESCRIPTION:        if (theEntry.log_description) {            *var_len = strlen(theEntry.log_description);            return (unsigned char *) theEntry.log_description;        } else {            *var_len = 0;            return (unsigned char *) "";        }    default:        ERROR_MSG("");    }    return NULL;}/* * External API section  */static char    *create_explanaition(CRTL_ENTRY_T * evptr, u_char is_rising,                    u_long alarm_index, u_long event_index,                    oid * alarmed_var,                    size_t alarmed_var_length,                    u_long value, u_long the_threshold,                    u_long sample_type, char *alarm_descr){#define UNEQ_LENGTH	(1 + 11 + 4 + 11 + 1 + 20)    char            expl[UNEQ_LENGTH];    static char     c_oid[SPRINT_MAX_LEN];    size_t          sz;    char           *descr;    register char  *pch;    register char  *tmp;    snprint_objid(c_oid, sizeof(c_oid)-1, alarmed_var, alarmed_var_length);    c_oid[sizeof(c_oid)-1] = '\0';    for (pch = c_oid;;) {        tmp = strchr(pch, '.');        if (!tmp)            break;        if (isdigit(tmp[1]) || '"' == tmp[1])            break;        pch = tmp + 1;    }    snprintf(expl, UNEQ_LENGTH, "=%ld %s= %ld :%ld, %ld",             (unsigned long) value,             is_rising ? ">" : "<",             (unsigned long) the_threshold,             (long) alarm_index, (long) event_index);    sz = 3 + strlen(expl) + strlen(pch);    if (alarm_descr)        sz += strlen(alarm_descr);    descr = AGMALLOC(sz);    if (!descr) {        ag_trace("Can't allocate event description");        return NULL;    }    if (alarm_descr) {        strcpy(descr, alarm_descr);        strcat(descr, ":");    } else        *descr = '\0';    strcat(descr, pch);    strcat(descr, expl);    return descr;}extern void     send_enterprise_trap_vars(int, int, oid *, int,                                          netsnmp_variable_list *);static netsnmp_variable_list *oa_bind_var(netsnmp_variable_list * prev,            void *value, int type, size_t sz_val, oid * oid, size_t sz_oid){    netsnmp_variable_list *var;    var = (netsnmp_variable_list *) malloc(sizeof(netsnmp_variable_list));    if (!var) {        ag_trace("FATAL: cannot malloc in oa_bind_var\n");        exit(-1);               /* Sorry :( */    }    memset(var, 0, sizeof(netsnmp_variable_list));    var->next_variable = prev;    snmp_set_var_objid(var, oid, sz_oid);    snmp_set_var_value(var, (u_char *) value, sz_val);    var->type = type;    return var;}static voidevent_send_trap(CRTL_ENTRY_T * evptr, u_char is_rising,                u_int alarm_index,                u_int value, u_int the_threshold,                oid * alarmed_var, size_t alarmed_var_length,                u_int sample_type){    static oid      rmon1_trap_oid[] = { 1, 3, 6, 1, 2, 1, 16, 0, 0 };    static oid      alarm_index_oid[] =        { 1, 3, 6, 1, 2, 1, 16, 3, 1, 1, 1 };    static oid      alarmed_var_oid[] =        { 1, 3, 6, 1, 2, 1, 16, 3, 1, 1, 3 };    static oid      sample_type_oid[] =        { 1, 3, 6, 1, 2, 1, 16, 3, 1, 1, 4 };    static oid      value_oid[] = { 1, 3, 6, 1, 2, 1, 16, 3, 1, 1, 5 };    static oid      threshold_oid[] = { 1, 3, 6, 1, 2, 1, 16, 3, 1, 1, 7 };     /* rising case */    netsnmp_variable_list *top = NULL;    register int    iii;    /*     * set the last 'oid' : risingAlarm or fallingAlarm      */    if (is_rising) {        iii = OID_LENGTH(rmon1_trap_oid);        rmon1_trap_oid[iii - 1] = 1;        iii = OID_LENGTH(threshold_oid);        threshold_oid[iii - 1] = 7;    } else {        iii = OID_LENGTH(rmon1_trap_oid);        rmon1_trap_oid[iii - 1] = 0;        iii = OID_LENGTH(threshold_oid);        threshold_oid[iii - 1] = 8;    }    /*     * build the var list      */    top = oa_bind_var(top, &alarm_index, ASN_INTEGER, sizeof(u_int),                      alarm_index_oid, OID_LENGTH(alarm_index_oid));    top =        oa_bind_var(top, alarmed_var, ASN_OBJECT_ID,                    sizeof(oid) * alarmed_var_length, alarmed_var_oid,                    OID_LENGTH(alarmed_var_oid));    top = oa_bind_var(top, &sample_type, ASN_INTEGER, sizeof(u_int),                      sample_type_oid, OID_LENGTH(sample_type_oid));    top = oa_bind_var(top, &value, ASN_INTEGER, sizeof(u_int),                      value_oid, OID_LENGTH(value_oid));    top = oa_bind_var(top, &the_threshold, ASN_INTEGER, sizeof(u_int),                      threshold_oid, OID_LENGTH(threshold_oid));    send_enterprise_trap_vars(SNMP_TRAP_ENTERPRISESPECIFIC, 0,                              rmon1_trap_oid,                              OID_LENGTH(rmon1_trap_oid), top);    ag_trace("rmon trap has been sent");    snmp_free_varbind(top);}static voidevent_save_log(CRTL_ENTRY_T * body, char *event_descr){    register DATA_ENTRY_T *lptr;    lptr = ROWDATAAPI_locate_new_data(&body->scrlr);    if (!lptr) {        ag_trace("Err: event_save_log:cannot locate ?");        return;    }    lptr->log_time = body->event_last_time_sent;    if (lptr->log_description)        AGFREE(lptr->log_description);    lptr->log_description = AGSTRDUP(event_descr);    lptr->data_index = ROWDATAAPI_get_total_number(&body->scrlr);    /*     * ag_trace ("log has been saved, data_index=%d", (int) lptr->data_index);      */}intevent_api_send_alarm(u_char is_rising,                     u_long alarm_index,                     u_long event_index,                     oid * alarmed_var,                     size_t alarmed_var_length,                     u_long sample_type,                     u_long value, u_long the_threshold, char *alarm_descr){    RMON_ENTRY_T   *eptr;    CRTL_ENTRY_T   *evptr;    if (!event_index)        return SNMP_ERR_NOSUCHNAME;#if 0    ag_trace("event_api_send_alarm(%d,%d,%d,'%s')",             (int) is_rising, (int) alarm_index, (int) event_index,             alarm_descr);#endif    eptr = ROWAPI_find(table_ptr, event_index);    if (!eptr) {        /*         * ag_trace ("event cannot find entry %ld", event_index);          */        return SNMP_ERR_NOSUCHNAME;    }    evptr = (CRTL_ENTRY_T *) eptr->body;    evptr->event_last_time_sent = AGUTIL_sys_up_time();    if (EVENT_TRAP == evptr->event_type        || EVENT_LOG_AND_TRAP == evptr->event_type) {        event_send_trap(evptr, is_rising, alarm_index, value,                        the_threshold, alarmed_var, alarmed_var_length,                        sample_type);    }    if (EVENT_LOG == evptr->event_type        || EVENT_LOG_AND_TRAP == evptr->event_type) {        register char  *explain;        explain = create_explanaition(evptr, is_rising,                                      alarm_index, event_index,                                      alarmed_var, alarmed_var_length,                                      value, the_threshold,                                      sample_type, alarm_descr);        /*         * if (explain) ag_trace ("Dbg:'%s'", explain);          */        event_save_log(evptr, explain);        if (explain)            AGFREE(explain);    }    return SNMP_ERR_NOERROR;}#if 1                           /* debug, but may be used for init. TBD: may be token snmpd.conf ? */intadd_event_entry(int ctrl_index,                char *event_description,                EVENT_TYPE_T event_type, char *event_community){    register RMON_ENTRY_T *eptr;    register CRTL_ENTRY_T *body;    int             ierr;    ierr = ROWAPI_new(table_ptr, ctrl_index);    if (ierr) {        ag_trace("ROWAPI_new failed with %d", ierr);        return ierr;    }    eptr = ROWAPI_find(table_ptr, ctrl_index);    if (!eptr) {        ag_trace("ROWAPI_find failed");        return -4;    }    body = (CRTL_ENTRY_T *) eptr->body;    /*     * set parameters      */    if (event_description) {        if (body->event_description)            AGFREE(body->event_description);        body->event_description = AGSTRDUP(event_description);    }    if (event_community) {        if (body->event_community)            AGFREE(body->event_community);        body->event_community = AGSTRDUP(event_community);    }    body->event_type = event_type;    eptr->new_status = RMON1_ENTRY_VALID;    ierr = ROWAPI_commit(table_ptr, ctrl_index);    if (ierr) {        ag_trace("ROWAPI_commit failed with %d", ierr);    }    return ierr;}#endif/* * Registration & Initializatio section  */oid             eventTable_variables_oid[] =    { 1, 3, 6, 1, 2, 1, 16, 9, 1 };oid             logTable_variables_oid[] = { 1, 3, 6, 1, 2, 1, 16, 9, 2 };struct variable2 eventTable_variables[] = {    /*     * magic number        , variable type, ro/rw , callback fn  ,           L, oidsuffix      */    {EVENTINDEX, ASN_INTEGER, RONLY, var_eventTable, 2, {1, 1}},    {EVENTDESCRIPTION, ASN_OCTET_STR, RWRITE, var_eventTable, 2, {1, 2}},    {EVENTTYPE, ASN_INTEGER, RWRITE, var_eventTable, 2, {1, 3}},    {EVENTCOMMUNITY, ASN_OCTET_STR, RWRITE, var_eventTable, 2, {1, 4}},    {EVENTLASTTIMESENT, ASN_TIMETICKS, RONLY, var_eventTable, 2, {1, 5}},    {EVENTOWNER, ASN_OCTET_STR, RWRITE, var_eventTable, 2, {1, 6}},    {EVENTSTATUS, ASN_INTEGER, RWRITE, var_eventTable, 2, {1, 7}}};struct variable2 logTable_variables[] = {    /*     * magic number        , variable type, ro/rw , callback fn  ,           L, oidsuffix      */    {LOGEVENTINDEX, ASN_INTEGER, RONLY, var_logTable, 2, {1, 1}},    {LOGINDEX, ASN_INTEGER, RONLY, var_logTable, 2, {1, 2}},    {LOGTIME, ASN_TIMETICKS, RONLY, var_logTable, 2, {1, 3}},    {LOGDESCRIPTION, ASN_OCTET_STR, RONLY, var_logTable, 2, {1, 4}}};voidinit_event(void){    REGISTER_MIB("eventTable", eventTable_variables, variable2,                 eventTable_variables_oid);    REGISTER_MIB("logTable", logTable_variables, variable2,                 logTable_variables_oid);    ROWAPI_init_table(&EventCtrlTable, "Event", 0, &event_Create, &event_Clone, &event_Delete, NULL,    /* &event_Validate, */                      &event_Activate, &event_Deactivate, &event_Copy);#if 0    add_event_entry(3, "Alarm", EVENT_LOG_AND_TRAP, NULL);    /*     * add_event_entry (5, ">=", EVENT_LOG_AND_TRAP, NULL);      */#endif}

⌨️ 快捷键说明

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