首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

求教一段python代码的解释! 多谢

2012-09-02 
求教一段python代码的解释! 谢谢这是一段 使用snmp用python访问一台设备上的磁盘信息。中间小弟有很多不懂

求教一段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

[解决办法]
都没有缩进,哎

热点排行