[Pkg-nagios-changes] [SCM] UNNAMED PROJECT branch, debian/master, updated. 810edbdd3feedbfe37f4a65bee50b57b2f60fa2a
Frescha
frescha at unitedseed.de
Tue Feb 28 22:14:21 UTC 2012
The following commit has been merged in the debian/master branch:
commit e18a50ec27cf7ee41acf775fcff891bb0e70ab5b
Author: Frescha <frescha at unitedseed.de>
Date: Sun Jan 15 17:44:51 2012 +0100
Add: Dashboard mockup
diff --git a/shinken/webui/plugins/dashboard/dashboard.py b/shinken/webui/plugins/dashboard/dashboard.py
index 7d11ccb..874bf95 100644
--- a/shinken/webui/plugins/dashboard/dashboard.py
+++ b/shinken/webui/plugins/dashboard/dashboard.py
@@ -1,93 +1,49 @@
#!/usr/bin/env python
-#Copyright (C) 2009-2011 :
+# Copyright (C) 2009-2012 :
# Gabes Jean, naparuba at gmail.com
# Gerhard Lausser, Gerhard.Lausser at consol.de
# Gregory Starck, g.starck at gmail.com
# Hartmut Goebel, h.goebel at goebel-consult.de
# Andreas Karfusehr, andreas at karfusehr.de
#
-#This file is part of Shinken.
+# This file is part of Shinken.
#
-#Shinken is free software: you can redistribute it and/or modify
-#it under the terms of the GNU Affero General Public License as published by
-#the Free Software Foundation, either version 3 of the License, or
-#(at your option) any later version.
+# Shinken is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
#
-#Shinken is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU Affero General Public License for more details.
+# Shinken is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
#
-#You should have received a copy of the GNU Affero General Public License
-#along with Shinken. If not, see <http://www.gnu.org/licenses/>.
+# You should have received a copy of the GNU Affero General Public License
+# along with Shinken. If not, see <http://www.gnu.org/licenses/>.
from shinken.webui.bottle import redirect
### Will be populated by the UI with it's own value
app = None
-import re
-
# Our page
def get_page():
- # First we look for the user sid
- # so we bail out if it's a false one
-# sid = app.request.get_cookie("sid")
-
-
user = app.get_user_auth()
if not user:
redirect("/user/login")
-# return {'app' : app, 'pbs' : [], 'valid_user' : False, 'user' : None, 'navi' : None}
-
- #We want to limit the number of elements
- start = int(app.request.GET.get('start', '0'))
- end = int(app.request.GET.get('end', '30'))
-
- search = app.request.GET.get('search', '')
-
- pbs = app.datamgr.get_all_problems()
-
- # Ok, if need, appli the search filter
- if search:
- print "SEARCHING FOR", search
- print "Before filtering", len(pbs)
- # We compile the patern
- pat = re.compile(search, re.IGNORECASE)
- new_pbs = []
- for p in pbs:
- if pat.search(p.get_full_name()):
- new_pbs.append(p)
- continue
- to_add = False
- for imp in p.impacts:
- if pat.search(imp.get_full_name()):
- to_add = True
- for src in p.source_problems:
- if pat.search(src.get_full_name()):
- to_add = True
- if to_add:
- new_pbs.append(p)
-
- pbs = new_pbs
- print "After filtering", len(pbs)
-
- total = len(pbs)
- # If we overflow, came back as normal
- if start > total:
- start = 0
- end = 30
- navi = app.helper.get_navi(total, start, step=30)
- pbs = pbs[start:end]
-
-# print "get all problems:", pbs
-# for pb in pbs :
-# print pb.get_name()
- return {'app' : app, 'pbs' : pbs, 'valid_user' : True, 'user' : user, 'navi' : navi, 'search' : search, 'page' : 'problems'}
-
+
+ schedulers = app.datamgr.get_schedulers()
+ brokers = app.datamgr.get_brokers()
+ reactionners = app.datamgr.get_reactionners()
+ receivers = app.datamgr.get_receivers()
+ pollers = app.datamgr.get_pollers()
+ return {'app' : app, 'user' : user, 'schedulers' : schedulers,
+ 'brokers' : brokers, 'reactionners' : reactionners,
+ 'receivers' : receivers, 'pollers' : pollers,
+ }
# Our page
def get_all():
@@ -140,7 +96,7 @@ def get_all():
-pages = {get_page : { 'routes' : ['/dashboard'], 'view' : 'problems', 'dashboard' : True},
+pages = {get_page : { 'routes' : ['/dashboard'], 'view' : 'dashboard', 'static' : True},
get_all : { 'routes' : ['/dashboard/fullscreen'], 'view' : 'fullscreen', 'static' : True},
}
diff --git a/shinken/webui/plugins/dashboard/htdocs/css/csschart.css b/shinken/webui/plugins/dashboard/htdocs/css/csschart.css
new file mode 100644
index 0000000..ca3ec3d
--- /dev/null
+++ b/shinken/webui/plugins/dashboard/htdocs/css/csschart.css
@@ -0,0 +1,188 @@
+/*
+
+Css Chart created by Alen Grakalic
+Brought to you by Css Globe (cssglobe.com)
+
+*/
+
+
+dl#csschart, dl#csschart dt, dl#csschart dd{
+ margin:0;
+ padding:0;
+ }
+dl#csschart{
+ background:url("/static/images/bg_chart.gif") no-repeat 0 0;
+ width:467px;
+ height:385px;
+ }
+dl#csschart dt{
+ display:none;
+ }
+dl#csschart dd{
+ position:relative;
+ float:left;
+ display:inline;
+ width:33%;
+ height:330px;
+ margin-top:22px;
+ }
+dl#csschart dd.first{
+ margin-left:33%;
+ }
+dl#csschart span{
+ position:absolute;
+ display:block;
+ width:33%;
+ bottom:0;
+ left:0;
+ z-index:1;
+ color:#555;
+ text-decoration:none;
+ }
+dl#csschart span em{
+ display:block;
+ font-style:normal;
+ float:left;
+ line-height:200%;
+ background:#fff;
+ color:#555;
+ border:1px solid #b1b1b1;
+ position:absolute;
+ top:50%;
+ left:3px;
+ text-align:center;
+ width:23px;
+ }
+
+/* default column styling */
+
+ dl#csschart span{
+ height:50%;
+ background:url(type1.gif) repeat-y;
+ }
+
+/* // default column styling */
+
+/* column types */
+
+ dl#csschart span.type1{
+ background: #FF0000;
+ width: 100%;
+ }
+ dl#csschart span.type2{
+ background:#00CCFF;
+ width: 100%;
+ }
+ dl#csschart span.type3{
+ background:#4F8A10;
+ width: 100%;
+ }
+
+/* // column types */
+
+/* percentages */
+
+ dl#csschart span.p0{height:0%;}
+ dl#csschart span.p1{height:1%;}
+ dl#csschart span.p2{height:2%;}
+ dl#csschart span.p3{height:3%;}
+ dl#csschart span.p4{height:4%;}
+ dl#csschart span.p5{height:5%;}
+ dl#csschart span.p6{height:6%;}
+ dl#csschart span.p7{height:7%;}
+ dl#csschart span.p8{height:8%;}
+ dl#csschart span.p9{height:9%;}
+ dl#csschart span.p10{height:10%;}
+ dl#csschart span.p11{height:11%;}
+ dl#csschart span.p12{height:12%;}
+ dl#csschart span.p13{height:13%;}
+ dl#csschart span.p14{height:14%;}
+ dl#csschart span.p15{height:15%;}
+ dl#csschart span.p16{height:16%;}
+ dl#csschart span.p17{height:17%;}
+ dl#csschart span.p18{height:18%;}
+ dl#csschart span.p19{height:19%;}
+ dl#csschart span.p20{height:20%;}
+ dl#csschart span.p21{height:21%;}
+ dl#csschart span.p22{height:22%;}
+ dl#csschart span.p23{height:23%;}
+ dl#csschart span.p24{height:24%;}
+ dl#csschart span.p25{height:25%;}
+ dl#csschart span.p26{height:26%;}
+ dl#csschart span.p27{height:27%;}
+ dl#csschart span.p28{height:28%;}
+ dl#csschart span.p29{height:29%;}
+ dl#csschart span.p30{height:30%;}
+ dl#csschart span.p31{height:31%;}
+ dl#csschart span.p32{height:32%;}
+ dl#csschart span.p33{height:33%;}
+ dl#csschart span.p34{height:34%;}
+ dl#csschart span.p35{height:35%;}
+ dl#csschart span.p36{height:36%;}
+ dl#csschart span.p37{height:37%;}
+ dl#csschart span.p38{height:38%;}
+ dl#csschart span.p39{height:39%;}
+ dl#csschart span.p40{height:40%;}
+ dl#csschart span.p41{height:41%;}
+ dl#csschart span.p42{height:42%;}
+ dl#csschart span.p43{height:43%;}
+ dl#csschart span.p44{height:44%;}
+ dl#csschart span.p45{height:45%;}
+ dl#csschart span.p46{height:46%;}
+ dl#csschart span.p47{height:47%;}
+ dl#csschart span.p48{height:48%;}
+ dl#csschart span.p49{height:49%;}
+ dl#csschart span.p50{height:50%;}
+ dl#csschart span.p51{height:51%;}
+ dl#csschart span.p52{height:52%;}
+ dl#csschart span.p53{height:53%;}
+ dl#csschart span.p54{height:54%;}
+ dl#csschart span.p55{height:55%;}
+ dl#csschart span.p56{height:56%;}
+ dl#csschart span.p57{height:57%;}
+ dl#csschart span.p58{height:58%;}
+ dl#csschart span.p59{height:59%;}
+ dl#csschart span.p60{height:60%;}
+ dl#csschart span.p61{height:61%;}
+ dl#csschart span.p62{height:62%;}
+ dl#csschart span.p63{height:63%;}
+ dl#csschart span.p64{height:64%;}
+ dl#csschart span.p65{height:65%;}
+ dl#csschart span.p66{height:66%;}
+ dl#csschart span.p67{height:67%;}
+ dl#csschart span.p68{height:68%;}
+ dl#csschart span.p69{height:69%;}
+ dl#csschart span.p70{height:70%;}
+ dl#csschart span.p71{height:71%;}
+ dl#csschart span.p72{height:72%;}
+ dl#csschart span.p73{height:73%;}
+ dl#csschart span.p74{height:74%;}
+ dl#csschart span.p75{height:75%;}
+ dl#csschart span.p76{height:76%;}
+ dl#csschart span.p77{height:77%;}
+ dl#csschart span.p78{height:78%;}
+ dl#csschart span.p79{height:79%;}
+ dl#csschart span.p80{height:80%;}
+ dl#csschart span.p81{height:81%;}
+ dl#csschart span.p82{height:82%;}
+ dl#csschart span.p83{height:83%;}
+ dl#csschart span.p84{height:84%;}
+ dl#csschart span.p85{height:85%;}
+ dl#csschart span.p86{height:86%;}
+ dl#csschart span.p87{height:87%;}
+ dl#csschart span.p88{height:88%;}
+ dl#csschart span.p89{height:89%;}
+ dl#csschart span.p90{height:90%;}
+ dl#csschart span.p91{height:91%;}
+ dl#csschart span.p92{height:92%;}
+ dl#csschart span.p93{height:93%;}
+ dl#csschart span.p94{height:94%;}
+ dl#csschart span.p95{height:95%;}
+ dl#csschart span.p96{height:96%;}
+ dl#csschart span.p97{height:97%;}
+ dl#csschart span.p98{height:98%;}
+ dl#csschart span.p99{height:99%;}
+ dl#csschart span.p100{height:100%;}
+
+
+/* // percentages */
\ No newline at end of file
diff --git a/shinken/webui/plugins/dashboard/htdocs/css/dashboard.css b/shinken/webui/plugins/dashboard/htdocs/css/dashboard.css
new file mode 100644
index 0000000..da3a6da
--- /dev/null
+++ b/shinken/webui/plugins/dashboard/htdocs/css/dashboard.css
@@ -0,0 +1,68 @@
+#widget_container ul {
+ float: left;
+ min-height: 10px;
+ margin: 5px;
+ width: 100%;
+}
+
+#widget_container li {
+
+ padding: 0px;
+ margin-left: 0px;
+ margin-bottom: 20px;
+ list-style-type: none;
+ display: inline;
+ border: solid 1px #eaeaea;
+}
+
+.widget_head {
+ width: 100%;
+ height: 22px;
+ border-bottom: 1px solid #eaeaea;
+ cursor: move;
+
+ background-color: #f5f5f5;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#dddddd)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient(top, #f5f5f5, #dddddd); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient(top, #f5f5f5, #dddddd); /* FF3.6 */
+ background-image: -ms-linear-gradient(top, #f5f5f5, #dddddd); /* IE10 */
+ background-image: -o-linear-gradient(top, #f5f5f5, #dddddd); /* Opera 11.10+ */
+ background-image: linear-gradient(top, #f5f5f5, #dddddd);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f5f5f5', EndColorStr='#dddddd'); /* IE6�IE9 */
+}
+
+.widget_head h3 {
+ padding-left: 10px;
+ margin-bottom: 0;
+ font-size: 15px;
+}
+
+.widget_body table {
+ margin-bottom: 0;
+}
+
+.wrap {
+ background: #FFF;
+ border: 0px solid #456;
+ padding: 10px;
+ margin-bottom: 20px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.wrap:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+
+.box {
+ margin: 5px;
+/* padding: 5px; */
+ background: #D8D5D2;
+ font-size: 11px;
+ float: left;
+}
\ No newline at end of file
diff --git a/shinken/webui/plugins/dashboard/htdocs/js/mooMasonry.js b/shinken/webui/plugins/dashboard/htdocs/js/mooMasonry.js
new file mode 100644
index 0000000..bbd43c4
--- /dev/null
+++ b/shinken/webui/plugins/dashboard/htdocs/js/mooMasonry.js
@@ -0,0 +1,244 @@
+/*
+---
+description: Masonry layout engine (converted from jQuery Masonry)
+
+license: mooMasonry is dual-licensed under GPL and MIT, just like jQuery Masonry itself. You can use it for both personal and commercial applications.
+
+authors:
+- David DeSandro
+- Olivier Refalo
+
+requires:
+- core/1.3.0:'*'
+
+provides: [Element.masonry]
+*/
+
+var MasonryClass = new Class({
+
+ options : {
+ singleMode : false,
+ columnWidth : undefined,
+ itemSelector : undefined,
+ appendedContent : undefined,
+ resizeable : true
+ },
+
+ element : undefined,
+ colW : undefined,
+ colCount : undefined,
+ lastColCount : undefined,
+ colY : undefined,
+ lastColY: undefined,
+ bound : undefined,
+ masoned : undefined,
+ bricks : undefined,
+ posLeft : undefined,
+ brickParent : undefined,
+
+ Implements : Options,
+
+ initialize : function(element, options) {
+ this.element = document.id(element);
+ this.go(options);
+ },
+
+ go: function(options) {
+ this.setOptions(options);
+
+ if (this.masoned && options.appendedContent != undefined) {
+ this.brickParent = options.appendedContent;
+ } else {
+ this.brickParent = this.element;
+ }
+
+ if (this.brickParent.getChildren().length > 0) {
+ this.masonrySetup();
+ this.masonryArrange();
+
+ var resizeOn = this.options.resizeable;
+ if (resizeOn) {
+ if(this.bound == undefined) {
+ this.bound = this.masonryResize.bind(this);
+ this.attach();
+ }
+ }
+
+ if (!resizeOn) {
+ this.detach();
+ }
+ }
+ },
+
+ attach : function() {
+ window.addEvent('resize', this.bound);
+ return this;
+ },
+
+ detach : function() {
+ if(this.bound != undefined ) {
+ window.removeEvent('resize', this.bound);
+ this.bound = undefined;
+ }
+ return this;
+ },
+
+ placeBrick : function(brick, setCount, setY, setSpan) {
+ var shortCol = 0;
+
+ for (var i = 0; i < setCount; i++) {
+ if (setY[i] < setY[shortCol]) {
+ shortCol = i;
+ }
+ }
+
+ brick.setStyles({
+ top : setY[shortCol],
+ left : this.colW * shortCol + this.posLeft
+ });
+
+ var size=brick.getSize().y+brick.getStyle('margin-top').toInt()+brick.getStyle('margin-bottom').toInt();
+
+ for (var i = 0; i < setSpan; i++) {
+ this.colY[shortCol + i] = setY[shortCol] + size;
+ }
+ },
+
+ masonrySetup : function() {
+ var s = this.options.itemSelector;
+ this.bricks = s == undefined ? this.brickParent.getChildren() : this.brickParent.getElements(s);
+
+ if (this.options.columnWidth == undefined) {
+ var b = this.bricks[0];
+ this.colW = b.getSize().x + b.getStyle('margin-left').toInt() + b.getStyle('margin-right').toInt();
+ } else {
+ this.colW = this.options.columnWidth;
+ }
+
+ var size = this.element.getSize().x+this.element.getStyle('margin-left').toInt()+this.element.getStyle('margin-right').toInt();
+ this.colCount = Math.floor(size / this.colW);
+ this.colCount = Math.max(this.colCount, 1);
+
+ return this;
+ },
+
+ masonryResize : function() {
+ this.brickParent = this.element;
+ this.lastColY=this.colY;
+ this.lastColCount = this.colCount;
+
+ this.masonrySetup();
+
+ if (this.colCount != this.lastColCount) {
+ this.masonryArrange();
+ }
+ return this;
+ },
+
+ masonryArrange : function() {
+ // if masonry hasn't been called before
+ if (!this.masoned) {
+ this.element.setStyle('position', 'relative');
+ }
+
+ if (!this.masoned || this.options.appendedContent != undefined) {
+ // just the new bricks
+ this.bricks.setStyle('position', 'absolute');
+ }
+
+ // get top left position of where the bricks should be
+ var cursor = new Element('div').inject(this.element, 'top');
+
+ var pos = cursor.getPosition();
+ var epos = this.element.getPosition();
+
+ var posTop = pos.y - epos.y;
+ this.posLeft = pos.x - epos.x;
+
+ cursor.dispose();
+
+ // set up column Y array
+ if (this.masoned && this.options.appendedContent != undefined) {
+ // if appendedContent is set, use colY from last call
+ if(this.lastColY != undefined) {
+ this.colY=this.lastColY;
+ }
+
+ /*
+ * in the case that the wall is not resizeable, but the colCount has
+ * changed from the previous time masonry has been called
+ */
+ for (var i = this.lastColCount; i < this.colCount; i++) {
+ this.colY[i] = posTop;
+ }
+
+ } else {
+ this.colY = [];
+ for (var i = 0; i < this.colCount; i++) {
+ this.colY[i] = posTop;
+ }
+ }
+
+ // layout logic
+ if (this.options.singleMode) {
+ for (var k = 0; k < this.bricks.length; k++) {
+ var brick = this.bricks[k];
+ this.placeBrick(brick, this.colCount, this.colY, 1);
+ }
+ } else {
+ for (var k = 0; k < this.bricks.length; k++) {
+ var brick = this.bricks[k];
+
+ // how many columns does this brick span
+ var size=brick.getSize().x+brick.getStyle('margin-left').toInt()+brick.getStyle('margin-right').toInt();
+ var colSpan = Math.ceil(size / this.colW);
+ colSpan = Math.min(colSpan, this.colCount);
+
+ if (colSpan == 1) {
+ // if brick spans only one column, just like singleMode
+ this.placeBrick(brick, this.colCount, this.colY, 1);
+ } else {
+ // brick spans more than one column
+ // how many different places could this brick fit horizontally
+ var groupCount = this.colCount + 1 - colSpan;
+ var groupY = [0];
+ // for each group potential horizontal position
+ for (var i = 0; i < groupCount; i++) {
+ groupY[i] = 0;
+ // for each column in that group
+ for (var j = 0; j < colSpan; j++) {
+ // get the maximum column height in that group
+ groupY[i] = Math.max(groupY[i], this.colY[i + j]);
+ }
+ }
+ this.placeBrick(brick, groupCount, groupY, colSpan);
+ } // else
+ }
+ } // /layout logic
+
+ // set the height of the wall to the tallest column
+ var wallH = 0;
+ for (var i = 0; i < this.colCount; i++) {
+ wallH = Math.max(wallH, this.colY[i]);
+ }
+
+ this.element.setStyle('height', wallH - posTop);
+
+ // let listeners know that we are done
+ this.element.fireEvent('masoned', this.element);
+ this.masoned = true;
+ this.options.appendedContent = undefined;
+
+ // set all data so we can retrieve it for appended appendedContent
+ // or anyone else's crazy jquery fun
+ // this.element.data('masonry', props );
+ return this;
+ }
+
+});
+
+Element.implement({
+ masonry : function(options) {
+ new MasonryClass(this, options);
+ }
+});
diff --git a/shinken/webui/plugins/dashboard/views/dashboard.tpl b/shinken/webui/plugins/dashboard/views/dashboard.tpl
new file mode 100644
index 0000000..ba8811c
--- /dev/null
+++ b/shinken/webui/plugins/dashboard/views/dashboard.tpl
@@ -0,0 +1,109 @@
+%rebase layout globals(),js=['dashboard/js/mooMasonry.js'], css=['dashboard/css/dashboard.css', 'dashboard/css/csschart.css'], title='Architecture state', menu_part='/dashboard'
+
+%from shinken.bin import VERSION
+%helper = app.helper
+
+<script type="text/javascript">
+
+ window.addEvent('domready', function(){
+ document.id('secondary').masonry({columnWidth: 100});
+ });
+
+</script>
+
+<div id="widget_container" class="grid_16 item">
+ <div id="messagebox" class="gradient_alert" style="margin-top: 20px;">
+ <img src="/static/images/icons/alert.png" alt="some_text" style="height: 40px; width: 40px" class="grid_4"/>
+ <p><strong>Mockup</strong></p>
+ </div>
+ <div>
+ <div class="wrap">
+ <div class="box grid_12">
+ <div class="widget_head"><h3>Business Impacts</h3></div>
+ <p>Donec nec justo eget felis facilisis fermentum. Aliquam porttitor mauris. </p>
+ </div>
+
+ <div class="box grid_4 hide">
+ <div class="widget_head"><h3>Charts</h3></div>
+ <div class="widget_body">
+ <dl id="csschart">
+ <dt>Impacts</dt>
+ <dd><span class="first type1 p55"><em>55</em></span></dd>
+
+ <dt>Services</dt>
+ <dd><span class="type2 p80"><em>80</em></span></dd>
+
+ <dt>Hosts</dt>
+ <dd><span class="type3 p72"><em>72</em></span></dd>
+ </dl>
+ </div>
+ </div>
+
+ <div class="box grid_3">
+ <div class="widget_head"> <h3>Shinken Status</h3> </div>
+ <div class="widget_body">
+ <table border="1">
+ <tbody>
+ <tr>
+ <td class="first">Running sice</td>
+ <td class="second">{{helper.print_duration(app.datamgr.get_program_start())}}</td>
+ </tr>
+ <tr>
+ <td class="first">Version</td>
+ <td class="second">{{VERSION}}</td>
+ </tr>
+ %types = [ ('scheduler', schedulers), ('poller', pollers), ('broker', brokers), ('reactionner', reactionners), ('receiver', receivers)]
+ %for (sat_type, sats) in types:
+ <tr>
+ %for s in sats:
+ <td>{{sat_type.capitalize()}} State</td>
+ <td>
+ %if not s.alive:
+ <span class="pulse"></span>
+ %end
+ <img style="width: 16px; height : 16px;" src="{{helper.get_icon_state(s)}}" alt="stateicon"/>
+ </td>
+ %# end of this satellite type
+ %end
+ </tr>
+ %# end of this satellite type
+ %end
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <div class="box grid_4">
+ <div class="widget_head"><h3>IT Problems</h3></div>
+ <div class="widget_body">
+ <table border="1">
+ <tbody>
+ <tr>
+ <td class="first">Problems</td>
+ <td class="second">{{app.datamgr.get_nb_all_problems()}}</td>
+ </tr>
+ <tr>
+ <td class="first">Unhandled </td>
+ <td class="second">{{app.datamgr.get_nb_problems()}}</td>
+ </tr>
+ <tr>
+ <td class="first">Total </td>
+ <td class="second">{{app.datamgr.get_nb_elements()}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+
+
+ <div class="box col1">
+ <h5>5</h5>
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec odio.</p>
+ </div>
+
+ </div> <!-- /#secondary.wrap -->
+ </div>
+
+</div>
+
diff --git a/shinken/webui/plugins/system/views/system.tpl b/shinken/webui/plugins/system/views/system.tpl
index 5320d95..9709801 100644
--- a/shinken/webui/plugins/system/views/system.tpl
+++ b/shinken/webui/plugins/system/views/system.tpl
@@ -67,7 +67,7 @@
%end
</a>
</li>
- %# end of this satellite type
+ %# end of this satellite type
%end
</ul>
</div>
\ No newline at end of file
--
UNNAMED PROJECT
More information about the Pkg-nagios-changes
mailing list