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