1#!/usr/local/bin/perl 2 3# isbgraph 4# an example in not so hot perl programming.... 5# based around GraphMaker from Fabrizio Pivari 6# A graph maker perl script 7 8use GD; 9use Getopt::Long; 10$hr=0; 11 12sub main{ 13 14$opt_conf="./graphmaker.cnf"; 15 16@elem=("NUMBERYCELLGRIDSIZE","MAXYVALUE","MINYVALUE","XCELLGRIDSIZE","XMAX", 17 "Data","Graph","Bar","Average","Graphnum","Title","Transparent","Rbgcolour", 18 "Gbgcolour","Bbgcolour","Rfgcolour","Gfgcolour","Bfgcolour","Rcolour", 19 "Gcolour","Bcolour","Racolour","Gacolour","Bacolour"); 20 21%option=( 22 NUMBERYCELLGRIDSIZE => '8', 23 MAXYVALUE => '7748', 24 MINYVALUE => '6500', 25 XCELLGRIDSIZE => '18', 26 XMAX => '1000', 27 Data => './graphmaker.dat', 28 Graph => './graphmaker.gif', 29 Bar => '1', 30 Average => '1', 31 Graphnum => '1', 32 Title => 'GraphMaker 2.1', 33 Transparent => 'yes', 34 Rbgcolour => '255', 35 Gbgcolour => '255', 36 Bbgcolour => '255', 37 Rfgcolour => '0', 38 Gfgcolour => '0', 39 Bfgcolour => '0', 40 Rcolour => '0', 41 Gcolour => '0', 42 Bcolour => '255', 43 Racolour => '255', 44 Gacolour => '255', 45 Bacolour => '0'); 46 47&GetOptions("conf=s","help") || &printusage ; 48 49 50if ($opt_help) {&printusage}; 51 52open (CNF, $opt_conf) || die; 53while (<CNF>) { 54s/\t/ /g; #replace tabs by space 55next if /^\s*\#/; #ignore comment lines 56next if /^\s*$/; #ignore empty lines 57foreach $elem (@elem) 58 { 59 if (/\s*$elem\s*:\s*(.*)/) { $option{$elem}=$1; } 60 } 61} 62close(CNF); 63######################################### 64# 65# 66# 67# number datapoints/24 hours is 1440 (minutes) 68# 69# Split into N graphs where each graph has max of 240 datapoints (4 hours) 70# 71 72$barset=0; 73$m=0; 74$YGRIDSIZE = 400; 75$YCELLGRIDSIZE = $YGRIDSIZE/$option{'NUMBERYCELLGRIDSIZE'}; 76$XINIT = 30; 77$XEND = 8; 78$YINIT =20; 79$YEND = 20; 80#$XGRIDSIZE = ($option{'XMAX'}*$option{'XCELLGRIDSIZE'}); 81#$XGRIDSIZE = (240*$option{'XCELLGRIDSIZE'}); 82$XGRIDSIZE = 620; 83$XGIF = $XGRIDSIZE + $XINIT + $XEND; 84$XGRAPH = $XGRIDSIZE + $XINIT; 85$YGIF = $YGRIDSIZE + $YEND + $YINIT; 86$YGRAPH = $YGRIDSIZE + $YINIT; 87$RANGE=$option{'MAXYVALUE'}-$option{'MINYVALUE'}; 88$SCALE=$YGRIDSIZE/$RANGE; 89 90# NEW IMAGE 91 $im=new GD::Image($XGIF,$YGIF); 92 93$white=$im->colorAllocate(255,255,255); 94$black=$im->colorAllocate(0,0,0); 95$pink=$im->colorAllocate(255,153,153); 96$red=$im->colorAllocate(255,0,0); 97$blue=$im->colorAllocate(0,0,255); 98$green=$im->colorAllocate(0,192,51); 99$orange=$im->colorAllocate(255,102,0); 100$pink=$im->colorAllocate(255,153,153); 101$teal=$im->colorAllocate(51,153,153); 102# gif background is $bg 103 $bg=$white; 104 $fg=$blue; 105# LINE COLOUR HELP BY VAR $colour 106 $colour=$red; 107 $acolour=$yellow; 108 # GRID 109 if ($option{'Transparent'} eq "yes") {$im->transparent($bg)}; 110 $im->filledRectangle(0,0,$XGIF,$YGIF,$bg); 111 112# Dot style 113# vertical markers on Y axis grid 114 $im->setStyle($fg,$bg,$bg,$bg); 115 for $i (0..$option{'XMAX'}) 116 { 117 $xspace= $XINIT+$option{'XCELLGRIDSIZE'}*$i +$i; 118 # $im->line($xspace,$YINIT,$xspace,$YGRAPH,gdStyled); 119 $num = $i+1; 120 121 use integer; 122 { 123 $posis=$num - ($num/60)*60; 124 } 125 if ($posis eq 0) 126 { 127 $outhr=0; 128 $hr=($hr + 1) ; 129 $outhr=$hr+$option{'Graphnum'}*4; 130# shift minutes coords to correct stat hour! 131 $im->string(gdMediumBoldFont,$xspace-3,$YGRAPH,"$outhr",$fg); 132 } 133 134 } # end of scan over X values (minutes) 135 136 $YCELLVALUE=($option{'MAXYVALUE'}-$option{'MINYVALUE'})/$option{'NUMBERYCELLGRIDSIZE'}; 137 for $i (0..$option{'NUMBERYCELLGRIDSIZE'}) 138 { 139 $num=$option{'MINYVALUE'}+$YCELLVALUE*($option{'NUMBERYCELLGRIDSIZE'}-$i); 140 $im->string(gdMediumBoldFont,0,$YINIT+$YCELLGRIDSIZE*$i -6,"$num",$fg); 141 } 142 $im->string(gdSmallFont,$XGRIDSIZE/2-80,0,$option{'Title'},$fg); 143 144 $odd_even = $option{'XCELLGRIDSIZE'}%2; 145 #odd 146 if ($odd_even eq 1) {$middle = $option{'XCELLGRIDSIZE'}/2 +0.5;} 147 else {$middle = $option{'XCELLGRIDSIZE'}/2 +0.5;} 148 149# start reading data 150# open (DATA,$option{'Data'}) || die "cant open $option{'Data'}"; 151# nextdata becomes Y on reading of second data set.... 152$nextdata="N"; 153@datafiles=("./in.dat" , "./out.dat" ); 154 foreach ( @datafiles ) 155{ 156 $m=0; 157 $count=0; 158 $i=0; 159 $fname=$_; 160 161 print "fname $fname\n"; 162# change entry for red in colour table to green for packets LEAVING target host 163 164 open (DATA,$_) || die "cant open $_"; 165 print "$nextdata nextdata\n"; 166 while (<DATA>) 167 { 168 /(.*):(.*)/; 169 if ($option{'Average'} eq 1) {$m+=$2;$i++;} 170 if ($count eq 0){$XOLD=$1;$YOLD=$2;$count=1;next} 171 $X=$1; $Y=$2; 172# +($X-1) are the pixel of the line 173 $xspace= $XINIT+$option{'XCELLGRIDSIZE'}*($X-1) +($X-1); 174 $xspaceold= $XINIT+$option{'XCELLGRIDSIZE'}*($XOLD-1) +($XOLD-1); 175 $yspace= $YGRAPH-($Y-$option{'MINYVALUE'})*$SCALE; 176 $yspaceold= $YGRAPH-($YOLD-$option{'MINYVALUE'})*$SCALE; 177 $barset=$option{'Bar'}; 178 if ($barset eq 0) 179 { 180 181 if($nextdata eq "Y") 182 { 183 184 #$im->line($XINIT,$YGRAPH,$X,$Y,$orange); 185 $im->line($xspaceold,$yspaceold,$xspace,$yspace,$green); 186 } 187 else 188 { 189 $im->line($xspaceold,$yspaceold,$xspace,$yspace,$red); 190 } 191 } 192 else 193 { 194 if ($1 eq 2) 195 { 196 $im->filledRectangle($xspaceold,$yspaceold, 197 $xspaceold+$middle,$YGRAPH,$colour); 198 $im->rectangle($xspaceold,$yspaceold, 199 $xspaceold+$middle,$YGRAPH,$fg); 200 } 201 else 202 { 203 $im->filledRectangle($xspaceold-$middle,$yspaceold, 204 $xspaceold+$middle,$YGRAPH,$colour); 205 $im->rectangle($xspaceold-$middle,$yspaceold, 206 $xspaceold+$middle,$YGRAPH,$fg); 207 } 208 } 209 $XOLD=$X; $YOLD=$Y; 210 211 } # end of while DATA loop 212 213 $im->line(500,40,530,40,$red); 214 $im->line(500,60,530,60,$green); 215 $im->string(gdSmallFont,535,35,"Packets IN",$fg); 216 $im->string(gdSmallFont,535,55,"Packets OUT",$fg); 217 218 if ($option{'Bar'} ne 0) 219 { 220 if ($X eq $option{'XMAX'}) 221 { 222 $im->filledRectangle($xspace-$middle,$yspace, 223 $xspace,$YGRAPH,$colour); 224 $im->rectangle($xspace-$middle,$yspace, 225 $xspace,$YGRAPH,$fg); 226 } 227 else 228 { 229 $im->filledRectangle($xspace-$middle,$yspace, 230 $xspace+$middle,$YGRAPH,$colour); 231 $im->rectangle($xspace-$middle,$yspace, 232 $xspace+$middle,$YGRAPH,$fg); 233 } 234 } 235 close (DATA); 236 237 238 $nextdata="Y"; 239# TOP LEFT is 0,0 on GIF (image) 240# origin of plot is xinit,yinit 241 # print "little line\n"; 242 $im->line($xspace,$yspace,$xspace,$YGRAPH,$blue); 243 $im->line($xspace,$YGRAPH,$XINIT,$YGRAPH,$blue); 244# (0,0) in cartesian space time=0 minutes, rate 0 packets/s 245 $im->line($XINIT,$YGRAPH,$XINIT,$YGRAPH,$blue); 246 $im->line($XINIT,$YGRAPH,$XINIT,$YGRAPH,$green); 247 248} # close foreach loop on data file names 249 250 251 252 253 if ($option{'Average'} eq 1) 254 { 255 # Line style 256 $im->setStyle($acolour,$acolour,$acolour,$acolour,$bg,$bg,$bg,$bg); 257 $m=$m/$i; 258 $ym=$YGRAPH-($m-$option{'MINYVALUE'})*$SCALE; 259 $im->line($XINIT,$ym,$XGRAPH,$ym,gdStyled) 260 } 261 $im->line($XINIT,$YINIT,$XINIT,$YGRAPH,$fg); 262 $im->line($XINIT,$YINIT,$XGRAPH,$YINIT,$fg); 263 $im->line($XGRAPH,$YINIT,$XGRAPH,$YGRAPH,$fg); 264 $im->line($XINIT,$YGRAPH,$XGRAPH,$YGRAPH,$fg); 265 266 $im->string(gdSmallFont,$XGIF-335,$YGIF - 12,"Time of Day (hours)",$fg); 267 open (GRAPH,">$option{'Graph'}") || die "Error: Grafico.gif - $!\n"; 268 print GRAPH $im -> gif; 269 close (GRAPH); 270 271 272 273 274} # end of subroutine main 275 276main; 277exit(0); 278 279sub printusage { 280 print <<USAGEDESC; 281 282usage: 283 graphmaker [-options ...] 284 285where options include: 286 -help print out this message 287 -conf file the configuration file (default graphmaker.cnf) 288 289If you want to know more about this tool, you might want 290to read the docs. They came together with graphmaker! 291 292Home: http://www.geocities.com/CapeCanaveral/Lab/3469/graphmaker.html 293 294USAGEDESC 295 exit(1); 296} 297 298