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 回答