/* * Note: this file originally auto-generated by mib2c using * : mib2c.create-dataset.conf,v 5.2 2002/07/17 14:41:53 dts12 Exp $ */ #include #include #include #include #include "mteTriggerTable.h" #include "mteEventTable.h" #include "mteEventNotificationTable.h" #include "mteObjectsTable.h" netsnmp_feature_require(table_dataset); netsnmp_feature_require(table_set_multi_add_default_row); static netsnmp_table_data_set *table_set = NULL; /** Initialize the mteEventTable table by defining its contents and how it's structured */ void initialize_table_mteEventTable(void) { static oid mteEventTable_oid[] = { 1, 3, 6, 1, 2, 1, 88, 1, 4, 2 }; size_t mteEventTable_oid_len = OID_LENGTH(mteEventTable_oid); /* * create the table structure itself */ table_set = netsnmp_create_table_data_set("mteEventTable"); /* * comment this out or delete if you don't support creation of new rows */ table_set->allow_creation = 1; /* mark the row status column */ table_set->rowstatus_column = COLUMN_MTEEVENTENTRYSTATUS; /*************************************************** * Adding indexes */ DEBUGMSGTL(("initialize_table_mteEventTable", "adding indexes to table mteEventTable\n")); netsnmp_table_set_add_indexes(table_set, ASN_OCTET_STR, /* index: mteOwner */ ASN_PRIV_IMPLIED_OCTET_STR, /* index: mteEventName */ 0); DEBUGMSGTL(("initialize_table_mteEventTable", "adding column types to table mteEventTable\n")); netsnmp_table_set_multi_add_default_row(table_set, COLUMN_MTEEVENTNAME, ASN_OCTET_STR, 0, NULL, 0, COLUMN_MTEEVENTCOMMENT, ASN_OCTET_STR, 1, NULL, 0, COLUMN_MTEEVENTACTIONS, ASN_OCTET_STR, 1, NULL, 0, COLUMN_MTEEVENTENABLED, ASN_INTEGER, 1, NULL, 0, COLUMN_MTEEVENTENTRYSTATUS, ASN_INTEGER, 1, NULL, 0, 0); /* keep index values around for comparisons later */ table_set->table->store_indexes = 1; /* * registering the table with the master agent */ /* * note: if you don't need a subhandler to deal with any aspects * of the request, change mteEventTable_handler to "NULL" */ netsnmp_register_table_data_set(netsnmp_create_handler_registration ("mteEventTable", mteEventTable_handler, mteEventTable_oid, mteEventTable_oid_len, HANDLER_CAN_RWRITE), table_set, NULL); } /** Initializes the mteEventTable module */ void init_mteEventTable(void) { /* * here we initialize all the tables we're planning on supporting */ initialize_table_mteEventTable(); snmpd_register_config_handler("notificationEvent", parse_notificationEvent, NULL, "notificationEvent NAME TRAP_OID [[-w] EXTRA_OID ...]"); snmpd_register_config_handler("linkUpDownNotifications", parse_linkUpDownNotifications, NULL, "linkUpDownNotifications (yes|no)"); } /** handles requests for the mteEventTable table, if anything else needs to be done */ int mteEventTable_handler(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { /* * perform anything here that you need to do. The requests have * already been processed by the master table_dataset handler, but * this gives you chance to act on the request in some other way * if need be. */ /* XXX: on rowstatus = destroy, remove the corresponding rows from the other tables: snmpEventNotificationTable and the set table */ return SNMP_ERR_NOERROR; } void parse_linkUpDownNotifications(const char *token, char *line) { if (strncmp(line, "y", 1) == 0) { parse_notificationEvent("notificationEvent", "linkUpTrap linkUp ifIndex ifAdminStatus ifOperStatus"); parse_notificationEvent("notificationEvent", "linkDownTrap linkDown ifIndex ifAdminStatus ifOperStatus"); parse_simple_monitor("monitor", "-r 60 -e linkUpTrap \"Generate linkUp\" ifOperStatus != 2"); parse_simple_monitor("monitor", "-r 60 -e linkDownTrap \"Generate linkDown\" ifOperStatus == 2"); } } void parse_notificationEvent(const char *token, char *line) { char name_buf[64]; char oid_name_buf[SPRINT_MAX_LEN]; oid oid_buf[MAX_OID_LEN]; size_t oid_buf_len = MAX_OID_LEN; int wild = 1; netsnmp_table_row *row; long tlong; char tc; /* get the owner */ const char *owner = "snmpd.conf"; /* get the name */ char *cp = copy_nword(line, name_buf, SPRINT_MAX_LEN); if (!cp || name_buf[0] == '\0') { config_perror("syntax error."); return; } for(row = table_set->table->first_row; row; row = row->next) { if (strcmp(row->indexes->val.string, owner) == 0 && strcmp(row->indexes->next_variable->val.string, name_buf) == 0) { config_perror("An eventd by that name has already been defined."); return; } } /* now, get all the trap oid */ cp = copy_nword(cp, oid_name_buf, SPRINT_MAX_LEN); if (oid_name_buf[0] == '\0') { config_perror("syntax error."); return; } if (!snmp_parse_oid(oid_name_buf, oid_buf, &oid_buf_len)) { snmp_log(LOG_ERR,"namebuf: %s\n",oid_name_buf); config_perror("unable to parse trap oid"); return; } /* * add to the mteEventNotificationtable to point to the * notification and the objects. */ row = netsnmp_create_table_data_row(); /* indexes */ netsnmp_table_row_add_index(row, ASN_OCTET_STR, owner, strlen(owner)); netsnmp_table_row_add_index(row, ASN_PRIV_IMPLIED_OCTET_STR, name_buf, strlen(name_buf)); /* columns */ netsnmp_set_row_column(row, COLUMN_MTEEVENTNOTIFICATION, ASN_OBJECT_ID, (char *) oid_buf, oid_buf_len * sizeof(oid)); netsnmp_set_row_column(row, COLUMN_MTEEVENTNOTIFICATIONOBJECTSOWNER, ASN_OCTET_STR, owner, strlen(owner)); netsnmp_set_row_column(row, COLUMN_MTEEVENTNOTIFICATIONOBJECTS, ASN_OCTET_STR, name_buf, strlen(name_buf)); netsnmp_table_data_add_row(mteEventNotif_table_set->table, row); /* * add to the mteEventTable to make it a notification to trigger * notification and the objects. */ row = netsnmp_create_table_data_row(); /* indexes */ netsnmp_table_row_add_index(row, ASN_OCTET_STR, owner, strlen(owner)); netsnmp_table_row_add_index(row, ASN_PRIV_IMPLIED_OCTET_STR, name_buf, strlen(name_buf)); /* columns */ tc = (u_char)0x80; netsnmp_set_row_column(row, COLUMN_MTEEVENTACTIONS, ASN_OCTET_STR, &tc, 1); tlong = MTETRIGGERENABLED_TRUE; netsnmp_set_row_column(row, COLUMN_MTEEVENTENABLED, ASN_INTEGER, (char *) &tlong, sizeof(tlong)); tlong = RS_ACTIVE; netsnmp_set_row_column(row, COLUMN_MTEEVENTENTRYSTATUS, ASN_INTEGER, (char *) &tlong, sizeof(tlong)); netsnmp_table_data_add_row(table_set->table, row); /* * now all the objects to put into the trap's object row */ while(cp) { cp = copy_nword(cp, oid_name_buf, SPRINT_MAX_LEN); if (strcmp(oid_name_buf, "-w") == 0) { wild = 0; continue; } oid_buf_len = MAX_OID_LEN; if (!snmp_parse_oid(oid_name_buf, oid_buf, &oid_buf_len)) { config_perror("unable to parse an object oid"); return; } mte_add_object_to_table("snmpd.conf", name_buf, oid_buf, oid_buf_len, wild); wild = 1; } } /* * send trap */ void run_mte_events(struct mteTriggerTable_data *item, oid * name_oid, size_t name_oid_len, const char *eventobjowner, const char *eventobjname) { static oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; /* snmpTrapIOD.0 */ netsnmp_variable_list *var_list = NULL; netsnmp_table_row *row, *notif_row; netsnmp_table_data_set_storage *col1, *tc, *no, *noo; for(row = table_set->table->first_row; row; row = row->next) { if (strcmp(row->indexes->val.string, eventobjowner) == 0 && strcmp(row->indexes->next_variable->val.string, eventobjname) == 0) { /* run this event */ col1 = (netsnmp_table_data_set_storage *) row->data; tc = netsnmp_table_data_set_find_column(col1, COLUMN_MTEEVENTACTIONS); if (!(tc->data.bitstring[0] & 0x80)) { /* not a notification. next! (XXX: do sets) */ continue; } tc = netsnmp_table_data_set_find_column(col1, COLUMN_MTEEVENTENABLED); if (*(tc->data.integer) != 1) { /* not enabled. next! */ continue; } if (!mteEventNotif_table_set) { /* no notification info */ continue; } /* send the notification */ var_list = NULL; /* XXX: get notif information */ for(notif_row = mteEventNotif_table_set->table->first_row; notif_row; notif_row = notif_row->next) { if (strcmp(notif_row->indexes->val.string, eventobjowner) == 0 && strcmp(notif_row->indexes->next_variable->val.string, eventobjname) == 0) { /* run this event */ col1 = (netsnmp_table_data_set_storage *) notif_row->data; tc = netsnmp_table_data_set_find_column(col1, COLUMN_MTEEVENTNOTIFICATION); no = netsnmp_table_data_set_find_column(col1, COLUMN_MTEEVENTNOTIFICATIONOBJECTS); noo = netsnmp_table_data_set_find_column(col1, COLUMN_MTEEVENTNOTIFICATIONOBJECTSOWNER); if (!tc) continue; /* no notification to be had. XXX: return? */ /* * snmpTrap oid */ snmp_varlist_add_variable(&var_list, objid_snmptrap, sizeof(objid_snmptrap) / sizeof(oid), ASN_OBJECT_ID, (u_char *) tc->data.objid, tc->data_len); /* XXX: add objects from the mteObjectsTable */ DEBUGMSGTL(("mteEventTable:send_events", "no: %x, no->data: %s", no, no->data.string)); DEBUGMSGTL(("mteEventTable:send_events", "noo: %x, noo->data: %s", noo, noo->data.string)); DEBUGMSGTL(("mteEventTable:send_events", "name_oid: %x",name_oid)); if (no && no->data.string && noo && noo->data.string && name_oid) { char *tmpowner = netsnmp_strdup_and_null(noo->data.string, noo->data_len); char *tmpname = netsnmp_strdup_and_null(no->data.string, no->data_len); DEBUGMSGTL(("mteEventTable:send_events", "Adding objects for owner=%s name=%s", tmpowner, tmpname)); mte_add_objects(var_list, item, tmpowner, tmpname, name_oid + item->mteTriggerValueIDLen, name_oid_len - item->mteTriggerValueIDLen); free(tmpowner); free(tmpname); } DEBUGMSGTL(("mteEventTable:send_events", "sending an event ")); DEBUGMSGOID(("mteEventTable:send_events", tc->data.objid, tc->data_len / sizeof(oid))); DEBUGMSG(("mteEventTable:send_events", "\n")); send_v2trap(var_list); snmp_free_varbind(var_list); } } } } }