python net-snmp加载mibs

时间:2011-10-27 23:16:23

标签: python net-snmp mib pysnmp

我正在使用net-snmp的python库在各种交换机上进行一些长查询。我希望能够加载新的mibs - 但我找不到任何关于如何执行此操作的文档。

PySNMP看起来相当复杂,需要我为每个mib创建Python对象(不能为我扩展);所以我坚持使用net-snmp的库(除了加载mib的东西之外还不错)。

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

2 个答案:

答案 0 :(得分: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环境变量...并且在库级别实现对此的支持。这意味着如果在启动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',)
>>> 

请注意,您必须在调用任何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',)
>>> 

答案 1 :(得分:2)

(First Post !!!)

如果正确配置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中安装了一些默认MIB(仅适用于/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以及/usr/share/mibs/iana和{{1 }}。如果您想再次下载MIB,/usr/share/mibs/ietf包还会为您提供snmp-mibs-downloader命令。

接下来,使用/usr/bin/download-mibs命令设置net-snmp环境:

snmpconf

我使用了$ 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. 并浏览了菜单项。该过程基本上查找现有的snmp.conf文件(默认情况下为snmpconf -p),并将其与新创建的配置文件合并,该文件将放入/etc/snmp/snmp.conf选项指定的/home/$USER/.snmp/snmp.conf中。从那时起,你真的只需要告诉-p在哪里寻找MIB,但是脚本提供了许多有用的选项,用于在snmpconf中生成配置指令。

完成snmp.conf后,您应该拥有一个充满活力的工作环境。这就是我的(非常简陋)snmpconf的样子:

/home/$USER/.snmp/snmp.conf

一些问题:

  1. ########################################################################### # # 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 加载此配置文件时,它不会执行递归目录搜索,因此您必须提供MIB所在目录的绝对路径。
  2. 如果您选择告诉net-snmp加载这些目录中的所有300多个MIB,可能会减慢您的SNMP查询速度,并且由于事实,必然会有一些事情被转储到net-snmp某些MIB要么过时,要么错误,要么尝试从不存在或未被包下载的MIB导入定义。您可以选择:告诉STDERR您希望如何处理这些错误,或找出丢失或过期的内容并自行下载MIB。如果你选择后者,你可能会发现自己正在使用MIB rabbithole,所以请记住这一点。我个人建议你加载它们,然后向后工作只加载给轮询特定设备有意义的给定MIB。
  3. 您在snmpconf中的搜索路径中指定的目录的顺序很重要,尤其是在某些MIB引用或依赖其他MIB的情况下。我做了一个错误,我只是通过在snmp.conf目录中取一个MIB文件并将其移动到iana目录而离开。我确信有一种方法可以通过编程方式找出哪些MIB依赖于其他MIB并让它们愉快地共存于一个目录中,但我不想浪费大量时间来解决这个问题。
  4. 故事的寓意是,如果你有一个合适的snmp.conf,你应该能够做到这一点:

    ietf

    仅供参考我省略了一堆$ 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转储到日志文件。

    希望这有帮助。