Project

General

Profile

Download (7.83 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
	$Id$
4
	part of m0n0wall (http://m0n0.ch/wall)
5

    
6
	Copyright (C) 2013-2015 Electric Sheep Fencing, LP
7
	Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
8
	and Jonathan Watt <jwatt@jwatt.org>.
9
	All rights reserved.
10

    
11
	Redistribution and use in source and binary forms, with or without
12
	modification, are permitted provided that the following conditions are met:
13

    
14
	1. Redistributions of source code must retain the above copyright notice,
15
	   this list of conditions and the following disclaimer.
16

    
17
	2. Redistributions in binary form must reproduce the above copyright
18
	   notice, this list of conditions and the following disclaimer in the
19
	   documentation and/or other materials provided with the distribution.
20

    
21
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
22
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
23
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
25
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
	POSSIBILITY OF SUCH DAMAGE.
31
*/
32
/*
33
	pfSense_MODULE:	graph
34
*/
35

    
36
##|+PRIV
37
##|*IDENT=page-diagnostics-cpuutilization
38
##|*NAME=Diagnostics: CPU Utilization page
39
##|*DESCR=Allow access to the 'Diagnostics: CPU Utilization' page.
40
##|*MATCH=graph_cpu.php*
41
##|-PRIV
42

    
43
require_once("guiconfig.inc");
44

    
45
header("Last-Modified: " . gmdate( "D, j M Y H:i:s" ) . " GMT" );
46
header("Expires: " . gmdate( "D, j M Y H:i:s", time() ) . " GMT" );
47
header("Cache-Control: no-cache, no-store, must-revalidate" ); // HTTP/1.1
48
header("Pragma: no-cache"); // HTTP/1.0
49
header("Content-type: image/svg+xml");
50

    
51
/********* Other conf *******/
52

    
53
$nb_plot = 120;  // maximum number of data points to plot in the graph
54
$fetch_link = "stats.php?stats=cpu";
55

    
56
//SVG attributes
57
$attribs['axis']='fill="black" stroke="black"';
58
$attribs['cpu']='fill="#FF0000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="7"';
59
$attribs['graph_cpu']='fill="none" stroke="#FF0000" stroke-opacity="0.8"';
60
$attribs['legend']='fill="black" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"';
61
$attribs['grid_txt']='fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="6"';
62
$attribs['grid']='stroke="gray" stroke-opacity="0.5"';
63
$attribs['error']='fill="blue" font-family="Arial" font-size="4"';
64
$attribs['collect_initial']='fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"';
65

    
66
$height=100;  // SVG internal height : do not modify
67
$width=200;   // SVG internal width  : do not modify
68

    
69
/********* Graph DATA **************/
70
print('<?xml version="1.0" encoding="UTF-8"?>' . "\n");?>
71
<svg width="100%" height="100%" viewBox="0 0 <?=$width?> <?=$height?>" preserveAspectRatio="none" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="init(evt);">
72
  <g id="graph">
73
    <rect id="bg" x1="0" y1="0" width="100%" height="100%" fill="white"/>
74
    <line id="axis_x" x1="0" y1="0" x2="0" y2="100%" <?=$attribs['axis']?>/>
75
    <line id="axis_y" x1="0" y1="100%" x2="100%" y2="100%" <?=$attribs['axis']?>/>
76
    <polygon id="axis_arrow_x" <?=$attribs['axis']?> points="<?=($width) . "," . ($height)?> <?=($width-2) . "," . ($height-2)?> <?=($width-2) . "," . $height?>"/>
77
    <path id="graph_cpu" d="" <?=$attribs['graph_cpu']?>/>
78
    <path id="grid" d="M0 <?=$height/4*1?> L <?=$width?> <?=$height/4*1?> M0 <?=$height/4*2?> L <?=$width?> <?=$height/4*2?> M0 <?=$height/4*3?> L <?=$width?> <?=$height/4*3?>" <?=$attribs['grid']?>/>
79
    <text id="grid_txt1" x="100%" y="25%" <?=$attribs['grid_txt']?> text-anchor="end">75%</text>
80
    <text id="grid_txt2" x="100%" y="50%" <?=$attribs['grid_txt']?> text-anchor="end">50%</text>
81
    <text id="grid_txt3" x="100%" y="75%" <?=$attribs['grid_txt']?> text-anchor="end">25%</text>
82
    <text id="graph_cpu_txt" x="4" y="8" <?=$attribs['cpu']?>> </text>
83
    <text id="error" x="50%" y="50%"  visibility="hidden" <?=$attribs['error']?> text-anchor="middle"><?=gettext("Cannot get CPU load"); ?></text>
84
    <text id="collect_initial" x="50%" y="50%"  visibility="hidden" <?=$attribs['collect_initial']?> text-anchor="middle"><?=gettext("Collecting initial data, please wait"); ?>...</text>
85
  </g>
86
  <script type="text/ecmascript">
87
    <![CDATA[
88

    
89
/**
90
 * getURL is a proprietary Adobe function, but it's simplicity has made it very
91
 * popular. If getURL is undefined we spin our own by wrapping XMLHttpRequest.
92
 */
93
if (typeof getURL == 'undefined') {
94
  getURL = function(url, callback) {
95
    if (!url)
96
      throw '<?=gettext("No URL for getURL"); ?>';
97

    
98
    try {
99
      if (typeof callback.operationComplete == 'function')
100
        callback = callback.operationComplete;
101
    } catch (e) {}
102
    if (typeof callback != 'function')
103
      throw '<?=gettext("No callback function for getURL"); ?>';
104

    
105
    var http_request = null;
106
    if (typeof XMLHttpRequest != 'undefined') {
107
      http_request = new XMLHttpRequest();
108
    } else if (typeof ActiveXObject != 'undefined') {
109
      try {
110
        http_request = new ActiveXObject('Msxml2.XMLHTTP');
111
      } catch (e) {
112
        try {
113
          http_request = new ActiveXObject('Microsoft.XMLHTTP');
114
        } catch (e) {}
115
      }
116
    }
117
    if (!http_request)
118
      throw '<?=gettext("Both getURL and XMLHttpRequest are undefined"); ?>';
119

    
120
    http_request.onreadystatechange = function() {
121
      if (http_request.readyState == 4) {
122
        callback( { success : true,
123
                    content : http_request.responseText,
124
                    contentType : http_request.getResponseHeader("Content-Type") } );
125
      }
126
    }
127
    http_request.open('GET', url, true);
128
    http_request.send(null);
129
  }
130
}
131

    
132
var SVGDoc = null;
133
var last_cpu_total = 0;
134
var last_cpu_idle = 0;
135
var diff_cpu_total = 0;
136
var diff_cpu_idle = 0;
137
var cpu_data = new Array();
138

    
139
var max_num_points = <?=$nb_plot?>;  // maximum number of plot data points
140
var step = <?=$width?> / max_num_points;  // plot X division size
141
var scale = <?=$height?> / 100;
142

    
143
function init(evt) {
144
  SVGDoc = evt.target.ownerDocument;
145
  fetch_data();
146
}
147

    
148
function fetch_data() {
149
  getURL('<?=$fetch_link?>', plot_cpu_data);
150
}
151

    
152
function plot_cpu_data(obj) {
153
  if (!obj.success)
154
    return handle_error();  // getURL failed to get current CPU load data
155

    
156
  var cpu = parseInt(obj.content);
157
  if (!isNumber(cpu))
158
    return handle_error();
159

    
160
  switch (cpu_data.length) {
161
  case 0:
162
    SVGDoc.getElementById("collect_initial").setAttributeNS(null, 'visibility', 'visible');
163
    cpu_data[0] = cpu;
164
    fetch_data();
165
    return;
166
  case 1:
167
    SVGDoc.getElementById("collect_initial").setAttributeNS(null, 'visibility', 'hidden');
168
    break;
169
  case max_num_points:
170
    // shift plot to left if the maximum number of plot points has been reached
171
    var i = 0;
172
    while (i < max_num_points) {
173
      cpu_data[i] = cpu_data[++i];
174
    }
175
    --cpu_data.length;
176
  }
177

    
178
  cpu_data[cpu_data.length] = cpu;
179

    
180
  var path_data = "M 0 " + (<?=$height?> - (cpu_data[0] * scale));
181
  for (var i = 1; i < cpu_data.length; ++i) {
182
    var x = step * i;
183
    var y_cpu = <?=$height?> - (cpu_data[i] * scale);
184
    path_data += " L" + x + " " + y_cpu;
185
  }
186

    
187
  SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'hidden');
188
  SVGDoc.getElementById('graph_cpu_txt').firstChild.data = cpu + '%';
189
  SVGDoc.getElementById('graph_cpu').setAttributeNS(null, "d", path_data);
190

    
191
  fetch_data();
192
}
193

    
194
function handle_error() {
195
  SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'visible');
196
  fetch_data();
197
}
198

    
199
function isNumber(a) {
200
  return typeof a == 'number' && isFinite(a);
201
}
202

    
203
    ]]>
204
  </script>
205
</svg>
(85-85/252)