Revision 8484b8bd
Version corrigée de Vigiboard. Encore des bugs dans les tests.
git-svn-id: https://vigilo-dev.si.c-s.fr/svn@713 b22e2e97-25c9-44ff-b637-2e5ceca36478
vigiboard/controllers/vigiboardrequest.py | ||
---|---|---|
2 | 2 |
# vim:set expandtab tabstop=4 shiftwidth=4: |
3 | 3 |
"""Gestion de la requête, des plugins et de l'affichage du Vigiboard""" |
4 | 4 |
|
5 |
from vigiboard.model import Event, Host, Service, \
|
|
6 |
HostGroup, ServiceGroup, EventHistory, User
|
|
5 |
from vigiboard.model import Event, EventsAggregate, EventHistory, \
|
|
6 |
Host, HostGroup, Service, ServiceGroup, User
|
|
7 | 7 |
from tg import tmpl_context, url, config, request |
8 | 8 |
from vigiboard.model import DBSession |
9 | 9 |
from sqlalchemy import not_ , and_ , asc , desc |
... | ... | |
30 | 30 |
|
31 | 31 |
username = request.environ['repoze.who.identity']['repoze.who.userid'] |
32 | 32 |
self.user_groups = User.by_user_name(username).groups |
33 |
self.bouton_severity = { 0: 'Minor', 1: 'Minor', 2: 'Minor', |
|
34 |
3: 'Minor', 4: 'Minor', 5: 'Minor', 6: 'Major', 7: 'Critical' } |
|
35 |
self.class_severity = { 0: 'None', 1: 'None', 2: 'None', 3: 'None', |
|
36 |
4: 'None', 5: 'Minor', 6: 'Major', 7: 'Critical' } |
|
37 |
self.severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'), |
|
38 |
3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'), |
|
39 |
6: _('Major'), 7: _('Critical') } |
|
40 | 33 |
|
41 |
self.class_ack = {'Acknowledged': 'Ack', 'None': '', 'AAClosed': 'Ack'} |
|
34 |
self.bouton_severity = ( |
|
35 |
'Minor', 'Minor', 'Minor', 'Minor', |
|
36 |
'Minor', 'Minor', 'Major', 'Critical' |
|
37 |
) |
|
38 |
|
|
39 |
self.class_severity = ( |
|
40 |
'None', 'None', 'None', 'None', |
|
41 |
'None', 'Minor', 'Major', 'Critical' |
|
42 |
) |
|
43 |
|
|
44 |
self.severity = ( |
|
45 |
_('None'), # 0 |
|
46 |
_('OK'), |
|
47 |
_('Suppressed'), |
|
48 |
_('Initial'), |
|
49 |
_('Maintenance'), |
|
50 |
_('Minor'), |
|
51 |
_('Major'), |
|
52 |
_('Critical'), # 7 |
|
53 |
) |
|
54 |
|
|
55 |
self.class_ack = { |
|
56 |
'Acknowledged': 'Ack', |
|
57 |
'None': '', |
|
58 |
'AAClosed': 'Ack' |
|
59 |
} |
|
42 | 60 |
|
43 | 61 |
self.generaterq = False |
44 |
self.table = [Event] |
|
45 |
self.join = [( Host, Event.hostname == Host.name ), |
|
46 |
( Service, Event.servicename == Service.name ), |
|
47 |
( HostGroup , Host.name == HostGroup.hostname ), |
|
48 |
( ServiceGroup , Service.name == ServiceGroup.servicename ) |
|
49 |
] |
|
62 |
|
|
63 |
self.table = [EventsAggregate] |
|
64 |
|
|
65 |
self.join = [ |
|
66 |
(Event, EventsAggregate.idcause == Event.idevent), |
|
67 |
(Host, Event.hostname == Host.name), |
|
68 |
(Service, Event.servicename == Service.name), |
|
69 |
(HostGroup, Host.name == HostGroup.hostname), |
|
70 |
(ServiceGroup, Service.name == ServiceGroup.servicename), |
|
71 |
] |
|
72 |
|
|
50 | 73 |
self.outerjoin = [] |
51 |
self.filter = [HostGroup.groupname.in_(self.user_groups), |
|
52 |
ServiceGroup.groupname.in_(self.user_groups), |
|
53 |
not_(and_(Event.active == False, |
|
54 |
Event.status == 'AAClosed')), |
|
55 |
Event.timestamp_active != None#, |
|
56 |
#not_(Event.timestamp_active.like('0000-00-00 00:00:00')) |
|
57 |
] |
|
58 |
self.orderby = [desc(Event.status), |
|
59 |
desc(Event.active), |
|
60 |
desc(Event.severity), |
|
61 |
asc(Event.hostname), |
|
62 |
desc(Event.timestamp)] |
|
63 |
self.groupby = [] |
|
74 |
|
|
75 |
self.filter = [ |
|
76 |
HostGroup.groupname.in_(self.user_groups), |
|
77 |
ServiceGroup.groupname.in_(self.user_groups), |
|
78 |
not_(and_(Event.active == False, |
|
79 |
EventsAggregate.status == 'AAClosed')), |
|
80 |
EventsAggregate.timestamp_active != None#, |
|
81 |
#not_(Event.timestamp_active.like('0000-00-00 00:00:00')) |
|
82 |
] |
|
83 |
|
|
84 |
self.orderby = [ |
|
85 |
desc(EventsAggregate.status), |
|
86 |
desc(Event.active), |
|
87 |
desc(EventsAggregate.severity), |
|
88 |
asc(Event.hostname), |
|
89 |
desc(Event.timestamp), |
|
90 |
] |
|
91 |
|
|
92 |
self.groupby = [ |
|
93 |
EventsAggregate.idaggregate, |
|
94 |
EventsAggregate, |
|
95 |
] |
|
96 |
|
|
64 | 97 |
self.plugin = [] |
65 | 98 |
self.events = [] |
66 | 99 |
self.idevents = [] |
... | ... | |
141 | 174 |
@param argv: Liste des tables à ajouter |
142 | 175 |
""" |
143 | 176 |
|
144 |
#On vérifi qu'il n'y a pas de doublons dans la liste des
|
|
145 |
#tables finale
|
|
177 |
# On vérifie qu'il n'y a pas de doublons dans la liste finale
|
|
178 |
# des tables.
|
|
146 | 179 |
|
147 | 180 |
for i in argv : |
148 | 181 |
for j in self.table: |
... | ... | |
159 | 192 |
@param argv: Liste des jointures à ajouter |
160 | 193 |
""" |
161 | 194 |
|
162 |
#On vérifi qu'il n'y a pas de doublons dans la liste des
|
|
163 |
#jointures finale
|
|
195 |
# On vérifie qu'il n'y a pas de doublons dans la liste finale
|
|
196 |
# des jointures.
|
|
164 | 197 |
|
165 | 198 |
for i in argv: |
166 | 199 |
for j in self.join: |
... | ... | |
177 | 210 |
@param argv: Liste des jointures externes à ajouter |
178 | 211 |
""" |
179 | 212 |
|
180 |
#On vérifi qu'il n'y a pas de doublons dans la liste des
|
|
181 |
#jointures externes finale
|
|
213 |
# On vérifie qu'il n'y a pas de doublons dans la liste finale
|
|
214 |
# des jointures externes.
|
|
182 | 215 |
|
183 | 216 |
for i in argv: |
184 | 217 |
for j in self.outerjoin: |
... | ... | |
194 | 227 |
@param argv: Liste des filtres à ajouter |
195 | 228 |
""" |
196 | 229 |
|
197 |
#On vérifi qu'il n'y a pas de doublons dans la liste des
|
|
198 |
#filtres finale
|
|
230 |
# On vérifie qu'il n'y a pas de doublons dans la liste finale
|
|
231 |
# des filtres.
|
|
199 | 232 |
|
200 | 233 |
for i in argv: |
201 | 234 |
for j in self.filter: |
... | ... | |
211 | 244 |
@param argv: Liste des groupements à ajouter |
212 | 245 |
""" |
213 | 246 |
|
214 |
#On vérifi qu'il n'y a pas de doublons dans la liste des
|
|
215 |
#groupements finale
|
|
247 |
# On vérifie qu'il n'y a pas de doublons dans la liste finale
|
|
248 |
# des groupements.
|
|
216 | 249 |
|
217 | 250 |
for i in argv: |
218 | 251 |
for j in self.groupby: |
... | ... | |
228 | 261 |
@param argv: Liste des ordres à ajouter |
229 | 262 |
""" |
230 | 263 |
|
231 |
#On vérifi qu'il n'y a pas de doublons dans la liste des
|
|
232 |
#ordres finale
|
|
264 |
# On vérifie qu'il n'y a pas de doublons dans la liste finale
|
|
265 |
# des ordres.
|
|
233 | 266 |
|
234 | 267 |
for i in argv: |
235 | 268 |
for j in self.orderby: |
... | ... | |
237 | 270 |
break |
238 | 271 |
self.orderby.append(i) |
239 | 272 |
|
240 |
def format_events_img_statu (self, event):
|
|
273 |
def format_events_img_status(self, event):
|
|
241 | 274 |
|
242 | 275 |
""" |
243 | 276 |
Suivant l'état de l'évènement, retourne la classe à appliquer |
... | ... | |
248 | 281 |
@return: Dictionnaire représentant la classe à appliquer |
249 | 282 |
""" |
250 | 283 |
|
251 |
if event.active and event.status == 'AAClosed': |
|
284 |
if event.cause.active and event.status == 'AAClosed':
|
|
252 | 285 |
return { 'src': url('/images/crossed.png') } |
253 | 286 |
elif event.status == 'Acknowledged' : |
254 | 287 |
return { 'src': url('/images/checked.png') } |
... | ... | |
298 | 331 |
# rq devient une liste plutôt que d'être directement la |
299 | 332 |
# table souhaité |
300 | 333 |
|
301 |
if isinstance(req, Event) : |
|
334 |
if isinstance(req, EventsAggregate) :
|
|
302 | 335 |
event = req |
303 |
else :
|
|
336 |
else: |
|
304 | 337 |
event = req[0] |
305 |
ids.append(event.idevent)
|
|
338 |
ids.append(event.idcause)
|
|
306 | 339 |
|
307 | 340 |
# La liste pour l'évènement actuel comporte dans l'ordre : |
308 | 341 |
# L'évènment en lui même |
... | ... | |
310 | 343 |
# couleurs suivant les lignes) |
311 | 344 |
# La classe pour la case comportant la flèche de détails |
312 | 345 |
# La classe pour la date, l'occurrence et l'édition |
313 |
# L'image a affiche pour la flèche de détails
|
|
346 |
# L'image à afficher pour la flèche de détails
|
|
314 | 347 |
# Une liste (une case par plugin) de ce que le plugin souhaite |
315 | 348 |
# afficher en fonction de l'évènement |
316 | 349 |
|
317 |
if event.active :
|
|
350 |
if event.cause.active:
|
|
318 | 351 |
events.append([ |
319 |
event, |
|
320 |
{'class': class_tr[i%2]}, |
|
321 |
{'class' : self.bouton_severity[event.severity] + \ |
|
322 |
self.class_ack[event.status]}, |
|
323 |
{'class' : self.bouton_severity[event.severity] + \ |
|
324 |
self.class_ack[event.status] },
|
|
325 |
{'src' : '/images/%s2.png' % \ |
|
326 |
self.bouton_severity[event.severity].upper()}, |
|
327 |
self.format_events_img_statu(event),
|
|
328 |
[[j.__show__(req), j.style] for j in self.plugin] |
|
352 |
event,
|
|
353 |
{'class': class_tr[i%2]},
|
|
354 |
{'class' : self.bouton_severity[event.severity] + \
|
|
355 |
self.class_ack[event.status]},
|
|
356 |
{'class' : self.bouton_severity[event.severity] + \
|
|
357 |
self.class_ack[event.status]},
|
|
358 |
{'src' : '/images/%s2.png' % \
|
|
359 |
self.bouton_severity[event.severity].upper()},
|
|
360 |
self.format_events_img_status(event),
|
|
361 |
[[j.__show__(req), j.style] for j in self.plugin]
|
|
329 | 362 |
]) |
330 |
else :
|
|
363 |
else: |
|
331 | 364 |
events.append([ |
332 |
event, |
|
333 |
{'class': class_tr[i%2]}, |
|
334 |
{'class' : self.bouton_severity[event.severity] + \ |
|
335 |
self.class_ack[event.status] }, |
|
336 |
{'class' : 'Cleared' + self.class_ack[event.status] }, |
|
337 |
{'src' : '/images/%s2.png' % \ |
|
338 |
self.bouton_severity[event.severity].upper()}, |
|
339 |
self.format_events_img_statu(event),
|
|
340 |
[[j.__show__(req), j.style] for j in self.plugin] |
|
365 |
event,
|
|
366 |
{'class': class_tr[i%2]},
|
|
367 |
{'class' : self.bouton_severity[event.severity] + \
|
|
368 |
self.class_ack[event.status] },
|
|
369 |
{'class' : 'Cleared' + self.class_ack[event.status] },
|
|
370 |
{'src' : '/images/%s2.png' % \
|
|
371 |
self.bouton_severity[event.severity].upper()},
|
|
372 |
self.format_events_img_status(event),
|
|
373 |
[[j.__show__(req), j.style] for j in self.plugin]
|
|
341 | 374 |
]) |
342 |
i = i + 1
|
|
375 |
i += 1
|
|
343 | 376 |
|
344 | 377 |
# On sauvegarde la liste précédemment créée puis rempli |
345 | 378 |
# le TmplContext |
... | ... | |
347 | 380 |
self.events = events |
348 | 381 |
self.idevents = ids |
349 | 382 |
|
350 |
def format_history (self):
|
|
383 |
def format_history(self): |
|
351 | 384 |
|
352 | 385 |
""" |
353 | 386 |
Formate les historiques correspondant aux évènements sélectionnés |
354 | 387 |
pour un affichage simple du résultat par Genshi. |
355 |
On génère une liste de liste, chaqu'une étant la description de l'affichage pour un
|
|
356 |
historique donné. |
|
388 |
On génère une liste de liste, chaqu'une étant la description |
|
389 |
de l'affichage pour un historique donné.
|
|
357 | 390 |
""" |
358 | 391 |
|
359 | 392 |
history = DBSession.query(EventHistory |
... | ... | |
407 | 440 |
{'class' : class_tr[i%2]}, |
408 | 441 |
{'class':self.class_severity[0]} |
409 | 442 |
]) |
410 |
i = i + 1
|
|
443 |
i += 1
|
|
411 | 444 |
|
412 | 445 |
hists[last_idevent] = hist_tmp |
413 | 446 |
self.hist = hists |
Also available in: Unified diff