File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / agentx.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jul 21 23:54:39 2013 UTC (10 years, 11 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, v0_99_22p0, v0_99_22, HEAD
0.99.22

    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>