diff options
Diffstat (limited to 'agent/mibgroup/examples/data_set.c')
-rw-r--r-- | agent/mibgroup/examples/data_set.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/agent/mibgroup/examples/data_set.c b/agent/mibgroup/examples/data_set.c new file mode 100644 index 0000000..daed8f3 --- /dev/null +++ b/agent/mibgroup/examples/data_set.c @@ -0,0 +1,206 @@ +/** @example data_set.c + * This example creates a table full of information and stores all + * that information within the agent's memory. The "table_dataset" + * helper routines take care of handling all aspects of SNMP requests + * as they come in (yay!). + * + * The exmaple we are instrumenting is an otherwise-useless table + * containing the names of IETF working group chairs. Obviously, + * this data isn't all that useful from a network management point of + * view but this example only demonstrates how to use and store data. + * For more useful examples (but more complex), check out the + * apps/notification_log.c file which implements parts of the + * NOTIFICATION-LOG-MIB for logging incoming SNMP notifications. + * + * Much of this code could be automatically generated by running + * mib2c as follows: + * + * - mib2c -c mib2c.create-dataset.conf netSnmpIETFWGTable + * + * The table is defined roughly as follows: + * + * <pre> + * % snmptranslate -m NET-SNMP-EXAMPLES-MIB -Tp -IR netSnmpIETFWGTable + * |+--netSnmpIETFWGTable(1) + * | | + * | +--netSnmpIETFWGEntry(1) + * | | Index: nsIETFWGName + * | | + * | +-- ---- String nsIETFWGName(1) + * | | Size: 1..32 + * | +-- CR-- String nsIETFWGChair1(2) + * | +-- CR-- String nsIETFWGChair2(3) + * </pre> + * + * If this module is compiled into an agent, you should be able to + * issue snmp commands that look something like (valid authentication + * information not shown in these commands): + * + * <pre> + * % snmpwalk localhost netSnmpIETFWGTable + * nsIETFWGChair1."snmpv3" = "Russ Mundy" + * nsIETFWGChair2."snmpv3" = "David Harrington" + * + * % snmpset localhost nsIETFWGChair1.\"sming\" = "David Durham" + * nsIETFWGChair1."sming" = "David Durham" + * + * % snmpwalk localhost netSnmpIETFWGTable + * nsIETFWGChair1."sming" = "David Durham" + * nsIETFWGChair1."snmpv3" = "Russ Mundy" + * nsIETFWGChair2."snmpv3" = "David Harrington" + * + * In your snmpd.conf file, put the following line: + * add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco" + * + * % snmpwalk localhost netSnmpIETFWGTable + * nsIETFWGChair1.\"eos\" = "Glenn Waters" + * nsIETFWGChair1.\"snmpv3\" = "Russ Mundy" + * nsIETFWGChair2.\"eos\" = "Dale Francisco" + * nsIETFWGChair2.\"snmpv3\" = "David Harrington" + * </pre> + */ + +/* + * start be including the appropriate header files + */ +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> + +/* + * our initialization routine, automatically called by the agent + */ +/* + * (to get called, the function name must match init_FILENAME() + */ +void +init_data_set(void) +{ + netsnmp_table_data_set *table_set; + netsnmp_table_row *row; + + /* + * the OID we want to register our integer at. This should be the + * * OID node for the entire table. In our case this is the + * * netSnmpIETFWGTable oid definition + */ + oid my_registration_oid[] = + { 1, 3, 6, 1, 4, 1, 8072, 2, 2, 1 }; + + /* + * a debugging statement. Run the agent with -Dexample_data_set to see + * * the output of this debugging statement. + */ + DEBUGMSGTL(("example_data_set", + "Initalizing example dataset table\n")); + + /* + * It's going to be the "working group chairs" table, since I'm + * * sitting at an IETF convention while I'm writing this. + * * + * * column 1 = index = string = WG name + * * column 2 = string = chair #1 + * * column 3 = string = chair #2 (most WGs have 2 chairs now) + */ + + table_set = netsnmp_create_table_data_set("netSnmpIETFWGTable"); + + /* + * allow the creation of new rows via SNMP SETs + */ + table_set->allow_creation = 1; + + /* + * set up what a row "should" look like, starting with the index + */ + netsnmp_table_dataset_add_index(table_set, ASN_OCTET_STR); + + /* + * define what the columns should look like. both are octet strings here + */ + netsnmp_table_set_multi_add_default_row(table_set, + /* + * column 2 = OCTET STRING, + * writable = 1, + * default value = NULL, + * default value len = 0 + */ + 2, ASN_OCTET_STR, 1, NULL, 0, + /* + * similar + */ + 3, ASN_OCTET_STR, 1, NULL, 0, + 0 /* done */ ); + + /* + * register the table + */ + /* + * if we wanted to handle specific data in a specific way, or note + * * when requests came in we could change the NULL below to a valid + * * handler method in which we could over ride the default + * * behaviour of the table_dataset helper + */ + netsnmp_register_table_data_set(netsnmp_create_handler_registration + ("netSnmpIETFWGTable", NULL, + my_registration_oid, + OID_LENGTH(my_registration_oid), + HANDLER_CAN_RWRITE), table_set, NULL); + + + /* + * create the a row for the table, and add the data + */ + row = netsnmp_create_table_data_row(); + /* + * set the index to the IETF WG name "snmpv3" + */ + netsnmp_table_row_add_index(row, ASN_OCTET_STR, "snmpv3", + strlen("snmpv3")); + + + /* + * set column 2 to be the WG chair name "Russ Mundy" + */ + netsnmp_set_row_column(row, 2, ASN_OCTET_STR, + "Russ Mundy", strlen("Russ Mundy")); + netsnmp_mark_row_column_writable(row, 2, 1); /* make writable via SETs */ + + /* + * set column 3 to be the WG chair name "David Harrington" + */ + netsnmp_set_row_column(row, 3, ASN_OCTET_STR, "David Harrington", + strlen("David Harrington")); + netsnmp_mark_row_column_writable(row, 3, 1); /* make writable via SETs */ + + /* + * add the row to the table + */ + netsnmp_table_dataset_add_row(table_set, row); + +#ifdef ADD_MORE_DATA + /* + * add the data, for the second row + */ + row = netsnmp_create_table_data_row(); + netsnmp_table_row_add_index(row, ASN_OCTET_STR, "snmpconf", + strlen("snmpconf")); + netsnmp_set_row_column(row, 2, ASN_OCTET_STR, "David Partain", + strlen("David Partain")); + netsnmp_mark_row_column_writable(row, 2, 1); /* make writable */ + netsnmp_set_row_column(row, 3, ASN_OCTET_STR, "Jon Saperia", + strlen("Jon Saperia")); + netsnmp_mark_row_column_writable(row, 3, 1); /* make writable */ + netsnmp_table_dataset_add_row(table_set, row); +#endif + + /* + * Finally, this actually allows the "add_row" token it the + * * snmpd.conf file to add rows to this table. + * * Example snmpd.conf line: + * * add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco" + */ + netsnmp_register_auto_data_table(table_set, NULL); + + DEBUGMSGTL(("example_data_set", "Done initializing.\n")); +} |