📄 event.c
字号:
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 + -