/* SNMP support * Copyright (C) 2012 Vincent Bernat * * 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 #if defined HAVE_SNMP && defined SNMP_AGENTX #include #include #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, unsigned int tick, u_char sptrap) { return 1; } #endif /* HAVE_SNMP */