net-snmp
5.4.1
|
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 }