Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / controllers / root.py @ 693e96f1

History | View | Annotate | Download (13.2 KB)

1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""Vigiboard Controller"""
4

    
5
import tg
6

    
7
from tg import config, expose, flash, require, request, redirect, \
8
                validate, tmpl_context, session
9

    
10
from tw.forms import validators 
11

    
12
from pylons.i18n import ugettext as _
13

    
14
from sqlalchemy import sql, asc
15

    
16
from vigiboard.lib.base import TGController
17
from vigiboard.model import DBSession
18

    
19
from vigiboard.model import ServiceHautNiveau, HostGroups, \
20
        Events, EventHistory
21

    
22
from repoze.what.predicates import Any, not_anonymous
23

    
24
from vigiboard.widgets.edit_event import edit_event_status_options
25

    
26
from vigiboard.controllers.userutils import get_user_groups
27
from vigiboard.controllers.vigiboardrequest import \
28
        VigiboardRequest
29

    
30
from vigiboard.controllers.vigiboard_controller import Vigiboard_RootController
31

    
32
__all__ = ['RootController']
33

    
34
class RootController(Vigiboard_RootController):
35
    
36
    """
37
    Le controller général de vigiboard
38
    """
39

    
40
    @expose()
41
    def process_form_errors (self, *argv, **kwargv):
42

    
43
        """
44
        Gestion des erreurs de validation : On affiche les erreurs
45
        puis on redirige vers la dernière page accédée.
46
        """
47
        flash(tmpl_context.form_errors, 'error')
48
        if request.environ.get('HTTP_REFERER') :
49
            redirect(request.environ.get('HTTP_REFERER'
50
                ).split(request.environ.get('HTTP_HOST'))[1])
51
        else :
52
            redirect('/')
53

    
54
    @validate(validators={'page':validators.Int(not_empty=False)},
55
            error_handler=process_form_errors)
56
    @expose('vigiboard.templates.vigiboard')
57
    @require(Any(not_anonymous(), msg="You need to be authenticated"))
58
    def default(self, page = 1, host = None, service = None, output = None,
59
            trouble_ticket=None,*argv,**krgv):
60
            
61
        """
62
        Page d'accueil de Vigiboard. Elle affiche, suivant la page demandée (page 1 par
63
        defaut), la liste des évènements, rangé par ordre de prise en compte puis de sévérité.
64
        Pour accéder à cette page, l'utilisateur doit être authentifié.
65

66
        @param page: numéro de la page souhaité, commence à 1
67
        @param host: Si l'utilisateur souhaite sélectionner seulement certains
68
                     évènments suivant leur hôte, il peut placer une expression
69
                     ici en suivant la structure du LIKE en SQL
70
        @param service: Idem que host mais sur les services
71
        @param output: Idem que host mais sur le text explicatif
72
        @param trouble_ticket: Idem que host mais sur les tickets attribués
73
        """
74

    
75
        if page < 1 :
76
            page = 1
77

    
78
        events = VigiboardRequest()
79
        
80
        search = {'host':'', 'service':'', 'output':'', 'tt':''}
81
        # Application des filtres si nécessaire
82
        if host :
83
            search['host'] = host
84
            events.add_filter(Events.hostname.like('%%%s%%' % host))
85
        if service :
86
            search['service'] = service
87
            events.add_filter(Events.servicename.like('%%%s%%' % service))
88
        if output :
89
            search['output'] = output
90
            events.add_filter(Events.output.like('%%%s%%' % output))
91
        if trouble_ticket :
92
            search['tt'] = trouble_ticket
93
            events.add_filter(Events.trouble_ticket.like(
94
                '%%%s%%' % trouble_ticket))
95

    
96
        # Calcul des éléments à afficher et du nombre de pages possibles
97
        total_row = events.num_rows()
98
       
99
        item_per_page = int(tg.config['vigiboard_item_per_page'])
100

    
101
        if total_row <= item_per_page * (page-1) :
102
            page = 1
103
        id_first_row = item_per_page * (page-1)
104
        id_last_row = min(id_first_row + item_per_page, total_row)
105

    
106
        events.format_events(id_first_row, id_last_row)
107
        events.generate_tmpl_context() 
108
        return dict(
109
               events = events.events,
110
               id_first_row = id_first_row + 1,
111
               id_last_row = id_last_row,
112
               total_row = total_row,
113
               pages = range(1, (total_row / item_per_page) + 2),
114
               page = page,
115
               event_edit_status_options = edit_event_status_options,
116
               history = [],
117
               hist_error = False,
118
               plugin_context = events.context_fct,
119
               search = search
120
               
121
            )
122
      
123
    @validate(validators={'idevent':validators.Int(not_empty=True)},
124
            error_handler=process_form_errors)
125
    @expose('json')
126
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
127
    def history_dialog (self, idevent) :
128
        
129
        """
130
        JSon renvoyant les éléments pour l'affichage de la fenêtre de dialogue
131
        contenant des liens internes et externes.
132
        Pour accéder à cette page, l'utilisateur doit être authentifié.
133

134
        @param id: identifiant de l'évènement
135
        """
136

    
137
        # Obtention de données sur l'évènement et sur son historique
138
        events = DBSession.query(Events.severity, Events.idevent,
139
                        Events.hostname, Events.servicename
140
                 ).join(( HostGroups , Events.hostname == HostGroups.hostname )
141
                 ).filter(HostGroups.groupname.in_(get_user_groups())
142
                 ).filter(Events.idevent == idevent)[0]
143
        initial_state = DBSession.query(EventHistory
144
                 ).filter(EventHistory.idevent == idevent
145
                 ).order_by(asc(EventHistory.timestamp)
146
                 ).order_by(asc(EventHistory.type_action))
147
        if initial_state.count() > 0 :
148
            for i in initial_state:
149
                if i.value != '' and i.value is not None:
150
                    initial_state = i.value
151
                    break
152
        else :
153
            initial_state = 0
154
        
155
        severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'),
156
                3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'),
157
                6: _('Major'), 7: _('Critical') }
158
        eventdetails = {}
159
        for edname, edlink in tg.config['vigiboard_links.eventdetails'].iteritems():
160
            eventdetails[edname] = edlink[1] % {
161
                    'idevent': events.idevent,
162
                    'host': events.hostname,
163
                    'service': events.servicename
164
                    }
165
        return dict(
166
                initial_state = severity[int(initial_state)],
167
                current_state = severity[events.severity],
168
                idevent = events.idevent,
169
                host = events.hostname,
170
                service = events.servicename,
171
                eventdetails = eventdetails
172
            )
173

    
174
    @validate(validators={'idevent':validators.Int(not_empty=True)},
175
            error_handler=process_form_errors)
176
    @expose('vigiboard.templates.vigiboard')
177
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
178
    def event(self, idevent):
179
        """
180
        Affichage de l'historique d'un évènement.
181
        Pour accéder à cette page, l'utilisateur doit être authentifié.
182

183
        @param idevent: identifiant de l'évènement souhaité
184
        """
185

    
186
        events = VigiboardRequest()
187
        events.add_filter(Events.idevent == idevent)
188
        
189
        # Vérification que l'évènement existe
190
        if events.num_rows() != 1 :
191
            flash(_('Error in DB'), 'error')
192
            redirect('/')
193
       
194
        events.format_events(0, 1)
195
        events.format_history()
196
        events.generate_tmpl_context() 
197

    
198
        return dict(
199
               events = events.events,
200
               id_first_row = 1,
201
               id_last_row = 1,
202
               total_row = 1,
203
               pages = [1],
204
               page = 1,
205
               event_edit_status_options = edit_event_status_options,
206
               history = events.hist,
207
               hist_error = True,
208
               plugin_context = events.context_fct,
209
               search = {'host':None,'service':None,'output':None,'tt':None}
210
            )
211

    
212
    @validate(validators={'host':validators.NotEmpty(),
213
        'service':validators.NotEmpty()}, error_handler=process_form_errors)
214
    @expose('vigiboard.templates.vigiboard')
215
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
216
    def host_service(self, host, service):
217
        
218
        """
219
        Affichage de l'historique de l'ensemble des évènements correspondant au
220
        host et service demandé.
221
        Pour accéder à cette page, l'utilisateur doit être authentifié.
222

223
        @param host: Nom de l'hôte souhaité.
224
        @param service: Nom du service souhaité
225
        """
226

    
227
        events = VigiboardRequest()
228
        events.add_filter(Events.hostname == host,
229
                Events.servicename == service)
230
        del events.filter[2]
231

    
232
        # Vérification qu'il y a au moins 1 évènement qui correspond
233
        if events.num_rows() == 0 :
234
            redirect('/')
235
       
236
        events.format_events(0, events.num_rows())
237
        events.format_history()
238
        events.generate_tmpl_context() 
239
        return dict(
240
               events = events.events,
241
               id_first_row = 1,
242
               id_last_row = 1,
243
               total_row = 1,
244
               pages = [1],
245
               page = 1,
246
               event_edit_status_options = edit_event_status_options,
247
               history = events.hist,
248
               hist_error = True,
249
               plugin_context = events.context_fct,
250
               search = {'host':None,'service':None,'output':None,'tt':None}
251
            )
252

    
253
    @validate(validators={
254
        "id":validators.Regex(r'^[0-9]+(,[0-9]*)*,?$'),
255
        "trouble_ticket":validators.Regex(r'^[0-9]*$'),
256
        "status":validators.OneOf(['NoChange', 'None', 'Acknowledged',
257
                'AAClosed'])
258
        }, error_handler=process_form_errors)
259
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
260
    def update(self,**krgv):
261
        
262
        """
263
        Mise à jour d'un évènement suivant les arguments passés.
264
        Cela peut être un changement de ticket ou un changement de statu.
265
        
266
        @param krgv['id']: Le ou les identifiants des évènements à traiter
267
        @param krgv['tt']: Nouveau numéro du ticket associé.
268
        @param krgv['status']: Nouveau status de/des évènements.
269
        """
270
        
271
        # Si l'utilisateur édite plusieurs évènements à la fois,
272
        # il nous faut chacun des identifiants
273

    
274
        ids = krgv['id'].split(',')
275
       
276
        if len(ids) > 1 :
277
            ids = ids[:-1]
278
        
279
        events = VigiboardRequest()
280
        events.add_filter(Events.idevent.in_(ids))
281
        
282
        # Vérification que au moins un des identifiants existe et est éditable
283
        if events.num_rows() <= 0 :
284
            flash(_('No access to this event'), 'error')
285
            redirect('/')
286
        
287
        # Modification des évènements et création d'un historique
288
        # pour chacun d'eux
289
        
290
        username = request.environ.get('repoze.who.identity'
291
                ).get('repoze.who.userid')
292

    
293
        for req in events.req :
294
            if isinstance(req,Events):
295
                event = req
296
            else:
297
                event = req[0]
298
            if krgv['trouble_ticket'] != '' :
299
                event.trouble_ticket = krgv['trouble_ticket']
300
                history = EventHistory(type_action = "Ticket change",
301
                    idevent = event.idevent, value = '', text = '',
302
                    username = username)
303
                DBSession.add(history)   
304
            if krgv['status'] != 'NoChange' :
305
                event.status = krgv['status']
306
                history = EventHistory(
307
                        type_action = "Acknowlegement change state",
308
                        idevent = event.idevent, value = '', text = '',
309
                        username = username)
310
                DBSession.add(history)
311
       
312
        flash(_('Updated successfully'))
313
        # Redirection vers la dernière page accédée
314
        redirect(request.environ.get('HTTP_REFERER').split(
315
            request.environ.get('HTTP_HOST')+tg.config['base_url_filter.base_url'])[1])
316

    
317

    
318
    @validate(validators={"plugin_name":validators.OneOf(
319
        [i for [i,j] in tg.config['vigiboard_plugins']])},
320
                error_handler=process_form_errors)
321
    @expose('json')
322
    def get_plugin_value(self,plugin_name,*arg,**krgv):
323
        """
324
        Permet aux plugins de pouvoir récupérer des valeurs Json
325
        """
326
        plugin = [i for i in tg.config['vigiboard_plugins'] if i[0] == plugin_name][0]
327
        try:
328
            mypac = __import__(
329
                'vigiboard.controllers.vigiboard_plugin.' +\
330
                        plugin[0],globals(), locals(), [plugin[1]],-1)
331
            p = getattr(mypac,plugin[1])()
332
            return p.controller(*arg,**krgv)
333
        except:
334
            raise
335
    
336
    @validate(validators={"fontsize":validators.Int()}, error_handler=process_form_errors)
337
    @expose('json')
338
    def set_fontsize(self,fontsize):
339
        try:
340
            session['fontsize'] = fontsize
341
            session.save()
342
            return dict(ret='ok')
343
        except:
344
            return dict(ret='fail')
345

    
346
    @validate(validators={"refresh":validators.Int()}, error_handler=process_form_errors)
347
    @expose('json')
348
    def set_refresh(self,refresh):
349
        try:
350
            session['refresh'] = refresh
351
            session.save()
352
            return dict(ret='ok')
353
        except:
354
            return dict(ret='fail')
355