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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  *  SNMPv1 MIB group implementation - snmp.c
  3.  *
  4.  */
  5. #include <net-snmp/net-snmp-config.h>
  6. #include <sys/types.h>
  7. #if HAVE_STRING_H
  8. #include <string.h>
  9. #else
  10. #include <strings.h>
  11. #endif
  12. #if HAVE_NETINET_IN_H
  13. #include <netinet/in.h>
  14. #endif
  15. #if HAVE_WINSOCK_H
  16. #include <winsock.h>
  17. #endif
  18. #include <net-snmp/net-snmp-includes.h>
  19. #include <net-snmp/agent/net-snmp-agent-includes.h>
  20. #include "util_funcs.h"
  21. #include "snmp_mib.h"
  22. #include "sysORTable.h"
  23.         /*********************
  24.  *
  25.  *  Kernel & interface information,
  26.  *   and internal forward declarations
  27.  *
  28.  *********************/
  29. extern int      snmp_enableauthentraps;
  30. extern int      snmp_enableauthentrapsset;
  31. int             old_snmp_enableauthentraps;
  32. /*********************
  33.  *
  34.  *  Initialisation & common implementation functions
  35.  *
  36.  *********************/
  37. /*
  38.  * define the structure we're going to ask the agent to register our
  39.  * information at 
  40.  */
  41. struct variable1 snmp_variables[] = {
  42.     {SNMPINPKTS, ASN_COUNTER, RONLY, var_snmp, 1, {1}},
  43.     {SNMPOUTPKTS, ASN_COUNTER, RONLY, var_snmp, 1, {2}},
  44.     {SNMPINBADVERSIONS, ASN_COUNTER, RONLY, var_snmp, 1, {3}},
  45. #if !defined(DISABLE_SNMPV1) || !defined(DISABLE_SNMPV2C)
  46.     {SNMPINBADCOMMUNITYNAMES, ASN_COUNTER, RONLY, var_snmp, 1, {4}},
  47.     {SNMPINBADCOMMUNITYUSES, ASN_COUNTER, RONLY, var_snmp, 1, {5}},
  48. #endif /* support for community based SNMP */
  49.     {SNMPINASNPARSEERRORS, ASN_COUNTER, RONLY, var_snmp, 1, {6}},
  50.     {SNMPINTOOBIGS, ASN_COUNTER, RONLY, var_snmp, 1, {8}},
  51.     {SNMPINNOSUCHNAMES, ASN_COUNTER, RONLY, var_snmp, 1, {9}},
  52.     {SNMPINBADVALUES, ASN_COUNTER, RONLY, var_snmp, 1, {10}},
  53.     {SNMPINREADONLYS, ASN_COUNTER, RONLY, var_snmp, 1, {11}},
  54.     {SNMPINGENERRS, ASN_COUNTER, RONLY, var_snmp, 1, {12}},
  55.     {SNMPINTOTALREQVARS, ASN_COUNTER, RONLY, var_snmp, 1, {13}},
  56.     {SNMPINTOTALSETVARS, ASN_COUNTER, RONLY, var_snmp, 1, {14}},
  57.     {SNMPINGETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {15}},
  58.     {SNMPINGETNEXTS, ASN_COUNTER, RONLY, var_snmp, 1, {16}},
  59.     {SNMPINSETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {17}},
  60.     {SNMPINGETRESPONSES, ASN_COUNTER, RONLY, var_snmp, 1, {18}},
  61.     {SNMPINTRAPS, ASN_COUNTER, RONLY, var_snmp, 1, {19}},
  62.     {SNMPOUTTOOBIGS, ASN_COUNTER, RONLY, var_snmp, 1, {20}},
  63.     {SNMPOUTNOSUCHNAMES, ASN_COUNTER, RONLY, var_snmp, 1, {21}},
  64.     {SNMPOUTBADVALUES, ASN_COUNTER, RONLY, var_snmp, 1, {22}},
  65.     {SNMPOUTGENERRS, ASN_COUNTER, RONLY, var_snmp, 1, {24}},
  66.     {SNMPOUTGETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {25}},
  67.     {SNMPOUTGETNEXTS, ASN_COUNTER, RONLY, var_snmp, 1, {26}},
  68.     {SNMPOUTSETREQUESTS, ASN_COUNTER, RONLY, var_snmp, 1, {27}},
  69.     {SNMPOUTGETRESPONSES, ASN_COUNTER, RONLY, var_snmp, 1, {28}},
  70.     {SNMPOUTTRAPS, ASN_COUNTER, RONLY, var_snmp, 1, {29}},
  71.     {SNMPENABLEAUTHENTRAPS, ASN_INTEGER, RWRITE, var_snmp, 1, {30}},
  72.     {SNMPSILENTDROPS, ASN_COUNTER, RONLY, var_snmp, 1, {31}},
  73.     {SNMPPROXYDROPS, ASN_COUNTER, RONLY, var_snmp, 1, {32}}
  74. };
  75. /*
  76.  * Define the OID pointer to the top of the mib tree that we're
  77.  * registering underneath 
  78.  */
  79. oid             snmp_variables_oid[] = { SNMP_OID_MIB2, 11 };
  80. #ifdef USING_MIBII_SYSTEM_MIB_MODULE
  81. extern oid      system_module_oid[];
  82. extern int      system_module_oid_len;
  83. extern int      system_module_count;
  84. #endif
  85. static int
  86. snmp_enableauthentraps_store(int a, int b, void *c, void *d)
  87. {
  88.     char            line[SNMP_MAXBUF_SMALL];
  89.     if (snmp_enableauthentrapsset > 0) {
  90.         snprintf(line, SNMP_MAXBUF_SMALL, "pauthtrapenable %d",
  91.                  snmp_enableauthentraps);
  92.         snmpd_store_config(line);
  93.     }
  94.     return 0;
  95. }
  96. void
  97. init_snmp_mib(void)
  98. {
  99.     /*
  100.      * register ourselves with the agent to handle our mib tree 
  101.      */
  102.     REGISTER_MIB("mibII/snmp", snmp_variables, variable1,
  103.                  snmp_variables_oid);
  104. #ifdef USING_MIBII_SYSTEM_MIB_MODULE
  105.     if (++system_module_count == 3)
  106.         REGISTER_SYSOR_TABLE(system_module_oid, system_module_oid_len,
  107.                              "The MIB module for SNMPv2 entities");
  108. #endif
  109.     snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
  110.                            snmp_enableauthentraps_store, NULL);
  111. }
  112. /*
  113.  * header_snmp(...
  114.  * Arguments:
  115.  * vp     IN      - pointer to variable entry that points here
  116.  * name    IN/OUT  - IN/name requested, OUT/name found
  117.  * length  IN/OUT  - length of IN/OUT oid's 
  118.  * exact   IN      - TRUE if an exact match was requested
  119.  * var_len OUT     - length of variable or 0 if function returned
  120.  * write_method
  121.  * 
  122.  */
  123.         /*********************
  124.  *
  125.  *  System specific implementation functions
  126.  * (actually common!)
  127.  *
  128.  *********************/
  129. u_char         *
  130. var_snmp(struct variable *vp,
  131.          oid * name,
  132.          size_t * length,
  133.          int exact, size_t * var_len, WriteMethod ** write_method)
  134. {
  135.     static long     long_ret;
  136.     *write_method = 0;          /* assume it isnt writable for the time being */
  137.     *var_len = sizeof(long_ret);        /* assume an integer and change later if not */
  138.     if (header_generic(vp, name, length, exact, var_len, write_method)
  139.         == MATCH_FAILED)
  140.         return NULL;
  141.     /*
  142.      * this is where we do the value assignments for the mib results. 
  143.      */
  144.     if (vp->magic == SNMPENABLEAUTHENTRAPS) {
  145.         *write_method = write_snmp;
  146.         long_return = snmp_enableauthentraps;
  147.         return (u_char *) & long_return;
  148.     } else if ((vp->magic >= 1)
  149.                && (vp->magic <=
  150.                    (STAT_SNMP_STATS_END - STAT_SNMP_STATS_START + 1))) {
  151.         long_ret =
  152.             snmp_get_statistic(vp->magic + STAT_SNMP_STATS_START - 1);
  153.         return (unsigned char *) &long_ret;
  154.     }
  155.     return NULL;
  156. }
  157. /*
  158.  * only for snmpEnableAuthenTraps:
  159.  */
  160. int
  161. write_snmp(int action,
  162.            u_char * var_val,
  163.            u_char var_val_type,
  164.            size_t var_val_len, u_char * statP, oid * name, size_t name_len)
  165. {
  166.     long            intval = 0;
  167.     switch (action) {
  168.     case RESERVE1:             /* Check values for acceptability */
  169.         if (var_val_type != ASN_INTEGER) {
  170.             DEBUGMSGTL(("mibII/snmp_mib", "%x not integer type",
  171.                         var_val_type));
  172.             return SNMP_ERR_WRONGTYPE;
  173.         }
  174.         intval = *((long *) var_val);
  175.         if (intval != 1 && intval != 2) {
  176.             DEBUGMSGTL(("mibII/snmp_mib", "not valid %xn", intval));
  177.             return SNMP_ERR_WRONGVALUE;
  178.         }
  179.         if (snmp_enableauthentrapsset < 0) {
  180.             /*
  181.              * The object is set in a read-only configuration file.  
  182.              */
  183.             return SNMP_ERR_NOTWRITABLE;
  184.         }
  185.         break;
  186.     case RESERVE2:             /* Allocate memory and similar resources */
  187.         /*
  188.          * Using static variables, so nothing needs to be done 
  189.          */
  190.         break;
  191.     case ACTION:               /* Perform the SET action (if reversible) */
  192.         /*
  193.          * Save the old value, in case of UNDO 
  194.          */
  195.         intval = *((long *) var_val);
  196.         old_snmp_enableauthentraps = snmp_enableauthentraps;
  197.         snmp_enableauthentraps = intval;
  198.         break;
  199.     case UNDO:                 /* Reverse the SET action and free resources */
  200.         snmp_enableauthentraps = old_snmp_enableauthentraps;
  201.         break;
  202.     case COMMIT:
  203.         snmp_enableauthentrapsset = 1;
  204.         snmp_save_persistent(netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPTYPE));
  205.         (void) snmp_call_callbacks(SNMP_CALLBACK_LIBRARY,
  206.                                    SNMP_CALLBACK_STORE_DATA, NULL);
  207.         snmp_clean_persistent(netsnmp_ds_get_string
  208.                               (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPTYPE));
  209.         break;
  210.     case FREE:                 /* Free any resources allocated */
  211.         break;
  212.     }
  213.     return SNMP_ERR_NOERROR;
  214. }
  215. /*********************
  216.  *
  217.  *  Internal implementation functions
  218.  *
  219.  *********************/