mib2sys.c

Go to the documentation of this file.
00001 /*
00002  * Copyright 2007 by egnite Software GmbH
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions
00006  * are met:
00007  *
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the copyright holders nor the names of
00014  *    contributors may be used to endorse or promote products derived
00015  *    from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00018  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00019  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00020  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00021  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00022  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00023  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00024  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
00025  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00026  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
00027  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00028  * SUCH DAMAGE.
00029  *
00030  * For additional information see http://www.ethernut.de/
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 uint8_t *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,                       /* egnite */
00113     2,                          /* egnite products=1 local=2 experimental=3 */
00114     6,                          /* egnite Nut/OS */
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, uint8_t * var_val, uint8_t var_val_type, size_t var_val_len, OID * name, size_t name_len)
00162 {
00163     size_t len = SNMP_MAX_LEN;
00164     uint8_t *value;
00165     uint8_t *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 = (uint8_t *)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 uint8_t *MibVarsSysGet(CONST SNMPVAR * vp, OID * name, size_t * namelen, int exact, size_t * varlen, WMETHOD ** wmethod)
00221 {
00222     static uint8_t 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 (uint8_t *) sys_descr;
00247     case MAG_SYS_OID:
00248         *varlen = sizeof(sys_oid);
00249         return (uint8_t *) sys_oid;
00250     case MAG_SYS_UPTIME:
00251         sys_uptime = time(NULL) - sys_starttime;
00252         sys_uptime *= 100;
00253         return (uint8_t *) & sys_uptime;
00254     case MAG_SYS_CONTACT:
00255         *wmethod = MibVarsSysSet;
00256         if (sys_contact) {
00257             *varlen = strlen(sys_contact);
00258             return (uint8_t *) 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 (uint8_t *) 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 (uint8_t *) sys_location;
00275         }
00276         *varlen = 0;
00277         return empty;
00278     case MAG_SYS_SERVICES:
00279         return (uint8_t *) & sys_services;
00280     }
00281     return NULL;
00282 }

© 2000-2010 by contributors - visit http://www.ethernut.de/