1
2
3
4
5
6
7
8
9
10
11 __doc__ = """EventManagerBase
12 Data connector to backend of the event management system.
13 """
14
15 import time
16 import random
17 random.seed()
18 import logging
19 log = logging.getLogger("zen.Events")
20
21 from AccessControl import ClassSecurityInfo
22
23 from Products.ZenModel.ZenModelRM import ZenModelRM
24 from Products.ZenModel.ZenossSecurity import *
25 from Products.ZenRelations.RelSchema import *
26 from Products.ZenUtils import Time
27 from Products.ZenUtils.guid.interfaces import IGlobalIdentifier
28
29 from Products.ZenUtils.Utils import unused
30 from .HeartbeatUtils import getHeartbeatObjects
31
32 __pychecker__="maxargs=16"
33
35 """
36 Data connector to backend of the event management system.
37 """
38
39 eventStateConversions = (
40 ('New', 0),
41 ('Acknowledged',1),
42 ('Suppressed', 2),
43 )
44
45 eventActions = ('status', 'history', 'drop')
46
47 severityConversions = (
48 ('Critical', 5),
49 ('Error', 4),
50 ('Warning', 3),
51 ('Info', 2),
52 ('Debug', 1),
53 ('Clear', 0),
54 )
55 severities = dict([(b, a) for a, b in severityConversions])
56
57 priorityConversions = (
58 ('None', -1),
59 ('Emergency', 0),
60 ('Alert', 1),
61 ('Critical', 2),
62 ('Error', 3),
63 ('Warning', 4),
64 ('Notice', 6),
65 ('Info', 8),
66 ('Debug', 10),
67 )
68 priorities = dict([(b, a) for a, b in priorityConversions])
69
70 statusTable = "status"
71 detailTable = "detail"
72 logTable = "log"
73 lastTimeField = "lastTime"
74 firstTimeField = "firstTime"
75 deviceField = "device"
76 componentField = "component"
77 eventClassField = "eventClass"
78 severityField = "severity"
79 stateField = "eventState"
80 countField = "count"
81 prodStateField = "prodState"
82 DeviceGroupField = "DeviceGroups"
83 SystemField = "Systems"
84
85 DeviceWhere = "\"device = '%s'\" % me.getDmdKey()"
86 DeviceResultFields = ("eventState", "severity", "component", "eventClass",
87 "summary", "firstTime", "lastTime", "count" )
88 ComponentWhere = ("\"(device = '%s' and component = '%s')\""
89 " % (me.device().getDmdKey(), escape_string(me.name()))")
90 ComponentResultFields = ("eventState", "severity", "eventClass", "summary",
91 "firstTime", "lastTime", "count" )
92 IpAddressWhere = "\"ipAddress='%s'\" % (me.getId())"
93 EventClassWhere = "\"eventClass like '%s%%'\" % me.getDmdKey()"
94 EventClassInstWhere = """\"eventClass = '%s' and eventClassKey = '%s'\" % (\
95 me.getEventClass(), me.eventClassKey)"""
96 DeviceClassWhere = "\"(DeviceClass = '%s' or DeviceClass like '%s/%%') \" % \
97 ( me.getDmdKey(), me.getDmdKey() )"
98
99 LocationWhere = "\"Location like '%s%%'\" % me.getDmdKey()"
100 SystemWhere = "\"Systems like '%%|%s%%'\" % me.getDmdKey()"
101 DeviceGroupWhere = "\"DeviceGroups like '%%|%s%%'\" % me.getDmdKey()"
102
103 defaultResultFields = ("eventState", "severity", "device", "component",
104 "eventClass", "summary", "firstTime", "lastTime",
105 "count" )
106
107 defaultFields = ('eventState', 'severity', 'evid')
108
109 defaultEventId = ('device', 'component', 'eventClass',
110 'eventKey', 'severity')
111
112 requiredEventFields = ('device', 'summary', 'severity')
113
114 defaultAvailabilityDays = 7
115 defaultPriority = 3
116 eventAgingHours = 4
117 eventAgingSeverity = 4
118 historyMaxAgeDays = 0
119
120 _properties = (
121 {'id':'backend', 'type':'string','mode':'r', },
122 {'id':'username', 'type':'string', 'mode':'w'},
123 {'id':'password', 'type':'string', 'mode':'w'},
124 {'id':'host', 'type':'string', 'mode':'w'},
125 {'id':'database', 'type':'string', 'mode':'w'},
126 {'id':'port', 'type':'int', 'mode':'w'},
127 {'id':'defaultWhere', 'type':'text', 'mode':'w'},
128 {'id':'defaultOrderby', 'type':'text', 'mode':'w'},
129 {'id':'defaultResultFields', 'type':'lines', 'mode':'w'},
130 {'id':'statusTable', 'type':'string', 'mode':'w'},
131 {'id':'detailTable', 'type':'string', 'mode':'w'},
132 {'id':'logTable', 'type':'string', 'mode':'w'},
133 {'id':'lastTimeField', 'type':'string', 'mode':'w'},
134 {'id':'firstTimeField', 'type':'string', 'mode':'w'},
135 {'id':'deviceField', 'type':'string', 'mode':'w'},
136 {'id':'componentField', 'type':'string', 'mode':'w'},
137 {'id':'severityField', 'type':'string', 'mode':'w'},
138 {'id':'countField', 'type':'string', 'mode':'w'},
139 {'id':'DeviceGroupField', 'type':'string', 'mode':'w'},
140 {'id':'SystemField', 'type':'string', 'mode':'w'},
141 {'id':'DeviceWhere', 'type':'string', 'mode':'w'},
142 {'id':'DeviceResultFields', 'type':'lines', 'mode':'w'},
143 {'id':'ComponentResultFields', 'type':'lines', 'mode':'w'},
144 {'id':'EventClassWhere', 'type':'string', 'mode':'w'},
145 {'id':'EventClassInstWhere', 'type':'string', 'mode':'w'},
146 {'id':'DeviceClassWhere', 'type':'string', 'mode':'w'},
147 {'id':'LocationWhere', 'type':'string', 'mode':'w'},
148 {'id':'SystemWhere', 'type':'string', 'mode':'w'},
149 {'id':'DeviceGroupWhere', 'type':'string', 'mode':'w'},
150 {'id':'requiredEventFields', 'type':'lines', 'mode':'w'},
151 {'id':'defaultEventId', 'type':'lines', 'mode':'w'},
152 {'id':'defaultFields', 'type':'lines', 'mode':'w'},
153 {'id':'timeout', 'type':'int', 'mode':'w'},
154 {'id':'clearthresh', 'type':'int', 'mode':'w'},
155 {'id':'defaultAvailabilityDays', 'type':'int', 'mode':'w'},
156 {'id':'defaultPriority', 'type':'int', 'mode':'w'},
157 {'id':'eventAgingHours', 'type':'int', 'mode':'w'},
158 {'id':'eventAgingSeverity', 'type':'int', 'mode':'w'},
159 {'id':'historyMaxAgeDays', 'type':'int', 'mode':'w'},
160 )
161
162 _relations = (
163 ("commands", ToManyCont(ToOne, "Products.ZenEvents.EventCommand", "eventManager")),
164 )
165
166 security = ClassSecurityInfo()
167
168
169 - def __init__(self, id, title='', hostname='localhost', username='root',
170 password='', database='events', port=3306,
171 defaultWhere='',defaultOrderby='',defaultResultFields=[]):
172 """
173 Sets up event database access and initializes the cache.
174
175 @param id: A unique id
176 @type id: string
177 @param title: A title
178 @type title: string
179 @param hostname: The hostname of the events database server
180 @type hostname: string
181 @param username: The name of a user with permissions to access the
182 events database
183 @type username: string
184 @param password: The password of the user
185 @type password: string
186 @param database: The name of the events database
187 @type database: string
188 @param port: The port on which the database server is listening
189 @type port: int
190 @param defaultWhere: The default where clause to use when building
191 queries
192 @type defaultWhere: string
193 @param defaultOrderby: The default order by clause to use when building
194 queries
195 @type defaultOrderby: string
196 @param defaultResultFields: DEPRECATED. Currently unused.
197 @type defaultResultFields: list
198
199 """
200 unused(defaultOrderby, defaultResultFields)
201 self.id = id
202 self.title = title
203 self.username=username
204 self.password=password
205 self.database=database
206 self.host=hostname
207 self.port=port
208
209 self.defaultWhere = defaultWhere
210 self.defaultOrderby="%s desc, %s desc" % (
211 self.severityField, self.lastTimeField)
212
214 """This is a hook do not delete me!"""
215 return where
216
219
220
223
224
226 import Availability
227 allowedFilters = (
228 "device", "component", "eventClass", "systems", "severity",
229 "prodState", "manager", "agent", "DeviceClass", "Location",
230 "System", "DeviceGroup", "DevicePriority", "monitor")
231
232 for name in allowedFilters:
233 if hasattr(state, name):
234 kw.setdefault(name, getattr(state, name))
235 if getattr(state, 'startDate', None) is not None:
236 kw.setdefault('startDate', Time.ParseUSDate(state.startDate))
237 if getattr(state, 'endDate', None) is not None:
238
239
240 kw.setdefault('endDate', Time.getEndOfDay(Time.ParseUSDate(
241 state.endDate)))
242 kw.setdefault('startDate',
243 time.time() - 60*60*24*self.defaultAvailabilityDays)
244 return Availability.query(self.dmd, **kw)
245
250
252 from Products.Zuul.facades import getFacade
253 """ Returns the severity of the most severe event. """
254 zep = getFacade('zep')
255 try:
256
257 uuid = IGlobalIdentifier(me).getGUID()
258 return zep.getWorstSeverityByUuid(uuid)
259 except TypeError, e:
260 log.warn("Attempted to query events for %r which does not have a uuid" % self)
261 return 0
262
263
264
265
266
267
268 security.declareProtected(ZEN_SEND_EVENTS, 'sendEvents')
270 """Send a group of events to the backend.
271 """
272 raise NotImplementedError
273
274
275 security.declareProtected(ZEN_SEND_EVENTS, 'sendEvent')
277 """
278 Send an event to the backend.
279
280 @param event: event
281 @type event: event object
282 @todo: implement
283 """
284 raise NotImplementedError
285
286
287
288
289
290
295
297 """Return a list of possible event actions.
298 """
299 return self.eventActions
300
301 security.declareProtected(ZEN_COMMON,'getSeverities')
303 """Return a list of tuples of severities [('Warning', 3), ...]
304 """
305 return self.severityConversions
306
308 """Return a string representation of the severity.
309 """
310 try:
311 return self.severities[severity]
312 except KeyError:
313 return "Unknown"
314
316 """Return a list of tuples of priorities [('Warning', 3), ...]
317 """
318 return self.priorityConversions
319
321 """Return the priority name
322 """
323 try:
324 return self.priorities[priority]
325 except IndexError:
326 return "Unknown"
327
332
334 ''' Return the img source for a status number
335 '''
336 if status < 0:
337 src = 'grey'
338 elif status == 0:
339 src = 'green'
340 else:
341 src = 'red'
342 return '/zport/dmd/img/%s_dot.png' % src
343
344
346 """return the css class name to be used for this event.
347 """
348 __pychecker__='no-constCond'
349 value = severity < 0 and "unknown" or severity
350 acked = acked and "acked" or "noack"
351 return "zenevents_%s_%s %s" % (value, acked, acked)
352
353
354
355
356
358 """Install skins into portal.
359 """
360 from Products.CMFCore.utils import getToolByName
361 from Products.CMFCore.DirectoryView import addDirectoryViews
362 from cStringIO import StringIO
363 import string
364
365 out = StringIO()
366 skinstool = getToolByName(self, 'portal_skins')
367 if 'zenevents' not in skinstool.objectIds():
368 addDirectoryViews(skinstool, 'skins', globals())
369 out.write("Added 'zenevents' directory view to portal_skins\n")
370 skins = skinstool.getSkinSelections()
371 for skin in skins:
372 path = skinstool.getSkinPath(skin)
373 path = map(string.strip, string.split(path,','))
374 if 'zenevents' not in path:
375 try: path.insert(path.index('zenmodel'), 'zenevents')
376 except ValueError:
377 path.append('zenevents')
378 path = string.join(path, ', ')
379 skinstool.addSkinSelection(skin, path)
380 out.write("Added 'zenevents' to %s skin\n" % skin)
381 else:
382 out.write(
383 "Skipping %s skin, 'zenevents' is already set up\n" % skin)
384 return out.getvalue()
385