summaryrefslogtreecommitdiff
path: root/agent/mibgroup/disman/mteEventTable.c
diff options
context:
space:
mode:
authorHideki Yamane <henrich@debian.org>2014-03-30 19:38:48 +0900
committerHideki Yamane <henrich@debian.org>2014-03-30 19:38:48 +0900
commit7769a9595c3da9a35f31b42451b1f6c3ed4004fa (patch)
tree009bf8fd68af6bb1129e07dd8c1ed205010d81f8 /agent/mibgroup/disman/mteEventTable.c
parent2e7891b0311204e0ecd5dc4a4334df01f3a6a1b4 (diff)
downloadpkg-net-snmp-7769a9595c3da9a35f31b42451b1f6c3ed4004fa.tar.gz
Imported Upstream version 5.7.2~dfsg
Diffstat (limited to 'agent/mibgroup/disman/mteEventTable.c')
-rw-r--r--agent/mibgroup/disman/mteEventTable.c345
1 files changed, 345 insertions, 0 deletions
diff --git a/agent/mibgroup/disman/mteEventTable.c b/agent/mibgroup/disman/mteEventTable.c
new file mode 100644
index 0000000..22bad73
--- /dev/null
+++ b/agent/mibgroup/disman/mteEventTable.c
@@ -0,0 +1,345 @@
+/*
+ * 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 <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-features.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#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);
+ }
+ }
+ }
+ }
+}