求教一段python代码的解释! 谢谢
这是一段 使用snmp用python访问一台设备上的磁盘信息。中间小弟有很多不懂之处,希望熟悉的大哥大姐们添加上注释!尤其是加粗的那两个方法 争取每行都来句注释!(genCbRecvFun,getcbTimerFum)
def sendRequest(pMod, reqMsg, host='127.0.0.1' , taskId = 1):
transportDispatcher = AsynsockDispatcher()
transportDispatcher.registerTransport(
udp.domainName, udp.UdpSocketTransport().openClientMode()
)
transportDispatcher.registerRecvCbFun(genCbRecvFun(pMod, taskId))
transportDispatcher.registerTimerCbFun(getcbTimerFum(transportDispatcher, taskId))
transportDispatcher.sendMessage(
encoder.encode(reqMsg), udp.domainName, (host, 161)
)
print "开始扫描====>%s" % host
transportDispatcher.jobStarted(taskId)
transportDispatcher.runDispatcher()
transportDispatcher.closeDispatcher()
print "结束扫描====>%s" % host
def getcbTimerFum(transportDispatcher,taskId):
def cbTimerFun(timeNow, startedAt=time()):
if timeNow - startedAt > 3:
while transportDispatcher.jobsArePending():
transportDispatcher.jobFinished(taskId)
return cbTimerFun
def genCbRecvFun(pMod, taskId):
def cbRecvFun(transportDispatcher, transportDomain, transportAddress, wholeMsg, reqPDU=reqPDU, headVars=headVars):
global _OID_StorageName
global storageAllBlock
while wholeMsg:
rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec=pMod.Message())
rspPDU = pMod.apiMessage.getPDU(rspMsg)
# Match response to request
if pMod.apiPDU.getRequestID(reqPDU)==pMod.apiPDU.getRequestID(rspPDU):
# Check for SNMP errors reported
errorStatus = pMod.apiPDU.getErrorStatus(rspPDU)
if errorStatus and errorStatus != 2:
raise Exception(errorStatus)
# Format var-binds table
varBindTable = pMod.apiPDU.getVarBindTable(reqPDU, rspPDU)
#===================代码扩展start=======================
#下面是将varBindTable[0]解析成为对应的key,val值,这里的遍历顺序和你setVindbar的OID采集顺序(变量列表顺序)是一致的。
#格式: storageAllBlock["ip:storageName"] = [storageName,storageTotal,storageUsed,storageFree,storagePrcenent]
tempStorageMapKeyStr = ""
tempStorageEvt = []
print varBindTable
for name, val in varBindTable[0]:
tempOID = name.prettyPrint()
if _OID_StorageName in tempOID:
tempStorageMapKeyStr = transportAddress[0]+":"+val.prettyPrint()
tempStorageEvt.append(val.prettyPrint())
print "%s<===>%s" % (tempStorageMapKeyStr,tempStorageEvt)
if tempStorageMapKeyStr != "":
storageAllBlock[tempStorageMapKeyStr] = tempStorageEvt
else:
transportDispatcher.jobFinished(taskId)
# Stop on EOM
for oid, val in varBindTable[-1]:
if val is not None:
break
else:
transportDispatcher.jobFinished(1)
#===================代码扩展end=======================
# Generate request for next row
pMod.apiPDU.setVarBinds(
reqPDU, [ (x, pMod.Null()) for x,y in varBindTable[-1] ]
)
pMod.apiPDU.setRequestID(reqPDU, pMod.getNextRequestID())
transportDispatcher.sendMessage(
encoder.encode(reqMsg), transportDomain, transportAddress
)
return wholeMsg
return cbRecvFun
[解决办法]
都没有缩进,哎