0

ドキュメントに従ってさまざまなことを試しましたが、MIB を動的テーブルに設定する方法がわかりません。スカラー値を設定して正常に動作するコードがあります。createAndGo(4)RowStatusの値を に設定してから に設定する必要があることはわかっていますactive(1)。これが私が試したものとMIB定義です:

    abcTable = MibTable((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4))
    abcEntry = MibTableRow((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1)).setIndexNames((0, "abc-mib", "abcEntryNum"))
    abcRowStatus = MibTableColumn((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1, 1),        RowStatus()).setMaxAccess("readcreate")
    abcEntryNum = MibTableColumn((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1, 2), Integer32().subtype(subtypeSpec=constraint.ValueRangeConstraint(1, 10))).setMaxAccess("noaccess")
    abcName = MibTableColumn((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1, 3), DisplayString().subtype(subtypeSpec=constraint.ValueSizeConstraint(0, 30))).setMaxAccess("readcreate")
    abcType = MibTableColumn((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1, 4), Integer().subtype(subtypeSpec=constraint.SingleValueConstraint(0,2,3,1,)).subtype(namedValues=namedval.NamedValues(("aa", 0), ("ab", 1), ("cb", 2), ("ca", 3), )).clone(0)).setMaxAccess("readcreate")
    abcLocation = MibTableColumn((1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1, 5), Integer32().subtype(subtypeSpec=constraint.ValueRangeConstraint(-1800, 1800))).setMaxAccess("readcreate")

    def getvar(self, symbol):
        """Used to get the dot notation string from the symbol in the MIB"""
        varObj, = self.mibBuilder.importSymbols('abc-mib', symbol)
        return varObj.getName()

    # Create the first Row
    errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().setCmd( \
        self.authData,
        cmdgen.UdpTransportTarget((host_addr, 161)),
        (getvar('abcRowStatus') + (1,), 4)  )

次のエラーが表示されます。

メッセージ ファイル名 行位置 トレースバック
set_single abc.py
setCmd build\bdist.win32\egg\pysnmp\entity\rfc3413\oneliner\cmdgen.py 374
setCmd build\bdist.win32\egg\pysnmp\entity\rfc3413\oneliner\cmdgen. py 240
AttributeError: MibIdentifier インスタンスに属性「getSyntax」がありません

何か案は?

4

2 に答える 2

1

OID "abcRowStatus" + 1 で識別される MIB オブジェクトを参照しているようです。

(1, 3, 6, 1, 4, 1, 6367, 3, 21, 4, 1, 1,  1)

そのオブジェクトは実際に MIB で定義されていますか?

値の SNMP タイプを指定しない (Python 整数を渡す) ため、setCmd() が適切な要求メッセージを作成するには、純粋な Python タイプ (コード内の整数) を SNMP タイプにキャストする必要があります。SNMP タイプを把握するために、「abcRowStatus」という名前の MIB オブジェクトを検索し、その OID を取得して、要求に応じて「1」サブ OID を追加します。次に、その OID で MIB オブジェクトを検索し、見つかった場合はそれに関連付けられた SNMP タイプを取得してさらにキャストします。

したがって、コードは次のようになるはずです。

cmdgen.CommandGenerator().setCmd(
    self.authData,
    cmdgen.UdpTransportTarget((host_addr, 161)),
    (getvar('abcRowStatus'), 4)
)
于 2012-11-07T21:01:44.313 に答える
0

タイプが問題であるという点で@poohは正しいようです。getvar 関数をそのまま使用しましたが、正しい型 (rfc1902.Integer(4)) を追加しただけで機能します。MibVariable('abc-mib, 'abcRowStatus', 1).addMibSource(/path) も使用できると思いますが、これは試していません。テーブルのインデックスは少しわかりにくいので、テーブルにインデックスを付ける getvar + (1,) を使い続けました。他の例を見ると、マルチレベル テーブルで MibVariable を使用する方法は MibVariable('abc-mib, 'abcRowStatus', '1.2.3') であり、'1.2.3' はインデックスです。マルチレベルの列要素。

于 2012-11-12T18:58:53.613 に答える