Package ZenEvents :: Module EventClass
[hide private]
[frames] | no frames]

Source Code for Module ZenEvents.EventClass

  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  __doc__="""EventClass.py 
 14   
 15  Event class objects 
 16  """ 
 17   
 18  import types 
 19  import logging 
 20  log = logging.getLogger("zen.Events") 
 21   
 22  import transaction 
 23  from Globals import InitializeClass 
 24  from Globals import DTMLFile 
 25  from AccessControl import ClassSecurityInfo 
 26  from AccessControl import Permissions 
 27  from Products.ZenModel.ManagedEntity import ManagedEntity 
 28  from Products.ZenModel.ZenossSecurity import * 
 29  from Acquisition import aq_base 
 30   
 31  from Products.ZenRelations.RelSchema import * 
 32  from EventClassInst import EventClassInst, EventClassPropertyMixin 
 33  from Products.ZenEvents.ZenEventClasses import Unknown 
 34   
 35  from Products.ZenModel.Organizer import Organizer 
 36  from Products.ZenModel.ZenPackable import ZenPackable 
 37   
 38  from Products.ZenUtils.Utils import prepId as globalPrepId 
 39   
 40  __pychecker__='no-argsused' 
 41   
42 -def manage_addEventClass(context, id="Events", REQUEST=None):
43 """make a event class""" 44 ed = EventClass(id) 45 context._setObject(id, ed) 46 if id == "Events": 47 ed = context._getOb(id) 48 ed.createCatalog() 49 ed.buildZProperties() 50 if REQUEST is not None: 51 REQUEST['RESPONSE'].redirect(context.absolute_url() + '/manage_main')
52 53 54 addEventClass = DTMLFile('dtml/addEventClass',globals()) 55
56 -class EventClass(EventClassPropertyMixin, Organizer, ManagedEntity, ZenPackable):
57 """ 58 EventClass organizer 59 """ 60 61 isInTree = True 62 63 transform = '' 64 65 meta_type = "EventClass" #FIXME - this is wrong just temp perserving data 66 event_key = "EventClass" 67 68 dmdRootName = "Events" 69 70 default_catalog = "eventClassSearch" 71 72 _relations = ZenPackable._relations + ( 73 ("instances", ToManyCont(ToOne,"Products.ZenEvents.EventClassInst","eventClass")), 74 ) 75 76 77 _properties = Organizer._properties + \ 78 EventClassPropertyMixin._properties + \ 79 ({'id':'transform', 'type':'text', 'mode':'w'},) 80 81 82 # Screen action bindings (and tab definitions) 83 factory_type_information = ( 84 { 85 'id' : 'EventClass', 86 'meta_type' : 'EventClass', 87 'description' : """Base class for all event classes""", 88 'icon' : 'EventClass.gif', 89 'product' : 'ZenEvents', 90 'factory' : 'manage_addEventClass', 91 'immediate_view' : 'eventClassStatus', 92 'actions' : 93 ( 94 { 'id' : 'classes' 95 , 'name' : 'Classes' 96 , 'action' : 'eventClassStatus' 97 , 'permissions' : ( 98 Permissions.view, ) 99 }, 100 { 'id' : 'eventList' 101 , 'name' : 'Mappings' 102 , 'action' : 'eventMappingList' 103 , 'permissions' : ( 104 Permissions.view, ) 105 }, 106 { 'id' : 'events' 107 , 'name' : 'Events' 108 , 'action' : 'viewEvents' 109 , 'permissions' : ( 110 Permissions.view, ) 111 }, 112 { 'id' : 'config' 113 , 'name' : 'zProperties' 114 , 'action' : 'zPropertyEdit' 115 , 'permissions' : ("Change Device",) 116 }, 117 ) 118 }, 119 ) 120 121 security = ClassSecurityInfo() 122 123 severityConversions = ( 124 ('Critical', 5), 125 ('Error', 4), 126 ('Warning', 3), 127 ('Info', 2), 128 ('Debug', 1), 129 ('Clear', 0), 130 ('Original', -1), 131 ) 132 severities = dict([(b, a) for a, b in severityConversions]) 133
134 - def getSubEventClasses(self):
135 """ 136 Return all EventClass objects below this one. 137 138 @return: list of event classes 139 @rtype: list of EventClass 140 """ 141 evts = self.children() 142 for subgroup in self.children(): 143 evts.extend(subgroup.getSubEventClasses()) 144 return evts
145 146 147 security.declareProtected(ZEN_COMMON, "getOrganizerNames")
148 - def getOrganizerNames(self, addblank=False, checkPerm=False):
149 """ 150 Returns a list of all organizer names under this organizer. Overridden 151 here so that restricted users can get a list of event classes. 152 153 @param addblank: If True, add a blank item in the list. 154 @type addblank: boolean 155 @return: The DMD paths of all Organizers below this instance. 156 @rtype: list 157 @permission: ZEN_COMMON 158 """ 159 return Organizer.getOrganizerNames( 160 self, addblank=addblank, checkPerm=checkPerm)
161 162
163 - def find(self, evClassKey):
164 """ 165 Look for the eventClassKey mapping in an event class, 166 and return them in sequence number oder, lowest-to-highest. 167 168 @parameter evClassKey: event class key 169 @type evClassKey: string 170 @return: list of event class mappings that match evClassKey, sorted 171 @rtype: list of EventClassInst 172 """ 173 cat = self._getCatalog() 174 matches = cat({'eventClassKey': evClassKey}) 175 insts = [ self.getObjByPath(b.getPrimaryId) for b in matches ] 176 insts.sort(lambda x,y: cmp(x.sequence, y.sequence)) 177 if evClassKey != "defaultmapping": 178 insts.extend(self.find("defaultmapping")) 179 return insts
180 181
182 - def lookup(self, evt, device):
183 """ 184 Given an event, return an event class organizer object 185 186 @parameter evt: an event 187 @type evt: dictionary 188 @parameter device: device object 189 @type device: DMD device 190 @return: an event class that matches the mapping 191 @rtype: EventClassInst 192 """ 193 evtcls = [] 194 if getattr(evt, "eventClass", False): 195 try: 196 return self.getDmdRoot("Events").getOrganizer(evt.eventClass) 197 except KeyError: 198 log.debug("Unable to find '%s' organizer" % evt.eventClass) 199 200 if getattr(evt, "eventClassKey", False): 201 log.debug("lookup eventClassKey:%s", evt.eventClassKey) 202 evtcls = self.find(evt.eventClassKey) 203 204 for evtcl in evtcls: 205 m = evtcl.match(evt, device) 206 if m: 207 log.debug("EventClass:%s matched", evtcl.getOrganizerName()) 208 break 209 else: 210 log.debug("No EventClass matched") 211 try: 212 return self.getDmdRoot("Events").getOrganizer(Unknown) 213 except KeyError: 214 evtcl = None 215 log.debug("Unable to find 'Unknown' organizer") 216 return evtcl
217 218
219 - def applyExtraction(self, evt):
220 """Don't have extraction on event class. 221 """ 222 return evt
223 224
225 - def getInstances(self):
226 """Return all EventClassInstances from this node down. 227 """ 228 insts = self.instances() 229 for subclass in self.children(): 230 insts.extend(subclass.getInstances()) 231 return insts
232 233
234 - def nextSequenceNumber(self, key):
235 """Get next sequence number for instance. 236 """ 237 idx = 0 238 insts = self.find(key) 239 if len(insts) > 0: 240 idx = insts[-1].sequence + 1 241 return idx
242
243 - def prepId(self, id, subchar='_'):
244 return globalPrepId(id, subchar)
245
246 - def createInstance(self, id=None, REQUEST=None):
247 """Add an EventClassInst to this EventClass. 248 """ 249 if id: 250 id = self.prepId(id) 251 c=0 252 while self.instances._getOb(id,False): 253 c+=1 254 id = "%s_%02d" % (id, c) 255 ecr = EventClassInst(id) 256 ecr.sequence = self.nextSequenceNumber(ecr.eventClassKey) 257 self.instances._setObject(id, ecr) 258 if REQUEST: return self() 259 return self.instances._getOb(id)
260 261
262 - def removeInstances(self, ids=None, REQUEST=None):
263 """Remove Instances from an EventClass. 264 """ 265 if not ids: return self() 266 if type(ids) == types.StringType: ids = (ids,) 267 for id in ids: 268 self.instances._delObject(id) 269 if REQUEST: return self()
270 271
272 - def moveInstances(self, moveTarget, ids=None, REQUEST=None):
273 """Move instances from this EventClass to moveTarget. 274 """ 275 if not moveTarget or not ids: return self() 276 if type(ids) == types.StringType: ids = (ids,) 277 target = self.getChildMoveTarget(moveTarget) 278 for id in ids: 279 rec = self.instances._getOb(id, None) 280 if rec is None: continue 281 rec._operation = 1 # moving object state 282 self.instances._delObject(id) 283 target.instances._setObject(id, rec) 284 if REQUEST: 285 REQUEST['RESPONSE'].redirect(target.getPrimaryUrlPath())
286 287
288 - def countInstances(self):
289 """count all instances with in an event dict""" 290 count = self.instances.countObjects() 291 for group in self.children(): 292 count += group.countInstances() 293 return count
294 295
296 - def buildZProperties(self):
297 edict = self.getDmdRoot("Events") 298 if getattr(aq_base(edict), "zEventAction", False): return 299 edict._setProperty("zEventClearClasses", [], type="lines") 300 edict._setProperty("zEventAction", "status") 301 edict._setProperty("zEventSeverity", -1, type="int")
302
303 - def testTransformStyle(self):
304 """Test our transform by compiling it. 305 """ 306 try: 307 if self.transform: 308 compile(self.transform, "<string>", "exec") 309 except: 310 return "color:#FF0000;"
311
312 - def manage_editEventClassTransform(self, transform = '', REQUEST=None):
313 "Save the transform" 314 self.transform = transform 315 if REQUEST: return self.callZenScreen(REQUEST)
316 317
318 - def getEventSeverities(self):
319 """Return a list of tuples of severities [('Warning', 3), ...] 320 """ 321 return self.severityConversions
322
323 - def getEventSeverityString(self, severity):
324 """Return a list of tuples of severities [('Warning', 3), ...] 325 """ 326 try: 327 return self.severities[severity] 328 except IndexError: 329 return "Unknown"
330
331 - def reIndex(self):
332 """Go through all ips in this tree and reindex them.""" 333 log.debug("reindexing EventClass:%s", self.getOrganizerName()) 334 zcat = self._getCatalog() 335 zcat.manage_catalogClear() 336 transaction.savepoint() 337 for evtclass in self.getSubEventClasses(): 338 for ip in evtclass.instances(): 339 ip.index_object() 340 transaction.savepoint()
341 342
343 - def createCatalog(self):
344 """Create a catalog for EventClassRecord searching""" 345 from Products.ZCatalog.ZCatalog import manage_addZCatalog 346 manage_addZCatalog(self, self.default_catalog, 347 self.default_catalog) 348 zcat = self._getOb(self.default_catalog) 349 zcat.addIndex('eventClassKey', 'FieldIndex') 350 zcat.addColumn('getPrimaryId')
351 352 353 security.declareProtected(ZEN_ZPROPERTIES_VIEW, 'getOverriddenObjects')
354 - def getOverriddenObjects(self, propname, showDevices=False):
355 """ 356 Get the objects that override a property somewhere below in the tree 357 This method overrides ZenPropertyManager 358 """ 359 objects = [] 360 for inst in self.getSubInstances('instances'): 361 if inst.isLocal(propname) and inst not in objects: 362 objects.append(inst) 363 for suborg in self.children(): 364 if suborg.isLocal(propname): 365 objects.append(suborg) 366 for inst in suborg.getOverriddenObjects(propname): 367 if inst not in objects: 368 objects.append(inst) 369 return objects
370 371 security.declareProtected(ZEN_VIEW, 'getIconPath')
372 - def getIconPath(self):
373 """ Override the zProperty icon path and return a folder 374 """ 375 return "/zport/dmd/img/icons/folder.png"
376 377 security.declareProtected(ZEN_VIEW, 'getPrettyLink')
393 394 InitializeClass(EventClass) 395