Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / controllers / vigiboard_ctl / vigiboard_ctl.py @ dde732e5

History | View | Annotate | Download (11.2 KB)

1 20367931 Thomas ANDREJAK
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""Vigiboard Controller"""
4
5
import tg
6 35cea70e Thomas ANDREJAK
7 52661754 Thomas ANDREJAK
from tg import expose, flash, require, request, redirect, \
8
                validate, tmpl_context
9 20367931 Thomas ANDREJAK
10
from tw.forms import validators 
11
12 52661754 Thomas ANDREJAK
from pylons.i18n import ugettext as _
13 20367931 Thomas ANDREJAK
14 52661754 Thomas ANDREJAK
from sqlalchemy import sql, asc
15 20367931 Thomas ANDREJAK
16
from vigiboard.lib.base import TGController
17
from vigiboard.model import DBSession
18
19 dde732e5 Thomas ANDREJAK
from vigiboard.model import ServiceHautNiveau, HostGroups, \
20 35cea70e Thomas ANDREJAK
        Events, EventHistory
21
22 52661754 Thomas ANDREJAK
from repoze.what.predicates import Any, not_anonymous
23 20367931 Thomas ANDREJAK
24
from vigiboard.widgets.edit_event import edit_event_status_options
25
26 977b981c Thomas ANDREJAK
from vigiboard.controllers.userutils import get_user_groups
27 35cea70e Thomas ANDREJAK
from vigiboard.controllers.vigiboard_ctl.vigiboardrequest import \
28 01862853 Thomas ANDREJAK
        VigiboardRequest
29 20367931 Thomas ANDREJAK
30
__all__ = ['VigiboardController']
31
32 977b981c Thomas ANDREJAK
class vigiboardController(TGController):
33 52661754 Thomas ANDREJAK
    
34
    """
35
    Le controller général de vigiboard
36
    """
37 20367931 Thomas ANDREJAK
38
    @expose()
39 52661754 Thomas ANDREJAK
    def process_form_errors (self, *argv, **kwargv):
40 20367931 Thomas ANDREJAK
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 52661754 Thomas ANDREJAK
        flash(tmpl_context.form_errors, 'error')
46 20367931 Thomas ANDREJAK
        if request.environ.get('HTTP_REFERER') :
47 52661754 Thomas ANDREJAK
            redirect(request.environ.get('HTTP_REFERER'
48
                ).split(request.environ.get('HTTP_HOST'))[1])
49 20367931 Thomas ANDREJAK
        else :
50 4f9d6461 Thomas ANDREJAK
            redirect('/')
51 20367931 Thomas ANDREJAK
52 52661754 Thomas ANDREJAK
    @validate(validators={'page':validators.Int(not_empty=False)},
53
            error_handler=process_form_errors)
54 20367931 Thomas ANDREJAK
    @expose('vigiboard.templates.vigiboard')
55 52661754 Thomas ANDREJAK
    @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):
58 20367931 Thomas ANDREJAK
            
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 52661754 Thomas ANDREJAK
        events = VigiboardRequest()
77
78 20367931 Thomas ANDREJAK
        # Application des filtres si nécessaire
79
        if host :
80 52661754 Thomas ANDREJAK
            events.add_filter(Events.hostname.like('%%%s%%' % host))
81 20367931 Thomas ANDREJAK
        if service :
82 52661754 Thomas ANDREJAK
            events.add_filter(Events.servicename.like('%%%s%%' % service))
83 20367931 Thomas ANDREJAK
        if output :
84 52661754 Thomas ANDREJAK
            events.add_filter(Events.output.like('%%%s%%' % output))
85 20367931 Thomas ANDREJAK
        if trouble_ticket :
86 52661754 Thomas ANDREJAK
            events.add_filter(Events.trouble_ticket.like(
87
                '%%%s%%' % trouble_ticket))
88 20367931 Thomas ANDREJAK
89
        # Calcul des éléments à afficher et du nombre de pages possibles
90 52661754 Thomas ANDREJAK
        total_row = events.num_rows()
91 20367931 Thomas ANDREJAK
       
92
        item_per_page = int(tg.config['vigiboard_item_per_page'])
93
94
        if total_row <= item_per_page * (page-1) :
95 52661754 Thomas ANDREJAK
            page = 1
96 20367931 Thomas ANDREJAK
        id_first_row = item_per_page * (page-1)
97 52661754 Thomas ANDREJAK
        id_last_row = min(id_first_row + item_per_page, total_row)
98 20367931 Thomas ANDREJAK
99 52661754 Thomas ANDREJAK
        events.format_events(id_first_row, id_last_row)
100
        events.generate_tmpl_context() 
101 20367931 Thomas ANDREJAK
102
        return dict(
103 52661754 Thomas ANDREJAK
               events = events.events,
104
               id_first_row = id_first_row + 1,
105
               id_last_row = id_last_row,
106
               total_row = total_row,
107
               pages = range(1, (total_row / item_per_page) + 2),
108
               page = page,
109
               event_edit_status_options = edit_event_status_options,
110
               history = [],
111 20367931 Thomas ANDREJAK
               hist_error = False
112
            )
113
       
114 35cea70e Thomas ANDREJAK
    @validate(validators={'idevent':validators.Int(not_empty=True)},
115 52661754 Thomas ANDREJAK
            error_handler=process_form_errors)
116 20367931 Thomas ANDREJAK
    @expose('json')
117 52661754 Thomas ANDREJAK
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
118
    def history_dialog (self, idevent) :
119 20367931 Thomas ANDREJAK
        
120
        """
121
        JSon renvoyant les éléments pour l'affichage de la fenêtre de dialogue
122
        contenant des liens internes et externes.
123
        Pour accéder à cette page, l'utilisateur doit être authentifié.
124

125
        @param id: identifiant de l'évènement
126
        """
127
        
128
        # Obtention de données sur l'évènement et sur son historique
129 52661754 Thomas ANDREJAK
        events = DBSession.query(Events.severity, Events.idevent,
130
                        Events.hostname, Events.servicename
131
                 ).join(( HostGroups , Events.hostname == HostGroups.hostname )
132
                 ).filter(HostGroups.groupname.in_(get_user_groups())
133
                 ).filter(Events.idevent == idevent)[0]
134 20367931 Thomas ANDREJAK
135 52661754 Thomas ANDREJAK
        initial_state = DBSession.query(EventHistory
136
                 ).filter(EventHistory.idevent == idevent
137
                 ).order_by(asc(EventHistory.timestamp)
138
                 ).order_by(asc(EventHistory.type_action))
139 20367931 Thomas ANDREJAK
140
        if initial_state.count() > 0 :
141
            initial_state = initial_state[0].value
142
        else :
143
            initial_state = 0
144
        
145 52661754 Thomas ANDREJAK
        severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'),
146
                3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'),
147
                6: _('Major'), 7: _('Critical') }
148 20367931 Thomas ANDREJAK
        
149
        return dict(
150 52661754 Thomas ANDREJAK
                initial_state = severity[int(initial_state)],
151
                current_state = severity[events.severity],
152 20367931 Thomas ANDREJAK
                idevent = events.idevent,
153
                host = events.hostname,
154
                service = events.servicename,
155 52661754 Thomas ANDREJAK
                nagios_link = tg.config['vigiboard_links.nagios'] % \
156
                        {'idevent': events.idevent},
157
                metrology_link = tg.config['vigiboard_links.metrology'] % \
158
                        {'idevent': events.idevent},
159
                security_link = tg.config['vigiboard_links.security'] % \
160
                        {'idevent': events.idevent},
161
                servicetype_link = tg.config['vigiboard_links.servicetype'] % \
162
                        {'idevent': events.idevent}
163
            )
164 20367931 Thomas ANDREJAK
165 52661754 Thomas ANDREJAK
    @validate(validators={'idevent':validators.Int(not_empty=True)},
166
            error_handler=process_form_errors)
167 20367931 Thomas ANDREJAK
    @expose('vigiboard.templates.vigiboard')
168 52661754 Thomas ANDREJAK
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
169
    def event(self, idevent):
170 20367931 Thomas ANDREJAK
        """
171
        Affichage de l'historique d'un évènement.
172
        Pour accéder à cette page, l'utilisateur doit être authentifié.
173

174
        @param idevent: identifiant de l'évènement souhaité
175
        """
176
177 52661754 Thomas ANDREJAK
        events = VigiboardRequest()
178
        events.add_filter(Events.idevent == idevent)
179 20367931 Thomas ANDREJAK
        
180
        # Vérification que l'évènement existe
181 52661754 Thomas ANDREJAK
        if events.num_rows() != 1 :
182
            flash(_('Error in DB'), 'error')
183 4f9d6461 Thomas ANDREJAK
            redirect('/')
184 20367931 Thomas ANDREJAK
       
185 52661754 Thomas ANDREJAK
        events.format_events(0, 1)
186
        events.format_history()
187
        events.generate_tmpl_context() 
188 20367931 Thomas ANDREJAK
189
        return dict(
190 52661754 Thomas ANDREJAK
               events = events.events,
191
               id_first_row = 1,
192
               id_last_row = 1,
193
               total_row = 1,
194
               pages = [1],
195
               page = 1,
196
               event_edit_status_options = edit_event_status_options,
197
               history = events.hist,
198 20367931 Thomas ANDREJAK
               hist_error = True
199
            )
200 52661754 Thomas ANDREJAK
201
    @validate(validators={'host':validators.NotEmpty(),
202
        'service':validators.NotEmpty()}, error_handler=process_form_errors)
203 20367931 Thomas ANDREJAK
    @expose('vigiboard.templates.vigiboard')
204 52661754 Thomas ANDREJAK
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
205
    def host_service(self, host, service):
206 20367931 Thomas ANDREJAK
        
207
        """
208
        Affichage de l'historique de l'ensemble des évènements correspondant au
209
        host et service demandé.
210
        Pour accéder à cette page, l'utilisateur doit être authentifié.
211

212
        @param host: Nom de l'hôte souhaité.
213
        @param service: Nom du service souhaité
214
        """
215
216 52661754 Thomas ANDREJAK
        events = VigiboardRequest()
217
        events.add_filter(Events.hostname == host,
218
                Events.servicename == service)
219 20367931 Thomas ANDREJAK
        
220
        # Vérification qu'il y a au moins 1 évènement qui correspond
221 52661754 Thomas ANDREJAK
        if events.num_rows() == 0 :
222 4f9d6461 Thomas ANDREJAK
            redirect('/')
223 20367931 Thomas ANDREJAK
       
224 52661754 Thomas ANDREJAK
        events.format_events(0, events.num_rows())
225
        events.format_history()
226
        events.generate_tmpl_context() 
227 20367931 Thomas ANDREJAK
228
        return dict(
229 52661754 Thomas ANDREJAK
               events = events.events,
230
               id_first_row = 1,
231
               id_last_row = 1,
232
               total_row = 1,
233
               pages = [1],
234
               page = 1,
235
               event_edit_status_options = edit_event_status_options,
236
               history = events.hist,
237 20367931 Thomas ANDREJAK
               hist_error = True
238
            )
239
240
    @validate(validators={
241
        "id":validators.Regex(r'^[0-9]+(,[0-9]*)*,?$'),
242
        "trouble_ticket":validators.Regex(r'^[0-9]*$'),
243 52661754 Thomas ANDREJAK
        "status":validators.OneOf(['NoChange', 'None', 'Acknowledged',
244
                'AAClosed'])
245
        }, error_handler=process_form_errors)
246
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
247 35cea70e Thomas ANDREJAK
    def update(self,**krgv):
248 20367931 Thomas ANDREJAK
        
249
        """
250
        Mise à jour d'un évènement suivant les arguments passés.
251
        Cela peut être un changement de ticket ou un changement de statu.
252
        
253
        @param krgv['id']: Le ou les identifiants des évènements à traiter
254
        @param krgv['tt']: Nouveau numéro du ticket associé.
255
        @param krgv['status']: Nouveau status de/des évènements.
256
        """
257
        
258 52661754 Thomas ANDREJAK
        # Si l'utilisateur édite plusieurs évènements à la fois,
259
        # il nous faut chacun des identifiants
260 20367931 Thomas ANDREJAK
261
        ids = krgv['id'].split(',')
262
       
263
        if len(ids) > 1 :
264
            ids = ids[:-1]
265
        
266 52661754 Thomas ANDREJAK
        events = VigiboardRequest()
267
        events.add_filter(Events.idevent.in_(ids))
268 20367931 Thomas ANDREJAK
        
269
        # Vérification que au moins un des identifiants existe et est éditable
270 52661754 Thomas ANDREJAK
        if events.num_rows() <= 0 :
271
            flash(_('No access to this event'), 'error')
272 4f9d6461 Thomas ANDREJAK
            redirect('/')
273 20367931 Thomas ANDREJAK
        
274 52661754 Thomas ANDREJAK
        # Modification des évènements et création d'un historique
275
        # pour chacun d'eux
276
        
277
        username = request.environ.get('repoze.who.identity'
278
                ).get('repoze.who.userid')
279
280 01862853 Thomas ANDREJAK
        for req in events.req :
281
            if isinstance(req,Events):
282
                event = req
283
            else:
284
                event = req[0]
285 20367931 Thomas ANDREJAK
            if krgv['trouble_ticket'] != '' :
286
                event.trouble_ticket = krgv['trouble_ticket']
287 52661754 Thomas ANDREJAK
                history = EventHistory(type_action = "Ticket change",
288
                    idevent = event.idevent, value = '', text = '',
289
                    username = username)
290 20367931 Thomas ANDREJAK
                DBSession.add(history)   
291
            if krgv['status'] != 'NoChange' :
292
                event.status = krgv['status']
293 52661754 Thomas ANDREJAK
                history = EventHistory(
294
                        type_action = "Acknowlegement change state",
295
                        idevent = event.idevent, value = '', text = '',
296
                        username = username)
297 20367931 Thomas ANDREJAK
                DBSession.add(history)
298
       
299
        flash(_('Updated successfully'))
300 4f9d6461 Thomas ANDREJAK
        # Redirection vers la dernière page accédée
301 52661754 Thomas ANDREJAK
        redirect(request.environ.get('HTTP_REFERER').split(
302 4f9d6461 Thomas ANDREJAK
            request.environ.get('HTTP_HOST')+tg.config['base_url_filter.base_url'])[1])