#!/usr/local/bin/perl

# ###################################################################
# create RRD tool graph
#
#    Summay : specification of http://<metrowebsite>/bin/gengraph
#	parameters :
#	    [ title = <title of the graph> ]
#		=> if not set : default generic legend
#	    idX = <sensor-id> [+ <sensor-id> [+ <sensor-id> ...]]
#	    [ legendX = <legend> ]
#		=> if not set : default generic legend
#	    [ size = <small|medium|big|LxH> ]
#		=> if not set : medium
#	    start = <start time (time_t)> end = <end time (time_t)> i
#	    | start = -<second before end time (time_t)> end = <now>
#
#   Example :
#	http://idris/bin/gengraph?
#		title=aggregated traffic from bat42
#		&id1=Minsa-cg1+Minsa-cg2+....
#		&id2=Minsa-cg3+Minsa-cg4+...
#		&size=200x100
#		&start=...&end=
#

use CGI qw/:standard/;
use CGI::Pretty qw( :html3 );
use strict;

# netmagis configuration file and libraries
our $conf_file = "/usr/local/etc/netmagis.conf";
our $rep_lib = "/usr/local/lib/netmagis";
require "/usr/local/lib/netmagis/libmetro.pl";

# read netmagis configuration file
our %global_conf = read_global_conf_file($conf_file);

# definition of graph size list
our %liste_taille = (   'small' => 1,
                        'medium' => 1,
                        'big' => 1
                    );

# initialization of default parameters for graph generation
our %param = (
		'type'		    => "-",
                'start'		    => "0",
                'end'		    => "0",
                'size'		    => "moyen",
                'title'		    => "",
);

# script for graph generation
our $generate_graph_cmd = "gen-rrdgraph.pl";


# get cgi parameters
my @liste = (param());
capture_liste(@liste);

# check cgi parameters
my $message_erreur = check_param();

if($message_erreur)
{
	print header();
	print $message_erreur;
}
else
{
	# if cgi parameters are correct
	create_and_send_graph();
}


###########################################################################
# functions

##
# check the validity of parameters
sub check_param
{
    my ($id,$debut,$fin,$taille) = @_;

    my $message_erreur = 0;
    if($param{'end'} eq "now" && $param{'start'} =~m/-([0-9]+)/)
    {
                $param{'end'} = time;
                $param{'start'} = $param{'end'} - $1;
    }
    elsif($param{'end'}!~m/[0-9]+/ || $param{'start'}!~m/[0-9]+/)
    {
	$message_erreur = "erreur date";
    }
    elsif($param{'end'} < $param{'start'})
    {
	$message_erreur = "erreur date : fin < debut <=> $param{'end'} < $param{'start'}";
    }
    elsif($param{'size'} ne "" && !defined($liste_taille{$param{'size'}}) && $param{'size'}!~m/[0-9]+x[0-9]+/)
    {
	$message_erreur = "erreur : taille de graphique non dfinie. Utiliser \"small\", \"medium\", \"big\"";
	$message_erreur = "$message_erreur ou bien \"<largeur>x<hauteur>\"";
    }
    return $message_erreur;
}


##
# create jpg file and print it on standard output
sub create_and_send_graph
{
    my $gengraphcmd = "$rep_lib/$generate_graph_cmd ";

    if(exists $param{'id'})
    {
	# creation des parametres "id" et "legend"
	my $param_id = "";
	my $param_legend = "";
	my $compteurid = 0;
	foreach my $key (sort keys %{$param{'id'}})
	{
	    if($compteurid == 0)
	    {
		$param_id = $param{'id'}{$key} . $param_id;
		if(exists $param{'legend'}{$key})
        	{
		    $param_legend = $param{'legend'}{$key} . $param_legend;
		}
	    }
	    elsif($compteurid > 0)
	    {
		$param_id = "$param_id,$param{'id'}{$key}";
		if(exists $param{'legend'}{$key})
                {
		    $param_legend = "$param_legend,$param{'legend'}{$key}";
		}
	    }
	    $compteurid ++;
	}

	# set command for graph generation
	my $gengraphcmd = "$rep_lib/$generate_graph_cmd $param_id $param{'type'} $param{'start'} $param{'end'} $param{'size'}";

	if($param{'title'} ne "")
	{
	    $gengraphcmd = "$gengraphcmd '$param{'title'}'";
	}
	if($param_legend ne "")
	{
	    $gengraphcmd = "$gengraphcmd '$param_legend'";
	}

	print header(-type=>'image/png');
	open(IMG,"$gengraphcmd |");
	binmode(IMG) ;
	while( <IMG> )
	{
	    print ;
	}
	close(IMG);
    }
    else
    {
	print header();
	print "Erreur : pas d'identifiant de graphe en parametre";
    }
}


##
# classify cgi parameters
sub capture_liste
{
    my (@liste) = @_;

    my ($elem,$arg);
    my $index_id = -1;
    my $index_legende = -1;

    foreach $elem (@liste)
    {
        $arg = param($elem);

        if($elem =~m/^id/)
        {
	    if($elem =~m/^id([0-9]+)/)
	    {
		$index_id = $1;
	    }
	    else
	    {
		$index_id ++;
	    }

	    $arg =~s/ /\+/g;

	    $param{'id'}{$index_id} = $arg;
        }
	elsif($elem =~m/^legend/)
	{
	    if($elem =~m/^legende([0-9]+)/ or m/^legend([0-9]+)/)
	    {
		$index_legende = $1;
	    }
	    else
	    {
		$index_legende ++;
	    }
	    $param{'legend'}{$index_legende} = $arg;
	}
	elsif($elem eq "type")
	{
	   $param{'type'} = $arg;
	}
	elsif($elem eq "taille" or $elem eq "size")
	{
	    $param{'size'} = $arg;
	}
	elsif(($elem eq "debut" or $elem eq "start") && $arg=~m/[0-9]+/)
	{
	    $param{'start'} = $arg;
	}
	elsif(($elem eq "fin" or $elem eq "end") && ($arg=~m/[0-9]+/ || $arg=~m/now/))
        {
	    $param{'end'} = $arg;
        }
	elsif($elem eq "titre" or $elem eq "title")
	{
	    $param{'title'} = $arg;
	}
    }
}

