data_set.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:7k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /**  @example data_set.c
  2.  *  This example creates a table full of information and stores all
  3.  *  that information within the agent's memory.  The "table_dataset"
  4.  *  helper routines take care of handling all aspects of SNMP requests
  5.  *  as they come in (yay!).
  6.  *
  7.  *  The exmaple we are instrumenting is an otherwise-useless table
  8.  *  containing the names of IETF working group chairs.  Obviously,
  9.  *  this data isn't all that useful from a network management point of
  10.  *  view but this example only demonstrates how to use and store data.
  11.  *  For more useful examples (but more complex), check out the
  12.  *  apps/notification_log.c file which implements parts of the
  13.  *  NOTIFICATION-LOG-MIB for logging incoming SNMP notifications.
  14.  *
  15.  *  Much of this code could be automatically generated by running
  16.  *  mib2c as follows:
  17.  *
  18.  *    - mib2c -c mib2c.create-dataset.conf netSnmpIETFWGTable
  19.  *
  20.  *  The table is defined roughly as follows:
  21.  *
  22.  *  <pre>
  23.  *    % snmptranslate -m NET-SNMP-EXAMPLES-MIB -Tp -IR netSnmpIETFWGTable
  24.  *    |+--netSnmpIETFWGTable(1)
  25.  *    |   |
  26.  *    |   +--netSnmpIETFWGEntry(1)
  27.  *    |      |  Index: nsIETFWGName
  28.  *    |      |
  29.  *    |      +-- ---- String    nsIETFWGName(1)
  30.  *    |      |        Size: 1..32
  31.  *    |      +-- CR-- String    nsIETFWGChair1(2)
  32.  *    |      +-- CR-- String    nsIETFWGChair2(3)
  33.  *  </pre>
  34.  *
  35.  *  If this module is compiled into an agent, you should be able to
  36.  *  issue snmp commands that look something like (valid authentication
  37.  *  information not shown in these commands):
  38.  *
  39.  *  <pre>
  40.  *      % snmpwalk localhost netSnmpIETFWGTable
  41.  *      nsIETFWGChair1."snmpv3" = "Russ Mundy"
  42.  *      nsIETFWGChair2."snmpv3" = "David Harrington"
  43.  *
  44.  *      % snmpset localhost nsIETFWGChair1."sming" = "David Durham"
  45.  *      nsIETFWGChair1."sming" = "David Durham"
  46.  *  
  47.  *      % snmpwalk localhost netSnmpIETFWGTable
  48.  *      nsIETFWGChair1."sming" = "David Durham"
  49.  *      nsIETFWGChair1."snmpv3" = "Russ Mundy"
  50.  *      nsIETFWGChair2."snmpv3" = "David Harrington"
  51.  *
  52.  *      In your snmpd.conf file, put the following line:
  53.  *      add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco"
  54.  *
  55.  *      % snmpwalk localhost netSnmpIETFWGTable
  56.  *      nsIETFWGChair1."eos" = "Glenn Waters"
  57.  *      nsIETFWGChair1."snmpv3" = "Russ Mundy"
  58.  *      nsIETFWGChair2."eos" = "Dale Francisco"
  59.  *      nsIETFWGChair2."snmpv3" = "David Harrington"
  60.  *  </pre>
  61.  */
  62. /*
  63.  * start be including the appropriate header files 
  64.  */
  65. #include <net-snmp/net-snmp-config.h>
  66. #include <net-snmp/net-snmp-includes.h>
  67. #include <net-snmp/agent/net-snmp-agent-includes.h>
  68. /*
  69.  * our initialization routine, automatically called by the agent 
  70.  */
  71. /*
  72.  * (to get called, the function name must match init_FILENAME() 
  73.  */
  74. void
  75. init_data_set(void)
  76. {
  77.     netsnmp_table_data_set *table_set;
  78.     netsnmp_table_row *row;
  79.     /*
  80.      * the OID we want to register our integer at.  This should be the
  81.      * * OID node for the entire table.  In our case this is the
  82.      * * netSnmpIETFWGTable oid definition 
  83.      */
  84.     oid             my_registration_oid[] =
  85.         { 1, 3, 6, 1, 4, 1, 8072, 2, 2, 1 };
  86.     /*
  87.      * a debugging statement.  Run the agent with -Dexample_data_set to see
  88.      * * the output of this debugging statement. 
  89.      */
  90.     DEBUGMSGTL(("example_data_set",
  91.                 "Initalizing example dataset tablen"));
  92.     /*
  93.      * It's going to be the "working group chairs" table, since I'm
  94.      * * sitting at an IETF convention while I'm writing this.
  95.      * *
  96.      * *  column 1 = index = string = WG name
  97.      * *  column 2 = string = chair #1
  98.      * *  column 3 = string = chair #2  (most WGs have 2 chairs now)
  99.      */
  100.     table_set = netsnmp_create_table_data_set("netSnmpIETFWGTable");
  101.     /*
  102.      * allow the creation of new rows via SNMP SETs 
  103.      */
  104.     table_set->allow_creation = 1;
  105.     /*
  106.      * set up what a row "should" look like, starting with the index 
  107.      */
  108.     netsnmp_table_dataset_add_index(table_set, ASN_OCTET_STR);
  109.     /*
  110.      * define what the columns should look like.  both are octet strings here 
  111.      */
  112.     netsnmp_table_set_multi_add_default_row(table_set,
  113.                                             /*
  114.                                              * column 2 = OCTET STRING,
  115.                                              * writable = 1,
  116.                                              * default value = NULL,
  117.                                              * default value len = 0 
  118.                                              */
  119.                                             2, ASN_OCTET_STR, 1, NULL, 0,
  120.                                             /*
  121.                                              * similar 
  122.                                              */
  123.                                             3, ASN_OCTET_STR, 1, NULL, 0,
  124.                                             0 /* done */ );
  125.     /*
  126.      * register the table 
  127.      */
  128.     /*
  129.      * if we wanted to handle specific data in a specific way, or note
  130.      * * when requests came in we could change the NULL below to a valid
  131.      * * handler method in which we could over ride the default
  132.      * * behaviour of the table_dataset helper 
  133.      */
  134.     netsnmp_register_table_data_set(netsnmp_create_handler_registration
  135.                                     ("netSnmpIETFWGTable", NULL,
  136.                                      my_registration_oid,
  137.                                      OID_LENGTH(my_registration_oid),
  138.                                      HANDLER_CAN_RWRITE), table_set, NULL);
  139.     /*
  140.      * create the a row for the table, and add the data 
  141.      */
  142.     row = netsnmp_create_table_data_row();
  143.     /*
  144.      * set the index to the IETF WG name "snmpv3" 
  145.      */
  146.     netsnmp_table_row_add_index(row, ASN_OCTET_STR, "snmpv3",
  147.                                 strlen("snmpv3"));
  148.     /*
  149.      * set column 2 to be the WG chair name "Russ Mundy" 
  150.      */
  151.     netsnmp_set_row_column(row, 2, ASN_OCTET_STR,
  152.                            "Russ Mundy", strlen("Russ Mundy"));
  153.     netsnmp_mark_row_column_writable(row, 2, 1);        /* make writable via SETs */
  154.     /*
  155.      * set column 3 to be the WG chair name "David Harrington" 
  156.      */
  157.     netsnmp_set_row_column(row, 3, ASN_OCTET_STR, "David Harrington",
  158.                            strlen("David Harrington"));
  159.     netsnmp_mark_row_column_writable(row, 3, 1);        /* make writable via SETs */
  160.     /*
  161.      * add the row to the table 
  162.      */
  163.     netsnmp_table_dataset_add_row(table_set, row);
  164. #ifdef ADD_MORE_DATA
  165.     /*
  166.      * add the data, for the second row 
  167.      */
  168.     row = netsnmp_create_table_data_row();
  169.     netsnmp_table_row_add_index(row, ASN_OCTET_STR, "snmpconf",
  170.                                 strlen("snmpconf"));
  171.     netsnmp_set_row_column(row, 2, ASN_OCTET_STR, "David Partain",
  172.                            strlen("David Partain"));
  173.     netsnmp_mark_row_column_writable(row, 2, 1);        /* make writable */
  174.     netsnmp_set_row_column(row, 3, ASN_OCTET_STR, "Jon Saperia",
  175.                            strlen("Jon Saperia"));
  176.     netsnmp_mark_row_column_writable(row, 3, 1);        /* make writable */
  177.     netsnmp_table_dataset_add_row(table_set, row);
  178. #endif
  179.     /*
  180.      * Finally, this actually allows the "add_row" token it the
  181.      * * snmpd.conf file to add rows to this table.
  182.      * * Example snmpd.conf line:
  183.      * *   add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco"
  184.      */
  185.     netsnmp_register_auto_data_table(table_set, NULL);
  186.     DEBUGMSGTL(("example_data_set", "Done initializing.n"));
  187. }