#!/usr/local/bin/perl # isbgraph # an example in not so hot perl programming.... # based around GraphMaker from Fabrizio Pivari # A graph maker perl script use GD; use Getopt::Long; $hr=0; sub main{ $opt_conf="./graphmaker.cnf"; @elem=("NUMBERYCELLGRIDSIZE","MAXYVALUE","MINYVALUE","XCELLGRIDSIZE","XMAX", "Data","Graph","Bar","Average","Graphnum","Title","Transparent","Rbgcolour", "Gbgcolour","Bbgcolour","Rfgcolour","Gfgcolour","Bfgcolour","Rcolour", "Gcolour","Bcolour","Racolour","Gacolour","Bacolour"); %option=( NUMBERYCELLGRIDSIZE => '8', MAXYVALUE => '7748', MINYVALUE => '6500', XCELLGRIDSIZE => '18', XMAX => '1000', Data => './graphmaker.dat', Graph => './graphmaker.gif', Bar => '1', Average => '1', Graphnum => '1', Title => 'GraphMaker 2.1', Transparent => 'yes', Rbgcolour => '255', Gbgcolour => '255', Bbgcolour => '255', Rfgcolour => '0', Gfgcolour => '0', Bfgcolour => '0', Rcolour => '0', Gcolour => '0', Bcolour => '255', Racolour => '255', Gacolour => '255', Bacolour => '0'); &GetOptions("conf=s","help") || &printusage ; if ($opt_help) {&printusage}; open (CNF, $opt_conf) || die; while () { s/\t/ /g; #replace tabs by space next if /^\s*\#/; #ignore comment lines next if /^\s*$/; #ignore empty lines foreach $elem (@elem) { if (/\s*$elem\s*:\s*(.*)/) { $option{$elem}=$1; } } } close(CNF); ######################################### # # # # number datapoints/24 hours is 1440 (minutes) # # Split into N graphs where each graph has max of 240 datapoints (4 hours) # $barset=0; $m=0; $YGRIDSIZE = 400; $YCELLGRIDSIZE = $YGRIDSIZE/$option{'NUMBERYCELLGRIDSIZE'}; $XINIT = 30; $XEND = 8; $YINIT =20; $YEND = 20; #$XGRIDSIZE = ($option{'XMAX'}*$option{'XCELLGRIDSIZE'}); #$XGRIDSIZE = (240*$option{'XCELLGRIDSIZE'}); $XGRIDSIZE = 620; $XGIF = $XGRIDSIZE + $XINIT + $XEND; $XGRAPH = $XGRIDSIZE + $XINIT; $YGIF = $YGRIDSIZE + $YEND + $YINIT; $YGRAPH = $YGRIDSIZE + $YINIT; $RANGE=$option{'MAXYVALUE'}-$option{'MINYVALUE'}; $SCALE=$YGRIDSIZE/$RANGE; # NEW IMAGE $im=new GD::Image($XGIF,$YGIF); $white=$im->colorAllocate(255,255,255); $black=$im->colorAllocate(0,0,0); $pink=$im->colorAllocate(255,153,153); $red=$im->colorAllocate(255,0,0); $blue=$im->colorAllocate(0,0,255); $green=$im->colorAllocate(0,192,51); $orange=$im->colorAllocate(255,102,0); $pink=$im->colorAllocate(255,153,153); $teal=$im->colorAllocate(51,153,153); # gif background is $bg $bg=$white; $fg=$blue; # LINE COLOUR HELP BY VAR $colour $colour=$red; $acolour=$yellow; # GRID if ($option{'Transparent'} eq "yes") {$im->transparent($bg)}; $im->filledRectangle(0,0,$XGIF,$YGIF,$bg); # Dot style # vertical markers on Y axis grid $im->setStyle($fg,$bg,$bg,$bg); for $i (0..$option{'XMAX'}) { $xspace= $XINIT+$option{'XCELLGRIDSIZE'}*$i +$i; # $im->line($xspace,$YINIT,$xspace,$YGRAPH,gdStyled); $num = $i+1; use integer; { $posis=$num - ($num/60)*60; } if ($posis eq 0) { $outhr=0; $hr=($hr + 1) ; $outhr=$hr+$option{'Graphnum'}*4; # shift minutes coords to correct stat hour! $im->string(gdMediumBoldFont,$xspace-3,$YGRAPH,"$outhr",$fg); } } # end of scan over X values (minutes) $YCELLVALUE=($option{'MAXYVALUE'}-$option{'MINYVALUE'})/$option{'NUMBERYCELLGRIDSIZE'}; for $i (0..$option{'NUMBERYCELLGRIDSIZE'}) { $num=$option{'MINYVALUE'}+$YCELLVALUE*($option{'NUMBERYCELLGRIDSIZE'}-$i); $im->string(gdMediumBoldFont,0,$YINIT+$YCELLGRIDSIZE*$i -6,"$num",$fg); } $im->string(gdSmallFont,$XGRIDSIZE/2-80,0,$option{'Title'},$fg); $odd_even = $option{'XCELLGRIDSIZE'}%2; #odd if ($odd_even eq 1) {$middle = $option{'XCELLGRIDSIZE'}/2 +0.5;} else {$middle = $option{'XCELLGRIDSIZE'}/2 +0.5;} # start reading data # open (DATA,$option{'Data'}) || die "cant open $option{'Data'}"; # nextdata becomes Y on reading of second data set.... $nextdata="N"; @datafiles=("./in.dat" , "./out.dat" ); foreach ( @datafiles ) { $m=0; $count=0; $i=0; $fname=$_; print "fname $fname\n"; # change entry for red in colour table to green for packets LEAVING target host open (DATA,$_) || die "cant open $_"; print "$nextdata nextdata\n"; while () { /(.*):(.*)/; if ($option{'Average'} eq 1) {$m+=$2;$i++;} if ($count eq 0){$XOLD=$1;$YOLD=$2;$count=1;next} $X=$1; $Y=$2; # +($X-1) are the pixel of the line $xspace= $XINIT+$option{'XCELLGRIDSIZE'}*($X-1) +($X-1); $xspaceold= $XINIT+$option{'XCELLGRIDSIZE'}*($XOLD-1) +($XOLD-1); $yspace= $YGRAPH-($Y-$option{'MINYVALUE'})*$SCALE; $yspaceold= $YGRAPH-($YOLD-$option{'MINYVALUE'})*$SCALE; $barset=$option{'Bar'}; if ($barset eq 0) { if($nextdata eq "Y") { #$im->line($XINIT,$YGRAPH,$X,$Y,$orange); $im->line($xspaceold,$yspaceold,$xspace,$yspace,$green); } else { $im->line($xspaceold,$yspaceold,$xspace,$yspace,$red); } } else { if ($1 eq 2) { $im->filledRectangle($xspaceold,$yspaceold, $xspaceold+$middle,$YGRAPH,$colour); $im->rectangle($xspaceold,$yspaceold, $xspaceold+$middle,$YGRAPH,$fg); } else { $im->filledRectangle($xspaceold-$middle,$yspaceold, $xspaceold+$middle,$YGRAPH,$colour); $im->rectangle($xspaceold-$middle,$yspaceold, $xspaceold+$middle,$YGRAPH,$fg); } } $XOLD=$X; $YOLD=$Y; } # end of while DATA loop $im->line(500,40,530,40,$red); $im->line(500,60,530,60,$green); $im->string(gdSmallFont,535,35,"Packets IN",$fg); $im->string(gdSmallFont,535,55,"Packets OUT",$fg); if ($option{'Bar'} ne 0) { if ($X eq $option{'XMAX'}) { $im->filledRectangle($xspace-$middle,$yspace, $xspace,$YGRAPH,$colour); $im->rectangle($xspace-$middle,$yspace, $xspace,$YGRAPH,$fg); } else { $im->filledRectangle($xspace-$middle,$yspace, $xspace+$middle,$YGRAPH,$colour); $im->rectangle($xspace-$middle,$yspace, $xspace+$middle,$YGRAPH,$fg); } } close (DATA); $nextdata="Y"; # TOP LEFT is 0,0 on GIF (image) # origin of plot is xinit,yinit # print "little line\n"; $im->line($xspace,$yspace,$xspace,$YGRAPH,$blue); $im->line($xspace,$YGRAPH,$XINIT,$YGRAPH,$blue); # (0,0) in cartesian space time=0 minutes, rate 0 packets/s $im->line($XINIT,$YGRAPH,$XINIT,$YGRAPH,$blue); $im->line($XINIT,$YGRAPH,$XINIT,$YGRAPH,$green); } # close foreach loop on data file names if ($option{'Average'} eq 1) { # Line style $im->setStyle($acolour,$acolour,$acolour,$acolour,$bg,$bg,$bg,$bg); $m=$m/$i; $ym=$YGRAPH-($m-$option{'MINYVALUE'})*$SCALE; $im->line($XINIT,$ym,$XGRAPH,$ym,gdStyled) } $im->line($XINIT,$YINIT,$XINIT,$YGRAPH,$fg); $im->line($XINIT,$YINIT,$XGRAPH,$YINIT,$fg); $im->line($XGRAPH,$YINIT,$XGRAPH,$YGRAPH,$fg); $im->line($XINIT,$YGRAPH,$XGRAPH,$YGRAPH,$fg); $im->string(gdSmallFont,$XGIF-335,$YGIF - 12,"Time of Day (hours)",$fg); open (GRAPH,">$option{'Graph'}") || die "Error: Grafico.gif - $!\n"; print GRAPH $im -> gif; close (GRAPH); } # end of subroutine main main; exit(0); sub printusage { print <