4

我正在使用 net-snmp 的 python 库对各种开关进行一些长查询。我希望能够加载新的 mib——但我找不到任何有关如何执行此操作的文档。

PySNMP 似乎相当复杂,需要我为每个 mib 创建 Python 对象(这对我来说无法扩展);所以我坚持使用 net-snmp 的库(除了加载 mib 之外,这些库还不错)。

我知道我可以将-mand-M选项与 net-snmp 命令行工具一起使用,并且有关于使用所有 mib 预编译 net-snmp 套件(等)的文档./configuremake我也假设到库中);如果 Python 库不提供加载 mib 的能力,我是否可以至少配置 net-snmp 以提供我的 python 库访问 mib 而无需重新编译?

4

2 回答 2

3

毕竟我找到了答案。从snmpcmd(1)手册页:

   -m MIBLIST
          Specifies a colon separated  list  of  MIB  modules  (not
          files)  to load for this application.  This overrides (or
          augments) the environment variable  MIBS,  the  snmp.conf
          directive  mibs,  and the list of MIBs hardcoded into the
          Net-SNMP library.

这里的关键部分是您可以MIBS像使用命令行选项一样使用环境变量-m......并且对此的支持是在库级别实现的。这意味着如果您MIBS在启动 Python 之前定义环境变量,它将影响netsnmp库的行为:

$ python 
Python 2.7.2 (default, Oct 27 2011, 01:40:22) 
[GCC 4.6.1 20111003 (Red Hat 4.6.1-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import netsnmp
>>> os.environ['MIBS'] = 'UPS-MIB:SNMPv2-SMI'
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>> 

请注意,您必须os.environ['MIBS'] 调用任何netsnmp模块函数之前进行设置(因为这将加载库并且在此之后的任何环境更改都不会影响)。

您(显然)还可以在 Python 之外设置环境变量:

$ export MIBS='UPS-MIB:SNMPv2-SMI'
$ python
>>> import netsnmp
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>> 
于 2012-02-28T16:18:41.803 回答
3

如果正确配置 net-snmp,从技术上讲,您不必初始化或导出任何环境变量。

(注意我在 Ubuntu 12.04.1 LTS 上,所以我真的不必net-snmp从源代码编译,即使我将涵盖我为完整性所做的全部工作,但这应该只适用于你想设置将一些 MIB 自动添加到net-snmp其 Python 绑定中。)

首先我做了sudo apt-get install libsnmp-base libsnmp-python libsnmp15 snmp

这将安装 net-snmp 及其库以及 Python 绑定。它还net-snmp/usr/share/mibs/netsnmp/. 如果您想获取一堆其他 IETF/IANA MIB,请执行以下操作:

sudo apt-get install snmp-mibs-downloader

正如您所期望的那样,它会将大量其他标准 MIB(包括 IF-MIB 等)下载到/var/lib/mibs/iana,/var/lib/mibs/ietf和. 如果您想再次下载 MIB,该软件包还会为您提供命令。/usr/share/mibs/iana/usr/share/mibs/ietfsnmp-mibs-downloader/usr/bin/download-mibs

接下来,使用snmpconf命令设置您的 net-snmp 环境:

$ snmpconf -h
/usr/bin/snmpconf [options] [FILETOCREATE...]
options:
  -f           overwrite existing files without prompting
  -i           install created files into /usr/share/snmp.
  -p           install created files into /home/$USER/.snmp.
  -I DIR       install created files into DIR.
  -a           Don't ask any questions, just read in current
               current .conf files and comment them
  -r all|none  Read in all or none of the .conf files found.
  -R file,...  Read in a particular list of .conf files.
  -g GROUP     Ask a series of GROUPed questions.
  -G           List known GROUPs.
  -c conf_dir  use alternate configuration directory.
  -q           run more quietly with less advice.
  -d           turn on debugging output.
  -D           turn on debugging dumper output.

我使用snmpconf -p并浏览了菜单项。该过程基本上会查找现有的 snmp.conf 文件(/etc/snmp/snmp.conf默认情况下)并将这些文件与新创建的配置文件合并,该配置文件将由选项/home/$USER/.snmp/snmp.conf指定-p。从那里开始,您实际上只需要告诉snmpconf在哪里查找 MIB,但是脚本提供了许多有用的选项,用于在snmp.conf.

完成后,您应该有一个主要的工作环境snmpconf。这是我的(非常简单的)的/home/$USER/.snmp/snmp.conf样子:

###########################################################################
#
# snmp.conf
#
#   - created by the snmpconf configuration program
#

###########################################################################
# SECTION: Textual mib parsing
#
#   This section controls the textual mib parser.  Textual
#   mibs are parsed in order to convert OIDs, enumerated
#   lists, and ... to and from textual representations
#   and numerical representations.

# mibdirs: Specifies directories to be searched for mibs.
#   Adding a '+' sign to the front of the argument appends the new
#   directory to the list of directories already being searched.
#   arguments: [+]directory[:directory...]

mibdirs : +/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp:/home/$USERNAME/.snmp/mibs/newmibs

# mibs: Specifies a list of mibs to be searched for and loaded.
#   Adding a '+' sign to the front of the argument appends the new
#   mib name to the list of mibs already being searched for.
#   arguments: [+]mibname[:mibname...]

mibs +ALL

一些陷阱:

  1. 加载此配置文件时net-snmp,它不会进行递归目录搜索,因此您必须提供 MIB 所在目录的绝对路径。
  2. 如果您选择告诉net-snmp在这些目录中加载所有 300 多个 MIB,它可能会减慢您的 SNMP 查询,并且STDERR由于某些 MIB 可能已过时、错误或尝试从不存在或未由包下载的 MIB 导入定义。您的选择是:告诉snmpconf您希望如何处理这些错误,或者找出丢失或过时的内容并自己下载 MIB。如果您选择后者,您可能会发现自己陷入了 MIB 兔子洞,所以请记住这一点。就个人而言,我建议您将它们全部加载,然后向后工作以仅加载对轮询特定设备有意义的给定 MIB。
  3. 您在搜索路径中指定的目录顺序snmp.conf很重要,尤其是在某些 MIB 引用或依赖于其他 MIB 时。我犯了一个错误,我只是通过在目录中获取一个 MIB 文件iana并将其移动到ietf目录中来解决。我确信有一种方法可以以编程方式找出哪些 MIB 依赖于其他 MIB,并使它们愉快地共存于一个目录中,但我不想浪费大量时间来解决这个问题。

这个故事的寓意是,如果你有一个适当的 snmp.conf,你应该能够做到这一点:

$ python
>>> import netsnmp
>>> oid = netsnmp.VarList(netsnmp.Varbind('dot1qTpFdbPort'))
>>> res = netsnmp.snmpwalk(oid, Version=2, DestHost='10.0.0.1', Community='pub')
>>> print res
('2', '1')
>>>

仅供参考,我省略了一堆输出,但如果您希望通过配置指令STDERR,您可以再次将环境配置为转储STDERR到日志文件。snmp.conf

希望这可以帮助。

于 2012-12-21T16:23:18.213 回答