Project

General

Profile

Download (7.83 KB) Statistics
| Branch: | Tag: | Revision:

univnautes / usr / local / www / graph_cpu.php @ a1b66bec

1
<?php
2
/*
3
	$Id$
4
	part of m0n0wall (http://m0n0.ch/wall)
5
	
6
	Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
7
	and Jonathan Watt <jwatt@jwatt.org>.
8
	All rights reserved.
9
	
10
	Redistribution and use in source and binary forms, with or without
11
	modification, are permitted provided that the following conditions are met:
12
	
13
	1. Redistributions of source code must retain the above copyright notice,
14
	   this list of conditions and the following disclaimer.
15
	
16
	2. Redistributions in binary form must reproduce the above copyright
17
	   notice, this list of conditions and the following disclaimer in the
18
	   documentation and/or other materials provided with the distribution.
19
	
20
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
21
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
24
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
	POSSIBILITY OF SUCH DAMAGE.
30
*/
31
/*
32
	pfSense_MODULE:	graph
33
*/
34

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

    
42
require_once("guiconfig.inc");
43

    
44
header("Last-Modified: " . gmdate( "D, j M Y H:i:s" ) . " GMT" );
45
header("Expires: " . gmdate( "D, j M Y H:i:s", time() ) . " GMT" );
46
header("Cache-Control: no-store, no-cache, must-revalidate" ); // HTTP/1.1
47
header("Cache-Control: post-check=0, pre-check=0", FALSE );
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" ?>' . "\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
    }
109
    else if (typeof ActiveXObject != 'undefined') {
110
      try {
111
        http_request = new ActiveXObject('Msxml2.XMLHTTP');
112
      } catch (e) {
113
        try {
114
          http_request = new ActiveXObject('Microsoft.XMLHTTP');
115
        } catch (e) {}
116
      }
117
    }
118
    if (!http_request)
119
      throw '<?=gettext("Both getURL and XMLHttpRequest are undefined"); ?>';
120

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

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

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

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

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

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

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

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

    
179
  cpu_data[cpu_data.length] = cpu;
180

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

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

    
192
  fetch_data();
193
}
194

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

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

    
204
    ]]>
205
  </script>
206
</svg>
(85-85/256)