Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / controllers / root.py @ b8500d1a

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 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 asc
15

    
16
from vigiboard.model import DBSession
17

    
18
from vigiboard.model import HostGroups, Events, EventHistory
19

    
20
from repoze.what.predicates import Any, not_anonymous
21

    
22
from vigiboard.widgets.edit_event import edit_event_status_options
23

    
24
from vigiboard.controllers.userutils import get_user_groups
25
from vigiboard.controllers.vigiboardrequest import \
26
        VigiboardRequest
27

    
28
from vigiboard.controllers.vigiboard_controller import VigiboardRootController
29

    
30
__all__ = ['RootController']
31

    
32
class RootController(VigiboardRootController):
33
    
34
    """
35
    Le controller général de vigiboard
36
    """
37

    
38
    @expose()
39
    def process_form_errors (self, *argv, **kwargv):
40

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

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

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

    
73
        if page < 1 :
74
            page = 1
75

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

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

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

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

132
        @param id: identifiant de l'évènement
133
        """
134

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

    
160
            eventdetails[edname] = edlink[1] % {
161
                    'idevent': events.idevent,
162
                    'host': events.hostname,
163
                    'service': events.servicename
164
                    }
165

    
166
        return dict(
167
                initial_state = severity[int(initial_state)],
168
                current_state = severity[events.severity],
169
                idevent = events.idevent,
170
                host = events.hostname,
171
                service = events.servicename,
172
                eventdetails = eventdetails
173
            )
174

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

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

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

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

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

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

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

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

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

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

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

    
319

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

    
350
    @validate(validators= {"refresh": validators.Int()},
351
            error_handler = process_form_errors)
352
    @expose('json')
353
    def set_refresh(self, refresh):
354
        """
355
        Save refresh time
356
        """
357
        session['refresh'] = refresh
358
        session.save()
359
        return dict(ret= 'ok')