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 <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,                       /* egnite */
00112     2,                          /* egnite products=1 local=2 experimental=3 */
00113     6,                          /* egnite Nut/OS */
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 }

© 2000-2007 by egnite Software GmbH - visit http://www.ethernut.de/