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