Project

General

Profile

Revision 94f31908

ID94f31908eff8d0e8871b696f05cf96dafa5ee55f
Parent d5ffcf1f
Child eab949e2

Added by Francois POIROTTE over 14 years ago

Renommage du dossier des plugins de VigiBoard en "plugins/", dans le code python et les templates.
Quelques corrections dans le RootController de VigiBoard.
Renommage du plugin "history" en "details" pour plus de cohérence avec le code HTML qu'il génère.

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@2168 b22e2e97-25c9-44ff-b637-2e5ceca36478

View differences:

vigiboard/config/app_cfg.py
57 57

  
58 58
# Configuration des liens
59 59
# Les elements suivants peuvent etre utilises dans la chaine de formatage :
60
# - idcorrevent : identifiant de l'aggregat (alerte correlee)
61
# - host : le nom de l'hote concerne par l'alerte
62
# - service : le nom du service concerne par l'alerte
63
# - message : le message transmis par Nagios dans l'alerte
60
# - %(idcorrevent)d : identifiant de l'aggregat (alerte correlee)
61
# - %(host)s : le nom de l'hote concerne par l'alerte
62
# - %(service)s : le nom du service concerne par l'alerte
63
# - %(message) : le message transmis par Nagios dans l'alerte
64 64
base_config['vigiboard_links.eventdetails'] = {
65 65
    'nagios': ['Nagios host details', 'http://example1.com/%(idcorrevent)d'],
66 66
    'metrology': ['Metrology details', 'http://example2.com/%(idcorrevent)d'],
......
70 70
}
71 71

  
72 72
# URL des tickets, possibilités:
73
# - %(idaggregate)s
73
# - %(idcorrevent)d
74 74
# - %(host)s
75 75
# - %(service)s
76 76
# - %(tt)s
77 77
base_config['vigiboard_links.tt'] = 'http://example4.com/%(idcorrevent)d/%(tt)s'
78 78

  
79 79
# Plugins to use
80
base_config['vigiboard_plugins'] = [
81
    ('history', 'PluginHistory'),
82
    ('date', 'PluginDate'),
83
    ('priority', 'PluginPriority'),
84
    ('occurrences', 'PluginOccurrences'),
85
    ('hostname', 'PluginHostname'),
86
    ('servicename', 'PluginServicename'),
87
    ('output', 'PluginOutput'),
88
    ('hls', 'PluginHLS'),
89
    ('tt', 'PluginTroubleTicket'),
90
    ('status', 'PluginStatus'),
91

  
92
    # Le plugin PluginId peut servir pour débuguer VigiBoard.
93
    # En production, mieux vaut le désactiver car il expose
94
    # des données d'un niveau assez bas dans l'interface.
95
#    ('id', 'PluginId'),
80
base_config['vigiboard_plugins'] = [#{
81
#    'correvent': [
82
        ('details', 'PluginDetails'),
83
        ('date', 'PluginDate'),
84
        ('priority', 'PluginPriority'),
85
        ('occurrences', 'PluginOccurrences'),
86
        ('hostname', 'PluginHostname'),
87
        ('servicename', 'PluginServicename'),
88
        ('output', 'PluginOutput'),
89
        ('hls', 'PluginHLS'),
90
        ('tt', 'PluginTroubleTicket'),
91
        ('status', 'PluginStatus'),
92

  
93
        # Le plugin PluginId peut servir pour débuguer VigiBoard.
94
        # En production, mieux vaut le désactiver car il expose
95
        # des données d'un niveau assez bas dans l'interface.
96
#        ('id', 'PluginId'),
97
#    ],
98

  
99
#    'event': [
100
#        ('timestamp', 'PluginTimestamp'),
101
#        ('hostname', 'PluginHostname'),
102
#        ('servicename', 'PluginServicename'),
103
#        ('current_state', 'PluginCurrentState'),
104
#        ('initial_state', 'PluginInitialState'),
105
#        ('peak_state', 'PluginPeakState'),
106
#        ('output', 'PluginOutput'),
107
#        ('history_link', 'PluginHistoryLink'),
108
#    ],
109

  
110
#    'eventhistory': [
111
#        
112
#    ],
113
#}
96 114
]
97 115

  
98 116
base_config['vigiboard_refresh_times'] = (
vigiboard/controllers/plugins/__init__.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Module complémentaire générique.
5
"""
6

  
7
from pylons.i18n import ugettext as _
8

  
9
class VigiboardRequestPlugin(object):
10
    """
11
    Classe que les plugins de VigiBoard doivent étendre.
12
    """
13

  
14
    def __init__ (self, table = None, join = None, outerjoin = None,
15
            filters = None, groupby = None, orderby = None, name = '',
16
            style = None, object_name = ""):
17
        self.table = table
18
        self.join = join
19
        self.outerjoin = outerjoin
20
        self.filter = filters
21
        self.orderby = orderby
22
        self.name = name
23
        self.groupby = groupby
24
        self.style = style
25
        self.object_name = object_name
26

  
27
    def get_value(self, idcorrevent, *args, **kwargs):
28
        """
29
        Cette méthode est appelée depuis le template associé à ce plugin,
30
        mais également lorsque l'on demande la valeur du plugin grâce à la
31
        méthode get_plugin_value du L{RootController} de VigiBoard.
32

  
33
        Cette méthode DEVRAIT être surchargée dans les classes dérivées.
34

  
35
        @param idcorrevent: Identifiant du L{CorrEvent} à interroger.
36
        @type idcorrevent: C{int}
37
        @return: Dictionnaire contenant un texte statique.
38
        @rtype: C{dict}
39
        """
40
        pass
41

  
42
    def get_generated_columns_count(self):
43
        """
44
        Cette méthode renvoie le nombre de colonnes ajoutées dans le tableau
45
        des événements par ce plugin. Par défaut, on suppose que chaque plugin
46
        n'ajoute qu'une seule colonne au tableau.
47

  
48
        Cette méthode PEUT être surchargée dans les classes dérivées.
49

  
50
        @return: Nombre de colonnes ajoutées par ce plugin.
51
        @rtype: C{int}
52
        """
53
        return 1
54

  
vigiboard/controllers/plugins/date.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec la date à laquelle
5
est survenu un événement et la durée depuis laquelle l'événement est actif.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.plugins import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginDate(VigiboardRequestPlugin):
17
    """Plugin pour l'ajout d'une colonne Date."""
18
    pass
19

  
vigiboard/controllers/plugins/details.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec les liens vers les
5
entrées d'historiques liées à l'événement, ainsi que les liens vers les
6
applications externes.
7
"""
8

  
9
import urllib
10

  
11
from tg.exceptions import HTTPForbidden
12
from tg import flash, request, config, redirect, url
13
from pylons.i18n import ugettext as _
14

  
15
from vigiboard.controllers.vigiboardrequest import VigiboardRequest
16
from vigiboard.controllers.plugins import VigiboardRequestPlugin
17
from vigilo.models.configure import DBSession
18
from vigilo.models import User, CorrEvent, Event, StateName
19

  
20
class PluginDetails(VigiboardRequestPlugin):
21
    """
22
    Plugin qui ajoute des liens vers les historiques et les applications
23
    externes.
24
    """
25

  
26
    def get_value(self, idcorrevent, *args, **kwargs):
27
        """
28
        Renvoie les éléments pour l'affichage de la fenêtre de dialogue
29
        contenant des détails sur un événement corrélé.
30

  
31
        @param idcorrevent: identifiant de l'événement corrélé.
32
        @type idcorrevent: C{int}
33
        """
34

  
35
        # Obtention de données sur l'événement et sur son historique
36
        username = request.environ.get('repoze.who.identity'
37
                    ).get('repoze.who.userid')
38

  
39
        username = request.environ['repoze.who.identity']['repoze.who.userid']
40
        events = VigiboardRequest(User.by_user_name(username))
41
        events.add_table(
42
            Event,
43
            events.items.c.hostname,
44
            events.items.c.servicename,
45
        )
46
        events.add_join((CorrEvent, CorrEvent.idcause == Event.idevent))
47
        events.add_join((events.items, 
48
            Event.idsupitem == events.items.c.idsupitem))
49
        events.add_filter(CorrEvent.idcorrevent == idcorrevent)
50

  
51
        # Vérification que au moins un des identifiants existe et est éditable
52
        if events.num_rows() != 1:
53
            raise HTTPForbidden()
54

  
55
        event = events.req[0]
56
        eventdetails = {}
57
        for edname, edlink in \
58
                config['vigiboard_links.eventdetails'].iteritems():
59

  
60
            # Rappel:
61
            # event[0] = priorité de l'alerte corrélée.
62
            # event[1] = alerte brute.
63
            if event.servicename:
64
                service = urllib.quote(event.servicename)
65
            else:
66
                service = None
67

  
68
            eventdetails[edname] = edlink[1] % {
69
                'idcorrevent': idcorrevent,
70
                'host': urllib.quote(event.hostname),
71
                'service': service,
72
                'message': urllib.quote(event[0].message),
73
            }
74

  
75
        return dict(
76
                current_state = StateName.value_to_statename(
77
                                    event[0].current_state),
78
                initial_state = StateName.value_to_statename(
79
                                    event[0].initial_state),
80
                peak_state = StateName.value_to_statename(
81
                                    event[0].peak_state),
82
                idcorrevent = idcorrevent,
83
                host = event.hostname,
84
                service = event.servicename,
85
                eventdetails = eventdetails,
86
                idcause = event[0].idevent,
87
            )
88

  
89

  
vigiboard/controllers/plugins/hls.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec les services de haut
5
niveau (L{HighLevelService}) impactés par un événement.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.plugins import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, CorrEvent, Event, SupItem
14

  
15
class PluginHLS(VigiboardRequestPlugin):
16
    """
17
    Plugin qui permet de voir les services de haut niveau impactés par
18
    un événement.
19
    """
20
    def get_value(self, idcorrevent):
21
        """
22
        Renvoie le nom des services de haut niveau impactés par l'événement.
23

  
24
        @param idcorrevent: Identifiant de l'événement corrélé.
25
        @type idcorrevent: C{int}
26
        @return: Un dictionnaire dont la clé "services" contient une liste
27
            des noms des services de haut niveau impactés par l'événement
28
            corrélé dont l'identifiant est L{idcorrevent}.
29
        """
30
        supitem = self.get_correvent_supitem(idcorrevent)
31

  
32
        if not supitem:
33
            return []
34

  
35
        services = supitem.impacted_hls(
36
            HighLevelService.servicename
37
        ).distinct().order_by(
38
            HighLevelService.servicename.asc()
39
        ).all()
40

  
41
        return {'services': [service.servicename for service in services]}
42

  
43
    def get_correvent_supitem(self, idcorrevent):
44
        """
45
        Retourne le supitem ayant causé l'évènement 
46
        corrélé dont l'identifiant est passé en paramètre.
47
        """
48
        # On récupère l'item recherché dans la BDD
49
        supitem = DBSession.query(SupItem
50
            ).join(
51
                (Event, Event.idsupitem == SupItem.idsupitem),
52
                (CorrEvent, CorrEvent.idcause == Event.idevent),
53
            ).filter(CorrEvent.idcorrevent == idcorrevent).first()
54
        return supitem
55

  
vigiboard/controllers/plugins/hostname.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec le nom de l'hôte
5
sur lequel porte l'événement corrélé.
6
"""
7
from vigiboard.controllers.plugins import VigiboardRequestPlugin
8

  
9
class PluginHostname(VigiboardRequestPlugin):
10
    """
11
    Ajoute une colonne avec le nom de l'hôte impacté par un événement corrélé.
12
    """
13

  
vigiboard/controllers/plugins/id.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec l'identifiant
5
de l'événement corrélé.
6
Ce plugin n'a d'intérêt que pour débuguer l'application.
7
"""
8

  
9
from vigiboard.controllers.plugins import VigiboardRequestPlugin
10

  
11
class PluginId(VigiboardRequestPlugin):
12
    """Plugin de debug qui affiche l'identifiant de l'événement corrélé."""
13
    pass
14

  
vigiboard/controllers/plugins/occurrences.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec le nombre
5
d'occurrences d'un événement corrélé donné.
6
"""
7
from vigiboard.controllers.plugins import VigiboardRequestPlugin
8

  
9
class PluginOccurrences(VigiboardRequestPlugin):
10
    """
11
    Ce plugin affiche le nombre d'occurrences d'un événement corrélé.
12
    Ce compteur d'occurrences est mis à jour automatiquement par le
13
    corrélateur chaque fois qu'un événement brut survient sur la cause
14
    de l'événement corrélé.
15
    """
16
    pass
17

  
vigiboard/controllers/plugins/output.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec la sortie
5
de la commande de test exécutée par Nagios sur cet hôte/service.
6
"""
7
from vigiboard.controllers.plugins import VigiboardRequestPlugin
8

  
9
class PluginOutput(VigiboardRequestPlugin):
10
    """Ajoute une colonne avec le message de Nagios."""
11

  
vigiboard/controllers/plugins/priority.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec la priorité
5
ITIL de l'événement corrélé.
6
"""
7
from vigiboard.controllers.plugins import VigiboardRequestPlugin
8

  
9
class PluginPriority(VigiboardRequestPlugin):
10
    """
11
    Ce plugin affiche la priorité ITIL des événements corrélés.
12
    La priorité est un nombre entier et permet de classer les événements
13
    corrélés dans l'ordre qui semble le plus approprié pour que les
14
    problèmes les plus urgents soient traités en premier.
15

  
16
    La priorité des événements peut être croissante (plus le nombre est
17
    élevé, plus il est urgent de traiter le problème) ou décroissante
18
    (ordre opposé). L'ordre utilisé par VigiBoard pour le tri est
19
    défini dans la variable de configuration C{vigiboard_priority_order}.
20
    """
21

  
vigiboard/controllers/plugins/servicename.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec le nom du service
5
à l'origine de l'événement corrélé.
6
"""
7
from vigiboard.controllers.plugins import VigiboardRequestPlugin
8

  
9
class PluginServicename(VigiboardRequestPlugin):
10
    """
11
    Affiche le nom du service à l'origine de l'événement corrélé.
12
    Si l'événement corrélé porte directement sur un hôte,
13
    alors le nom de service vaut None.
14
    """
15

  
vigiboard/controllers/plugins/status.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute 3 colonnes au tableau des événements :
5
-   la première colonne contient l'état d'acquittement de l'événement.
6
-   la seconde colonne contient un lien permettant d'éditer certaines
7
    propriétés associées à l'événement corrélé.
8
-   la dernière colonne permet de (dé)sélectionner l'événement pour
9
    effectuer un traitement par lot.
10
"""
11
from vigiboard.controllers.plugins import VigiboardRequestPlugin
12

  
13
class PluginStatus(VigiboardRequestPlugin):
14
    """
15
    Ajoute des colonnes permettant de voir le statut d'acquittement
16
    d'un événement corrélé et de modifier certaines de ses propriétés.
17
    """
18

  
19
    def get_generated_columns_count(self):
20
        """
21
        Renvoie le nombre de colonnes que ce plugin ajoute.
22
        Ce plugin en ajoute 3, au lieu de 1 comme la plupart des plugins.
23
        """
24
        return 3
25

  
vigiboard/controllers/plugins/test.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Ce fichier contient un exemple de plugin pour l'interface
5
de VigiBoard. Il s'accompagne d'un template contenu dans
6
les thèmes, dans le répertoire suivant :
7
vigilo/themes/templates/vigiboard/plugins/test.html
8
"""
9
from vigiboard.controllers.plugins import VigiboardRequestPlugin
10

  
11
class PluginTest(VigiboardRequestPlugin):
12
    """
13
    Un plugin de démonstration qui se contente d'afficher
14
    "Hello world" pour chaque événement du tableau.
15
    """
16

  
17
    def get_value(self, *args, **kwargs):
18
        """
19
        Cette méthode est appelée depuis le template associé à ce plugin,
20
        mais également lorsque l'on demande la valeur du plugin grâce à la
21
        méthode get_plugin_value du L{RootController} de VigiBoard.
22

  
23
        @param idcorrevent: Identifiant du L{CorrEvent} à interroger.
24
        @type idcorrevent: C{int}
25
        @return: Dictionnaire contenant un texte statique.
26
        @rtype: C{dict}
27
        """
28
        return {'text': 'Hello world'}
29

  
vigiboard/controllers/plugins/tt.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec un lien vers le ticket
5
d'incidence se rapportant à un événement corrélé donné.
6
"""
7
from vigiboard.controllers.plugins import VigiboardRequestPlugin
8

  
9
class PluginTroubleTicket(VigiboardRequestPlugin):
10
    """Ajoute un lien vers le ticket d'incidence associé à l'événement."""
11

  
vigiboard/controllers/root.py
276 276
    @require(Any(not_anonymous(), msg=l_("You need to be authenticated")))
277 277
    def event(self, idevent, page=1):
278 278
        """
279
        Affichage de l'historique d'un événement.
279
        Affichage de l'historique d'un événement brut.
280 280
        Pour accéder à cette page, l'utilisateur doit être authentifié.
281 281

  
282
        @param idevent: identifiant de l'événement souhaité
282
        @param idevent: identifiant de l'événement brut souhaité.
283
        @type idevent: C{int}
283 284
        """
284 285
        if not page:
285 286
            page = 1
286 287

  
287 288
        username = request.environ['repoze.who.identity']['repoze.who.userid']
288
        events = VigiboardRequest(User.by_user_name(username))
289
        events = VigiboardRequest(User.by_user_name(username), False)
289 290
        events.add_table(
290 291
            Event,
291 292
            events.items.c.hostname,
292 293
            events.items.c.servicename,
293 294
        )
295
        events.add_join((EVENTSAGGREGATE_TABLE, EVENTSAGGREGATE_TABLE.c.idevent == Event.idevent))
296
        events.add_join((CorrEvent, CorrEvent.idcorrevent == EVENTSAGGREGATE_TABLE.c.idcorrevent))
294 297
        events.add_join((events.items, 
295 298
            Event.idsupitem == events.items.c.idsupitem))
299
        events.add_filter(Event.idevent == idevent)
296 300

  
297 301
        if events.num_rows() != 1:
298 302
            flash(_('No such event or access denied'), 'error')
......
376 380

  
377 381
        # Vérification qu'il y a au moins 1 événement qui correspond
378 382
        total_rows = aggregates.num_rows()
379
        if total_rows == 0 :
383
        if not total_rows:
380 384
            flash(_('No access to this host/service or no event yet'), 'error')
381 385
            redirect('/')
382 386

  
......
473 477
            raise redirect(request.environ.get('HTTP_REFERER', url('/')))
474 478
        
475 479
        # Vérification que au moins un des identifiants existe et est éditable
476
        if events.num_rows() <= 0:
480
        if not events.num_rows():
477 481
            flash(_('No access to this event'), 'error')
478 482
            redirect('/')
479 483
        
......
554 558
        plugin_class = plugin_class[0]
555 559
        try:
556 560
            mypac = __import__(
557
                'vigiboard.controllers.vigiboard_plugin.' + plugin_name,
561
                'vigiboard.controllers.plugins.' + plugin_name,
558 562
                globals(), locals(), [plugin_class], -1)
559 563
            plugin = getattr(mypac, plugin_class)
560 564
            if callable(plugin):
......
626 630
    for (plugin_name, plugin_class) in plugins:
627 631
        try:
628 632
            mypac = __import__(
629
                'vigiboard.controllers.vigiboard_plugin.' + plugin_name,
633
                'vigiboard.controllers.plugins.' + plugin_name,
630 634
                globals(), locals(), [plugin_class], -1)
631 635
            plugin = getattr(mypac, plugin_class)
632 636
            if callable(plugin):
vigiboard/controllers/vigiboard_plugin/__init__.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Module complémentaire générique.
5
"""
6

  
7
from pylons.i18n import ugettext as _
8

  
9
class VigiboardRequestPlugin(object):
10
    """
11
    Classe que les plugins de VigiBoard doivent étendre.
12
    """
13

  
14
    def __init__ (self, table = None, join = None, outerjoin = None,
15
            filters = None, groupby = None, orderby = None, name = '',
16
            style = None, object_name = ""):
17
        self.table = table
18
        self.join = join
19
        self.outerjoin = outerjoin
20
        self.filter = filters
21
        self.orderby = orderby
22
        self.name = name
23
        self.groupby = groupby
24
        self.style = style
25
        self.object_name = object_name
26

  
27
    def get_value(self, idcorrevent, *args, **kwargs):
28
        """
29
        Cette méthode est appelée depuis le template associé à ce plugin,
30
        mais également lorsque l'on demande la valeur du plugin grâce à la
31
        méthode get_plugin_value du L{RootController} de VigiBoard.
32

  
33
        Cette méthode DEVRAIT être surchargée dans les classes dérivées.
34

  
35
        @param idcorrevent: Identifiant du L{CorrEvent} à interroger.
36
        @type idcorrevent: C{int}
37
        @return: Dictionnaire contenant un texte statique.
38
        @rtype: C{dict}
39
        """
40
        pass
41

  
42
    def get_generated_columns_count(self):
43
        """
44
        Cette méthode renvoie le nombre de colonnes ajoutées dans le tableau
45
        des événements par ce plugin. Par défaut, on suppose que chaque plugin
46
        n'ajoute qu'une seule colonne au tableau.
47

  
48
        Cette méthode PEUT être surchargée dans les classes dérivées.
49

  
50
        @return: Nombre de colonnes ajoutées par ce plugin.
51
        @rtype: C{int}
52
        """
53
        return 1
54

  
vigiboard/controllers/vigiboard_plugin/date.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec la date à laquelle
5
est survenu un événement et la durée depuis laquelle l'événement est actif.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginDate(VigiboardRequestPlugin):
17
    """Plugin pour l'ajout d'une colonne Date."""
18
    pass
19

  
vigiboard/controllers/vigiboard_plugin/history.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec les liens vers les
5
entrées d'historiques liées à l'événement, ainsi que les liens vers les
6
applications externes.
7
"""
8

  
9
import urllib
10

  
11
from tg.exceptions import HTTPNotFound
12
from tg import flash, request, config, redirect, url
13
from pylons.i18n import ugettext as _
14

  
15
from vigiboard.controllers.vigiboardrequest import VigiboardRequest
16
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
17
from vigilo.models.configure import DBSession
18
from vigilo.models import User, CorrEvent, Event, StateName
19

  
20
class PluginHistory(VigiboardRequestPlugin):
21
    """
22
    Plugin qui ajoute des liens vers les historiques et les applications
23
    externes.
24
    """
25

  
26
    def get_value(self, idcorrevent, *args, **kwargs):
27
        """
28
        Renvoie les éléments pour l'affichage de la fenêtre de dialogue
29
        contenant des liens internes et externes.
30
        Pour accéder à cette page, l'utilisateur doit être authentifié.
31

  
32
        @param id: identifiant de l'événement
33
        """
34

  
35
        # Obtention de données sur l'événement et sur son historique
36
        username = request.environ.get('repoze.who.identity'
37
                    ).get('repoze.who.userid')
38

  
39
        username = request.environ['repoze.who.identity']['repoze.who.userid']
40
        events = VigiboardRequest(User.by_user_name(username))
41
        events.add_table(
42
            Event,
43
            events.items.c.hostname,
44
            events.items.c.servicename,
45
        )
46
        events.add_join((CorrEvent, CorrEvent.idcause == Event.idevent))
47
        events.add_join((events.items, 
48
            Event.idsupitem == events.items.c.idsupitem))
49
        events.add_filter(CorrEvent.idcorrevent == idcorrevent)
50

  
51
        # Vérification que au moins un des identifiants existe et est éditable
52
        # TODO: on est dans du JSON, donc flash/redirect ne fonctionneront pas!
53
        if events.num_rows() != 1:
54
            flash(_('No access to this event'), 'error')
55
            redirect('/')
56

  
57
        event = events.req[0]
58
        eventdetails = {}
59
        for edname, edlink in \
60
                config['vigiboard_links.eventdetails'].iteritems():
61

  
62
            # Rappel:
63
            # event[0] = priorité de l'alerte corrélée.
64
            # event[1] = alerte brute.
65
            if event.servicename:
66
                service = urllib.quote(event.servicename)
67
            else:
68
                service = None
69

  
70
            eventdetails[edname] = edlink[1] % {
71
                'idcorrevent': idcorrevent,
72
                'host': urllib.quote(event.hostname),
73
                'service': service,
74
                'message': urllib.quote(event[0].message),
75
            }
76

  
77
        return dict(
78
                current_state = StateName.value_to_statename(
79
                                    event[0].current_state),
80
                initial_state = StateName.value_to_statename(
81
                                    event[0].initial_state),
82
                peak_state = StateName.value_to_statename(
83
                                    event[0].peak_state),
84
                idcorrevent = idcorrevent,
85
                host = event.hostname,
86
                service = event.servicename,
87
                eventdetails = eventdetails,
88
                idcause = event[0].idevent,
89
            )
90

  
91

  
vigiboard/controllers/vigiboard_plugin/hls.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec les services de haut
5
niveau (L{HighLevelService}) impactés par un événement.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginHLS(VigiboardRequestPlugin):
17
    """
18
    Plugin qui permet de voir les services de haut niveau impactés par
19
    un événement.
20
    """
21
    def get_value(self, idcorrevent):
22
        """
23
        Renvoie le nom des services de haut niveau impactés par l'événement.
24

  
25
        @param idcorrevent: Identifiant de l'événement corrélé.
26
        @type idcorrevent: C{int}
27
        @return: Un dictionnaire dont la clé "services" contient une liste
28
            des noms des services de haut niveau impactés par l'événement
29
            corrélé dont l'identifiant est L{idcorrevent}.
30
        """
31
        supitem = self.get_correvent_supitem(idcorrevent)
32

  
33
        if not supitem:
34
            return []
35

  
36
        services = supitem.impacted_hls(
37
            HighLevelService.servicename
38
        ).distinct().order_by(
39
            HighLevelService.servicename.asc()
40
        ).all()
41

  
42
        return {'services': [service.servicename for service in services]}
43

  
44
    def get_correvent_supitem(self, idcorrevent):
45
        """
46
        Retourne le supitem ayant causé l'évènement 
47
        corrélé dont l'identifiant est passé en paramètre.
48
        """
49
        # On récupère l'item recherché dans la BDD
50
        supitem = DBSession.query(SupItem
51
            ).join(
52
                (Event, Event.idsupitem == SupItem.idsupitem),
53
                (CorrEvent, CorrEvent.idcause == Event.idevent),
54
            ).filter(CorrEvent.idcorrevent == idcorrevent).first()
55
        return supitem
56

  
vigiboard/controllers/vigiboard_plugin/hostname.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec le nom de l'hôte
5
sur lequel porte l'événement corrélé.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginHostname(VigiboardRequestPlugin):
17
    """
18
    Ajoute une colonne avec le nom de l'hôte impacté par un événement corrélé.
19
    """
20

  
vigiboard/controllers/vigiboard_plugin/id.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec l'identifiant
5
de l'événement corrélé.
6
Ce plugin n'a d'intérêt que pour débuguer l'application.
7
"""
8

  
9
from pylons.i18n import ugettext as _
10
from tg import url
11

  
12
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
13
from vigilo.models.configure import DBSession
14
from vigilo.models import HighLevelService, \
15
                            CorrEvent, Event, SupItem
16

  
17
class PluginId(VigiboardRequestPlugin):
18
    """Plugin de debug qui affiche l'identifiant de l'événement corrélé."""
19
    pass
20

  
vigiboard/controllers/vigiboard_plugin/occurrences.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec le nombre
5
d'occurrences d'un événement corrélé donné.
6
"""
7

  
8

  
9
from pylons.i18n import ugettext as _
10
from tg import url
11

  
12
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
13
from vigilo.models.configure import DBSession
14
from vigilo.models import HighLevelService, \
15
                            CorrEvent, Event, SupItem
16

  
17
class PluginOccurrences(VigiboardRequestPlugin):
18
    """
19
    Ce plugin affiche le nombre d'occurrences d'un événement corrélé.
20
    Ce compteur d'occurrences est mis à jour automatiquement par le
21
    corrélateur chaque fois qu'un événement brut survient sur la cause
22
    de l'événement corrélé.
23
    """
24
    pass
25

  
vigiboard/controllers/vigiboard_plugin/output.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec la sortie
5
de la commande de test exécutée par Nagios sur cet hôte/service.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginOutput(VigiboardRequestPlugin):
17
    """Ajoute une colonne avec le message de Nagios."""
18

  
vigiboard/controllers/vigiboard_plugin/priority.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec la priorité
5
ITIL de l'événement corrélé.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginPriority(VigiboardRequestPlugin):
17
    """
18
    Ce plugin affiche la priorité ITIL des événements corrélés.
19
    La priorité est un nombre entier et permet de classer les événements
20
    corrélés dans l'ordre qui semble le plus approprié pour que les
21
    problèmes les plus urgents soient traités en premier.
22

  
23
    La priorité des événements peut être croissante (plus le nombre est
24
    élevé, plus il est urgent de traiter le problème) ou décroissante
25
    (ordre opposé). L'ordre utilisé par VigiBoard pour le tri est
26
    défini dans la variable de configuration C{vigiboard_priority_order}.
27
    """
28

  
vigiboard/controllers/vigiboard_plugin/servicename.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec le nom du service
5
à l'origine de l'événement corrélé.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginServicename(VigiboardRequestPlugin):
17
    """
18
    Affiche le nom du service à l'origine de l'événement corrélé.
19
    Si l'événement corrélé porte directement sur un hôte,
20
    alors le nom de service vaut None.
21
    """
22

  
vigiboard/controllers/vigiboard_plugin/status.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute 3 colonnes au tableau des événements :
5
-   la première colonne contient l'état d'acquittement de l'événement.
6
-   la seconde colonne contient un lien permettant d'éditer certaines
7
    propriétés associées à l'événement corrélé.
8
-   la dernière colonne permet de (dé)sélectionner l'événement pour
9
    effectuer un traitement par lot.
10
"""
11

  
12
from pylons.i18n import ugettext as _
13
from tg import url
14

  
15
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
16
from vigilo.models.configure import DBSession
17
from vigilo.models import HighLevelService, \
18
                            CorrEvent, Event, SupItem
19

  
20
class PluginStatus(VigiboardRequestPlugin):
21
    """
22
    Ajoute des colonnes permettant de voir le statut d'acquittement
23
    d'un événement corrélé et de modifier certaines de ses propriétés.
24
    """
25

  
26
    def get_generated_columns_count(self):
27
        """
28
        Renvoie le nombre de colonnes que ce plugin ajoute.
29
        Ce plugin en ajoute 3, au lieu de 1 comme la plupart des plugins.
30
        """
31
        return 3
32

  
vigiboard/controllers/vigiboard_plugin/test.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""
4
Ce fichier contient un exemple de plugin pour l'interface
5
de VigiBoard. Il s'accompagne d'un template contenu dans
6
les thèmes, dans le répertoire suivant :
7
vigilo/themes/templates/vigiboard/vigiboard_plugin/test.html
8
"""
9

  
10
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
11

  
12
class PluginTest(VigiboardRequestPlugin):
13
    """
14
    Un plugin de démonstration qui se contente d'afficher
15
    "Hello world" pour chaque événement du tableau.
16
    """
17

  
18
    def get_value(self, *args, **kwargs):
19
        """
20
        Cette méthode est appelée depuis le template associé à ce plugin,
21
        mais également lorsque l'on demande la valeur du plugin grâce à la
22
        méthode get_plugin_value du L{RootController} de VigiBoard.
23

  
24
        @param idcorrevent: Identifiant du L{CorrEvent} à interroger.
25
        @type idcorrevent: C{int}
26
        @return: Dictionnaire contenant un texte statique.
27
        @rtype: C{dict}
28
        """
29
        return {'text': 'Hello world'}
30

  
vigiboard/controllers/vigiboard_plugin/tt.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""
4
Un plugin pour VigiBoard qui ajoute une colonne avec un lien vers le ticket
5
d'incidence se rapportant à un événement corrélé donné.
6
"""
7

  
8
from pylons.i18n import ugettext as _
9
from tg import url
10

  
11
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
12
from vigilo.models.configure import DBSession
13
from vigilo.models import HighLevelService, \
14
                            CorrEvent, Event, SupItem
15

  
16
class PluginTroubleTicket(VigiboardRequestPlugin):
17
    """Ajoute un lien vers le ticket d'incidence associé à l'événement."""
18

  
vigiboard/controllers/vigiboardrequest.py
18 18
                                            SERVICE_GROUP_TABLE
19 19
from vigiboard.widgets.edit_event import EditEventForm
20 20
from vigiboard.widgets.search_form import SearchForm
21
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
21
from vigiboard.controllers.plugins import VigiboardRequestPlugin
22 22

  
23 23
LOGGER = getLogger(__name__)
24 24

  
......
171 171
        for plug in config.get('vigiboard_plugins', []):
172 172
            try:
173 173
                mypac = __import__(
174
                    'vigiboard.controllers.vigiboard_plugin.' +\
174
                    'vigiboard.controllers.plugins.' +\
175 175
                            plug[0], globals(), locals(), [plug[1]], -1)
176 176
                self.add_plugin(getattr(mypac, plug[1])())
177 177
            except ImportError:
......
331 331
        self.events = []
332 332

  
333 333
        for data in self.req[first_row : last_row]:
334
            self.events.append((data[0], data.hostname, data.servicename))
334
            self.events.append(data)
335 335

  
336 336
    def format_history(self):
337 337
        """
......
358 358
        from vigiboard.controllers.root import get_last_modification_timestamp
359 359

  
360 360
        # Si les objets manipulés sont des Event, on a facilement les idevent.
361
        if isinstance(self.events[0][0], Event):
361
        if not len(self.events):
362
            ids = []
363
        elif isinstance(self.events[0][0], Event):
362 364
            ids = [data[0].idevent for data in self.events]
363 365
        # Sinon, il s'agit de CorrEvent(s) dont on récupère l'idcause.
364 366
        else:
vigiboard/tests/functional/test_history_tables.py
105 105

  
106 106
    def setUp(self):
107 107
        super(TestEventTable, self).setUp()
108
#        tg.config['vigiboard_plugins'] = [('history', 'PluginHistory')]
109 108

  
110 109
    def test_host_event_history(self):
111 110
        """Affichage de l'historique d'un évènement corrélé pour un hôte."""
vigiboard/tests/functional/test_host_vigiboardrequest.py
15 15
                            Host, HostGroup
16 16
from vigiboard.tests import TestController
17 17
from vigiboard.controllers.vigiboardrequest import VigiboardRequest
18
from vigiboard.controllers.vigiboard_plugin.tests import MonPlugin
19

  
20 18

  
21 19
class TestHostVigiboardRequest(TestController):
22 20
    """ Préparation de la base de données en vue des tests. """
......
116 114
        tg.request = response.request
117 115

  
118 116
        # Derrière, VigiboardRequest doit charger le plugin de tests tout seul
119
#        tg.config['vigiboard_plugins'] = [['test', 'MonPlugin']]
120 117
        vigi_req = VigiboardRequest(User.by_user_name(u'editor'))
121 118
        vigi_req.add_table(
122 119
            CorrEvent,
vigiboard/tests/functional/test_vigiboardrequest.py
15 15
                            Host, HostGroup, LowLevelService, ServiceGroup
16 16
from vigiboard.tests import TestController
17 17
from vigiboard.controllers.vigiboardrequest import VigiboardRequest
18
from vigiboard.controllers.vigiboard_plugin.tests import MonPlugin
19

  
20 18

  
21 19
class TestVigiboardRequest(TestController):
22 20
    """Test de la classe Vigiboard Request"""
......
186 184
        tg.request = response.request
187 185

  
188 186
        # Derrière, VigiboardRequest doit charger le plugin de tests tout seul
189
#        tg.config['vigiboard_plugins'] = [['tests', 'MonPlugin']]
190 187
        vigi_req = VigiboardRequest(User.by_user_name(u'editor'))
191 188
        vigi_req.add_table(
192 189
            CorrEvent,

Also available in: Unified diff