如何在pySNMP中使用setCmd作为表元素?

时间:2012-11-07 18:11:27

标签: python pysnmp

我根据文档尝试了各种各样的东西,但我无法弄清楚如何在动态表中设置MIB。我有代码设置标量值并且工作正常。我知道我必须在RowStatus上设置createAndGo(4)的值,然后将其设置为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'

有什么想法吗?

2 个答案:

答案 0 :(得分: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)
)

答案 1 :(得分: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'是索引多级列元素。