1 | <?php |
---|
2 | /* $Id: graph.php,v 1.8 2005/02/18 14:20:35 knobi1 Exp $ */ |
---|
3 | include_once "./conf.php"; |
---|
4 | include_once "./get_context.php"; |
---|
5 | |
---|
6 | if ( !empty( $_GET ) ) { |
---|
7 | extract( $_GET ); |
---|
8 | } |
---|
9 | |
---|
10 | # Graph specific variables |
---|
11 | $size = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["z"] )); |
---|
12 | $graph = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["g"] )); |
---|
13 | $grid = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["G"] )); |
---|
14 | $self = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["me"] )); |
---|
15 | $max = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["x"] )); |
---|
16 | $min = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["n"] )); |
---|
17 | $value = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["v"] )); |
---|
18 | $load_color = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["l"] )); |
---|
19 | $vlabel = escapeshellcmd( rawurldecode( $HTTP_GET_VARS["vl"] )); |
---|
20 | $sourcetime = escapeshellcmd($HTTP_GET_VARS["st"]); |
---|
21 | |
---|
22 | # Assumes we have a $start variable (set in get_context.php). |
---|
23 | if ($size == "small") |
---|
24 | { |
---|
25 | $height = 40; |
---|
26 | $width = 130; |
---|
27 | } |
---|
28 | else if ($size == "medium") |
---|
29 | { |
---|
30 | $height = 75; |
---|
31 | $width = 300; |
---|
32 | } |
---|
33 | else |
---|
34 | { |
---|
35 | $height = 100; |
---|
36 | $width = 400; |
---|
37 | } |
---|
38 | |
---|
39 | |
---|
40 | # This security fix was brought to my attention by Peter Vreugdenhil <petervre@sci.kun.nl> |
---|
41 | # Dont want users specifying their own malicious command via GET variables e.g. |
---|
42 | # http://ganglia.mrcluster.org/graph.php?graph=blob&command=whoami;cat%20/etc/passwd |
---|
43 | # |
---|
44 | if($command) |
---|
45 | { |
---|
46 | exit(); |
---|
47 | } |
---|
48 | |
---|
49 | switch ($context) |
---|
50 | { |
---|
51 | case "meta": |
---|
52 | $rrd_dir = "$rrds/__SummaryInfo__"; |
---|
53 | break; |
---|
54 | case "grid": |
---|
55 | $rrd_dir = "$rrds/$grid/__SummaryInfo__"; |
---|
56 | break; |
---|
57 | case "cluster": |
---|
58 | $rrd_dir = "$rrds/$clustername/__SummaryInfo__"; |
---|
59 | break; |
---|
60 | case "host": |
---|
61 | $rrd_dir = "$rrds/$clustername/$hostname"; |
---|
62 | break; |
---|
63 | default: |
---|
64 | exit; |
---|
65 | } |
---|
66 | |
---|
67 | if ($graph) /* Canned graph request */ |
---|
68 | { |
---|
69 | if($graph == "cpu_report") |
---|
70 | { |
---|
71 | $style = "CPU"; |
---|
72 | |
---|
73 | $upper_limit = "--upper-limit 100 --rigid"; |
---|
74 | $lower_limit = "--lower-limit 0"; |
---|
75 | |
---|
76 | $vertical_label = "--vertical-label Percent "; |
---|
77 | |
---|
78 | if($context != "host" ) |
---|
79 | { |
---|
80 | /* If we are not in a host context, then we need to calculate the average */ |
---|
81 | $series = |
---|
82 | "DEF:'num_nodes'='${rrd_dir}/cpu_user.rrd':'num':AVERAGE " |
---|
83 | ."DEF:'cpu_user'='${rrd_dir}/cpu_user.rrd':'sum':AVERAGE " |
---|
84 | ."CDEF:'ccpu_user'=cpu_user,num_nodes,/ " |
---|
85 | ."DEF:'cpu_nice'='${rrd_dir}/cpu_nice.rrd':'sum':AVERAGE " |
---|
86 | ."CDEF:'ccpu_nice'=cpu_nice,num_nodes,/ " |
---|
87 | ."DEF:'cpu_system'='${rrd_dir}/cpu_system.rrd':'sum':AVERAGE " |
---|
88 | ."CDEF:'ccpu_system'=cpu_system,num_nodes,/ " |
---|
89 | ."DEF:'cpu_idle'='${rrd_dir}/cpu_idle.rrd':'sum':AVERAGE " |
---|
90 | ."CDEF:'ccpu_idle'=cpu_idle,num_nodes,/ " |
---|
91 | ."AREA:'ccpu_user'#$cpu_user_color:'User CPU' " |
---|
92 | ."STACK:'ccpu_nice'#$cpu_nice_color:'Nice CPU' " |
---|
93 | ."STACK:'ccpu_system'#$cpu_system_color:'System CPU' "; |
---|
94 | if (file_exists("$rrd_dir/cpu_wio.rrd")) { |
---|
95 | $series .= "DEF:'cpu_wio'='${rrd_dir}/cpu_wio.rrd':'sum':AVERAGE " |
---|
96 | ."CDEF:'ccpu_wio'=cpu_wio,num_nodes,/ " |
---|
97 | ."STACK:'ccpu_wio'#$cpu_wio_color:'WAIT CPU' "; |
---|
98 | } |
---|
99 | $series .= "STACK:'ccpu_idle'#$cpu_idle_color:'Idle CPU' "; |
---|
100 | } |
---|
101 | else |
---|
102 | { |
---|
103 | $series ="DEF:'cpu_user'='${rrd_dir}/cpu_user.rrd':'sum':AVERAGE " |
---|
104 | ."DEF:'cpu_nice'='${rrd_dir}/cpu_nice.rrd':'sum':AVERAGE " |
---|
105 | ."DEF:'cpu_system'='${rrd_dir}/cpu_system.rrd':'sum':AVERAGE " |
---|
106 | ."DEF:'cpu_idle'='${rrd_dir}/cpu_idle.rrd':'sum':AVERAGE " |
---|
107 | ."AREA:'cpu_user'#$cpu_user_color:'User CPU' " |
---|
108 | ."STACK:'cpu_nice'#$cpu_nice_color:'Nice CPU' " |
---|
109 | ."STACK:'cpu_system'#$cpu_system_color:'System CPU' "; |
---|
110 | if (file_exists("$rrd_dir/cpu_wio.rrd")) { |
---|
111 | $series .= "DEF:'cpu_wio'='${rrd_dir}/cpu_wio.rrd':'sum':AVERAGE " |
---|
112 | ."STACK:'cpu_wio'#$cpu_wio_color:'WAIT CPU' "; |
---|
113 | } |
---|
114 | $series .= "STACK:'cpu_idle'#$cpu_idle_color:'Idle CPU' "; |
---|
115 | } |
---|
116 | } |
---|
117 | else if ($graph == "mem_report") |
---|
118 | { |
---|
119 | $style = "Memory"; |
---|
120 | |
---|
121 | $lower_limit = "--lower-limit 0 --rigid"; |
---|
122 | $extras = "--base 1024"; |
---|
123 | $vertical_label = "--vertical-label Bytes"; |
---|
124 | |
---|
125 | $series = "DEF:'mem_total'='${rrd_dir}/mem_total.rrd':'sum':AVERAGE " |
---|
126 | ."CDEF:'bmem_total'=mem_total,1024,* " |
---|
127 | ."DEF:'mem_shared'='${rrd_dir}/mem_shared.rrd':'sum':AVERAGE " |
---|
128 | ."CDEF:'bmem_shared'=mem_shared,1024,* " |
---|
129 | ."DEF:'mem_free'='${rrd_dir}/mem_free.rrd':'sum':AVERAGE " |
---|
130 | ."CDEF:'bmem_free'=mem_free,1024,* " |
---|
131 | ."DEF:'mem_cached'='${rrd_dir}/mem_cached.rrd':'sum':AVERAGE " |
---|
132 | ."CDEF:'bmem_cached'=mem_cached,1024,* " |
---|
133 | ."DEF:'mem_buffers'='${rrd_dir}/mem_buffers.rrd':'sum':AVERAGE " |
---|
134 | ."CDEF:'bmem_buffers'=mem_buffers,1024,* " |
---|
135 | ."CDEF:'bmem_used'='bmem_total','bmem_shared',-,'bmem_free',-,'bmem_cached',-,'bmem_buffers',- " |
---|
136 | ."AREA:'bmem_used'#$mem_used_color:'Memory Used' " |
---|
137 | ."STACK:'bmem_shared'#$mem_shared_color:'Memory Shared' " |
---|
138 | ."STACK:'bmem_cached'#$mem_cached_color:'Memory Cached' " |
---|
139 | ."STACK:'bmem_buffers'#$mem_buffered_color:'Memory Buffered' "; |
---|
140 | if (file_exists("$rrd_dir/swap_total.rrd")) { |
---|
141 | $series .= "DEF:'swap_total'='${rrd_dir}/swap_total.rrd':'sum':AVERAGE " |
---|
142 | ."DEF:'swap_free'='${rrd_dir}/swap_free.rrd':'sum':AVERAGE " |
---|
143 | ."CDEF:'bmem_swapped'='swap_total','swap_free',-,1024,* " |
---|
144 | ."STACK:'bmem_swapped'#$mem_swapped_color:'Memory Swapped' "; |
---|
145 | } |
---|
146 | $series .= "LINE2:'bmem_total'#$cpu_num_color:'Total In-Core Memory' "; |
---|
147 | } |
---|
148 | else if ($graph == "load_report") |
---|
149 | { |
---|
150 | $style = "Load"; |
---|
151 | |
---|
152 | $lower_limit = "--lower-limit 0 --rigid"; |
---|
153 | $vertical_label = "--vertical-label 'Load/Procs'"; |
---|
154 | |
---|
155 | $series = "DEF:'load_one'='${rrd_dir}/load_one.rrd':'sum':AVERAGE " |
---|
156 | ."DEF:'proc_run'='${rrd_dir}/proc_run.rrd':'sum':AVERAGE " |
---|
157 | ."DEF:'cpu_num'='${rrd_dir}/cpu_num.rrd':'sum':AVERAGE "; |
---|
158 | if( $context != "host" ) |
---|
159 | { |
---|
160 | $series .="DEF:'num_nodes'='${rrd_dir}/cpu_num.rrd':'num':AVERAGE "; |
---|
161 | } |
---|
162 | $series .="AREA:'load_one'#$load_one_color:'1-min Load' "; |
---|
163 | if( $context != "host" ) |
---|
164 | { |
---|
165 | $series .= "LINE2:'num_nodes'#$num_nodes_color:'Nodes' "; |
---|
166 | } |
---|
167 | $series .="LINE2:'cpu_num'#$cpu_num_color:'CPUs' "; |
---|
168 | $series .="LINE2:'proc_run'#$proc_run_color:'Running Processes' "; |
---|
169 | } |
---|
170 | else if ($graph == "network_report") |
---|
171 | { |
---|
172 | $style = "Network"; |
---|
173 | |
---|
174 | $lower_limit = "--lower-limit 0 --rigid"; |
---|
175 | $extras = "--base 1024"; |
---|
176 | $vertical_label = "--vertical-label 'Bytes/sec'"; |
---|
177 | |
---|
178 | $series = "DEF:'bytes_in'='${rrd_dir}/bytes_in.rrd':'sum':AVERAGE " |
---|
179 | ."DEF:'bytes_out'='${rrd_dir}/bytes_out.rrd':'sum':AVERAGE " |
---|
180 | ."LINE2:'bytes_in'#$mem_cached_color:'In' " |
---|
181 | ."LINE2:'bytes_out'#$mem_used_color:'Out' "; |
---|
182 | } |
---|
183 | else if ($graph == "packet_report") |
---|
184 | { |
---|
185 | $style = "Packets"; |
---|
186 | |
---|
187 | $lower_limit = "--lower-limit 0 --rigid"; |
---|
188 | $extras = "--base 1024"; |
---|
189 | $vertical_label = "--vertical-label 'Packets/sec'"; |
---|
190 | |
---|
191 | $series = "DEF:'bytes_in'='${rrd_dir}/pkts_in.rrd':'sum':AVERAGE " |
---|
192 | ."DEF:'bytes_out'='${rrd_dir}/pkts_out.rrd':'sum':AVERAGE " |
---|
193 | ."LINE2:'bytes_in'#$mem_cached_color:'In' " |
---|
194 | ."LINE2:'bytes_out'#$mem_used_color:'Out' "; |
---|
195 | } |
---|
196 | else |
---|
197 | { |
---|
198 | /* Custom graph */ |
---|
199 | $style = ""; |
---|
200 | |
---|
201 | $subtitle = $metricname; |
---|
202 | if ($context == "host") |
---|
203 | { |
---|
204 | if ($size == "small") |
---|
205 | $prefix = $metricname; |
---|
206 | else |
---|
207 | $prefix = $hostname; |
---|
208 | |
---|
209 | $value = $value>1000 ? number_format($value) : number_format($value, 2); |
---|
210 | |
---|
211 | if ($range=="job") { |
---|
212 | $hrs = intval( -$jobrange / 3600 ); |
---|
213 | $subtitle = "$prefix last ${hrs}h (now $value)"; |
---|
214 | } |
---|
215 | else |
---|
216 | $subtitle = "$prefix last $range (now $value)"; |
---|
217 | } |
---|
218 | |
---|
219 | if (is_numeric($max)) |
---|
220 | $upper_limit = "--upper-limit '$max' "; |
---|
221 | if (is_numeric($min)) |
---|
222 | $lower_limit ="--lower-limit '$min' "; |
---|
223 | |
---|
224 | if ($vlabel) |
---|
225 | $vertical_label = "--vertical-label '$vlabel'"; |
---|
226 | else if ($upper_limit or $lower_limit) |
---|
227 | { |
---|
228 | $max = $max>1000 ? number_format($max) : number_format($max, 2); |
---|
229 | $min = $min>0 ? number_format($min,2) : $min; |
---|
230 | |
---|
231 | $vertical_label ="--vertical-label '$min - $max' "; |
---|
232 | } |
---|
233 | |
---|
234 | $rrd_file = "$rrd_dir/$metricname.rrd"; |
---|
235 | $series = "DEF:'sum'='$rrd_file':'sum':AVERAGE " |
---|
236 | ."AREA:'sum'#$default_metric_color:'$subtitle' "; |
---|
237 | if ($jobstart) |
---|
238 | $series .= "VRULE:$jobstart#$jobstart_color "; |
---|
239 | } |
---|
240 | |
---|
241 | # Set the graph title. |
---|
242 | if($context == "meta") |
---|
243 | { |
---|
244 | $title = "$self $meta_designator $style last $range"; |
---|
245 | } |
---|
246 | else if ($context == "grid") |
---|
247 | { |
---|
248 | $title = "$grid $meta_designator $style last $range"; |
---|
249 | } |
---|
250 | else if ($context == "cluster") |
---|
251 | { |
---|
252 | $title = "$clustername $style last $range"; |
---|
253 | } |
---|
254 | else |
---|
255 | { |
---|
256 | if ($size == "small") |
---|
257 | { |
---|
258 | # Value for this graph define a background color. |
---|
259 | if (!$load_color) $load_color = "ffffff"; |
---|
260 | $background = "--color BACK#'$load_color'"; |
---|
261 | |
---|
262 | $title = $hostname; |
---|
263 | } |
---|
264 | else if ($style) |
---|
265 | $title = "$hostname $style last $range"; |
---|
266 | else |
---|
267 | $title = $metricname; |
---|
268 | } |
---|
269 | |
---|
270 | # Fix from Phil Radden, but step is not always 15 anymore. |
---|
271 | if ($range=="month") |
---|
272 | $end = floor($end / 672) * 672; |
---|
273 | |
---|
274 | # |
---|
275 | # Generate the rrdtool graph command. |
---|
276 | # |
---|
277 | $command = RRDTOOL . " graph - --start $start --end $end ". |
---|
278 | "--width $width --height $height $upper_limit $lower_limit ". |
---|
279 | "--title '$title' $vertical_label $extras $background ". |
---|
280 | $series; |
---|
281 | |
---|
282 | $debug=0; |
---|
283 | |
---|
284 | # Did we generate a command? Run it. |
---|
285 | if($command) |
---|
286 | { |
---|
287 | /*Make sure the image is not cached*/ |
---|
288 | header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past |
---|
289 | header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified |
---|
290 | header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 |
---|
291 | header ("Pragma: no-cache"); // HTTP/1.0 |
---|
292 | if ($debug) { |
---|
293 | header ("Content-type: text/html"); |
---|
294 | print "$command\n\n\n\n\n"; |
---|
295 | } |
---|
296 | else { |
---|
297 | header ("Content-type: image/gif"); |
---|
298 | passthru($command); |
---|
299 | } |
---|
300 | } |
---|
301 | |
---|
302 | ?> |
---|
303 | |
---|