Revision d6c3a0c9
Correction d'une erreur d'accès
Corrections de problèmes d'affichage
Ajout de différents liens pour la navigation
Révision du système de plugin pour y ajouter des fonctionnalités
Changement dans les liens pour une gestion plus simple
git-svn-id: https://vigilo-dev.si.c-s.fr/svn@524 b22e2e97-25c9-44ff-b637-2e5ceca36478
vigiboard/config/vigiboard.py | ||
---|---|---|
6 | 6 |
'vigiboard_bdd.basename' : '', |
7 | 7 |
|
8 | 8 |
# Affichage, lien disponibles dans la fenêtre de détail d'un évènement |
9 |
'vigiboard_links.nagios' : 'http://example1.com/%(idevent)d', |
|
10 |
'vigiboard_links.metrology' : 'http://example2.com/%(idevent)d', |
|
11 |
'vigiboard_links.security' : 'http://example3.com/%(idevent)d', |
|
12 |
'vigiboard_links.servicetype' : 'http://example4.com/%(idevent)d', |
|
9 |
'vigiboard_links.eventdetails' : { |
|
10 |
'nagios' : ['Nagios host details','http://example1.com/%(idevent)d'], |
|
11 |
'metrology' : ['Metrology details','http://example2.com/%(idevent)d'], |
|
12 |
'security' : ['Security details','http://example3.com/%(idevent)d'], |
|
13 |
'servicetype' : ['Service Type','http://example4.com/%(idevent)d'] |
|
14 |
}, |
|
13 | 15 |
|
14 | 16 |
# Nombre d'évènments par pages |
15 | 17 |
'vigiboard_item_per_page' : '15', |
... | ... | |
20 | 22 |
[ 'shn' , 'PluginSHN' ] |
21 | 23 |
], |
22 | 24 |
|
23 |
} |
|
25 |
# Version de Vigiboard |
|
26 |
'vigiboard_version' : '0.1', |
|
27 |
|
|
28 |
# URL pour le logo Vigilo, si vide on renvoi sur / |
|
29 |
'vigiboard_links.logo' : '', |
|
24 | 30 |
|
31 |
# URL des tickets, possibilités: |
|
32 |
# - %(idevent)d |
|
33 |
# - %(host)s |
|
34 |
# - %(service)s |
|
35 |
# - %(tt)s |
|
36 |
'vigiboard_links.tt' : 'http://example4.com/%(idevent)d/%(tt)s' |
|
37 |
} |
vigiboard/controllers/root.py | ||
---|---|---|
75 | 75 |
page = 1 |
76 | 76 |
|
77 | 77 |
events = VigiboardRequest() |
78 |
|
|
78 |
|
|
79 |
search = 0 |
|
79 | 80 |
# Application des filtres si nécessaire |
80 | 81 |
if host : |
82 |
search = 1 |
|
81 | 83 |
events.add_filter(Events.hostname.like('%%%s%%' % host)) |
82 | 84 |
if service : |
85 |
search = 1 |
|
83 | 86 |
events.add_filter(Events.servicename.like('%%%s%%' % service)) |
84 | 87 |
if output : |
88 |
search = 1 |
|
85 | 89 |
events.add_filter(Events.output.like('%%%s%%' % output)) |
86 | 90 |
if trouble_ticket : |
91 |
search = 1 |
|
87 | 92 |
events.add_filter(Events.trouble_ticket.like( |
88 | 93 |
'%%%s%%' % trouble_ticket)) |
89 | 94 |
|
... | ... | |
110 | 115 |
event_edit_status_options = edit_event_status_options, |
111 | 116 |
history = [], |
112 | 117 |
hist_error = False, |
113 |
plugin_context = events.context_fct |
|
118 |
plugin_context = events.context_fct, |
|
119 |
search = search |
|
114 | 120 |
) |
115 | 121 |
|
116 | 122 |
@validate(validators={'idevent':validators.Int(not_empty=True)}, |
... | ... | |
147 | 153 |
severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'), |
148 | 154 |
3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'), |
149 | 155 |
6: _('Major'), 7: _('Critical') } |
150 |
|
|
156 |
eventdetails = {} |
|
157 |
for edname, edlink in tg.config['vigiboard_links.eventdetails'].iteritems(): |
|
158 |
eventdetails[edname] = edlink[1] % { |
|
159 |
'idevent': events.idevent, |
|
160 |
'host': events.hostname, |
|
161 |
'service': events.servicename |
|
162 |
} |
|
151 | 163 |
return dict( |
152 | 164 |
initial_state = severity[int(initial_state)], |
153 | 165 |
current_state = severity[events.severity], |
154 | 166 |
idevent = events.idevent, |
155 | 167 |
host = events.hostname, |
156 | 168 |
service = events.servicename, |
157 |
nagios_link = tg.config['vigiboard_links.nagios'] % \ |
|
158 |
{'idevent': events.idevent,'host': events.hostname, 'service': events.servicename}, |
|
159 |
metrology_link = tg.config['vigiboard_links.metrology'] % \ |
|
160 |
{'idevent': events.idevent,'host': events.hostname, 'service': events.servicename}, |
|
161 |
security_link = tg.config['vigiboard_links.security'] % \ |
|
162 |
{'idevent': events.idevent,'host': events.hostname, 'service': events.servicename}, |
|
163 |
servicetype_link = tg.config['vigiboard_links.servicetype'] % \ |
|
164 |
{'idevent': events.idevent,'host': events.hostname, 'service': events.servicename} |
|
165 |
|
|
169 |
eventdetails = eventdetails |
|
166 | 170 |
) |
167 | 171 |
|
168 | 172 |
@validate(validators={'idevent':validators.Int(not_empty=True)}, |
... | ... | |
199 | 203 |
event_edit_status_options = edit_event_status_options, |
200 | 204 |
history = events.hist, |
201 | 205 |
hist_error = True, |
202 |
plugin_context = events.context_fct |
|
206 |
plugin_context = events.context_fct, |
|
207 |
search = 0 |
|
203 | 208 |
) |
204 | 209 |
|
205 | 210 |
@validate(validators={'host':validators.NotEmpty(), |
... | ... | |
239 | 244 |
event_edit_status_options = edit_event_status_options, |
240 | 245 |
history = events.hist, |
241 | 246 |
hist_error = True, |
242 |
plugin_context = events.context_fct |
|
247 |
plugin_context = events.context_fct, |
|
248 |
search = 0 |
|
243 | 249 |
) |
244 | 250 |
|
245 | 251 |
@validate(validators={ |
vigiboard/controllers/vigiboardrequest.py | ||
---|---|---|
274 | 274 |
|
275 | 275 |
# Liste des éléments pour la tête du tableau |
276 | 276 |
|
277 |
lst_title = ['', _('Date<br />[Duration]'), '#', _('Host'), |
|
278 |
_('Service Type<br />Service Name'), _('Output')] |
|
279 |
lst_title.extend([plug.name for plug in self.plugin]) |
|
280 |
lst_title.extend(['[T T]', '']) |
|
281 |
|
|
277 |
lst_title = [['',{}], [_('Date')+ '<span style="font-weight:normal">' + _('<br />[Duration]') + '</span>', {}], ['#',{'style':'text-align:center'}], [_('Host'),{}], |
|
278 |
[_('Service Type<br />Service Name'),{}], [_('Output'),{}]] |
|
279 |
lst_title.extend([[plug.name,plug.style] for plug in self.plugin]) |
|
280 |
lst_title.extend([['[TT]',{'style':'text-align:center'}], ['',{}]]) |
|
282 | 281 |
events = [lst_title] |
283 | 282 |
i = 0 |
284 | 283 |
class_tr = ['odd', 'even'] |
... | ... | |
310 | 309 |
event, |
311 | 310 |
{'class': class_tr[i%2]}, |
312 | 311 |
{'class' : self.bouton_severity[event.severity] + \ |
313 |
self.class_ack[event.status]}, |
|
312 |
self.class_ack[event.status], |
|
313 |
'style' : 'text-align: center'}, |
|
314 | 314 |
{'class' : self.bouton_severity[event.severity] + \ |
315 | 315 |
self.class_ack[event.status] }, |
316 | 316 |
{'src' : '/images/%s2.png' % \ |
vigiboard/public/css/vigiboard_style.css | ||
---|---|---|
3 | 3 |
width: 99%; |
4 | 4 |
margin: auto; |
5 | 5 |
padding: 0; |
6 |
font-size: 11px;
|
|
6 |
font-size: 10px;
|
|
7 | 7 |
font-family:"Lucida Grande","Lucida Sans Unicode",geneva,verdana,sans-serif; |
8 | 8 |
} |
9 | 9 |
|
10 |
.table_top { |
|
11 |
border: solid 0px black; |
|
12 |
width: 100%; |
|
13 |
background-color: #F0F1F5; |
|
14 |
border-collapse:collapse; |
|
15 |
margin-bottom: 10px; |
|
16 |
} |
|
10 | 17 |
.vigitable { |
11 | 18 |
width: 100%; |
12 | 19 |
border-spacing: 10px; |
13 | 20 |
border-collapse: collapse; |
14 | 21 |
} |
15 | 22 |
|
16 |
.vigitable tr { |
|
23 |
.vigitable thead tr td { |
|
24 |
padding: 0px; |
|
25 |
} |
|
26 |
|
|
27 |
.vigitable tbody tr { |
|
17 | 28 |
border-style: solid; |
18 | 29 |
border-width: 1px 1px 1px 1px; |
19 | 30 |
border-color: #FFFFFF; |
20 |
padding: 5px; |
|
21 | 31 |
empty-cells: show; |
22 | 32 |
} |
23 | 33 |
|
24 |
.vigitable tr td { |
|
34 |
.vigitable tbody tr td {
|
|
25 | 35 |
border-style: solid; |
26 | 36 |
border-width: 1px 1px 1px 1px; |
27 | 37 |
border-color: #FFFFFF; |
28 |
padding: 4px;
|
|
38 |
padding: 3px;
|
|
29 | 39 |
empty-cells: show; |
30 | 40 |
} |
31 | 41 |
|
42 |
|
|
32 | 43 |
tr.odd { |
33 | 44 |
background-color: #F8F8F8; |
34 | 45 |
} |
... | ... | |
77 | 88 |
|
78 | 89 |
img { |
79 | 90 |
border: none; |
91 |
margin: 0px; |
|
80 | 92 |
} |
81 | 93 |
|
82 | 94 |
#flash, .notice { |
vigiboard/templates/vigiboard.html | ||
---|---|---|
14 | 14 |
</head> |
15 | 15 |
|
16 | 16 |
<body> |
17 |
|
|
18 |
<table class="table_top"> |
|
19 |
<tr> |
|
20 |
<td style="width: 20%;text-align: left;"> |
|
21 |
<a py:if="tg.config['vigiboard_links.logo'] != ''" href="${tg.config['vigiboard_links.logo']}"><img alt="logo" src="images/vigilo.png" style="width:58px;"/></a> |
|
22 |
<a py:if="tg.config['vigiboard_links.logo'] == ''" href="${tg.url('/')}"><img alt="logo" src="images/vigilo.png" style="width:58px;"/></a> |
|
23 |
v${tg.config['vigiboard_version']}</td> |
|
24 |
<td style="text-align: center"> |
|
25 |
<span py:if="search == 1" style="color:rgb(70, 130, 180)"> |
|
26 |
Mode recherche, <a href="${tg.url('/')}" style="color:rgb(70, 130, 180); text-decoration: underline;">cliquer ici</a> pour revenir au mode initial. |
|
27 |
</span> |
|
28 |
</td> |
|
29 |
<td style="width: 20%;text-align: right;"><a href="${tg.url('/')}">Accueil</a> |
|
30 |
<a id="SearchLien" href="javascript:vigiboard_searchdialog()"> |
|
31 |
<img src="${tg.url('/images/filter.png')}" /> |
|
32 |
</a> |
|
33 |
</td> |
|
34 |
</tr> |
|
35 |
</table> |
|
36 |
|
|
17 | 37 |
<py:with vars="flash=tg.flash_obj.render('flash', use_js=False)"> |
18 | 38 |
<div py:if="flash" py:content="XML(flash)" /> |
19 | 39 |
</py:with> |
vigiboard/templates/vigiboard_event_table.html | ||
---|---|---|
7 | 7 |
<py:def function="event_table(events,page,pages,id_first_row,id_last_row,total_row,edit_event_status_options)"> |
8 | 8 |
<?python from genshi import HTML ?> |
9 | 9 |
|
10 |
<div style="text-align: right; margin-bottom: 10px"> |
|
11 |
<a href="${tg.url('/')}">Accueil</a> |
|
12 |
<a id="SearchLien" href="javascript:vigiboard_searchdialog()"> |
|
13 |
<img src="${tg.url('/images/filter.png')}" /> |
|
14 |
</a> |
|
15 |
</div> |
|
16 | 10 |
<py:if test="len(events) > 1"> |
17 | 11 |
<table class="vigitable"> |
18 | 12 |
|
19 | 13 |
<thead> |
20 |
<tr> |
|
21 |
<td style="width:27px">
|
|
14 |
<tr >
|
|
15 |
<td style="width:26px;background-color: rgb(70, 130, 180);">
|
|
22 | 16 |
<a py:if="page > pages[0]" href="${tg.url('/%d' % (page-1))}"><img src="${tg.url('/images/fleche_up.png')}" alt="" /></a> |
23 | 17 |
<img py:if="page == pages[0]" src="${tg.url('/images/fleche_up.png')}" alt="" /> |
24 | 18 |
</td> |
25 |
<td colspan="${8+len(events[1][6])}" style="background-color:#4682B4;color:white;text-align:center">Showing rows ${id_first_row} to ${id_last_row} of ${total_row}<br /> |
|
19 |
<td colspan="${8+len(events[1][6])}" style="width:100%;background-color:#4682B4;color:white;text-align:center">Showing rows ${id_first_row} to ${id_last_row} of ${total_row}<br />
|
|
26 | 20 |
Pages <py:for each="p in pages"> |
27 | 21 |
<a py:if="p != page" href="${tg.url('/%d' % p)}" py:content="p" /> |
28 | 22 |
<span py:if="p == page" py:replace="p" /> |
29 | 23 |
</py:for> |
30 | 24 |
</td> |
31 |
<td style="width:27px">
|
|
25 |
<td style="width:26px">
|
|
32 | 26 |
<a py:if="pages[-1] > page" href="${tg.url('/%d' % (page+1))}"><img src="${tg.url('/images/fleche_down.png')}" alt="" /></a> |
33 | 27 |
<img py:if="page == pages[-1]" src="${tg.url('/images/fleche_down.png')}" alt="" /> |
34 | 28 |
</td> |
35 | 29 |
</tr> |
30 |
|
|
36 | 31 |
<tr style="background-color:#F8F8F8;font-weight: bold"> |
37 |
<td py:for="item in events[0]">${HTML(item)}</td> |
|
38 |
<td><a class="Edit_EventsLien" href="javascript:vigiboard_edit_eventdialog('all')"><img src="${tg.url('/images/icon_page_edit.png')}" /></a></td> |
|
39 |
<td><input id="vigiboard_checkall_checkbox" type="checkbox" onclick="javascript:vigiboard_checkall()" /></td> |
|
32 |
<py:for each="(pname,pstyle) in events[0]"> |
|
33 |
<td style="padding: 5px;" py:attrs="pstyle">${HTML(pname)}</td> |
|
34 |
</py:for> |
|
35 |
<td style="text-align: center;" ><a class="Edit_EventsLien" href="javascript:vigiboard_edit_eventdialog('all')"><img src="${tg.url('/images/icon_page_edit.png')}" /></a></td> |
|
36 |
<td style="text-align: center;"><input id="vigiboard_checkall_checkbox" type="checkbox" onclick="javascript:vigiboard_checkall()" /></td> |
|
40 | 37 |
</tr> |
41 | 38 |
</thead> |
42 | 39 |
|
... | ... | |
45 | 42 |
<py:for each="(event,class_tr,class_td_severity,class_td_date,img_fleche,img_statu,plugin) in events[1:]"> |
46 | 43 |
<tr py:attrs="class_tr"> |
47 | 44 |
<td py:attrs="class_td_severity"><a href="javascript:vigiboard_historydialog('${event.idevent}')" class="HistoryLien"><img src="${tg.url(img_fleche['src'])}" style="width:20px"/></a></td> |
48 |
<td py:attrs="class_td_date">${event.get_date('timestamp_active')}<br />[${event.get_since_date('timestamp_active')}]</td>
|
|
45 |
<td py:attrs="class_td_date"><span style="font-weight: bold;">${event.get_date('timestamp_active')}</span><br />[${event.get_since_date('timestamp_active')}]</td>
|
|
49 | 46 |
<td py:attrs="class_td_date" style="text-align:center">${event.occurence}</td> |
50 | 47 |
<td>${event.hostname}</td> |
51 | 48 |
<td>${event.servicename}</td> |
52 | 49 |
<td>${event.output}</td> |
53 | 50 |
<td py:for="plug in plugin" py:attrs="plug[1]">${HTML(plug[0])}</td> |
54 |
<td>${event.trouble_ticket}</td> |
|
55 |
<td><img py:attrs="img_statu" py:if="img_statu != None" /></td> |
|
56 |
<td py:attrs="class_td_date"><a class="Edit_EventsLien" href="javascript:vigiboard_edit_eventdialog('${event.idevent}')"><img src="${tg.url('/images/icon_page_edit.png')}" /></a></td> |
|
57 |
<td py:attrs="class_td_date"><input type="checkbox" class="Edit_EventsCheckBox" value="${event.idevent}"/></td> |
|
51 |
<td style="text-align: center"><a href="${ |
|
52 |
tg.config['vigiboard_links.tt'] % { |
|
53 |
'idevent' : event.idevent, |
|
54 |
'host' : event.hostname, |
|
55 |
'service' : event.servicename, |
|
56 |
'tt' : event.trouble_ticket }}">${event.trouble_ticket}</a></td> |
|
57 |
<td style="text-align: center"><img py:attrs="img_statu" py:if="img_statu != None" /></td> |
|
58 |
<td py:attrs="class_td_date" style="text-align: center"><a class="Edit_EventsLien" href="javascript:vigiboard_edit_eventdialog('${event.idevent}')"><img src="${tg.url('/images/icon_page_edit.png')}" /></a></td> |
|
59 |
<td py:attrs="class_td_date" style="text-align: center"><input type="checkbox" class="Edit_EventsCheckBox" value="${event.idevent}"/></td> |
|
58 | 60 |
|
59 | 61 |
</tr> |
60 | 62 |
</py:for> |
... | ... | |
78 | 80 |
$('#HistoryDialog_current_state').html(json.current_state); |
79 | 81 |
$('#HistoryDialog_detailed_event').attr('href' , '${tg.url('/event/')}' + json.idevent); |
80 | 82 |
$('#HistoryDialog_detailed_host').attr('href', '${tg.url('/host_service/')}' + json.host + "/" + json.service); |
81 |
$('#HistoryDialog_nagios').attr('href', json.nagios_link); |
|
82 |
$('#HistoryDialog_metrology').attr('href', json.metrology_link); |
|
83 |
$('#HistoryDialog_security').attr('href', json.security_link); |
|
84 |
$('#HistoryDialog_servicetype').attr('href', json.servicetype_link); |
|
83 |
<py:for each="edname, edit in tg.config['vigiboard_links.eventdetails'].iteritems()"> |
|
84 |
$('#HistoryDialog_${edname}').attr('href', json.eventdetails['${edname}']); |
|
85 |
</py:for> |
|
85 | 86 |
$('#HistoryDialog').dialog('open'); |
86 | 87 |
}) |
87 | 88 |
} |
... | ... | |
133 | 134 |
<ul> |
134 | 135 |
<li><a id="HistoryDialog_detailed_event" href="" >Detailed history for this event</a></li> |
135 | 136 |
<li><a id="HistoryDialog_detailed_host" href="" >Detailed history for this host/service</a></li> |
136 |
<li><a id="HistoryDialog_nagios" href="" >Nagios host details</a></li> |
|
137 |
<li><a id="HistoryDialog_metrology" href="" >Metrology details</a></li> |
|
138 |
<li><a id="HistoryDialog_security" href="" >Security details</a></li> |
|
139 |
<li><a id="HistoryDialog_servicetype" href="" >Service Type</a></li> |
|
137 |
<li py:for="edname, edit in tg.config['vigiboard_links.eventdetails'].iteritems()"> |
|
138 |
<a href="" id="HistoryDialog_${edname}">${edit[0]}</a> |
|
139 |
</li> |
|
140 | 140 |
</ul> |
141 | 141 |
</div> |
142 | 142 |
|
... | ... | |
150 | 150 |
</py:if> |
151 | 151 |
|
152 | 152 |
<py:if test="1 >= len(events)"> |
153 |
Aucun évènement disponible. |
|
153 |
<table class="vigitable"> |
|
154 |
|
|
155 |
<thead> |
|
156 |
<tr > |
|
157 |
<td style="width:26px;background-color: rgb(70, 130, 180);"> |
|
158 |
<img src="${tg.url('/images/fleche_up.png')}" alt="" /> |
|
159 |
</td> |
|
160 |
<td colspan="9" style="width:100%;background-color:#4682B4;color:white;text-align:center">Showing rows 0 to 0 of 0<br /> |
|
161 |
Page 0 |
|
162 |
</td> |
|
163 |
<td style="width:26px"> |
|
164 |
<img src="${tg.url('/images/fleche_down.png')}" alt="" /> |
|
165 |
</td> |
|
166 |
</tr> |
|
167 |
|
|
168 |
<tr style="background-color:#F8F8F8;font-weight: bold"> |
|
169 |
<py:for each="(pname,pstyle) in events[0]"> |
|
170 |
<td py:attrs="pstyle">${HTML(pname)}</td> |
|
171 |
</py:for> |
|
172 |
<td style="text-align: center;"><img src="${tg.url('/images/icon_page_edit.png')}" /></td> |
|
173 |
<td style="text-align: center;"><input id="vigiboard_checkall_checkbox" type="checkbox" /></td> |
|
174 |
</tr> |
|
175 |
</thead> |
|
176 |
|
|
177 |
<tbody> |
|
178 |
<tr><td colspan="9"><br />Aucun évènement disponible.</td></tr> |
|
179 |
</tbody> |
|
180 |
</table> |
|
181 |
${tmpl_context.searchdialog} |
|
182 |
<div id="SearchDialog"> |
|
183 |
${tmpl_context.search_form()} |
|
184 |
</div> |
|
185 |
<script type="text/javascript"> |
|
186 |
function vigiboard_searchdialog() { |
|
187 |
$('#search_form_host').attr('value',''); |
|
188 |
$('#search_form_service').attr('value',''); |
|
189 |
$('#search_form_output').attr('value',''); |
|
190 |
$('#search_form_trouble_ticket').attr('value', ''); |
|
191 |
$('#SearchDialog').dialog('open'); |
|
192 |
} |
|
193 |
$('#SearchLien').click(function(e){ |
|
194 |
$('#SearchDialog').dialog('option','position','center'); |
|
195 |
}); |
|
196 |
</script> |
|
197 |
|
|
154 | 198 |
</py:if> |
155 | 199 |
|
156 | 200 |
</py:def> |
vigiboard/widgets/edit_event.py | ||
---|---|---|
44 | 44 |
TextField('trouble_ticket',label_text=_('Trouble Ticket')), |
45 | 45 |
] |
46 | 46 |
|
47 |
method = 'GET' |
|
47 | 48 |
submit_text = _('Search') |
Also available in: Unified diff