繁体   English   中英

python net-snmp加载mibs

[英]python net-snmp loading mibs

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

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

我知道我可以使用-m-M与NET-SNMP命令行工具选项,并有对预编译的net-snmp套件的文档( ./configuremake等)与所有的MIB(和我也假设进入图书馆); 如果 Python 库不提供加载 mib 的能力,我至少可以配置 net-snmp 以提供对 mib 的 python 库访问而无需重新编译吗?

如果正确配置 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 绑定。 它还在/usr/share/mibs/netsnmp/安装了一些默认 MIB(仅用于net-snmp )。 如果您想获取一堆其他 IETF/IANA MIB,请执行以下操作:

sudo apt-get install snmp-mibs-downloader

如您所料,这会将大量其他标准 MIB(包括 IF-MIB 等)下载到/var/lib/mibs/iana/var/lib/mibs/ietf以及/usr/share/mibs/iana/usr/share/mibs/ietf 如果您想再次下载 MIB, snmp-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 的情况下。 我犯了一个错误,我只是通过在iana目录中获取一个 MIB 文件并将其移动到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输出,但如果您愿意,您可以通过snmp.conf配置指令再次配置您的环境以将STDERR转储到日志文件。

希望这可以帮助。

毕竟我找到了答案。 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.

这里的关键部分是您可以像使用-m命令行选项一样使用MIBS环境变量……并且在库级别实现了对此的支持。 这意味着如果在启动 Python 之前定义MIBS环境变量,它将影响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',)
>>> 

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

您(显然)也可以在 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',)
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM