Trees | Indices | Help |
|
---|
|
1 ########################################################################### 2 # 3 # This program is part of Zenoss Core, an open source monitoring platform. 4 # Copyright (C) 2007, Zenoss Inc. 5 # 6 # This program is free software; you can redistribute it and/or modify it 7 # under the terms of the GNU General Public License version 2 as published by 8 # the Free Software Foundation. 9 # 10 # For complete information please visit: http://www.zenoss.com/oss/ 11 # 12 ########################################################################### 13 14 import sys 15 import logging 16 log = logging.getLogger("zen.SnmpClient") 17 18 from twisted.internet import reactor, error, defer 19 from twisted.python import failure 20 from twisted.internet.error import TimeoutError 21 22 from pynetsnmp.twistedsnmp import snmpprotocol 23 24 import Globals 25 26 from Products.ZenUtils.Driver import drive 27 28 global defaultTries, defaultTimeout 29 defaultTries = 2 30 defaultTimeout = 1 31 defaultSnmpCommunity = 'public' 32 33 DEFAULT_MAX_OIDS_BACK = 40 34 35 from BaseClient import BaseClient 3638164 165 16639 - def __init__(self, hostname, ipaddr, options=None, device=None, 40 datacollector=None, plugins=[]):41 BaseClient.__init__(self, device, datacollector) 42 global defaultTries, defaultTimeout 43 self.hostname = hostname 44 self.device = device 45 self.options = options 46 self.datacollector = datacollector 47 self.plugins = plugins 48 49 self._getdata = {} 50 self._tabledata = {} 51 52 from Products.ZenHub.services.PerformanceConfig import SnmpConnInfo 53 self.connInfo = SnmpConnInfo(device) 54 srcport = snmpprotocol.port() 55 self.proxy = self.connInfo.createSession(srcport.protocol)56 5759 """Start snmp collection. 60 """ 61 log.debug("Starting %s", self.connInfo.summary()) 62 self.proxy.open() 63 drive(self.doRun).addBoth(self.clientFinished)64 65 66 # FIXME: cleanup --force option #266068 """Check to see if a cisco box has changed. 69 """ 70 device = self.device 71 yield self.proxy.get(['.1.3.6.1.4.1.9.9.43.1.1.1.0']) 72 lastpolluptime = device.getLastPollSnmpUpTime() 73 log.debug("lastpolluptime = %s", lastpolluptime) 74 result = True 75 try: 76 lastchange = driver.next().values()[0] 77 log.debug("lastchange = %s", lastchange) 78 if lastchange <= lastpolluptime: 79 log.info("skipping cisco device %s no change detected", 80 device.id) 81 result = False 82 else: 83 device.setLastPollSnmpUpTime(lastchange) 84 except Exception: 85 pass 86 yield defer.succeed(result)87 8890 # test snmp connectivity 91 log.debug("Testing SNMP configuration") 92 yield self.proxy.walk('.1.3') 93 try: 94 driver.next() 95 except TimeoutError, ex: 96 log.info("Device timed out: " + self.connInfo.summary()) 97 return 98 except Exception, ex: 99 log.exception("Unable to talk: " + self.connInfo.summary()) 100 return 101 102 changed = True 103 # FIXME: cleanup --force option #2660 104 if not self.options.force and self.device.snmpOid.startswith(".1.3.6.1.4.1.9"): 105 yield drive(self.checkCiscoChange) 106 changed = driver.next() 107 if changed: 108 yield drive(self.collect)109 110112 for plugin in self.plugins: 113 try: 114 log.debug('running %s', plugin) 115 pname = plugin.name() 116 self._tabledata[pname] = {} 117 log.debug("sending queries for plugin %s", pname) 118 if plugin.snmpGetMap: 119 yield self.proxy.get(plugin.snmpGetMap.getoids()) 120 self._getdata[pname] = driver.next() 121 for tmap in plugin.snmpGetTableMaps: 122 rowSize = len(tmap.getoids()) 123 maxRepetitions = max(DEFAULT_MAX_OIDS_BACK / rowSize, 1) 124 yield self.proxy.getTable(tmap.getoids(), 125 maxRepetitions=maxRepetitions, 126 limit=sys.maxint) 127 self._tabledata[pname][tmap] = driver.next() 128 except Exception, ex: 129 if not isinstance( ex, error.TimeoutError ): 130 log.exception("device %s plugin %s unexpected error", 131 self.hostname, pname)132 133135 """Return data for this client in the form 136 ((plugin, (getdata, tabledata),) 137 getdata = {'.1.2.4.5':"value",} 138 tabledata = {tableMap : {'.1.2.3.4' : {'.1.2.3.4.1': "value",...}}} 139 """ 140 data = [] 141 for plugin in self.plugins: 142 pname = plugin.name() 143 getdata = self._getdata.get(pname,{}) 144 tabledata = self._tabledata.get(pname,{}) 145 if getdata or tabledata: 146 data.append((plugin, (getdata, tabledata))) 147 return data148150 log.info("snmp client finished collection for %s" % self.hostname) 151 if isinstance(result, failure.Failure): 152 from twisted.internet import error 153 if isinstance(result.value, error.TimeoutError): 154 log.warning("Device %s timed out: are " 155 "your SNMP settings correct?", self.hostname) 156 else: 157 log.error("Device %s had an error: %s", self.hostname, result) 158 self.proxy.close() 159 """tell the datacollector that we are all done""" 160 if self.datacollector: 161 self.datacollector.clientFinished(self) 162 else: 163 reactor.stop()168 "build options list that both telnet and ssh use" 169 170 if not usage: 171 usage = "%prog [options] hostname[:port] oids" 172 173 if not parser: 174 from optparse import OptionParser 175 parser = OptionParser(usage=usage) 176 177 parser.add_option('--snmpCommunity', 178 dest='snmpCommunity', 179 default=defaultSnmpCommunity, 180 help='Snmp Community string')181 182 183 if __name__ == "__main__": 184 import pprint 185 logging.basicConfig() 186 log = logging.getLogger() 187 log.setLevel(20) 188 import sys 189 sys.path.append("plugins") 190 from plugins.zenoss.snmp.InterfaceMap import InterfaceMap 191 ifmap = InterfaceMap() 192 sc = SnmpClient("gate.confmon.loc", community="zentinel", plugins=[ifmap,]) 193 reactor.run() 194 pprint.pprint(sc.getResults()) 195
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0beta1 on Mon Oct 19 14:44:17 2009 | http://epydoc.sourceforge.net |