2

SNMP / pysnmpを初めて使用し、カスタムMIBを使用するエージェントを実装しようとしています。pysnmpサイトで次の例を見ていますが、動作させることができないようです。これが私が取っているステップです:

  1. build-pysnmp-mibを使用してMIBファイルをpysnmpモジュールに変換します(これはエラーなしで成功します)
  2. MIBソースを設定し、MibBuilder()を使用してMIBモジュールをロードします
  3. 上記の例を使用してエージェントを設定します(追加したのはmibBuilderのみです)
  4. net-snmpのsnmpwalkを使用して、ロードされたMIBを表示します。

snmpwalkコマンドは次のとおりです。

snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -E 8000000001020304 -n my-context 127.0.0.1 .1.3.6

snmpwalkはタイムアウトエラーを返し、通信を分析すると(pysnmpでI / Oデバッグを有効にすることにより)、エージェントが要求を受信したが、応答しなかったことがわかります。これは文脈と関係があるのではないかと思いますが、現時点では正しく理解していない可能性があります。私が間違ったことをしている可能性のある場所についてのポインタは大歓迎です。テストには次のサンプルMIBを使用しています。以下のコード。ありがとう。

#!/usr/local/bin/python

from pysnmp.smi import builder
from pysnmp.smi import view

from pysnmp.entity import engine
from pysnmp.entity import config
from pysnmp.entity.rfc3413 import cmdrsp
from pysnmp.entity.rfc3413 import context
from pysnmp.smi import instrum
from pysnmp.carrier.asynsock.dgram import udp
from pysnmp.proto.api import v2c

from pysnmp import debug

# Create SNMP engine
snmpEngine = engine.SnmpEngine()

# Transport setup

# UDP over IPv4
config.addSocketTransport(
    snmpEngine,
    udp.domainName,
    udp.UdpTransport().openServerMode(('127.0.0.1', 161))
)

# SNMPv3/USM setup

# user: usr-md5-none, auth: MD5, priv NONE
config.addV3User(
    snmpEngine, 'usr-md5-none',
    config.usmHMACMD5AuthProtocol, 'authkey1'
)

# Allow full MIB access for each user at VACM
config.addVacmUser(snmpEngine, 3, 'usr-md5-none', 'authNoPriv',
                   (1,3,6,1,2,1), (1,3,6,1,2,1)) 

# Create an SNMP context with ContextEngineId = 8000000001020304
snmpContext = context.SnmpContext(
    snmpEngine, contextEngineId=v2c.OctetString(hexValue='8000000001020304')
)

# load mibs
MIBDIR = '/usr/local/share//mibdata'
mibBuilder = builder.MibBuilder()
mibSources = mibBuilder.getMibSources() + (builder.DirMibSource(MIBDIR),)
mibBuilder.setMibSources(*mibSources)
mibBuilder.loadModules('TOASTER-MIB')

# pass mib to Management Instrumentation Controller and register at SNMP Context
# under ContextName 'my-context'
snmpContext.registerContextName(
    v2c.OctetString('my-context'),            # Context Name
    instrum.MibInstrumController(mibBuilder)  # Managed Objects - loading my custom TOASTER-MIB
)

# Register SNMP Applications at the SNMP engine for particular SNMP context
cmdrsp.GetCommandResponder(snmpEngine, snmpContext)
cmdrsp.SetCommandResponder(snmpEngine, snmpContext)
cmdrsp.NextCommandResponder(snmpEngine, snmpContext)
cmdrsp.BulkCommandResponder(snmpEngine, snmpContext)

# Register an imaginary never-ending job to keep I/O dispatcher running forever
snmpEngine.transportDispatcher.jobStarted(1)

# Run I/O dispatcher which would receive queries and send responses
try:
    snmpEngine.transportDispatcher.runDispatcher()
except:
    snmpEngine.transportDispatcher.closeDispatcher()
    raise
4

1 に答える 1

2

デフォルト以外のContextEngineIdとContextNameを本当に使用する必要がありますか?そうでない場合は、代わりにこの例を使用することをお勧めします。カスタムMIBをデフォルトのSnmpEngineのMIBツリー(mibBuilder)にロードできます。これは、次の呼び出しを通じて利用できます。

snmpContext = context.SnmpContext(snmpEngine)
mibBuilder = snmpContext.getMibInstrum().getMibBuilder()

また、関数を使用してManagerがOIDにアクセスできるようにしてくださいconfig.addVacmUser()

認識すべきもう1つの重要な点は、初期状態でコンパイルされたpysnmp MIBには、MIB変数のインスタンスが含まれておらず、エージェントの内容に関するヒントをマネージャーに提供するだけであるということです。したがって、エージェントを稼働させるには、別の例で説明されているように、管理対象オブジェクトのインスタンスをMIBに追加する必要があります。

于 2013-01-31T20:58:26.060 に答える