Project

General

Profile

Revision 20367931

ID20367931826425cf944d798b717c132dfae9ab42
Parent ed374445
Child 089dfbc2

Added by Thomas ANDREJAK almost 15 years ago

Réorganisation du code (controllers, etc)
Mise en place d'un système de plugin pour ajouter des colonnes à la volée
Internationalisation complète
Création de quelques tests

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@274 b22e2e97-25c9-44ff-b637-2e5ceca36478

View differences:

vigiboard/controllers/root.py
1 1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
2 3
"""Main Controller"""
3 4

  
4
import tg
5
from tg import expose, flash, require, url, request, redirect, validate, tmpl_context
6

  
7
from tw.forms import validators 
8

  
9
from sets import Set
5
from tg import expose, flash, require, url, request, redirect
10 6

  
11 7
import pylons
12 8
from pylons.i18n import ugettext as _, lazy_ugettext as l_
13 9
from catwalk.tg2 import Catwalk
14 10
from repoze.what import predicates
15 11

  
16
from sqlalchemy import not_ , and_ , asc , desc, or_
17

  
18
from tw.jquery import JQueryUIDialog
19

  
20 12
from vigiboard.lib.base import BaseController
21
from vigiboard.model import DBSession, metadata
13
from vigiboard.model import DBSession 
22 14
from vigiboard.controllers.error import ErrorController
23 15
from vigiboard import model
24 16
from vigiboard.controllers.secure import SecureController
25 17

  
26
from vigiboard.model.vigiboard_bdd import *
27
from vigiboard.model.auth import Permission
28
from repoze.what.predicates import Any,not_anonymous
29

  
30
from vigiboard.widgets.edit_event import Edit_Event_Form , Search_Form , edit_event_status_options
18
from vigiboard.controllers.vigiboard_ctl import VigiboardController
31 19

  
32 20
__all__ = ['RootController']
33 21

  
34
def GetUserGroups():
35
	
36
	gr = DBSession.query(Groups.name).join(
37
	    ( GroupPermissions , Groups.name == GroupPermissions.groupname ),
38
	    ( Permission , Permission.permission_id == GroupPermissions.idpermission )
39
	    ).filter(Permission.permission_name.in_(request.environ.get('repoze.who.identity').get('permissions')))
40
	  
41
	lst_grp = Set([i.name for i in gr])
42
	lst_tmp = lst_grp
43
	  
44
	while len(lst_tmp) > 0:
45
		gr = DBSession.query(Groups.name).filter(Groups.parent.in_(lst_tmp))
46
		tmp = Set([])
47
		for i in gr :
48
			tmp.add(i.name)
49
			lst_grp.add(i.name)
50
		lst_tmp = tmp
51
	
52
	return lst_grp
53

  
54
def FormatEventsImgStatu (event):
55
	if event.active and event.status == 'AAClosed':
56
		return { 'src': url('/images/vigiboard/crossed.png') }
57
	elif event.status == 'Acknowledged' :
58
		return { 'src': url('/images/vigiboard/checked.png') }
59
	else:
60
		return None
61

  
62

  
63
def FormatEvents(events,first_row,last_row):
64
	ev = []
65
	i=0
66
	severity = { 0 : 'Minor' , 1 : 'Minor', 2 : 'Minor', 3 : 'Minor', 4 : 'Minor', 5 : 'Minor' , 6 : 'Major' , 7 : 'Critical' }
67
	class_tr = ['odd','even']
68
	class_ack = { 'Acknowledged' : 'Ack' , 'None' : '' , 'AAClosed' : 'Ack' }
69
	ids = []
70
	for event in events[first_row : last_row]:
71
		ids.append(event.idevent)
72
		if event.active :
73
			ev.append([
74
				event,
75
				{'class': class_tr[i%2]},
76
				{'class' : severity[event.severity] + class_ack[event.status]},
77
				{'class' : severity[event.severity] + class_ack[event.status] },
78
				{'src' : url('/images/vigiboard/%s2.png' % severity[event.severity].upper())},
79
				FormatEventsImgStatu(event)
80
				])
81
		else :
82
			ev.append([
83
				event,
84
				{'class': class_tr[i%2]},
85
				{'class' : severity[event.severity] + class_ack[event.status] },
86
				{'class' : 'Cleared' + class_ack[event.status] },
87
				{'src' : url('/images/vigiboard/%s2.png' % severity[event.severity].upper())},
88
				FormatEventsImgStatu(event)
89
				])
90

  
91
		i=i+1
92
	return ev,ids
93

  
94
def FormatHistory (idevents,hostname,servicename):
95
	history = DBSession.query(EventHistory).filter(EventHistory.idevent.in_(idevents)).order_by(desc(EventHistory.timestamp))
96
	severity = { 0 : 'None' , 1 : 'OK', 2 : 'Suppressed', 3 : 'Initial', 4 : 'Maintenance', 5 : 'Minor' , 6 : 'Major' , 7 : 'Critical' }
97
	hist = []
98
	i = 0
99
	class_tr = ['odd','even']
100
	for h in history :
101
		if h.value :
102
			hist.append([
103
				h.idhistory,
104
				hostname,
105
				servicename,
106
				h.timestamp,
107
				h.username,
108
				h.type_action,
109
				severity[min(int(h.value),7)],
110
				h.text,
111
				{'class' : class_tr[i%2]},
112
				{'class':severity[min(int(h.value),7)]}
113
			])
114
		else:
115
			hist.append([
116
				h.idhistory,
117
				hostname,
118
				servicename,
119
				h.timestamp,
120
				h.username,
121
				h.type_action,
122
				severity[0],
123
				h.text,
124
				{'class' : class_tr[i%2]},
125
				{'class':severity[0]}
126
			])	
127
		i = i+1
128
	
129
	return hist
130

  
131
def GenerateTmplContext():
132
	tmpl_context.edit_eventdialog = JQueryUIDialog(id='Edit_EventsDialog',autoOpen=False,title='Edit Event')
133
        tmpl_context.searchdialog = JQueryUIDialog(id='SearchDialog',autoOpen=False,title='Search Event')
134
        tmpl_context.historydialog = JQueryUIDialog(id='HistoryDialog',autoOpen=False,title='History')
135
        tmpl_context.edit_event_form = Edit_Event_Form('edit_event_form',action=url('/update_event'))
136
        tmpl_context.search_form = Search_Form('search_form',action=url('/vigiboard'))
137

  
138 22
class RootController(BaseController):
139 23
    """
140 24
    The root controller for the vigiboard application.
......
155 39
    
156 40
    error = ErrorController()
157 41

  
42
    vigiboard = VigiboardController()
43

  
158 44
    @expose('vigiboard.templates.index')
159 45
    def index(self):
160 46
        """Handle the front-page."""
......
214 100
        """
215 101
        flash(_('We hope to see you soon!'))
216 102
        redirect(came_from)
217

  
218
    @expose('vigiboard.templates.vigiboard')
219
    @require(Any(not_anonymous(),msg="You need to be authenticated"))
220
    def vigiboard(self,page='1',host=None,service=None,output=None,trouble_ticket=None):
221
	   try :
222
	   	page = int(page)
223
	   except :
224
		page = 1
225
	   if page < 1 :
226
		  page = 1
227
	   
228
	   events = DBSession.query(Events).join(
229
		( Host, Events.hostname == Host.name ),
230
		( Service, Events.servicename == Service.name ),
231
		( HostGroups , Host.name == HostGroups.hostname )
232
		).filter(HostGroups.groupname.in_(GetUserGroups())
233
		).filter(not_(and_(Events.active == False,Events.status == 'AAClosed'))
234
		).filter(Events.timestamp_active != None
235
		).filter(not_(Events.timestamp_active.like('0000-00-00 00:00:00'))
236
		)
237

  
238
	   if host :
239
		   events = events.filter(Events.hostname.like('%%%s%%' % host))
240
	   if service :
241
		   events = events.filter(Events.servicename.like('%%%s%%' % service))
242
	   if output :	
243
		   events = events.filter(Events.output.like('%%%s%%' % output))
244
	   if trouble_ticket :
245
		   events = events.filter(Events.trouble_ticket.like('%%%s%%' % trouble_ticket))
246

  
247
	   events= events.order_by(asc(Events.status)
248
		).order_by(desc(Events.active)
249
		).order_by(desc(Events.severity)
250
		).order_by(asc(Events.hostname)
251
		).order_by(desc(Events.timestamp))
252

  
253
	   total_row = events.count()
254
	   
255
	   item_per_page = int(tg.config['vigiboard_item_per_page'])
256

  
257
	   if total_row <= item_per_page * (page-1) :
258
		page = 1
259
	   id_first_row = item_per_page * (page-1)
260
	   id_last_row = min(id_first_row + item_per_page,total_row)
261
	   
262
	   GenerateTmplContext()
263
	   events , ids = FormatEvents(events,id_first_row,id_last_row)
264
	   return dict(
265
			   events=events,
266
			   id_first_row=id_first_row,
267
			   id_last_row=id_last_row,
268
			   total_row=total_row,
269
			   pages=range(1,(total_row/item_per_page) + 2),
270
			   page=page,
271
			   event_edit_status_options=edit_event_status_options,
272
			   history=[],
273
			   hist_error = False
274
		)
275
   	
276
  
277
    @expose('json')
278
    def vigiboard_HistoryDialog ( self , id ) :
279
	    events = DBSession.query(Events.severity,Events.idevent,Events.hostname,Events.servicename).filter(Events.idevent == id)[0]
280
	    initial_state = DBSession.query(EventHistory).filter(EventHistory.idevent == id).order_by(asc(EventHistory.timestamp)).order_by(asc(EventHistory.type_action))
281
	    if initial_state.count() > 0 :
282
		    initial_state = initial_state[0].value
283
	    else :
284
		    initial_state = 0
285
	    severity = { 0 : 'None' , 1 : 'OK', 2 : 'Suppressed', 3 : 'Initial', 4 : 'Maintenance', 5 : 'Minor' , 6 : 'Major' , 7 : 'Critical' }
286
	    return dict(
287
		initial_state=severity[int(initial_state)],
288
		current_state=severity[events.severity],
289
		idevent = events.idevent,
290
		host = events.hostname,
291
		service = events.servicename,
292
		nagios_link = tg.config['vigiboard_links.nagios'] % {'idevent':events.idevent},
293
		metrology_link = tg.config['vigiboard_links.metrology'] % {'idevent':events.idevent},
294
		security_link = tg.config['vigiboard_links.security'] % {'idevent':events.idevent},
295
		servicetype_link = tg.config['vigiboard_links.servicetype'] % {'idevent':events.idevent}
296
		)
297
	
298
    @expose('vigiboard.templates.vigiboard')
299
    @require(Any(not_anonymous(),msg="You need to be authenticated"))
300
    def vigiboard_event(self,idevent):
301
	   
302
	   events = DBSession.query(Events).join(
303
		( Host, Events.hostname == Host.name ),
304
		( Service, Events.servicename == Service.name ),
305
		( HostGroups , Host.name == HostGroups.hostname )
306
		).filter(HostGroups.groupname.in_(GetUserGroups())
307
	   	).filter(not_(and_(Events.active == False,Events.status == 'AAClosed'))
308
		).filter(Events.timestamp_active != None
309
		).filter(not_(Events.timestamp_active.like('0000-00-00 00:00:00'))
310
		).filter(Events.idevent == idevent)
311

  
312
	   if events.count() != 1 :
313
		flash(_('Error in DB'),'error')
314
		redirect('/vigiboard')
315
	   
316
   	   GenerateTmplContext()
317
	   events , ids = FormatEvents(events,0,1)
318
	   return dict(
319
			   events=events,
320
			   id_first_row=1,
321
			   id_last_row=1,
322
			   total_row=1,
323
			   pages=[1],
324
			   page=1,
325
			   event_edit_status_options=edit_event_status_options,
326
			   history=FormatHistory(ids,events[0][0].hostname,events[0][0].servicename),
327
			   hist_error = True
328
		)
329
 	
330
    @expose('vigiboard.templates.vigiboard')
331
    @require(Any(not_anonymous(),msg="You need to be authenticated"))
332
    def vigiboard_host_service(self,host,service):
333
	   
334
	   events = DBSession.query(Events).join(
335
		( Host, Events.hostname == Host.name ),
336
		( Service, Events.servicename == Service.name ),
337
		( HostGroups , Host.name == HostGroups.hostname )
338
		).filter(HostGroups.groupname.in_(GetUserGroups())
339
	   	).filter(not_(and_(Events.active == False,Events.status == 'AAClosed'))
340
		).filter(Events.timestamp_active != None
341
		).filter(not_(Events.timestamp_active.like('0000-00-00 00:00:00'))
342
		).filter(Events.hostname == host
343
		).filter(Events.servicename == service)
344

  
345
	   if events.count() == 0 :
346
		redirect('/vigiboard')
347
	   
348
	   GenerateTmplContext()
349

  
350
	   events , ids = FormatEvents(events,0,events.count())
351

  
352
	   return dict(
353
			   events=events,
354
			   id_first_row=1,
355
			   id_last_row=1,
356
			   total_row=1,
357
			   pages=[1],
358
			   page=1,
359
			   event_edit_status_options=edit_event_status_options,
360
			   history=FormatHistory(ids,host,service),
361
			   hist_error = True
362
		)
363

  
364
    def edit_event_form_errors (self,**argv):
365
	    flash(_(tmpl_context.form_errors),'error')
366
	    redirect(request.environ.get('HTTP_REFERER').split(request.environ.get('HTTP_HOST'))[1])
367

  
368
    @expose('vigiboard.templates.vigiboard_update')
369
    @validate(validators={
370
	    "id":validators.Regex(r'^[0-9]+(,[0-9]*)*,?$'),
371
	    "tt":validators.Regex(r'^[0-9]*$'),
372
	    "status":validators.OneOf(['None', 'Acknowledged', 'AAClosed'])
373
	    },error_handler=edit_event_form_errors)
374
    @require(Any(not_anonymous(),msg="You need to be authenticated"))
375
    def update_event(self,*argv,**krgv):
376
	   
377
           ids = krgv['id'].split(',')
378
	   
379
	   if len(ids) > 1 :
380
		   ids = ids[:-1]
381

  
382
	   events = DBSession.query(Events).join(
383
		( Host, Events.hostname == Host.name ),
384
		( Service, Events.servicename == Service.name ),
385
		( HostGroups , Host.name == HostGroups.hostname )
386
		).filter(HostGroups.groupname.in_(GetUserGroups())
387
		).filter(Events.idevent.in_(ids))
388
	   
389
	   if events.count() <= 0 :
390
		   flash(_('No access to this event'),'error')
391
		   redirect('/vigiboard')
392
	   
393
	   for event in events :
394
		   if krgv['tt'] != '' :
395
		   	event.trouble_ticket = krgv['tt']
396
		   	history = EventHistory(type_action="Ticket change",idevent=event.idevent,value='',text='',username=request.environ.get('repoze.who.identity').get('repoze.who.userid'))
397
		   	DBSession.add(history)	
398
	   
399
		   if events[0].status != krgv['status'] :
400
		   	event.status = krgv['status']
401
                   	history = EventHistory(type_action="Acknowlegement change state",idevent=event.idevent,value='',text='',username=request.environ.get('repoze.who.identity').get('repoze.who.userid'))
402
                   	DBSession.add(history)
403
	   
404
   	   flash(_('Updated successfully'))
405
	   redirect(request.environ.get('HTTP_REFERER').split(request.environ.get('HTTP_HOST'))[1])

Also available in: Unified diff