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

SNMP编程

开发平台:

Unix_Linux

  1. /** @example notification.c
  2.  *  This example shows how to send a notification from inside the
  3.  *  agent.  In this case we do something really boring to decide
  4.  *  whether to send a notification or not: we simply sleep for 30
  5.  *  seconds and send it, then we sleep for 30 more and send it again.
  6.  *  We do this through the snmp_alarm mechanisms (which are safe to
  7.  *  use within the agent.  Don't use the system alarm() call, it won't
  8.  *  work properly).  Normally, you would probably want to do something
  9.  *  to test whether or not to send an alarm, based on the type of mib
  10.  *  module you were creating.
  11.  *
  12.  *  When this module is compiled into the agent (run configure with
  13.  *  --with-mib-modules="examples/notification") then it should send
  14.  *  out traps, which when received by the snmptrapd demon will look
  15.  *  roughly like:
  16.  *
  17.  *  2002-05-08 08:57:05 localhost.localdomain [udp:127.0.0.1:32865]:
  18.  *      sysUpTimeInstance = Timeticks: (3803) 0:00:38.03        snmpTrapOID.0 = OID: netSnmpExampleNotification
  19.  *
  20.  */
  21. /*
  22.  * start be including the appropriate header files 
  23.  */
  24. #include <net-snmp/net-snmp-config.h>
  25. #include <net-snmp/net-snmp-includes.h>
  26. #include <net-snmp/agent/net-snmp-agent-includes.h>
  27. /*
  28.  * contains prototypes 
  29.  */
  30. #include "notification.h"
  31. /*
  32.  * our initialization routine
  33.  * (to get called, the function name must match init_FILENAME() 
  34.  */
  35. void
  36. init_notification(void)
  37. {
  38.     DEBUGMSGTL(("example_notification",
  39.                 "initializing (setting callback alarm)n"));
  40.     snmp_alarm_register(30,     /* seconds */
  41.                         SA_REPEAT,      /* repeat (every 30 seconds). */
  42.                         send_example_notification,      /* our callback */
  43.                         NULL    /* no callback data needed */
  44.         );
  45. }
  46. /** here we send a SNMP v2 trap (which can be sent through snmpv3 and
  47.  *  snmpv1 as well) and send it out.
  48.  *
  49.  *     The various "send_trap()" calls allow you to specify traps in different
  50.  *  formats.  And the various "trapsink" directives allow you to specify
  51.  *  destinations to receive different formats.
  52.  *  But *all* traps are sent to *all* destinations, regardless of how they
  53.  *  were specified.
  54.  *  
  55.  *  
  56.  *  I.e. it's
  57.  *                                           ___  trapsink
  58.  *                                          /
  59.  *      send_easy_trap ___  [  Trap      ] ____  trap2sink
  60.  *                      ___  [ Generator  ]
  61.  *      send_v2trap    /     [            ] ----- informsink
  62.  *                                          ____
  63.  *                                                trapsess
  64.  *  
  65.  *  *Not*
  66.  *       send_easy_trap  ------------------->  trapsink
  67.  *       send_v2trap     ------------------->  trap2sink
  68.  *       ????            ------------------->  informsink
  69.  *       ????            ------------------->  trapsess
  70.  */
  71. void
  72. send_example_notification(unsigned int clientreg, void *clientarg)
  73. {
  74.     /*
  75.      * define the OID for the notification we're going to send
  76.      * NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification 
  77.      */
  78.     oid             notification_oid[] =
  79.         { 1, 3, 6, 1, 4, 1, 8072, 2, 3, 0, 1 };
  80.     size_t          notification_oid_len = OID_LENGTH(notification_oid);
  81.     /*
  82.      * In the notification, we have to assign our notification OID to
  83.      * the snmpTrapOID.0 object. Here is it's definition. 
  84.      */
  85.     oid             objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
  86.     size_t          objid_snmptrap_len = OID_LENGTH(objid_snmptrap);
  87.     /*
  88.      * define the OIDs for the varbinds we're going to include
  89.      *  with the notification -
  90.      * NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatRate  and
  91.      * NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatName 
  92.      */
  93.     oid      hbeat_rate_oid[]   = { 1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 1, 0 };
  94.     size_t   hbeat_rate_oid_len = OID_LENGTH(hbeat_rate_oid);
  95.     oid      hbeat_name_oid[]   = { 1, 3, 6, 1, 4, 1, 8072, 2, 3, 2, 2, 0 };
  96.     size_t   hbeat_name_oid_len = OID_LENGTH(hbeat_name_oid);
  97.     /*
  98.      * here is where we store the variables to be sent in the trap 
  99.      */
  100.     netsnmp_variable_list *notification_vars = NULL;
  101.     const char *heartbeat_name = "A girl named Maria";
  102. #ifdef  RANDOM_HEARTBEAT
  103.     int  heartbeat_rate = rand() % 60;
  104. #else
  105.     int  heartbeat_rate = 30;
  106. #endif
  107.     DEBUGMSGTL(("example_notification", "defining the trapn"));
  108.     /*
  109.      * add in the trap definition object 
  110.      */
  111.     snmp_varlist_add_variable(&notification_vars,
  112.                               /*
  113.                                * the snmpTrapOID.0 variable 
  114.                                */
  115.                               objid_snmptrap, objid_snmptrap_len,
  116.                               /*
  117.                                * value type is an OID 
  118.                                */
  119.                               ASN_OBJECT_ID,
  120.                               /*
  121.                                * value contents is our notification OID 
  122.                                */
  123.                               (u_char *) notification_oid,
  124.                               /*
  125.                                * size in bytes = oid length * sizeof(oid) 
  126.                                */
  127.                               notification_oid_len * sizeof(oid));
  128.     /*
  129.      * add in the additional objects defined as part of the trap
  130.      */
  131.     snmp_varlist_add_variable(&notification_vars,
  132.                                hbeat_rate_oid, hbeat_rate_oid_len,
  133.                                ASN_INTEGER,
  134.                               (u_char *)&heartbeat_rate,
  135.                                   sizeof(heartbeat_rate));
  136.     /*
  137.      * if we want to insert additional objects, we do it here 
  138.      */
  139.     if (heartbeat_rate < 30 ) {
  140.         snmp_varlist_add_variable(&notification_vars,
  141.                                hbeat_name_oid, hbeat_name_oid_len,
  142.                                ASN_OCTET_STR,
  143.                                heartbeat_name, strlen(heartbeat_name));
  144.     }
  145.     /*
  146.      * send the trap out.  This will send it to all registered
  147.      * receivers (see the "SETTING UP TRAP AND/OR INFORM DESTINATIONS"
  148.      * section of the snmpd.conf manual page. 
  149.      */
  150.     DEBUGMSGTL(("example_notification", "sending the trapn"));
  151.     send_v2trap(notification_vars);
  152.     /*
  153.      * free the created notification variable list 
  154.      */
  155.     DEBUGMSGTL(("example_notification", "cleaning upn"));
  156.     snmp_free_varbind(notification_vars);
  157. }