Annotation of embedaddon/quagga/lib/agentx.c, revision 1.1.1.1

1.1       misho       1: /* SNMP support
                      2:  * Copyright (C) 2012 Vincent Bernat <bernat@luffy.cx>
                      3:  *
                      4:  * This file is part of GNU Zebra.
                      5:  *
                      6:  * GNU Zebra is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2, or (at your option) any
                      9:  * later version.
                     10:  *
                     11:  * GNU Zebra is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14:  * General Public License for more details.
                     15:  *
                     16:  * You should have received a copy of the GNU General Public License
                     17:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
                     18:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     19:  * 02111-1307, USA.  
                     20:  */
                     21: 
                     22: #include <zebra.h>
                     23: 
                     24: #if defined HAVE_SNMP && defined SNMP_AGENTX
                     25: #include <net-snmp/net-snmp-config.h>
                     26: #include <net-snmp/net-snmp-includes.h>
                     27: 
                     28: #include "command.h"
                     29: #include "smux.h"
                     30: 
                     31: int agentx_enabled = 0;
                     32: 
                     33: /* AgentX node. */
                     34: static struct cmd_node agentx_node =
                     35: {
                     36:   SMUX_NODE,
                     37:   ""                            /* AgentX has no interface. */
                     38: };
                     39: 
                     40: /* Logging NetSNMP messages */
                     41: static int
                     42: agentx_log_callback(int major, int minor,
                     43:                    void *serverarg, void *clientarg)
                     44: {
                     45:   struct snmp_log_message *slm = (struct snmp_log_message *)serverarg;
                     46:   char *msg = strdup (slm->msg);
                     47:   if (msg) msg[strlen(msg)-1] = '\0';
                     48:   switch (slm->priority)
                     49:     {
                     50:     case LOG_EMERG:   zlog_err   ("snmp[emerg]: %s",   msg?msg:slm->msg); break;
                     51:     case LOG_ALERT:   zlog_err   ("snmp[alert]: %s",   msg?msg:slm->msg); break;
                     52:     case LOG_CRIT:    zlog_err   ("snmp[crit]: %s",    msg?msg:slm->msg); break;
                     53:     case LOG_ERR:     zlog_err   ("snmp[err]: %s",     msg?msg:slm->msg); break;
                     54:     case LOG_WARNING: zlog_warn  ("snmp[warning]: %s", msg?msg:slm->msg); break;
                     55:     case LOG_NOTICE:  zlog_notice("snmp[notice]: %s",  msg?msg:slm->msg); break;
                     56:     case LOG_INFO:    zlog_info  ("snmp[info]: %s",    msg?msg:slm->msg); break;
                     57:     case LOG_DEBUG:   zlog_debug ("snmp[debug]: %s",   msg?msg:slm->msg); break;
                     58:     }
                     59:   free(msg);
                     60:   return SNMP_ERR_NOERROR;
                     61: }
                     62: 
                     63: static int
                     64: config_write_agentx (struct vty *vty)
                     65: {
                     66:   if (agentx_enabled)
                     67:       vty_out (vty, "agentx%s", VTY_NEWLINE);
                     68:   return 0;
                     69: }
                     70: 
                     71: DEFUN (agentx_enable,
                     72:        agentx_enable_cmd,
                     73:        "agentx",
                     74:        "SNMP AgentX protocol settings\n"
                     75:        "SNMP AgentX settings\n")
                     76: {
                     77:   if (!agentx_enabled)
                     78:     {
                     79:       init_snmp("quagga");
                     80:       agentx_enabled = 1;
                     81:       return CMD_SUCCESS;
                     82:     }
                     83:   vty_out (vty, "SNMP AgentX already enabled%s", VTY_NEWLINE);
                     84:   return CMD_WARNING;
                     85: }
                     86: 
                     87: DEFUN (no_agentx,
                     88:        no_agentx_cmd,
                     89:        "no agentx",
                     90:        NO_STR
                     91:        "SNMP AgentX protocol settings\n"
                     92:        "SNMP AgentX settings\n")
                     93: {
                     94:   if (!agentx_enabled) return CMD_SUCCESS;
                     95:   vty_out (vty, "SNMP AgentX support cannot be disabled once enabled%s", VTY_NEWLINE);
                     96:   return CMD_WARNING;
                     97: }
                     98: 
                     99: void
                    100: smux_init (struct thread_master *tm)
                    101: {
                    102:   netsnmp_enable_subagent ();
                    103:   snmp_disable_log ();
                    104:   snmp_enable_calllog ();
                    105:   snmp_register_callback (SNMP_CALLBACK_LIBRARY,
                    106:                          SNMP_CALLBACK_LOGGING,
                    107:                          agentx_log_callback,
                    108:                          NULL);
                    109:   init_agent ("quagga");
                    110: 
                    111:   install_node (&agentx_node, config_write_agentx);
                    112:   install_element (CONFIG_NODE, &agentx_enable_cmd);
                    113:   install_element (CONFIG_NODE, &no_agentx_cmd);
                    114: }
                    115: 
                    116: void
                    117: smux_register_mib (const char *descr, struct variable *var, 
                    118:                   size_t width, int num,
                    119:                   oid name[], size_t namelen)
                    120: {
                    121:   register_mib (descr, var, width, num, name, namelen);
                    122: }
                    123: 
                    124: int
                    125: smux_trap (struct variable *vp, size_t vp_len,
                    126:           const oid *ename, size_t enamelen,
                    127:           const oid *name, size_t namelen,
                    128:           const oid *iname, size_t inamelen,
                    129:           const struct trap_object *trapobj, size_t trapobjlen,
                    130:           u_char sptrap)
                    131: {
                    132:   oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
                    133:   size_t objid_snmptrap_len = sizeof objid_snmptrap / sizeof (oid);
                    134:   oid notification_oid[MAX_OID_LEN];
                    135:   size_t notification_oid_len;
                    136:   unsigned int i;
                    137: 
                    138:   netsnmp_variable_list *notification_vars = NULL;
                    139:   if (!agentx_enabled) return 0;
                    140: 
                    141:   /* snmpTrapOID */
                    142:   oid_copy (notification_oid, ename, enamelen);
                    143:   notification_oid[enamelen] = sptrap;
                    144:   notification_oid_len = enamelen + 1;
                    145:   snmp_varlist_add_variable (&notification_vars,
                    146:                             objid_snmptrap, objid_snmptrap_len,
                    147:                             ASN_OBJECT_ID,
                    148:                             (u_char *) notification_oid,
                    149:                             notification_oid_len * sizeof(oid));
                    150: 
                    151:   /* Provided bindings */
                    152:   for (i = 0; i < trapobjlen; i++)
                    153:     {
                    154:       unsigned int j;
                    155:       oid oid[MAX_OID_LEN];
                    156:       size_t oid_len, onamelen;
                    157:       u_char *val;
                    158:       size_t val_len;
                    159:       WriteMethod *wm = NULL;
                    160:       struct variable cvp;
                    161: 
                    162:       /* Make OID. */
                    163:       if (trapobj[i].namelen > 0)
                    164:         {
                    165:          /* Columnar object */
                    166:          onamelen = trapobj[i].namelen;
                    167:          oid_copy (oid, name, namelen);
                    168:          oid_copy (oid + namelen, trapobj[i].name, onamelen);
                    169:          oid_copy (oid + namelen + onamelen, iname, inamelen);
                    170:          oid_len = namelen + onamelen + inamelen;
                    171:         }
                    172:       else
                    173:         {
                    174:          /* Scalar object */
                    175:          onamelen = trapobj[i].namelen * (-1);
                    176:          oid_copy (oid, name, namelen);
                    177:          oid_copy (oid + namelen, trapobj[i].name, onamelen);
                    178:          oid[onamelen + namelen] = 0;
                    179:          oid_len = namelen + onamelen + 1;
                    180:         }
                    181: 
                    182:       /* Locate the appropriate function and type in the MIB registry. */
                    183:       for (j = 0; j < vp_len; j++)
                    184:        {
                    185:          if (oid_compare (trapobj[i].name, onamelen, vp[j].name, vp[j].namelen) != 0)
                    186:            continue;
                    187:          /* We found the appropriate variable in the MIB registry. */
                    188:          oid_copy(cvp.name, name, namelen);
                    189:          oid_copy(cvp.name + namelen, vp[j].name, vp[j].namelen);
                    190:          cvp.namelen = namelen + vp[j].namelen;
                    191:          cvp.type = vp[j].type;
                    192:          cvp.magic = vp[j].magic;
                    193:          cvp.acl = vp[j].acl;
                    194:          cvp.findVar = vp[j].findVar;
                    195:          /* Grab the result. */
                    196:          val = cvp.findVar (&cvp, oid, &oid_len, 1, &val_len, &wm);
                    197:          if (!val) break;
                    198:          snmp_varlist_add_variable (&notification_vars,
                    199:                                     oid, oid_len,
                    200:                                     vp[j].type,
                    201:                                     val,
                    202:                                     val_len);
                    203:          break;
                    204:        }
                    205:     }
                    206: 
                    207: 
                    208:   send_v2trap (notification_vars);
                    209:   snmp_free_varbind (notification_vars);
                    210:   return 1;
                    211: }
                    212: 
                    213: #endif /* HAVE_SNMP */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>