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