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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * ucdDemoPublic.c 
  3.  */
  4. #include <net-snmp/net-snmp-config.h>
  5. #if HAVE_STDLIB_H
  6. #include <stdlib.h>
  7. #endif
  8. #if HAVE_STRING_H
  9. #include <string.h>
  10. #else
  11. #include <strings.h>
  12. #endif
  13. #if TIME_WITH_SYS_TIME
  14. # ifdef WIN32
  15. #  include <sys/timeb.h>
  16. # else
  17. #  include <sys/time.h>
  18. # endif
  19. # include <time.h>
  20. #else
  21. # if HAVE_SYS_TIME_H
  22. #  include <sys/time.h>
  23. # else
  24. #  include <time.h>
  25. # endif
  26. #endif
  27. #if HAVE_WINSOCK_H
  28. #include <winsock.h>
  29. #endif
  30. #include <net-snmp/net-snmp-includes.h>
  31. #include <net-snmp/agent/net-snmp-agent-includes.h>
  32. #include "util_funcs.h"
  33. #include "ucdDemoPublic.h"
  34. #define MYMAX 1024
  35. #define MAXUSERS 10
  36. int             num = 0;
  37. static char     demoUsers[MAXUSERS][MYMAX + 1];
  38. static char     demopass[MYMAX + 1];
  39. void
  40. ucdDemo_parse_user(const char *word, char *line)
  41. {
  42.     if (num == MAXUSERS)
  43.         return;
  44.     if (strlen(line) > MYMAX)
  45.         return;
  46.     strcpy(demoUsers[num++], line);
  47. }
  48. void
  49. ucdDemo_parse_userpass(const char *word, char *line)
  50. {
  51.     if (strlen(line) > MYMAX)
  52.         return;
  53.     strcpy(demopass, line);
  54. }
  55. /*
  56.  * this variable defines function callbacks and type return information 
  57.  * for the ucdDemoPublic mib 
  58.  */
  59. struct variable2 ucdDemoPublic_variables[] = {
  60.     {UCDDEMORESETKEYS, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {1}},
  61.     {UCDDEMOPUBLICSTRING, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1,
  62.      {2}},
  63.     {UCDDEMOUSERLIST, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1, {3}},
  64.     {UCDDEMOPASSPHRASE, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1, {4}},
  65. };
  66. /*
  67.  * Define the OID pointer to the top of the mib tree that we're
  68.  * registering underneath 
  69.  */
  70. oid             ucdDemoPublic_variables_oid[] =
  71.     { 1, 3, 6, 1, 4, 1, 2021, 14, 1, 1 };
  72. void
  73. init_ucdDemoPublic(void)
  74. {
  75.     REGISTER_MIB("examples/ucdDemoPublic", ucdDemoPublic_variables,
  76.                  variable2, ucdDemoPublic_variables_oid);
  77.     snmpd_register_config_handler("demoUser",
  78.                                   ucdDemo_parse_user, NULL, "USER");
  79.     snmpd_register_config_handler("demoPass",
  80.                                   ucdDemo_parse_userpass, NULL,
  81.                                   "PASSPHASE");
  82. }
  83. unsigned char   publicString[MYMAX + 1];
  84. unsigned char  *
  85. var_ucdDemoPublic(struct variable *vp,
  86.                   oid * name,
  87.                   size_t * length,
  88.                   int exact, size_t * var_len, WriteMethod ** write_method)
  89. {
  90.     static long     long_ret;
  91.     static char     string[MYMAX + 1], *cp;
  92.     int             i;
  93.     *write_method = 0;          /* assume it isnt writable for the time being */
  94.     *var_len = sizeof(long_ret);        /* assume an integer and change later if not */
  95.     if (header_generic(vp, name, length, exact, var_len, write_method))
  96.         return 0;
  97.     /*
  98.      * this is where we do the value assignments for the mib results. 
  99.      */
  100.     switch (vp->magic) {
  101.     case UCDDEMORESETKEYS:
  102.         *write_method = write_ucdDemoResetKeys;
  103.         long_ret = 0;
  104.         return (unsigned char *) &long_ret;
  105.     case UCDDEMOPUBLICSTRING:
  106.         *write_method = write_ucdDemoPublicString;
  107.         *var_len = strlen(publicString);
  108.         return (unsigned char *) publicString;
  109.     case UCDDEMOUSERLIST:
  110.         cp = string;
  111.         for (i = 0; i < num; i++) {
  112.             snprintf(cp, sizeof(string)-strlen(string), " %s", demoUsers[i]);
  113.             string[MYMAX] = 0;
  114.             cp = cp + strlen(cp);
  115.         }
  116.         *var_len = strlen(string);
  117.         return (unsigned char *) string;
  118.     case UCDDEMOPASSPHRASE:
  119.         *var_len = strlen(demopass);
  120.         return (unsigned char *) demopass;
  121.     default:
  122.         DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ucdDemoPublicn",
  123.                     vp->magic));
  124.     }
  125.     return 0;
  126. }
  127. int
  128. write_ucdDemoResetKeys(int action,
  129.                        u_char * var_val,
  130.                        u_char var_val_type,
  131.                        size_t var_val_len,
  132.                        u_char * statP, oid * name, size_t name_len)
  133. {
  134.     /*
  135.      * variables we may use later 
  136.      */
  137.     static long     long_ret;
  138.     unsigned char  *engineID;
  139.     size_t          engineIDLen;
  140.     int             i;
  141.     struct usmUser *user;
  142.     if (var_val_type != ASN_INTEGER) {
  143.         DEBUGMSGTL(("ucdDemoPublic",
  144.                     "write to ucdDemoResetKeys not ASN_INTEGERn"));
  145.         return SNMP_ERR_WRONGTYPE;
  146.     }
  147.     if (var_val_len > sizeof(long_ret)) {
  148.         DEBUGMSGTL(("ucdDemoPublic",
  149.                     "write to ucdDemoResetKeys: bad lengthn"));
  150.         return SNMP_ERR_WRONGLENGTH;
  151.     }
  152.     if (action == COMMIT) {
  153.         long_ret = *((long *) var_val);
  154.         if (long_ret == 1) {
  155.             engineID = snmpv3_generate_engineID(&engineIDLen);
  156.             for (i = 0; i < num; i++) {
  157.                 user = usm_get_user(engineID, engineIDLen, demoUsers[i]);
  158.                 if (user) {
  159.                     usm_set_user_password(user, "userSetAuthPass",
  160.                                           demopass);
  161.                     usm_set_user_password(user, "userSetPrivPass",
  162.                                           demopass);
  163.                 }
  164.             }
  165.             /*
  166.              * reset the keys 
  167.              */
  168.         }
  169.     }
  170.     return SNMP_ERR_NOERROR;
  171. }
  172. int
  173. write_ucdDemoPublicString(int action,
  174.                           u_char * var_val,
  175.                           u_char var_val_type,
  176.                           size_t var_val_len,
  177.                           u_char * statP, oid * name, size_t name_len)
  178. {
  179.     if (var_val_type != ASN_OCTET_STR) {
  180.         DEBUGMSGTL(("ucdDemoPublic",
  181.                     "write to ucdDemoPublicString not ASN_OCTET_STRn"));
  182.         return SNMP_ERR_WRONGTYPE;
  183.     }
  184.     if (var_val_len > MYMAX) {
  185.         DEBUGMSGTL(("ucdDemoPublic",
  186.                     "write to ucdDemoPublicString: bad lengthn"));
  187.         return SNMP_ERR_WRONGLENGTH;
  188.     }
  189.     if (action == COMMIT) {
  190.         if (var_val_len != 0) {
  191.             strcpy(publicString, var_val);
  192.             publicString[var_val_len] = '';
  193.         } else
  194.             publicString[0] = '';
  195.     }
  196.     return SNMP_ERR_NOERROR;
  197. }