我根据文档尝试了各种各样的东西,但我无法弄清楚如何在动态表中设置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'
有什么想法吗?
答案 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'是索引多级列元素。