|  | #!/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 (<CNF>) { | 
|  | 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 (<DATA>) | 
|  | { | 
|  | /(.*):(.*)/; | 
|  | 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 <<USAGEDESC; | 
|  |  | 
|  | usage: | 
|  | graphmaker [-options ...] | 
|  |  | 
|  | where options include: | 
|  | -help                        print out this message | 
|  | -conf  file                  the configuration file (default graphmaker.cnf) | 
|  |  | 
|  | If you want to know more about this tool, you might want | 
|  | to read the docs. They came together with graphmaker! | 
|  |  | 
|  | Home: http://www.geocities.com/CapeCanaveral/Lab/3469/graphmaker.html | 
|  |  | 
|  | USAGEDESC | 
|  | exit(1); | 
|  | } | 
|  |  |