Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / controllers / vigiboard_ctl / vigiboard_ctl.py @ 20367931

History | View | Annotate | Download (11 KB)

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

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

    
8
from tw.forms import validators 
9

    
10
from pylons.i18n import ugettext as _, lazy_ugettext as l_
11

    
12
from sqlalchemy import sql, not_ , and_ , asc , desc, or_
13

    
14
from vigiboard.lib.base import TGController
15
from vigiboard.model import DBSession
16

    
17
from vigiboard.model.vigiboard_bdd import *
18
from vigiboard.controllers.vigiboard_ctl.userutils import GetUserGroups
19
from repoze.what.predicates import Any,not_anonymous
20

    
21
from vigiboard.widgets.edit_event import edit_event_status_options
22

    
23
from vigiboard.controllers.vigiboard_ctl import VigiboardRequest, VigiboardRequestPlugin
24

    
25
__all__ = ['VigiboardController']
26

    
27
class VigiboardController(TGController):
28

    
29
    @expose()
30
    def process_form_errors (self,*argv,**kwargv):
31

    
32
        """
33
        Gestion des erreurs de validation : On affiche les erreurs
34
        puis on redirige vers la dernière page accédée.
35
        """
36
        flash(tmpl_context.form_errors,'error')
37
        if request.environ.get('HTTP_REFERER') :
38
            redirect(request.environ.get('HTTP_REFERER').split(request.environ.get('HTTP_HOST'))[1])
39
        else :
40
            redirect('1')
41

    
42
    @validate(validators={'page':validators.Int(not_empty=False)},error_handler=process_form_errors)
43
    @expose('vigiboard.templates.vigiboard')
44
    @require(Any(not_anonymous(),msg="You need to be authenticated"))
45
    def default(self,page=1,host=None,service=None,output=None,trouble_ticket=None):
46
            
47
        """
48
        Page d'accueil de Vigiboard. Elle affiche, suivant la page demandée (page 1 par
49
        defaut), la liste des évènements, rangé par ordre de prise en compte puis de sévérité.
50
        Pour accéder à cette page, l'utilisateur doit être authentifié.
51

52
        @param page: numéro de la page souhaité, commence à 1
53
        @param host: Si l'utilisateur souhaite sélectionner seulement certains
54
                     évènments suivant leur hôte, il peut placer une expression
55
                     ici en suivant la structure du LIKE en SQL
56
        @param service: Idem que host mais sur les services
57
        @param output: Idem que host mais sur le text explicatif
58
        @param trouble_ticket: Idem que host mais sur les tickets attribués
59
        """
60

    
61
        if page < 1 :
62
            page = 1
63

    
64
        ev = VigiboardRequest()
65

    
66
        # Création d'un plugin affichant le nombre de service impactés par un évènement
67
        class PluginSHN (VigiboardRequestPlugin):
68
            def show(self,rq):
69
                if rq[1] : 
70
                    return rq[2]
71
                else :
72
                    return None
73

    
74
        # Intégration de celui-ci à la requête en cours
75
        ev.AddPlugin(PluginSHN(
76
            table=[ServiceHautNiveau.servicename_dep,sql.func.count(Events.idevent)],
77
            outerjoin=[(ServiceHautNiveau,ServiceHautNiveau.servicename_dep == Events.servicename)],
78
            groupby=[(Events.idevent)],
79
            name=_(u'SHNs impacté'),
80
            style={'style':'text-align:center'}
81
           ))
82

    
83
        # Application des filtres si nécessaire
84
        if host :
85
            ev.AddFilter(Events.hostname.like('%%%s%%' % host))
86
        if service :
87
            ev.AddFilter(Events.servicename.like('%%%s%%' % service))
88
        if output :
89
            ev.AddFilter(Events.output.like('%%%s%%' % output))
90
        if trouble_ticket :
91
            ev.AddFilter(Events.trouble_ticket.like('%%%s%%' % trouble_ticket))
92

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

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

    
103
        ev.FormatEvents(id_first_row,id_last_row)
104
        ev.GenerateTmplContext() 
105

    
106
        return dict(
107
               events=ev.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
            )
117
       
118
    @validate(validators={'id':validators.Int(not_empty=True)},error_handler=process_form_errors)
119
    @expose('json')
120
    @require(Any(not_anonymous(),msg=_("You need to be authenticated")))
121
    def HistoryDialog ( self , id ) :
122
        
123
        """
124
        JSon renvoyant les éléments pour l'affichage de la fenêtre de dialogue
125
        contenant des liens internes et externes.
126
        Pour accéder à cette page, l'utilisateur doit être authentifié.
127

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

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

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

    
158
    @validate(validators={'idevent':validators.Int(not_empty=True)},error_handler=process_form_errors)
159
    @expose('vigiboard.templates.vigiboard')
160
    @require(Any(not_anonymous(),msg=_("You need to be authenticated")))
161
    def event(self,idevent):
162
        """
163
        Affichage de l'historique d'un évènement.
164
        Pour accéder à cette page, l'utilisateur doit être authentifié.
165

166
        @param idevent: identifiant de l'évènement souhaité
167
        """
168

    
169
        ev = VigiboardRequest()
170
        ev.AddFilter(Events.idevent == idevent)
171
        
172
        # Vérification que l'évènement existe
173
        if ev.NumRows() != 1 :
174
            flash(_('Error in DB'),'error')
175
            redirect('1')
176
       
177
        ev.FormatEvents(0,1)
178
        ev.FormatHistory()
179
        ev.GenerateTmplContext() 
180

    
181
        return dict(
182
               events=ev.events,
183
               id_first_row=1,
184
               id_last_row=1,
185
               total_row=1,
186
               pages=[1],
187
               page=1,
188
               event_edit_status_options=edit_event_status_options,
189
               history=ev.hist,
190
               hist_error = True
191
            )
192
    @validate(validators={'host':validators.NotEmpty(),'service':validators.NotEmpty()},error_handler=process_form_errors)
193
    @expose('vigiboard.templates.vigiboard')
194
    @require(Any(not_anonymous(),msg=_("You need to be authenticated")))
195
    def host_service(self,host,service):
196
        
197
        """
198
        Affichage de l'historique de l'ensemble des évènements correspondant au
199
        host et service demandé.
200
        Pour accéder à cette page, l'utilisateur doit être authentifié.
201

202
        @param host: Nom de l'hôte souhaité.
203
        @param service: Nom du service souhaité
204
        """
205

    
206
        ev = VigiboardRequest()
207
        ev.AddFilter(Events.hostname == host,Events.servicename == service)
208
        
209
        # Vérification qu'il y a au moins 1 évènement qui correspond
210
        if ev.NumRows() == 0 :
211
            redirect('1')
212
       
213
        ev.FormatEvents(0,ev.NumRows())
214
        ev.FormatHistory()
215
        ev.GenerateTmplContext() 
216

    
217
        return dict(
218
               events=ev.events,
219
               id_first_row=1,
220
               id_last_row=1,
221
               total_row=1,
222
               pages=[1],
223
               page=1,
224
               event_edit_status_options=edit_event_status_options,
225
               history=ev.hist,
226
               hist_error = True
227
            )
228

    
229
    @expose('vigiboard.templates.vigiboard_update')
230
    @validate(validators={
231
        "id":validators.Regex(r'^[0-9]+(,[0-9]*)*,?$'),
232
        "trouble_ticket":validators.Regex(r'^[0-9]*$'),
233
        "status":validators.OneOf(['NoChange','None', 'Acknowledged', 'AAClosed'])
234
        },error_handler=process_form_errors)
235
    @require(Any(not_anonymous(),msg=_("You need to be authenticated")))
236
    def update(self,*argv,**krgv):
237
        
238
        """
239
        Mise à jour d'un évènement suivant les arguments passés.
240
        Cela peut être un changement de ticket ou un changement de statu.
241
        
242
        @param krgv['id']: Le ou les identifiants des évènements à traiter
243
        @param krgv['tt']: Nouveau numéro du ticket associé.
244
        @param krgv['status']: Nouveau status de/des évènements.
245
        """
246
        
247
        # Si l'utilisateur édite plusieurs évènements à la fois, il nous faut chacun
248
        # des identifiants
249

    
250
        ids = krgv['id'].split(',')
251
       
252
        if len(ids) > 1 :
253
            ids = ids[:-1]
254
        
255
        ev = VigiboardRequest()
256
        ev.AddFilter(Events.idevent.in_(ids))
257
        
258
        # Vérification que au moins un des identifiants existe et est éditable
259
        if ev.NumRows() <= 0 :
260
            flash(_('No access to this event'),'error')
261
            redirect('1')
262
        
263
        # Modification des évènements et création d'un historique pour chacun d'eux
264
        for event in ev.rq :
265
            if krgv['trouble_ticket'] != '' :
266
                event.trouble_ticket = krgv['trouble_ticket']
267
                history = EventHistory(type_action="Ticket change",idevent=event.idevent,value='',text='',username=request.environ.get('repoze.who.identity').get('repoze.who.userid'))
268
                DBSession.add(history)   
269
            if krgv['status'] != 'NoChange' :
270
                event.status = krgv['status']
271
                history = EventHistory(type_action="Acknowlegement change state",idevent=event.idevent,value='',text='',username=request.environ.get('repoze.who.identity').get('repoze.who.userid'))
272
                DBSession.add(history)
273
       
274
        flash(_('Updated successfully'))
275

    
276
        # Redirection vers la dernière page accédée
277
        redirect(request.environ.get('HTTP_REFERER').split(request.environ.get('HTTP_HOST'))[1])
278