00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <stdlib.h>
00034 #include <string.h>
00035 #include <ctype.h>
00036 #include <time.h>
00037
00038 #include <sys/version.h>
00039 #include <sys/confos.h>
00040 #include <sys/confnet.h>
00041 #include <sys/environ.h>
00042
00043 #include <pro/snmp.h>
00044 #include <pro/snmp_api.h>
00045 #include "mib2sys.h"
00046
00047 #if defined(STK501)
00048 #define BOARD_NAME "STK 501"
00049 #elif defined(INTECH21)
00050 #define BOARD_NAME "Intech 21"
00051 #elif defined(XNUT_100)
00052 #define BOARD_NAME "XNUT 100"
00053 #elif defined(XNUT_105)
00054 #define BOARD_NAME "XNUT 105"
00055 #elif defined(AT91SAM7X_EK)
00056 #define BOARD_NAME "AT91SAM7X-EK"
00057 #elif defined(AT91SAM9260_EK)
00058 #define BOARD_NAME "AT91SAM9260-EK"
00059 #elif defined(CHARON2)
00060 #define BOARD_NAME "Charon 2"
00061 #elif defined(WOLF)
00062 #define BOARD_NAME "Wolf"
00063 #elif defined(ARTHERNET1)
00064 #define BOARD_NAME "Arthernet 1"
00065 #elif defined(MMNET02)
00066 #define BOARD_NAME "MMNET02"
00067 #elif defined(ETHERNUT1)
00068 #define BOARD_NAME "Ethernut 1"
00069 #elif defined(ETHERNUT2)
00070 #define BOARD_NAME "Ethernut 2"
00071 #elif defined(ETHERNUT3)
00072 #define BOARD_NAME "Ethernut 3"
00073 #elif defined(ETHERNUT5)
00074 #define BOARD_NAME "Ethernut 5"
00075 #else
00076 #define BOARD_NAME "Custom"
00077 #endif
00078
00079 #define MAG_SYS_DESCR 1
00080 #define MAG_SYS_OID 2
00081 #define MAG_SYS_UPTIME 3
00082 #define MAG_SYS_CONTACT 4
00083 #define MAG_SYS_NAME 5
00084 #define MAG_SYS_LOCATION 6
00085 #define MAG_SYS_SERVICES 7
00086
00087 static u_char *MibVarsSysGet(CONST SNMPVAR *, OID *, size_t *, int, size_t *, WMETHOD **);
00088
00089 static OID base_oid[] = { SNMP_OID_MIB2, 1 };
00090 static size_t base_oidlen = sizeof(base_oid) / sizeof(OID);
00091
00092 static SNMPVAR mib_variables[] = {
00093 {MAG_SYS_DESCR, ASN_OCTET_STR, ACL_RONLY, MibVarsSysGet, 1, {1}},
00094 {MAG_SYS_OID, ASN_OBJECT_ID, ACL_RONLY, MibVarsSysGet, 1, {2}},
00095 {MAG_SYS_UPTIME, ASN_TIMETICKS, ACL_RONLY, MibVarsSysGet, 1, {3}},
00096 {MAG_SYS_CONTACT, ASN_OCTET_STR, ACL_RWRITE, MibVarsSysGet, 1, {4}},
00097 {MAG_SYS_NAME, ASN_OCTET_STR, ACL_RWRITE, MibVarsSysGet, 1, {5}},
00098 {MAG_SYS_LOCATION, ASN_OCTET_STR, ACL_RWRITE, MibVarsSysGet, 1, {6}},
00099 {MAG_SYS_SERVICES, ASN_INTEGER, ACL_RONLY, MibVarsSysGet, 1, {7}},
00100 };
00101
00102 static char sys_descr[MAX_SYSSTR_LEN];
00103 static char *sys_contact;
00104 static char *sys_name;
00105 static char *sys_location;
00106 static time_t sys_starttime;
00107 static long sys_uptime;
00108 static long sys_services = 72;
00109 static OID sys_oid[] = {
00110 SNMP_OID_ENTERPRISES,
00111 3444,
00112 2,
00113 6,
00114 };
00115
00116 static char *UpdateStringEnv(char *name, char *var, char *value)
00117 {
00118 if (var) {
00119 free(var);
00120 }
00121 if ((var = malloc(strlen(value) + 1)) != NULL) {
00122 strcpy(var, value);
00123 if (name) {
00124 setenv(name, value, 1);
00125 }
00126 }
00127 return var;
00128 }
00129
00135 int MibRegisterSysVars(void)
00136 {
00137 char *cp;
00138
00139 strcpy(sys_descr, BOARD_NAME);
00140 strcat(sys_descr, " Nut/OS ");
00141 strcat(sys_descr, NutVersionString());
00142
00143 if ((cp = getenv("SYSCONTACT")) != NULL) {
00144 sys_contact = UpdateStringEnv(NULL, sys_contact, cp);
00145 }
00146 if ((cp = getenv("SYSNAME")) != NULL) {
00147 sys_name = UpdateStringEnv(NULL, sys_name, cp);
00148 } else {
00149 sys_name = UpdateStringEnv(NULL, sys_name, confos.hostname);
00150 }
00151 if ((cp = getenv("SYSLOCATION")) != NULL) {
00152 sys_location = UpdateStringEnv(NULL, sys_location, cp);
00153 }
00154
00155 sys_starttime = time(NULL);
00156
00157 return SnmpMibRegister(base_oid, base_oidlen, mib_variables, sizeof(mib_variables) / sizeof(SNMPVAR));
00158 }
00159
00160 static int MibVarsSysSet(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, OID * name, size_t name_len)
00161 {
00162 size_t len = SNMP_MAX_LEN;
00163 u_char *value;
00164 u_char *cp;
00165 size_t size;
00166
00167 if (action != SNMP_ACT_COMMIT) {
00168 return 0;
00169 }
00170
00171 if (var_val_type != ASN_OCTET_STR) {
00172 return SNMP_ERR_WRONGTYPE;
00173 }
00174 if (var_val_len > MAX_SYSSTR_LEN) {
00175 return SNMP_ERR_WRONGLENGTH;
00176 }
00177 size = MAX_SYSSTR_LEN;
00178 if ((value = malloc(MAX_SYSSTR_LEN) + 1) == NULL) {
00179 return SNMP_ERR_RESOURCEUNAVAILABLE;
00180 }
00181 AsnOctetStringParse(var_val, &len, &var_val_type, value, &size);
00182 value[size] = 0;
00183 for (cp = value; *cp; cp++) {
00184 if (!isprint(*cp)) {
00185 free(value);
00186 return SNMP_ERR_WRONGVALUE;
00187 }
00188 }
00189 if (action == SNMP_ACT_COMMIT) {
00190 switch (name[7]) {
00191 case 4:
00192 sys_contact = UpdateStringEnv("SYSCONTACT", sys_contact, (char *) value);
00193 break;
00194 case 5:
00195 sys_name = UpdateStringEnv("SYSNAME", sys_name, (char *) value);
00196 break;
00197 case 6:
00198 sys_location = UpdateStringEnv("SYSLOCATION", sys_location, (char *) value);
00199 break;
00200 }
00201 }
00202 free(value);
00203
00204 return 0;
00205 }
00206
00219 static u_char *MibVarsSysGet(CONST SNMPVAR * vp, OID * name, size_t * namelen, int exact, size_t * varlen, WMETHOD ** wmethod)
00220 {
00221 static u_char empty[1];
00222 int rc;
00223 OID *fullname;
00224 size_t fullnamelen = base_oidlen + vp->var_namelen + 1;
00225
00226 fullname = malloc(fullnamelen * sizeof(OID));
00227 memcpy(fullname, base_oid, base_oidlen * sizeof(OID));
00228 memcpy(fullname + base_oidlen, vp->var_name, vp->var_namelen * sizeof(OID));
00229 *(fullname + fullnamelen - 1) = 0;
00230
00231 rc = SnmpOidCmp(name, *namelen, fullname, fullnamelen);
00232 if ((exact && rc) || (!exact && rc >= 0)) {
00233 return NULL;
00234 }
00235 memcpy(name, fullname, fullnamelen * sizeof(OID));
00236 *namelen = fullnamelen;
00237
00238 *wmethod = NULL;
00239 *varlen = sizeof(long);
00240 switch (vp->var_magic) {
00241 case MAG_SYS_DESCR:
00242 *varlen = strlen(sys_descr);
00243 return (u_char *) sys_descr;
00244 case MAG_SYS_OID:
00245 *varlen = sizeof(sys_oid);
00246 return (u_char *) sys_oid;
00247 case MAG_SYS_UPTIME:
00248 sys_uptime = time(NULL) - sys_starttime;
00249 sys_uptime *= 100;
00250 return (u_char *) & sys_uptime;
00251 case MAG_SYS_CONTACT:
00252 *wmethod = MibVarsSysSet;
00253 if (sys_contact) {
00254 *varlen = strlen(sys_contact);
00255 return (u_char *) sys_contact;
00256 }
00257 *varlen = 0;
00258 return empty;
00259 case MAG_SYS_NAME:
00260 *wmethod = MibVarsSysSet;
00261 if (sys_name) {
00262 *varlen = strlen(sys_name);
00263 return (u_char *) sys_name;
00264 }
00265 *varlen = 0;
00266 return empty;
00267 case MAG_SYS_LOCATION:
00268 *wmethod = MibVarsSysSet;
00269 if (sys_location) {
00270 *varlen = strlen(sys_location);
00271 return (u_char *) sys_location;
00272 }
00273 *varlen = 0;
00274 return empty;
00275 case MAG_SYS_SERVICES:
00276 return (u_char *) & sys_services;
00277 }
00278 return NULL;
00279 }