Package ZenWin :: Package services :: Module WmiConfig
[hide private]
[frames] | no frames]

Source Code for Module ZenWin.services.WmiConfig

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007-2009, 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  __doc__='''WmiService 
 15   
 16  Provides Wmi config to zenwin clients. 
 17  ''' 
 18   
 19  from Products.ZenHub.services.ModelerService import ModelerService 
 20  from Products.ZenModel.Device import Device 
 21  from Products.ZenModel.DeviceClass import DeviceClass 
 22  from Products.ZenModel.WinService import WinService 
 23  from Products.ZenModel.ServiceClass import ServiceClass 
 24  from Products.ZenModel.ServiceOrganizer import ServiceOrganizer 
 25   
 26  from Products.ZenHub.services.Procrastinator import Procrastinate 
 27  from Products.ZenHub.services.ThresholdMixin import ThresholdMixin 
 28   
 29  import logging 
 30  log = logging.getLogger('zen.ModelerService.WmiConfig') 
 31   
32 -class WmiConfig(ModelerService, ThresholdMixin):
33 34
35 - def __init__(self, dmd, instance):
36 ModelerService.__init__(self, dmd, instance) 37 self.config = self.dmd.Monitors.Performance._getOb(self.instance) 38 self.procrastinator = Procrastinate(self.push)
39 40
41 - def createDeviceProxy(self, dev):
42 result = ModelerService.createDeviceProxy(self, dev) 43 for prop in ( 44 'zWmiMonitorIgnore', 45 'zWinUser', 46 'zWinPassword', 47 'zWinEventlogMinSeverity'): 48 if hasattr(dev, prop): 49 setattr(result, prop, getattr(dev, prop)) 50 return result
51 52
53 - def remote_getConfig(self):
54 return self.config.propertyItems()
55 56
57 - def update(self, object):
58 objects = [] 59 if isinstance(object, DeviceClass): 60 objects = object.getSubDevices() 61 elif isinstance(object, WinService): 62 objects = [object.device()] 63 elif isinstance(object, ServiceClass): 64 objects = [ i.device() for i in object.instances() \ 65 if isinstance(i, WinService) ] 66 elif isinstance(object, ServiceOrganizer): 67 68 #only need to find one device with a WinService to determine if a 69 #config change notification needs to be sent. This is because 70 #config changes are not sent for each device, if any device has 71 #changed the notifyConfigChanged method is called on the collector 72 #which tells the collector to re-read the entire configuration 73 def scanHeirarchyForDevice( organizer ): 74 75 #find device with a winserivce in an organizers service classes 76 def getWinServiceDevice( organizer ): 77 for sc in organizer.serviceclasses(): 78 for inst in sc.instances(): 79 if isinstance(inst,WinService): 80 return inst.device() 81 82 return None
83 84 organizers = [organizer] 85 #iterate through all the organizers and children 'till a device 86 #is found 87 while organizers: 88 for org in organizers: 89 device = getWinServiceDevice(org) 90 if device: 91 return device 92 93 oldOrgs = organizers 94 organizers = [] 95 for org in oldOrgs: 96 organizers.extend(org.children()) 97 98 return None
99 100 device = scanHeirarchyForDevice( object ) 101 102 if device: 103 objects = [device] 104 105 else: 106 objects = [object] 107 for object in objects: 108 if not isinstance(object, Device): 109 continue 110 self.procrastinator.doLater(object) 111 112
113 - def push(self, object):
114 if (not object.monitorDevice() or 115 getattr(object, 'zWmiMonitorIgnore', False)): 116 self.deleted(object) 117 else: 118 for listener in self.listeners: 119 listener.callRemote('notifyConfigChanged') 120 self.procrastinator.clear()
121 122
123 - def deleted(self, obj):
124 for listener in self.listeners: 125 if isinstance(obj, Device): 126 listener.callRemote('deleteDevice', obj.id)
127 128
129 - def _monitoredDevices(self, names):
130 """ 131 A generator method that provides a list of devices that are set to be 132 monitored via WMI. 133 """ 134 deviceMap = {} 135 136 for name in names: 137 # try and load the device from the provided list of names, but 138 # exclude the device if a) we can't find it! or b) we've already 139 # found it and created a proxy. The latter is a guard against 140 # two different proxies for the same device being provided which 141 # will cause great grief with the native code DCOM implementation 142 # we use. 143 device = self.dmd.Devices.findDeviceExact(name) 144 if not device: 145 continue 146 elif deviceMap.has_key(device.id): 147 continue 148 149 device = device.primaryAq() 150 151 # make sure the device itself is being monitored 152 if not device.monitorDevice(): 153 log.debug("Device %s skipped because monitoring is disabled", 154 device.id) 155 continue 156 157 # now make sure the WMI specific monitoring flag is enabled 158 if getattr(device, 'zWmiMonitorIgnore', False): 159 log.debug("Device %s skipped because zWmiMonitorIgnore is set", 160 device.id) 161 continue 162 163 # return the monitored device to the generator caller 164 yield device
165 166
167 - def remote_getDeviceConfigForEventlog(self, names):
168 """Return a list of (devname, user, password) 169 """ 170 deviceProxies = [] 171 172 for device in self._monitoredDevices(names): 173 if not getattr(device, 'zWinEventlog', True): 174 log.debug("Device %s skipped because zWinEventlog is cleared", 175 device.id) 176 continue 177 178 proxy = self.createDeviceProxy(device) 179 proxy.id = device.getId() 180 181 deviceProxies.append(proxy) 182 log.debug("Device %s added to proxy list", proxy.id) 183 184 return deviceProxies
185 186
187 - def remote_getDeviceConfigAndWinServices(self, names):
188 """Return a list of (devname, user, passwd, {'EvtSys':0,'Exchange':0}) 189 """ 190 deviceProxies = [] 191 for device in self._monitoredDevices(names): 192 193 proxy = self.createDeviceProxy(device) 194 proxy.id = device.getId() 195 196 proxy.services = {} 197 for s in device.getMonitoredComponents(type='WinService'): 198 name = s.name() 199 if type(name) == type(u''): 200 name = name.encode(s.zCollectorDecoding) 201 proxy.services[name] = (s.getStatus(), 202 s.getAqProperty('zFailSeverity')) 203 204 # don't bother adding this device proxy if there aren't any services 205 # to monitor 206 if not proxy.services: 207 log.debug("Device %s skipped because there are no services", 208 proxy.id) 209 continue 210 211 deviceProxies.append(proxy) 212 log.debug("Device %s added to proxy list", proxy.id) 213 214 return deviceProxies
215