298 lines
8.1 KiB
Perl
298 lines
8.1 KiB
Perl
#!/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);
|
|
}
|
|
|