Silly me...

http://wtf.ath.cx/screenshots.html



Eli Stair wrote:

>
>
> Do you have a description/doc page, demo or PNG's up showing what the
> patch does/allows for?
>
> Thanks,
>
> /eli
>
> Alex Balk wrote:
>> 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