ucdDemoPublic.c

00001 /*
00002  * ucdDemoPublic.c 
00003  */
00004 
00005 #include <net-snmp/net-snmp-config.h>
00006 #if HAVE_STDLIB_H
00007 #include <stdlib.h>
00008 #endif
00009 #if HAVE_STRING_H
00010 #include <string.h>
00011 #else
00012 #include <strings.h>
00013 #endif
00014 
00015 #if TIME_WITH_SYS_TIME
00016 # ifdef WIN32
00017 #  include <sys/timeb.h>
00018 # else
00019 #  include <sys/time.h>
00020 # endif
00021 # include <time.h>
00022 #else
00023 # if HAVE_SYS_TIME_H
00024 #  include <sys/time.h>
00025 # else
00026 #  include <time.h>
00027 # endif
00028 #endif
00029 
00030 #if HAVE_WINSOCK_H
00031 #include <winsock.h>
00032 #endif
00033 
00034 #include <net-snmp/net-snmp-includes.h>
00035 #include <net-snmp/agent/net-snmp-agent-includes.h>
00036 
00037 #include "util_funcs.h"
00038 #include "ucdDemoPublic.h"
00039 
00040 #define MYMAX 1024
00041 #define MAXUSERS 10
00042 
00043 int             num = 0;
00044 static char     demoUsers[MAXUSERS][MYMAX + 1];
00045 static char     demopass[MYMAX + 1];
00046 
00047 void
00048 ucdDemo_parse_user(const char *word, char *line)
00049 {
00050     if (num == MAXUSERS)
00051         return;
00052 
00053     if (strlen(line) > MYMAX)
00054         return;
00055 
00056     strcpy(demoUsers[num++], line);
00057 }
00058 
00059 
00060 void
00061 ucdDemo_parse_userpass(const char *word, char *line)
00062 {
00063     if (strlen(line) > MYMAX)
00064         return;
00065 
00066     strcpy(demopass, line);
00067 }
00068 
00069 /*
00070  * this variable defines function callbacks and type return information 
00071  * for the ucdDemoPublic mib 
00072  */
00073 
00074 struct variable2 ucdDemoPublic_variables[] = {
00075     {UCDDEMORESETKEYS, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {1}},
00076     {UCDDEMOPUBLICSTRING, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1,
00077      {2}},
00078     {UCDDEMOUSERLIST, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1, {3}},
00079     {UCDDEMOPASSPHRASE, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1, {4}},
00080 
00081 };
00082 
00083 /*
00084  * Define the OID pointer to the top of the mib tree that we're
00085  * registering underneath 
00086  */
00087 oid             ucdDemoPublic_variables_oid[] =
00088     { 1, 3, 6, 1, 4, 1, 2021, 14, 1, 1 };
00089 
00090 void
00091 init_ucdDemoPublic(void)
00092 {
00093     REGISTER_MIB("examples/ucdDemoPublic", ucdDemoPublic_variables,
00094                  variable2, ucdDemoPublic_variables_oid);
00095     snmpd_register_config_handler("demoUser",
00096                                   ucdDemo_parse_user, NULL, "USER");
00097     snmpd_register_config_handler("demoPass",
00098                                   ucdDemo_parse_userpass, NULL,
00099                                   "PASSPHASE");
00100 }
00101 
00102 unsigned char   publicString[MYMAX + 1];
00103 
00104 unsigned char  *
00105 var_ucdDemoPublic(struct variable *vp,
00106                   oid * name,
00107                   size_t * length,
00108                   int exact, size_t * var_len, WriteMethod ** write_method)
00109 {
00110     static long     long_ret;
00111     static char     string[MYMAX + 1], *cp;
00112     int             i;
00113 
00114     *write_method = 0;          /* assume it isnt writable for the time being */
00115     *var_len = sizeof(long_ret);        /* assume an integer and change later if not */
00116 
00117     if (header_generic(vp, name, length, exact, var_len, write_method))
00118         return 0;
00119 
00120     /*
00121      * this is where we do the value assignments for the mib results. 
00122      */
00123     switch (vp->magic) {
00124 
00125     case UCDDEMORESETKEYS:
00126         *write_method = write_ucdDemoResetKeys;
00127         long_ret = 0;
00128         return (unsigned char *) &long_ret;
00129 
00130     case UCDDEMOPUBLICSTRING:
00131         *write_method = write_ucdDemoPublicString;
00132         *var_len = strlen(publicString);
00133         return (unsigned char *) publicString;
00134 
00135     case UCDDEMOUSERLIST:
00136         cp = string;
00137         for (i = 0; i < num; i++) {
00138             snprintf(cp, sizeof(string)-strlen(string), " %s", demoUsers[i]);
00139             string[MYMAX] = 0;
00140             cp = cp + strlen(cp);
00141         }
00142         *var_len = strlen(string);
00143         return (unsigned char *) string;
00144 
00145     case UCDDEMOPASSPHRASE:
00146         *var_len = strlen(demopass);
00147         return (unsigned char *) demopass;
00148 
00149     default:
00150         DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ucdDemoPublic\n",
00151                     vp->magic));
00152     }
00153     return 0;
00154 }
00155 
00156 int
00157 write_ucdDemoResetKeys(int action,
00158                        u_char * var_val,
00159                        u_char var_val_type,
00160                        size_t var_val_len,
00161                        u_char * statP, oid * name, size_t name_len)
00162 {
00163     /*
00164      * variables we may use later 
00165      */
00166     static long     long_ret;
00167     unsigned char  *engineID;
00168     size_t          engineIDLen;
00169     int             i;
00170     struct usmUser *user;
00171 
00172     if (var_val_type != ASN_INTEGER) {
00173         DEBUGMSGTL(("ucdDemoPublic",
00174                     "write to ucdDemoResetKeys not ASN_INTEGER\n"));
00175         return SNMP_ERR_WRONGTYPE;
00176     }
00177     if (var_val_len > sizeof(long_ret)) {
00178         DEBUGMSGTL(("ucdDemoPublic",
00179                     "write to ucdDemoResetKeys: bad length\n"));
00180         return SNMP_ERR_WRONGLENGTH;
00181     }
00182     if (action == COMMIT) {
00183         long_ret = *((long *) var_val);
00184         if (long_ret == 1) {
00185             engineID = snmpv3_generate_engineID(&engineIDLen);
00186             for (i = 0; i < num; i++) {
00187                 user = usm_get_user(engineID, engineIDLen, demoUsers[i]);
00188                 if (user) {
00189                     usm_set_user_password(user, "userSetAuthPass",
00190                                           demopass);
00191                     usm_set_user_password(user, "userSetPrivPass",
00192                                           demopass);
00193                 }
00194             }
00195             /*
00196              * reset the keys 
00197              */
00198         }
00199     }
00200     return SNMP_ERR_NOERROR;
00201 }
00202 
00203 int
00204 write_ucdDemoPublicString(int action,
00205                           u_char * var_val,
00206                           u_char var_val_type,
00207                           size_t var_val_len,
00208                           u_char * statP, oid * name, size_t name_len)
00209 {
00210     if (var_val_type != ASN_OCTET_STR) {
00211         DEBUGMSGTL(("ucdDemoPublic",
00212                     "write to ucdDemoPublicString not ASN_OCTET_STR\n"));
00213         return SNMP_ERR_WRONGTYPE;
00214     }
00215     if (var_val_len > MYMAX) {
00216         DEBUGMSGTL(("ucdDemoPublic",
00217                     "write to ucdDemoPublicString: bad length\n"));
00218         return SNMP_ERR_WRONGLENGTH;
00219     }
00220     if (action == COMMIT) {
00221         if (var_val_len != 0) {
00222             strcpy(publicString, var_val);
00223             publicString[var_val_len] = '\0';
00224         } else
00225             publicString[0] = '\0';
00226     }
00227     return SNMP_ERR_NOERROR;
00228 }

net-snmpに対してSat Sep 5 13:14:28 2009に生成されました。  doxygen 1.4.7