4

私はnet-snmpのpythonライブラリを使用して、さまざまなスイッチで長いクエリを実行しています。新しいMIBをロードできるようにしたいのですが、これを行う方法に関するドキュメントが見つかりません。

PySNMPはかなり複雑に見えるため、mibごとにPythonオブジェクトを作成する必要があります(これは私にはスケーリングしません)。だから私はnet-snmpのライブラリで立ち往生しています(mibをロードすることを除いて悪くはありません)。

私はnet-snmpコマンドラインツールで-mandオプションを使用できることを知っています。また、net-snmpスイート(など)をすべてのmib-Mでプリコンパイルすることに関するドキュメントがあります(ライブラリにも想定しています)。PythonライブラリがMIBをロードする機能を提供していない場合、少なくとも、再コンパイルせずにPythonライブラリがMIBにアクセスできるようにnet-snmpを構成できますか?./configuremake

4

2 に答える 2

3

net-snmpを適切に構成すれば、技術的には環境変数を初期化またはエクスポートする必要はありません。

(私はUbuntu 12.04.1 LTSを使用しているのでnet-snmp、ソースからコンパイルする必要はありませんでした。完全を期すために行ったことのすべてをカバーしますが、これは実際には、設定する場合にのみ適用されます。いくつかのMIBをアップしてnet-snmp、PythonバインディングまたはそのPythonバインディングによって自動的にスラップインされます。)

最初にやったsudo apt-get install libsnmp-base libsnmp-python libsnmp15 snmp

これにより、net-snmpとそのライブラリ、およびPythonバインディングがインストールされます。また、にいくつかのデフォルトMIB(forのみ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およびにダウンロード/usr/share/mibs/ianaします/usr/share/mibs/ietfsnmp-mibs-downloaderパッケージには、MIBを再度ダウンロードする場合のコマンド/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. これらのディレクトリに300以上のMIBをすべてロードするように指示net-snmpすると、SNMPクエリの速度が低下する可能性がありSTDERR、一部のMIBが古くなっている、間違っている、または存在しない、またはパッケージによってダウンロードされなかったMIBから定義をインポートしようとしています。オプションは次のとおりです。snmpconfこれらのエラーをどのように処理するかを指定するか、不足しているものや古くなっているものを見つけて、MIBを自分でダウンロードします。後者を選択すると、MIBのうさぎの穴を掘り下げることに気付くかもしれないので、それを覚えておいてください。個人的には、それらすべてをロードしてから、特定のデバイスのポーリングに意味のある特定のMIBのみをロードするように逆方向に作業することをお勧めします。
  3. snmp.conf特に一部のMIBが他のMIBを参照または依存している場合は、検索パスで指定するディレクトリの順序が重要です。ディレクトリ内のMIBファイルを取得してianaディレクトリに移動するだけで、1つのエラーが発生しましたietf。どのMIBが他のMIBに依存しているかをプログラムで把握し、それらを1つのディレクトリにうまく共存させる方法があると確信していますが、これを把握するために多くの時間を無駄にしたくありませんでした。

話の教訓は、適切な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にダンプするように環境を構成できます。STDERRsnmp.conf

お役に立てれば。

于 2012-12-21T16:23:18.213 に答える
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です...これに対するサポートはライブラリレベルで実装されています。これは、MIBSPythonを起動する前に環境変数を定義すると、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 に答える