Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / controllers / root.py @ 02503aef

History | View | Annotate | Download (11.3 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
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 index(self, page = 1, host = None, service = None, output = None,
59
            trouble_ticket=None):
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
        if page < 1 :
75
            page = 1
76

    
77
        events = VigiboardRequest()
78

    
79
        # Application des filtres si nécessaire
80
        if host :
81
            events.add_filter(Events.hostname.like('%%%s%%' % host))
82
        if service :
83
            events.add_filter(Events.servicename.like('%%%s%%' % service))
84
        if output :
85
            events.add_filter(Events.output.like('%%%s%%' % output))
86
        if trouble_ticket :
87
            events.add_filter(Events.trouble_ticket.like(
88
                '%%%s%%' % trouble_ticket))
89

    
90
        # Calcul des éléments à afficher et du nombre de pages possibles
91
        total_row = events.num_rows()
92
       
93
        item_per_page = int(tg.config['vigiboard_item_per_page'])
94

    
95
        if total_row <= item_per_page * (page-1) :
96
            page = 1
97
        id_first_row = item_per_page * (page-1)
98
        id_last_row = min(id_first_row + item_per_page, total_row)
99

    
100
        events.format_events(id_first_row, id_last_row)
101
        events.generate_tmpl_context() 
102

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

126
        @param id: identifiant de l'évènement
127
        """
128
        
129
        # Obtention de données sur l'évènement et sur son historique
130
        events = DBSession.query(Events.severity, Events.idevent,
131
                        Events.hostname, Events.servicename
132
                 ).join(( HostGroups , Events.hostname == HostGroups.hostname )
133
                 ).filter(HostGroups.groupname.in_(get_user_groups())
134
                 ).filter(Events.idevent == idevent)[0]
135

    
136
        initial_state = DBSession.query(EventHistory
137
                 ).filter(EventHistory.idevent == idevent
138
                 ).order_by(asc(EventHistory.timestamp)
139
                 ).order_by(asc(EventHistory.type_action))
140

    
141
        if initial_state.count() > 0 :
142
            initial_state = initial_state[0].value
143
        else :
144
            initial_state = 0
145
        
146
        severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'),
147
                3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'),
148
                6: _('Major'), 7: _('Critical') }
149
        
150
        return dict(
151
                initial_state = severity[int(initial_state)],
152
                current_state = severity[events.severity],
153
                idevent = events.idevent,
154
                host = events.hostname,
155
                service = events.servicename,
156
                nagios_link = tg.config['vigiboard_links.nagios'] % \
157
                        {'idevent': events.idevent},
158
                metrology_link = tg.config['vigiboard_links.metrology'] % \
159
                        {'idevent': events.idevent},
160
                security_link = tg.config['vigiboard_links.security'] % \
161
                        {'idevent': events.idevent},
162
                servicetype_link = tg.config['vigiboard_links.servicetype'] % \
163
                        {'idevent': events.idevent}
164
            )
165

    
166
    @validate(validators={'idevent':validators.Int(not_empty=True)},
167
            error_handler=process_form_errors)
168
    @expose('vigiboard.templates.vigiboard')
169
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
170
    def event(self, idevent):
171
        """
172
        Affichage de l'historique d'un évènement.
173
        Pour accéder à cette page, l'utilisateur doit être authentifié.
174

175
        @param idevent: identifiant de l'évènement souhaité
176
        """
177

    
178
        events = VigiboardRequest()
179
        events.add_filter(Events.idevent == idevent)
180
        
181
        # Vérification que l'évènement existe
182
        if events.num_rows() != 1 :
183
            flash(_('Error in DB'), 'error')
184
            redirect('/')
185
       
186
        events.format_events(0, 1)
187
        events.format_history()
188
        events.generate_tmpl_context() 
189

    
190
        return dict(
191
               events = events.events,
192
               id_first_row = 1,
193
               id_last_row = 1,
194
               total_row = 1,
195
               pages = [1],
196
               page = 1,
197
               event_edit_status_options = edit_event_status_options,
198
               history = events.hist,
199
               hist_error = True
200
            )
201

    
202
    @validate(validators={'host':validators.NotEmpty(),
203
        'service':validators.NotEmpty()}, error_handler=process_form_errors)
204
    @expose('vigiboard.templates.vigiboard')
205
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
206
    def host_service(self, host, service):
207
        
208
        """
209
        Affichage de l'historique de l'ensemble des évènements correspondant au
210
        host et service demandé.
211
        Pour accéder à cette page, l'utilisateur doit être authentifié.
212

213
        @param host: Nom de l'hôte souhaité.
214
        @param service: Nom du service souhaité
215
        """
216

    
217
        events = VigiboardRequest()
218
        events.add_filter(Events.hostname == host,
219
                Events.servicename == service)
220
        
221
        # Vérification qu'il y a au moins 1 évènement qui correspond
222
        if events.num_rows() == 0 :
223
            redirect('/')
224
       
225
        events.format_events(0, events.num_rows())
226
        events.format_history()
227
        events.generate_tmpl_context() 
228

    
229
        return dict(
230
               events = events.events,
231
               id_first_row = 1,
232
               id_last_row = 1,
233
               total_row = 1,
234
               pages = [1],
235
               page = 1,
236
               event_edit_status_options = edit_event_status_options,
237
               history = events.hist,
238
               hist_error = True
239
            )
240

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

    
262
        ids = krgv['id'].split(',')
263
       
264
        if len(ids) > 1 :
265
            ids = ids[:-1]
266
        
267
        events = VigiboardRequest()
268
        events.add_filter(Events.idevent.in_(ids))
269
        
270
        # Vérification que au moins un des identifiants existe et est éditable
271
        if events.num_rows() <= 0 :
272
            flash(_('No access to this event'), 'error')
273
            redirect('/')
274
        
275
        # Modification des évènements et création d'un historique
276
        # pour chacun d'eux
277
        
278
        username = request.environ.get('repoze.who.identity'
279
                ).get('repoze.who.userid')
280

    
281
        for req in events.req :
282
            if isinstance(req,Events):
283
                event = req
284
            else:
285
                event = req[0]
286
            if krgv['trouble_ticket'] != '' :
287
                event.trouble_ticket = krgv['trouble_ticket']
288
                history = EventHistory(type_action = "Ticket change",
289
                    idevent = event.idevent, value = '', text = '',
290
                    username = username)
291
                DBSession.add(history)   
292
            if krgv['status'] != 'NoChange' :
293
                event.status = krgv['status']
294
                history = EventHistory(
295
                        type_action = "Acknowlegement change state",
296
                        idevent = event.idevent, value = '', text = '',
297
                        username = username)
298
                DBSession.add(history)
299
       
300
        flash(_('Updated successfully'))
301
        # Redirection vers la dernière page accédée
302
        redirect(request.environ.get('HTTP_REFERER').split(
303
            request.environ.get('HTTP_HOST')+tg.config['base_url_filter.base_url'])[1])
304