[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