#!/usr/bin/perl
################################################################
#
# NOM    : $Name:  $
# VERSION: $Revision: 1.5 $ $Date: 2003/03/28 14:41:34 $
# OBJET  : Generation de stat pour rrdtool (suivi des temps de
#	   reponse)
#
# HISTORIQUE:
#       $Log: gen_graph.pl,v $
#       Revision 1.5  2003/03/28 14:41:34  eric
#       Ajout prise en charge cpu nt
#
#       Revision 1.4  2003/03/21 09:33:57  eric
#       modif format rrd
#       stat sur disque nt
#
#       Revision 1.3  2003/03/04 18:10:36  eric
#       ajustement de la variable max de 20 à 1000
#
#
################################################################
use File::Copy cp;


$rrd = "/var/www/html/stat/rrd" ;
$png = "/var/www/html/stat/png" ;
$dest = '' ;
$nagios_file = '' ;
$do_png = 1 ;

sub usage
{
    print "Usage : gen_graph.pl [-h] [--no-png] [-f nagios.cfg] [-l srvperf.log]\n" ;
    exit(1) ;
}

for($i=0;$i < @ARGV; $i++) {
    if ($ARGV[$i] eq '-h') {
	usage() ;
    } elsif ($ARGV[$i] eq '-f') {
	$i++ ;
	$nagios_file = $ARGV[$i] ;
    } elsif ($ARGV[$i] eq '-l') {
	$i++ ;
	$dest = $ARGV[$i] ;
    } elsif ($ARGV[$i] eq '--no-png') {
	$do_png = 0 ;
    } else {
	usage() ;
    }
}

# on recupere le fichier de log depuis la configuration de nagios
if ($nagios_file) {
    open(FP, $nagios_file) or die "Pb pour ouvrir $nagios_file : $!" ;
    while (<FP>) {
	chop() ;
	$log = $1 if (/xpdfile_service_perfdata_file=(.+)/) ;
    }
    close(FP) ;
    
    $log or die "Erreur dans le fichier de configuration $nagios_file" ;

    $today = `/bin/date +%m-%d-%Y-%Hh%Mm%Ss` or die "$!" ;
    chop($today) ;

    $dest = $log ;
    $dest =~ s/([^\/]+)$/archives\/$1-$today/ ;
    
    cp($log,$dest) ;
    open(FP, ">$log") ;
    close(FP) ;
}

open(FP, $dest) or die "Erreur : impossible d'ouvrir $dest : $!" ;

while (<FP>) 
{
    chop() ;			# \n
    ($temps, $machine, $service, $output, $vars) = split(/\|/) ;
 
    # on met a jour nous meme le service ping
    if ($service eq 'ping') {
	if($output =~ /Packet loss = (\d+)%, RTA = ([\d\.]+) ms/) { 
	    $vars = "packet_loss=$1 rta=$2" ;
	} else {
	    $vars = "packet_loss=100 rta=0" ; # CRITICAL timeout...
	}
    } elsif ($service eq 'cpu') {
	my @res = split(/\)/, $output) ;
	foreach $r (@res) {
	    $vars .= "cpu$1=$2 " if ($r =~ /(\d+) min. (\d+)%/) ;
	}
    } elsif ($service =~ /disk_./) {
	if ($output =~ /^(\w):\\ - total: ([\d\.]+) Gb - used: ([\d\.]+) Gb \((\d+)%\)/) {
	    $vars = "used=$3 usedp=$4 max=$2" ;
	}
    }

    next if (! $vars) ;

    #|titis=1 toto=4 titi=6 >> "titis" => 1, "toto" => 4 
    %var = split(/=\s*|\s+/, $vars) ;

    foreach $v (keys %var) {
	$res{"$machine:$service:$v"} .= "$temps:$var{$v} " if $v ;
    }
}
close(FP) ;

# definition des periodes de references
%leg = (3600 => "heure",
	86400 => "jour",
	604800 => "semaine",
	#18144000 => "mois",
	#31536000 => "annee"
	) ;

foreach $t (values %leg) {
    mkdir("$png/$t") if (! -d "$png/$t"); # creation des repertoires 
}

foreach $id (sort keys %res) {   

    ($machine, $service, $v) = split(/:/, $id) ;

    $file = "$machine-$service-$v" ;

    # creation a la demande
    if (! -f "$rrd/$file.rrd") {
	# on garde sur 7 jours toutes les min
	# on garde sur 1 mois toutes les 5min
	# on garde sur 6 mois toutes les 10min
	# on garde sur 1 ans toutes les 12heures
	print("rrdtool create $rrd/$file.rrd --start 1045642420 --step 60 DS:$v:GAUGE:1800:0:1000 RRA:AVERAGE:0.5:1:10080  RRA:AVERAGE:0.5:5:8928 RRA:AVERAGE:0.5:10:26784 RRA:AVERAGE:0.5:700:370\n") ;
    }
    
    # mise a jour des dernieres valeurs
    print "rrdtool update $rrd/$file.rrd ", $res{$id}, "\n" ;

    next if (! $do_png) ;
    # pour chaque periode, on genere les graphiques
    foreach $t (keys %leg) {
	$tt = $leg{$t} ;

	# la variable rta arrive avant packet_loss grace au sort
	if ($service eq 'ping') {
	    next if ($v ne 'rta') ;
	    $file = "$machine-$service" ;
	    print "rrdtool graph $png/$tt/$file-$tt.png -t '$machine -- $service' --start -$t --vertical-label=msec DEF:rta=$rrd/$file-rta.rrd:rta:AVERAGE DEF:pl=$rrd/$file-packet_loss.rrd:packet_loss:AVERAGE LINE1:rta#FF0000:'Temps de reponse (RTA)' LINE1:pl#00FF00:'Packet loss'\n";
	} elsif ($service eq 'cpu') {
	     print "rrdtool graph $png/$tt/$file-$tt.png -t '$machine -- $service' --start -$t --vertical-label=%CPU DEF:time=$rrd/$file.rrd:$v:AVERAGE LINE1:time#FF0000:'% Utilise'\n" ;
	} elsif ($service =~ /disk_(.)/) {
	    if ($v eq 'used') {
		print "rrdtool graph $png/$tt/$file-$tt.png -t '$machine -- Espace disque sur $1:' --start -$t -l 0 --vertical-label=Go DEF:used=$rrd/$file.rrd:$v:AVERAGE DEF:max=$rrd/$machine-$service-max.rrd:max:AVERAGE LINE1:max#FF00FF:'Maximum' LINE1:used#FF0000:'Place disque occupee'\n" ;
	    } elsif ($v eq 'usedp') {
		print "rrdtool graph $png/$tt/$file-$tt.png -t '$machine -- Espace disque sur $1:' -u 100 -l 0 --start -$t --vertical-label='% utilise' DEF:used=$rrd/$file.rrd:$v:AVERAGE LINE1:used#FF0000:'Place disque occupee'\n" ;
	    }
	} else {
	    print "rrdtool graph $png/$tt/$file-$tt.png -t '$machine -- $service' --start -$t --vertical-label=sec DEF:time=$rrd/$file.rrd:$v:AVERAGE LINE1:time#FF0000:'Temps de reponse (sec)'\n" ;
	}
    }
}

