Project

General

Profile

Download (7.7 KB) Statistics
| Branch: | Tag: | Revision:
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
##|+PRIV
33
##|*IDENT=page-diagnostics-cpuutilization
34
##|*NAME=Diagnostics: CPU Utilization page
35
##|*DESCR=Allow access to the 'Diagnostics: CPU Utilization' page.
36
##|*MATCH=graph_cpu.php*
37
##|-PRIV
38

    
39
header("Last-Modified: " . gmdate( "D, j M Y H:i:s" ) . " GMT" );
40
header("Expires: " . gmdate( "D, j M Y H:i:s", time() ) . " GMT" );
41
header("Cache-Control: no-store, no-cache, must-revalidate" ); // HTTP/1.1
42
header("Cache-Control: post-check=0, pre-check=0", FALSE );
43
header("Pragma: no-cache"); // HTTP/1.0
44
header("Content-type: image/svg+xml");
45

    
46
/********* Other conf *******/
47

    
48
$nb_plot = 120;  // maximum number of data points to plot in the graph
49
$fetch_link = "stats.php?stats=cpu";
50

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

    
61
$height=100;  // SVG internal height : do not modify
62
$width=200;   // SVG internal width  : do not modify
63

    
64
/********* Graph DATA **************/
65
print('<?xml version="1.0" encoding="iso-8859-1"?>' . "\n");?>
66
<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);">
67
  <g id="graph">
68
    <rect id="bg" x1="0" y1="0" width="100%" height="100%" fill="white"/>
69
    <line id="axis_x" x1="0" y1="0" x2="0" y2="100%" <?=$attribs['axis']?>/>
70
    <line id="axis_y" x1="0" y1="100%" x2="100%" y2="100%" <?=$attribs['axis']?>/>
71
    <polygon id="axis_arrow_x" <?=$attribs['axis']?> points="<?=($width) . "," . ($height)?> <?=($width-2) . "," . ($height-2)?> <?=($width-2) . "," . $height?>"/>
72
    <path id="graph_cpu" d="" <?=$attribs['graph_cpu']?>/>
73
    <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']?>/>
74
    <text id="grid_txt1" x="100%" y="25%" <?=$attribs['grid_txt']?> text-anchor="end">75%</text>
75
    <text id="grid_txt2" x="100%" y="50%" <?=$attribs['grid_txt']?> text-anchor="end">50%</text>
76
    <text id="grid_txt3" x="100%" y="75%" <?=$attribs['grid_txt']?> text-anchor="end">25%</text>
77
    <text id="graph_cpu_txt" x="4" y="8" <?=$attribs['cpu']?>> </text>
78
    <text id="error" x="50%" y="50%"  visibility="hidden" <?=$attribs['error']?> text-anchor="middle">Cannot get CPU load</text>
79
    <text id="collect_initial" x="50%" y="50%"  visibility="hidden" <?=$attribs['collect_initial']?> text-anchor="middle">Collecting initial data, please wait...</text>
80
  </g>
81
  <script type="text/ecmascript">
82
    <![CDATA[
83

    
84
/**
85
 * getURL is a proprietary Adobe function, but it's simplicity has made it very
86
 * popular. If getURL is undefined we spin our own by wrapping XMLHttpRequest.
87
 */
88
if (typeof getURL == 'undefined') {
89
  getURL = function(url, callback) {
90
    if (!url)
91
      throw 'No URL for getURL';
92

    
93
    try {
94
      if (typeof callback.operationComplete == 'function')
95
        callback = callback.operationComplete;
96
    } catch (e) {}
97
    if (typeof callback != 'function')
98
      throw 'No callback function for getURL';
99

    
100
    var http_request = null;
101
    if (typeof XMLHttpRequest != 'undefined') {
102
      http_request = new XMLHttpRequest();
103
    }
104
    else if (typeof ActiveXObject != 'undefined') {
105
      try {
106
        http_request = new ActiveXObject('Msxml2.XMLHTTP');
107
      } catch (e) {
108
        try {
109
          http_request = new ActiveXObject('Microsoft.XMLHTTP');
110
        } catch (e) {}
111
      }
112
    }
113
    if (!http_request)
114
      throw 'Both getURL and XMLHttpRequest are undefined';
115

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

    
128
var SVGDoc = null;
129
var last_cpu_total = 0;
130
var last_cpu_idle = 0;
131
var diff_cpu_total = 0;
132
var diff_cpu_idle = 0;
133
var cpu_data = new Array();
134

    
135
var max_num_points = <?=$nb_plot?>;  // maximum number of plot data points
136
var step = <?=$width?> / max_num_points;  // plot X division size
137
var scale = <?=$height?> / 100;
138

    
139
function init(evt) {
140
  SVGDoc = evt.target.ownerDocument;
141
  fetch_data();
142
}
143

    
144
function fetch_data() {
145
  getURL('<?=$fetch_link?>', plot_cpu_data);
146
}
147

    
148
function plot_cpu_data(obj) {
149
  if (!obj.success)
150
    return handle_error();  // getURL failed to get current CPU load data
151

    
152
  var cpu = parseInt(obj.content);
153
  if (!isNumber(cpu))
154
    return handle_error();
155

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

    
174
  cpu_data[cpu_data.length] = cpu;
175

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

    
183
  SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'hidden');
184
  SVGDoc.getElementById('graph_cpu_txt').firstChild.data = cpu + '%';
185
  SVGDoc.getElementById('graph_cpu').setAttributeNS(null, "d", path_data);
186

    
187
  fetch_data();
188
}
189

    
190
function handle_error() {
191
  SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'visible');
192
  fetch_data();
193
}
194

    
195
function isNumber(a) {
196
  return typeof a == 'number' && isFinite(a);
197
}
198

    
199
    ]]>
200
  </script>
201
</svg>
(69-69/217)