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 Globals 15 from Products.ZenEvents.ZenEventClasses import Status_Snmp 16 17 from Products.ZenHub.HubService import HubService 18 from Products.ZenHub.PBDaemon import translateError 19 20 from Products.ZenModel.Device import Device 21 from Acquisition import aq_parent 22 23 from twisted.internet import defer 24 25 from Procrastinator import Procrastinate 26 from ThresholdMixin import ThresholdMixin 27 28 ATTRIBUTES = ( 29 'id', 30 'manageIp', 31 'zMaxOIDPerRequest', 32 'zSnmpMonitorIgnore', 33 'zSnmpAuthPassword', 34 'zSnmpAuthType', 35 'zSnmpCommunity', 36 'zSnmpPort', 37 'zSnmpPrivPassword', 38 'zSnmpPrivType', 39 'zSnmpSecurityName', 40 'zSnmpTimeout', 41 'zSnmpTries', 42 'zSnmpVer', 43 ) 44 45 from twisted.spread import pb47 "A class to transfer the many SNMP values to clients" 48106 107 pb.setUnjellyableForClass(SnmpConnInfo, SnmpConnInfo)50 "Store the properties from the device" 51 for propertyName in ATTRIBUTES: 52 setattr(self, propertyName, getattr(device, propertyName, None)) 53 self.id = device.id5456 for propertyName in ATTRIBUTES: 57 c = cmp(getattr(self, propertyName), getattr(other, propertyName)) 58 if c != 0: 59 return c 60 return 06163 result = 'SNMP info for %s at %s:%s' % ( 64 self.id, self.manageIp, self.zSnmpPort) 65 result += ' timeout: %s tries: %d' % ( 66 self.zSnmpTimeout, self.zSnmpTries) 67 result += ' version: %s ' % (self.zSnmpVer) 68 if '3' not in self.zSnmpVer: 69 result += ' community: %s' % self.zSnmpCommunity 70 else: 71 result += ' securityName: %s' % self.zSnmpSecurityName 72 result += ' authType: %s' % self.zSnmpAuthType 73 result += ' privType: %s' % self.zSnmpPrivType 74 return result7577 "Create a session based on the properties" 78 from pynetsnmp.twistedsnmp import AgentProxy 79 cmdLineArgs=[] 80 if '3' in self.zSnmpVer: 81 if self.zSnmpPrivType: 82 cmdLineArgs += ['-l', 'authPriv'] 83 cmdLineArgs += ['-x', self.zSnmpPrivType] 84 cmdLineArgs += ['-X', self.zSnmpPrivPassword] 85 elif self.zSnmpAuthType: 86 cmdLineArgs += ['-l', 'authNoPriv'] 87 else: 88 cmdLineArgs += ['-l', 'noAuthNoPriv'] 89 if self.zSnmpAuthType: 90 cmdLineArgs += ['-a', self.zSnmpAuthType] 91 cmdLineArgs += ['-A', self.zSnmpAuthPassword] 92 cmdLineArgs += ['-u', self.zSnmpSecurityName] 93 p = AgentProxy(ip=self.manageIp, 94 port=self.zSnmpPort, 95 timeout=self.zSnmpTimeout, 96 snmpVersion=self.zSnmpVer, 97 community=self.zSnmpCommunity, 98 cmdLineArgs=cmdLineArgs, 99 protocol=protocol, 100 allowCache=allowCache) 101 p.snmpConnInfo = self 102 return p103105 return '<%s for %s>' % (self.__class__, self.id)111245113 HubService.__init__(self, dmd, instance) 114 self.config = self.dmd.Monitors.Performance._getOb(self.instance) 115 self.procrastinator = Procrastinate(self.pushConfig) 116 self._collectorMap = {}117 118 119 @translateError121 return self.config.propertyItems()122 123 124 @translateError126 "Return the failure counts for Snmp" 127 counts = {} 128 try: 129 # get all the events with /Status/Snmp 130 conn = self.zem.connect() 131 try: 132 curs = conn.cursor() 133 cmd = ('SELECT device, sum(count) ' + 134 ' FROM status ' + 135 ' WHERE eventClass = "%s"' % Status_Snmp) 136 if devname: 137 cmd += ' AND device = "%s"' % devname 138 cmd += ' GROUP BY device' 139 curs.execute(cmd); 140 counts = dict([(d, int(c)) for d, c in curs.fetchall()]) 141 finally: 142 self.zem.close(conn) 143 except Exception, ex: 144 self.log.exception('Unable to get Snmp Status') 145 raise 146 if devname: 147 return [(devname, counts.get(devname, 0))] 148 return [(dev.id, counts.get(dev.id, 0)) for dev in self.config.devices()]149 150 153 154 157 158160 deferreds = [] 161 cfg = None 162 163 cur_collector = device.perfServer.getRelatedId() 164 prev_collector = self._collectorMap.get(device.id, None) 165 self._collectorMap[device.id] = cur_collector 166 167 # Always push config to currently assigned collector. 168 if cur_collector == self.instance: 169 cfg = self.getDeviceConfig(device) 170 171 # Push a deleteDevice call if the device was previously assigned to 172 # this collector. 173 elif prev_collector in (None, self.instance): 174 cfg = None 175 176 # Don't do anything if this collector is not, and has not been involved 177 # with the device 178 else: 179 return defer.DeferredList(deferreds) 180 181 for listener in self.listeners: 182 if cfg is None: 183 deferreds.append(listener.callRemote('deleteDevice', device.id)) 184 else: 185 deferreds.append(self.sendDeviceConfig(listener, cfg)) 186 return defer.DeferredList(deferreds)187 188 192 193 197 198200 if not self.listeners: 201 return 202 203 # the PerformanceConf changed 204 from Products.ZenModel.PerformanceConf import PerformanceConf 205 if isinstance(object, PerformanceConf) and object.id == self.instance: 206 for listener in self.listeners: 207 listener.callRemote('setPropertyItems', object.propertyItems()) 208 209 # a ZenPack is installed 210 from Products.ZenModel.ZenPack import ZenPack 211 if isinstance(object, ZenPack): 212 for listener in self.listeners: 213 try: 214 listener.callRemote('updateThresholdClasses', 215 self.remote_getThresholdClasses()) 216 except Exception, ex: 217 self.log.warning("Error notifying a listener of new classes") 218 219 # device has been changed: 220 if isinstance(object, Device): 221 self.notifyAll(object) 222 return 223 224 # somethinge else... mark the devices as out-of-date 225 from Products.ZenModel.DeviceClass import DeviceClass 226 227 while object: 228 # walk up until you hit an organizer or a device 229 if isinstance(object, DeviceClass): 230 for device in object.getSubDevices(): 231 self.notifyAll(device) 232 break 233 234 if isinstance(object, Device): 235 self.notifyAll(object) 236 break 237 238 object = aq_parent(object)239 240242 for listener in self.listeners: 243 if isinstance(obj, Device): 244 listener.callRemote('deleteDevice', obj.id)
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Wed Jul 14 12:07:23 2010 | http://epydoc.sourceforge.net |