blob: 2358581f8962c3b05692e838bd53469585396baf [file] [log] [blame]
/* SNMP support
* Copyright (C) 2012 Vincent Bernat <bernat@luffy.cx>
*
* This file is part of GNU Zebra.
*
* GNU Zebra is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* GNU Zebra is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Zebra; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <zebra.h>
#if defined HAVE_SNMP && defined SNMP_AGENTX
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include "command.h"
#include "smux.h"
int agentx_enabled = 0;
/* AgentX node. */
static struct cmd_node agentx_node =
{
SMUX_NODE,
"" /* AgentX has no interface. */
};
/* Logging NetSNMP messages */
static int
agentx_log_callback(int major, int minor,
void *serverarg, void *clientarg)
{
struct snmp_log_message *slm = (struct snmp_log_message *)serverarg;
char *msg = strdup (slm->msg);
if (msg) msg[strlen(msg)-1] = '\0';
switch (slm->priority)
{
case LOG_EMERG: zlog_err ("snmp[emerg]: %s", msg?msg:slm->msg); break;
case LOG_ALERT: zlog_err ("snmp[alert]: %s", msg?msg:slm->msg); break;
case LOG_CRIT: zlog_err ("snmp[crit]: %s", msg?msg:slm->msg); break;
case LOG_ERR: zlog_err ("snmp[err]: %s", msg?msg:slm->msg); break;
case LOG_WARNING: zlog_warn ("snmp[warning]: %s", msg?msg:slm->msg); break;
case LOG_NOTICE: zlog_notice("snmp[notice]: %s", msg?msg:slm->msg); break;
case LOG_INFO: zlog_info ("snmp[info]: %s", msg?msg:slm->msg); break;
case LOG_DEBUG: zlog_debug ("snmp[debug]: %s", msg?msg:slm->msg); break;
}
free(msg);
return SNMP_ERR_NOERROR;
}
static int
config_write_agentx (struct vty *vty)
{
if (agentx_enabled)
vty_out (vty, "agentx%s", VTY_NEWLINE);
return 0;
}
DEFUN (agentx_enable,
agentx_enable_cmd,
"agentx",
"SNMP AgentX protocol settings\n"
"SNMP AgentX settings\n")
{
if (!agentx_enabled)
{
init_snmp("quagga");
agentx_enabled = 1;
return CMD_SUCCESS;
}
vty_out (vty, "SNMP AgentX already enabled%s", VTY_NEWLINE);
return CMD_WARNING;
}
DEFUN (no_agentx,
no_agentx_cmd,
"no agentx",
NO_STR
"SNMP AgentX protocol settings\n"
"SNMP AgentX settings\n")
{
if (!agentx_enabled) return CMD_SUCCESS;
vty_out (vty, "SNMP AgentX support cannot be disabled once enabled%s", VTY_NEWLINE);
return CMD_WARNING;
}
void
smux_init (struct thread_master *tm)
{
netsnmp_enable_subagent ();
snmp_disable_log ();
snmp_enable_calllog ();
snmp_register_callback (SNMP_CALLBACK_LIBRARY,
SNMP_CALLBACK_LOGGING,
agentx_log_callback,
NULL);
init_agent ("quagga");
install_node (&agentx_node, config_write_agentx);
install_element (CONFIG_NODE, &agentx_enable_cmd);
install_element (CONFIG_NODE, &no_agentx_cmd);
}
void
smux_register_mib (const char *descr, struct variable *var,
size_t width, int num,
oid name[], size_t namelen)
{
register_mib (descr, var, width, num, name, namelen);
}
int
smux_trap (const oid *name, size_t namelen,
const oid *iname, size_t inamelen,
const struct trap_object *trapobj, size_t trapobjlen,
u_char sptrap)
{
return 1;
}
#endif /* HAVE_SNMP */