Hi all,

I've finally finished implementing an interface for generating
customized graphs.

A patch against Ganglia 3.0.2 is attached (it should probably work with
3.0.3 as well). You can also grab it at http://wtf.ath.cx/custom_graph.diff


I suspect IE won't like the JavaScript in this one, but I didn't really
dig into that.


Feedback is most welcome!


Cheers,

Alex

diff -urN ganglia/custom_graph_interface.php ganglia.new/custom_graph_interface.php
--- ganglia/custom_graph_interface.php	1970-01-01 02:00:00.000000000 +0200
+++ ganglia.new/custom_graph_interface.php	2006-04-18 23:04:24.000000000 +0300
@@ -0,0 +1,457 @@
+
+<html>
+<body>
+
+  <script language="JavaScript">
+	function resubmit() {
+		document.myform.action="custom_graph_interface.php";
+		document.myform.submit();
+	}
+	function process() {
+		document.myform.action="custom_graph_processing.php";
+		document.myform.submit();
+	}
+  </script>
+
+  <form name="myform" action="custom_graph_processing.php" method="get">
+    <input type="hidden" name="action" value="custom_graph_interface">
+
+<?php
+
+#
+# The hard limit of 1000 logical metrics is totally random
+#
+$max_logical_metrics = 1000;
+$default_line_thickness = 2;
+
+#
+# Get directory containing RRDs
+#
+if (!empty($_GET['rrd_dir']))
+	$directory = escapeshellcmd(rawurldecode($_GET['rrd_dir']));
+else {
+	echo "Could not obtain directory containing RRDs.";
+	exit;
+}
+
+
+function table_entry($metric) {
+
+	global $max_logical_metrics;
+	global $default_line_thickness;
+
+	#
+	# Metric name
+	#
+	if (stristr($metric, "logical_metric_")) {
+		echo "<td>\n";
+		#
+		# logical_metric_0 is used for newly added values only
+		# if that's our $metric value, we need to reassign it to an empty
+		# slot in the logical_metric_$domain
+		#
+		if ($metric == "logical_metric_0") {
+			for ($i = 1; $i < $max_logical_metrics; $i++) {
+				if (empty($_GET["logical_metric_" ."$i"])) {
+					$logical_metric_num = $i;
+					break;
+				}
+			}
+			echo "<input type=\"checkbox\" checked=\"checked\" name=\"logical_metric_" ."$logical_metric_num\">\n";
+			echo "<input type=\"text\" name=\"logical_metric_" ."$logical_metric_num" ."_name\" value=\"logical_metric\">\n";
+		}
+		else {
+			echo "<input type=\"checkbox\" checked=\"checked\" name=\"$metric\">\n";
+			$metric_name = $_GET["$metric" ."_name"];
+			echo "<input type=\"text\" name=\"$metric" ."_name\" value=\"$metric_name\">\n";
+		}
+		echo "</td>\n";
+	}
+	else
+		echo "<td><input type=\"checkbox\" checked=\"checked\" name=\"$metric\">$metric</td>\n";
+	#
+	# Line thickness
+	#
+	echo "<td>\n";
+	if (stristr($metric, "logical_metric_") && $metric == "logical_metric_0")
+		echo "<select name=\"logical_metric_" ."$logical_metric_num" ."_line_thickness\">\n";
+	else
+		echo "<select name=\"$metric" ."_line_thickness\">\n";
+	if (isset($_GET["$metric" ."_line_thickness"])) {
+		$option_selected = "option_" .$_GET["$metric" ."_line_thickness"] ."_selected";
+		$$option_selected = "selected";
+	}
+	else {
+		$option_selected = "option_" ."$default_line_thickness" ."_selected";
+		$$option_selected = "selected";
+	}
+	echo "<option value=\"0\" $option_0_selected>none\n";
+	echo "<option value=\"1\" $option_1_selected>1\n";
+	echo "<option value=\"2\" $option_2_selected>2\n";
+	echo "<option value=\"3\" $option_3_selected>3\n";
+	unset ($$option_selected);
+	echo "</select>\n";
+	echo "</td>\n";
+	#
+	# Line color
+	#
+	echo "<td>\n";
+	if (stristr($metric, "logical_metric_") && $metric == "logical_metric_0")
+		color_dropdown(line_color, $metric, $logical_metric_num);
+	else
+		color_dropdown(line_color, $metric);
+	echo "</td>\n";
+	#
+	# Fill area
+	#
+	echo "<td>\n";
+	if (stristr($metric, "logical_metric_") && $metric == "logical_metric_0")
+		echo "<select name=\"logical_metric_" ."$logical_metric_num" ."_fill_area\">\n";
+	else
+		echo "<select name=\"$metric" ."_fill_area\">\n";
+	if (isset($_GET["$metric" ."_fill_area"])) {
+		$option_selected = "option_" .$_GET["$metric" ."_fill_area"] ."_selected";
+		$$option_selected = "selected";
+	}
+	echo "<option value=\"0\" $option_0_selected>no\n";
+	echo "<option value=\"1\" $option_1_selected>yes\n";
+	unset($$option_selected);
+	echo "</select>\n";
+	echo "</td>\n";
+	#
+	# Area color
+	#
+	echo "<td>\n";
+	if (stristr($metric, "logical_metric_") && $metric == "logical_metric_0")
+		color_dropdown(area_color, $metric, $logical_metric_num);
+	else
+		color_dropdown(area_color, $metric);
+	echo "</td>\n";
+	#
+	# CDEF field is used only for logical metrics
+	#
+	if (stristr($metric, "logical_metric_")) {
+		if ($metric == "logical_metric_0")
+			echo "<td><input type=\"text\" name=\"logical_metric_" ."$logical_metric_num" ."_cdef\"";
+		else
+			echo "<td><input type=\"text\" name=\"$metric" ."_cdef\"";
+		if (isset($_GET["$metric" ."_cdef"]))
+			$metric_cdef = $_GET["$metric" ."_cdef"];
+		else
+			$metric_cdef = "metric1,metric2,*";
+		echo "value=\"$metric_cdef\"></td>\n";
+	}
+	#
+	# Terminate row
+	#
+	echo "<tr>\n";
+}
+
+function choose_random_color($field_name, $color_codes) {
+	#
+	# Obtain all colors already set in the field
+	#
+	$get_keys = array_keys($_GET);
+	foreach ($get_keys as $key)
+		if (strpos($key, "$field_name"))
+			$colors_set[$key] = $_GET[$key];
+
+	#
+	# Generate array of colors that do not appear in $colors_set
+	#
+	if (count($colors_set))
+		$unused_colors = array_diff($color_codes, $colors_set);
+	
+	#
+	# Choose a random color
+	#
+	if (isset($colors_set))
+		return array_rand($unused_colors);
+	else
+		return array_rand($color_codes);
+}
+
+function color_dropdown() {
+	$arg_list = func_get_args();
+	$field_name = $arg_list[0];
+	$metric = $arg_list[1];
+	if ($metric == "logical_metric_0")
+		$logical_metric_num = $arg_list[2];
+	$color_codes = array(
+		"black" => "#000000",
+		"white" => "#FFFFFF",
+		"grey" => "#AAAAAA",
+		"blue" => "#0000FF",
+		"green"=> "#00CC00",
+		"red" => "#FF0000",
+		"yellow" => "#FFFF00",
+		"cyan" => "#00FFFF",
+		"pink" => "#FF33FF",
+		"purple" => "#CC00CC"
+		);
+	$color_list = array_keys($color_codes);
+
+	if ($metric == "logical_metric_0")
+		echo "<select name=\"logical_metric_" .$logical_metric_num ."_$field_name\">\n";
+	else
+		echo "<select name=\"$metric" ."_$field_name\">\n";
+	foreach ($color_list as $color) {
+		echo "<option value=\"$color_codes[$color]\"";
+		if (isset($_GET["$metric" ."_$field_name"]) && $_GET["$metric" ."_$field_name"] == $color_codes[$color]) {
+			echo "selected";
+			$selected_color = 1;
+		}
+		echo ">$color\n";
+	}
+	if (! $selected_color) {
+		$random_color = choose_random_color($field_name, $color_codes);
+		echo "<option value=\"$color_codes[$random_color]\" selected>$random_color\n";
+	}
+	echo "</select>\n";
+}
+
+
+echo "<table border=0>\n";
+#
+# Who we're generating a custom graph for
+#
+echo "<td>Graph view: &nbsp;</td>\n";
+echo "<td><b>$_GET[custom_graph_view] &nbsp;</b></td>\n";
+echo "<tr>\n";
+
+#
+# Graph title
+#
+echo "<td>Graph title: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"title\"";
+if (!empty($_GET['title']))
+	echo " value=\"$_GET[title]\"";
+echo ">&nbsp;</td>\n";
+echo "<tr>\n";
+
+#
+# Start time
+#
+echo "<td>Start time: &nbsp;";
+echo "<td><input type=\"text\" name=\"start_time\"";
+if (!empty($_GET['start_time']))
+	echo " value=\"$_GET[start_time]\"";
+else {
+	$time_array = gettimeofday();
+	$start_time = $time_array[sec];
+	switch ($_GET[$time_range]) {
+		case "hour":  $start_time -= 3600; break;
+		case "day":   $start_time -= 86400; break;
+		case "week":  $start_time -= 604800; break;
+		case "month": $start_time -= 2419200; break;
+		case "year":  $start_time -= 31449600; break;
+		default: $start_time -= 3600;
+	}
+	$human_time = date("j F Y  H:i", $start_time);
+	echo " value=\"$human_time\"";
+}
+echo ">&nbsp;</td>\n";
+
+#
+# End time
+#
+echo "<td>End time: &nbsp;";
+echo "<td><input type=\"text\" name=\"end_time\"";
+if (!empty($_GET['end_time']))
+	echo " value=\"$_GET[end_time]\"";
+else {
+	$human_time = date("j F Y  H:i");
+	echo " value=\"$human_time\"";
+}
+echo ">&nbsp;</td>\n";
+echo "<tr>\n";
+
+#
+# Upper graph limit
+#
+echo "<td>Upper graph limit: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"upper_limit\"";
+if (!empty($_GET['upper_limit']))
+	echo " value=\"$_GET[upper_limit]\"";
+echo ">&nbsp;</td>\n";
+echo "<td>Rigid? &nbsp;</td>\n";
+echo "<td>\n";
+echo "<select name=\"upper_limit_rigid\">\n";
+if (!empty($_GET['upper_limit_rigid'])) {
+	$option_selected = "option_" .$_GET['upper_limit_rigid'] ."_selected";
+	$$option_selected = "selected";
+}
+echo "<option value=\"0\" $option_0_selected>no\n";
+echo "<option value=\"1\" $option_1_selected>yes\n";
+unset($$option_selected);
+echo "</select>\n";
+echo "</td>\n";
+echo "<tr>\n";
+
+#
+# Lower graph limit
+#
+echo "<td>Lower graph limit: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"lower_limit\"";
+if (!empty($_GET['lower_limit']))
+	echo " value=\"$_GET[lower_limit]\"";
+else
+	echo " value=\"0\"";
+echo ">&nbsp;</td>\n";
+echo "<td>Rigid? &nbsp;</td>\n";
+echo "<td>\n";
+echo "<select name=\"lower_limit_rigid\">\n";
+if (!empty($_GET['lower_limit_rigid'])) {
+	$option_selected = "option_" .$_GET['lower_limit_rigid'] ."_selected";
+	$$option_selected = "selected";
+}
+echo "<option value=\"1\" $option_1_selected>yes\n";
+echo "<option value=\"0\" $option_0_selected>no\n";
+unset($$option_selected);
+echo "</select>\n";
+echo "</td>\n";
+echo "<tr>\n";
+
+#
+# Base units for graph
+#
+echo "<td>Base: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"base\"";
+if (!empty($_GET['base']))
+	echo " value=\"$_GET[base]\"";
+else
+	echo " value=\"1000\"";
+echo ">&nbsp;</td>\n";
+echo "<tr>\n";
+
+#
+# Vertical label
+#
+echo "<td>Vertical label: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"vertical_label\"";
+if (!empty($_GET['vertical_label']))
+	echo " value=\"$_GET[vertical_label]\"";
+echo ">&nbsp;</td>\n";
+echo "<tr>\n";
+
+#
+# Graph height
+#
+echo "<td>Graph height: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"height\"";
+if (!empty($_GET['height']))
+	echo " value=\"$_GET[height]\"";
+else
+	echo " value=\"295\"";
+echo ">&nbsp;</td>\n";
+echo "<tr>\n";
+
+#
+# Graph width
+#
+echo "<td>Graph width: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"width\"";
+if (!empty($_GET['width']))
+	echo " value=\"$_GET[width]\"";
+else
+	echo " value=\"895\"";
+echo ">&nbsp;</td>\n";
+echo "<tr>\n";
+
+#
+# Where to send the graph output
+#
+echo "<td>Display graph to: &nbsp;</td>\n";
+echo "<td><input type=\"text\" name=\"output_file\"";
+if (!empty($_GET['output_file']))
+	echo " value=\"$_GET[output_file]\"";
+else
+	echo " value=\"stdout\"";
+echo ">&nbsp;</td>\n";
+echo "</table>\n";
+echo "<br>\n";
+
+#
+# Drop-down metric menu - when a value is selected the form is resubmitted to itself
+#
+echo "Add metric: &nbsp;<select name=\"added_metric\" onchange=\"resubmit()\">\n";
+
+#
+# Iterate over all files in dir and display them in the drop-down menu
+#
+if ($handle = opendir($directory)) {
+	echo "<option>Choose metric";
+	echo "<option value=\"logical_metric_0\">logical_metric";
+
+	$arr_size = 0;
+	while (false !== ($file = readdir($handle))) {
+		#
+		# Exclude "." and ".."
+		#
+		if ($file != "." && $file != "..") {
+			#
+			# Strip file extension and replace "." with "_"
+			#
+			$file = str_replace(".rrd", "", "$file");
+			$file = str_replace(".", "_", "$file");
+			$metrics[$arr_size] = $file;
+			echo "<option value=\"$file\">$file";
+		}
+		$arr_size++;
+	}
+	echo "</select>\n";
+	closedir($handle);
+}
+
+#
+# Table header - our added metrics will appear inside it
+#
+echo "<br><br>\n";
+echo "<table border=1>\n";
+echo "<th>Metric Name</th>\n";
+echo "<th>Line Thickness</th>\n";
+echo "<th>Line Color</th>\n";
+echo "<th>Fill Area</th>\n";
+echo "<th>Area Color</th>\n";
+echo "<th>CDEF</th>\n";
+echo "<tr>\n";
+
+#
+# Add metrics to table - if the GET variable we're checking exists, the form has been
+# submitted to itself and we have a metric to add to the table
+#
+if (isset($_GET['added_metric']))
+	table_entry($_GET['added_metric']);
+
+#
+# Popullate table with checked elements - this applies only to metrics which have
+# an rrd file in the scanned directory
+#
+for ($i = 0; $i < $arr_size; $i++)
+	if (isset($_GET[$metrics[$i]]))
+		table_entry($metrics[$i]);
+
+#
+# Add logical metrics to table
+#
+for ($i = 0; $i < $max_logical_metrics; $i++)
+	if (isset($_GET["logical_metric_" ."$i"]))
+		table_entry("logical_metric_" ."$i");
+
+#
+# Some hidden values to pass on
+#
+echo "<input type=\"hidden\" name=\"rrd_dir\" value=\"$directory\">\n";
+echo "<input type=\"hidden\" name=\"rrd_tool\" value=\"$_GET[rrd_tool]\">\n";
+echo "<input type=\"hidden\" name=\"max_logical_metrics\" value=\"$max_logical_metrics\">\n";
+echo "<input type=\"hidden\" name=\"custom_graph_view\" value=\"$_GET[custom_graph_view]\">\n";
+
+?>
+
+    </table>
+    <br>
+    <center><input type="submit" value="Generate graph!"></center>
+  </form>
+
+</body>
+</html>
diff -urN ganglia/custom_graph_processing.php ganglia.new/custom_graph_processing.php
--- ganglia/custom_graph_processing.php	1970-01-01 02:00:00.000000000 +0200
+++ ganglia.new/custom_graph_processing.php	2006-04-18 23:04:35.000000000 +0300
@@ -0,0 +1,194 @@
+<?php
+
+#
+# Obtain some variables
+#
+$rrd_dir = isset($_GET["rrd_dir"]) ?
+	escapeshellcmd(rawurldecode($_GET["rrd_dir"])) : NULL;
+$rrdtool = isset($_GET["rrd_tool"]) ?
+	escapeshellcmd(rawurldecode($_GET["rrd_tool"])) : NULL;
+$max_logical_metrics = isset($_GET["max_logical_metrics"]) ?
+	escapeshellcmd(rawurldecode($_GET["max_logical_metrics"])) : NULL;
+
+#
+# Obtain general graph parameters
+#
+$title = isset($_GET["title"]) ?
+	escapeshellcmd(rawurldecode($_GET["title"])) : NULL;
+$start_time = isset($_GET["start_time"]) ?
+	escapeshellcmd(rawurldecode($_GET["start_time"])) : NULL;
+$end_time = isset($_GET["end_time"]) ?
+	escapeshellcmd(rawurldecode($_GET["end_time"])) : NULL;
+$upper_limit = isset($_GET["upper_limit"]) ?
+	escapeshellcmd(rawurldecode($_GET["upper_limit"])) : NULL;
+$upper_limit_rigid = isset($_GET["upper_limit_rigid"]) ?
+	escapeshellcmd(rawurldecode($_GET["upper_limit_rigid"])) : NULL;
+$lower_limit = isset($_GET["lower_limit"]) ?
+	escapeshellcmd(rawurldecode($_GET["lower_limit"])) : NULL;
+$lower_limit_rigid = isset($_GET["lower_limit_rigid"]) ?
+	escapeshellcmd(rawurldecode($_GET["lower_limit_rigid"])) : NULL;
+$base = isset($_GET["base"]) ?
+	escapeshellcmd(rawurldecode($_GET["base"])) : NULL;
+$vertical_label = isset($_GET["vertical_label"]) ?
+	escapeshellcmd(rawurldecode($_GET["vertical_label"])) : NULL;
+$height = isset($_GET["height"]) ?
+	escapeshellcmd(rawurldecode($_GET["height"])) : NULL;
+$width = isset($_GET["width"]) ?
+	escapeshellcmd(rawurldecode($_GET["width"])) : NULL;
+$output_file = isset($_GET["output_file"]) ?
+	escapeshellcmd(rawurldecode($_GET["output_file"])) : NULL;
+
+#
+# If graphs are sent to stdout we need to parse the variable
+#
+if ($output_file == "stdout")
+	$output_file = "-";
+
+#
+# Convert time
+#
+$start_time = strtotime($start_time);
+$end_time = strtotime($end_time);
+if ($start_time == -1 or $end_time == -1) {
+	echo "Invalid time string supplied, convertion failed:<br>";
+	echo '$start_time ' ."($_GET[start_time]) = $start_time<br>";
+	echo '$end_time ' ."($_GET[end_time]) = $end_time<br>";
+	exit;
+}
+
+#
+# Optional parameters
+#
+if (!empty($upper_limit)) {
+	$opt_cmdline .= " --upper-limit $upper_limit";
+	if (!empty($upper_limit_rigid))
+		$opt_cmdline .= " --rigid";
+}
+if (!empty($lower_limit)) {
+	$opt_cmdline .= " --lower-limit $lower_limit";
+	if (!empty($lower_limit_rigid))
+		$opt_cmdline .= " --rigid";
+}
+if (!empty($title))
+	$opt_cmdline .= " --title '$title'";
+if (!empty($vertical_label))
+	$opt_cmdline .= " --vertical-label '$vertical_label'";
+
+#
+# Handle metrics
+#
+if ($handle = opendir($rrd_dir)) {
+	while (false !== ($file = readdir($handle))) {
+		#
+		# Exclude "." and ".."
+		#
+		if ($file != "." && $file != "..") {
+			#
+			# Strip file extension and replace "." with "_"
+			#
+			$file_no_ext = str_replace(".rrd", "", "$file");
+			$metric_name = str_replace(".", "_", "$file_no_ext");
+			$metric_status = escapeshellcmd(rawurldecode($_GET["$metric_name"]));
+
+			if ($metric_status == "on") {
+				#
+				# Graphical parameters of metric
+				#
+				$metric_line_thickness = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_line_thickness"]));
+				$metric_line_color = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_line_color"]));
+				$metric_fill_area = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_fill_area"]));
+				$metric_area_color = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_area_color"]));
+				#
+				# Parse metric parameters to rrdtool format
+				#
+				$metrics_cmdline .= " DEF:'$file_no_ext'='$rrd_dir/$file':sum:AVERAGE";
+				if (!empty($metric_line_thickness))
+					$metrics_cmdline .= " LINE$metric_line_thickness:'$file_no_ext'$metric_line_color:'$file_no_ext'";
+				if (!empty($metric_fill_area))
+					$metrics_cmdline .= " AREA:'$file_no_ext'$metric_area_color:'$file_no_ext'";
+				#
+				# Graph legend
+				#
+				$leading_spaces = 20 - strlen($file_no_ext);
+				$metrics_cmdline .= " VDEF:'$file_no_ext" ."min'=$file_no_ext,MINIMUM";
+				$metrics_cmdline .= " VDEF:'$file_no_ext" ."avg'=$file_no_ext,AVERAGE";
+				$metrics_cmdline .= " VDEF:'$file_no_ext" ."max'=$file_no_ext,MAXIMUM";
+				$metrics_cmdline .= " GPRINT:'$file_no_ext" ."min':\"%$leading_spaces.2lf\"";
+				$metrics_cmdline .= " GPRINT:'$file_no_ext" ."avg':\"\t%10.2lf\"";
+				$metrics_cmdline .= " GPRINT:'$file_no_ext" ."max':\"\t%10.2lf\\n\"";
+			}
+		}
+	}
+}
+
+#
+# Handle logical metrics
+#
+for ($i = 0; $i < $max_logical_metrics; $i++) {
+	if (isset($_GET["logical_metric_" ."$i"])) {
+		$metric_name = "logical_metric_" ."$i";
+		$logical_metric_name = $_GET["$metric_name" ."_name"];
+		$logical_metric_cdef = $_GET["$metric_name" ."_cdef"];
+		$metrics_cmdline .= " CDEF:'$logical_metric_name'=$logical_metric_cdef";
+		#
+		# Graphical parameters of metric
+		#
+		$metric_line_thickness = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_line_thickness"]));
+		$metric_line_color = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_line_color"]));
+		$metric_fill_area = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_fill_area"]));
+		$metric_area_color = escapeshellcmd(rawurldecode($_GET["$metric_name" ."_area_color"]));
+		#
+		# Parse graphical metric parameters to rrdtool format
+		#
+		if (!empty($metric_line_thickness))
+			$metrics_cmdline .= " LINE$metric_line_thickness:'$logical_metric_name'$metric_line_color:'$logical_metric_name'";
+		if (!empty($metric_fill_area))
+			$metrics_cmdline .= " AREA:'$logical_metric_name'$metric_area_color:'$logical_metric_name'";
+		#
+		# Graph legend
+		#
+		$leading_spaces = 20 - strlen($logical_metric_name);
+		$metrics_cmdline .= " VDEF:'$logical_metric_name" ."min'=$logical_metric_name,MINIMUM";
+		$metrics_cmdline .= " VDEF:'$logical_metric_name" ."avg'=$logical_metric_name,AVERAGE";
+		$metrics_cmdline .= " VDEF:'$logical_metric_name" ."max'=$logical_metric_name,MAXIMUM";
+		$metrics_cmdline .= " GPRINT:'$logical_metric_name" ."min':\"%$leading_spaces.2lf\"";
+		$metrics_cmdline .= " GPRINT:'$logical_metric_name" ."avg':\"\t%10.2lf\"";
+		$metrics_cmdline .= " GPRINT:'$logical_metric_name" ."max':\"\t%10.2lf\\n\"";
+	}
+}
+
+#
+# Legend header - nice formatting always seems to me like voodoo
+#
+$legend_header .= " COMMENT:\"\\t\\t\\t\""
+	." COMMENT:\"Minimum        \""
+	." COMMENT:\"Average         \""
+	." COMMENT:\"Maximum\\n\"";
+
+#
+# Add metric parameters to command line
+#
+$command = "$rrdtool graph $output_file --start $start_time --end $end_time --width $width --height $height";
+$command .= "$opt_cmdline $legend_header $metrics_cmdline";
+
+
+$debug = 0;
+if (empty($debug)) {
+	#
+	# Prepare HTTP header
+	#
+	header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");   // Date in the past
+	header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
+	header ("Cache-Control: no-cache, must-revalidate");   // HTTP/1.1
+	header ("Pragma: no-cache");                     // HTTP/1.0
+	header ("Content-type: image/gif");
+
+	#
+	# Execute command
+	#
+	passthru($command);
+}
+else
+	echo $command;
+
+?>
diff -urN ganglia/header.php ganglia.new/header.php
--- ganglia/header.php	2005-02-03 04:22:48.000000000 +0200
+++ ganglia.new/header.php	2006-04-18 23:04:10.000000000 +0300
@@ -328,6 +328,45 @@
       # Assign template variable in cluster view.
    }
 
+#
+# Button for custom graphs interface
+#
+if ($context != "node" and $context != "physical" ) {
+   switch ($context)
+      {
+        case "meta":
+          $rrd_dir = "$rrds/__SummaryInfo__";
+          $custom_graph_view = $self;
+          break;
+        case "grid":
+          $rrd_dir = "$rrds/$grid/__SummaryInfo__";
+          $custom_graph_view = $grid;
+          break;
+        case "cluster":
+          $rrd_dir = "$rrds/$clustername/__SummaryInfo__";
+          $custom_graph_view = $clustername;
+          break;
+        case "host":
+          $rrd_dir = "$rrds/$clustername/$hostname";
+          $custom_graph_view = $hostname;
+          break;
+        default:
+          exit;
+      }
+
+
+   $custom_graph_button = "<FORM METHOD=\"get\" ACTION=\"custom_graph_interface.php\" NAME=\"custom_graph\">"
+     ."<INPUT TYPE=\"hidden\" NAME=\"rrd_dir\" VALUE=\"$rrd_dir\">"
+     ."<INPUT TYPE=\"hidden\" NAME=\"rrd_tool\" VALUE=\"" .RRDTOOL ."\">"
+     ."<INPUT TYPE=\"hidden\" NAME=\"time_range\" VALUE=\"$range\">"
+     ."<INPUT TYPE=\"hidden\" NAME=\"custom_graph_view\" VALUE=\"$custom_graph_view\">"
+     ."<INPUT TYPE=\"submit\" VALUE=\"custom graph\">"
+     ."</FORM>";
+
+   $tpl->assign("custom_graph_button", $custom_graph_button);
+}
+
+
 # Make sure that no data is cached..
 header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    # Date in the past
 header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); # always modified
diff -urN ganglia/templates/default/header.tpl ganglia.new/templates/default/header.tpl
--- ganglia/templates/default/header.tpl	2005-02-03 04:22:48.000000000 +0200
+++ ganglia.new/templates/default/header.tpl	2006-04-18 13:16:34.000000000 +0300
@@ -47,5 +47,9 @@
 
 <FONT SIZE="+1">
 {node_menu}
+</FORM>
+<CENTER>
+{custom_graph_button}
+</CENTER>
 </FONT>
 <HR SIZE="1" NOSHADE>

Reply via email to