00001
00002
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
00071
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
00085
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;
00115 *var_len = sizeof(long_ret);
00116
00117 if (header_generic(vp, name, length, exact, var_len, write_method))
00118 return 0;
00119
00120
00121
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
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
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 }