Tuesday, April 2, 2013

Updated Wireless Client Tracking

Some of the comments in my older post about RRDTool Wireless Graphing asked for detailed graph creation code. Below is what I use for generating three types of graphs. 1. A single record graph. 2. An Access Point graph with multiple clients displayed. 3. A composite graph that includes all the access points the client has associated to.
First, I query our wireless controller and save an RRD database for each client/ap association. I use an HTML and perl based web page for the user interface. I also save the records to a database in order to query for the most recent records. I use datatables to display the records. And some jqueryui buttons to limit the search filtering.
When the user clicks a row in datatables, the script below processes the request and creates the graphs. The other graphs besides daily are hidden by default, but a click of the button will swap the images. Also, using daterangepicker the user can select a specific range of dates.
Here is an example of the results. This gives us a nice visual of clients moving from one access point to another.
print "Content-type:text/html\n\n";
use Win32::ODBC;
use CGI;
use CGI::Carp qw( fatalsToBrowser );
use CGI qw/:standard/;
use RRDs;

my $GraphType = param('GraphType');
my $ApName = param('ApName');
my $ClientMac = param('ClientMac');
#print "
GraphType: $GraphType"; #print "
ApName: $ApName"; #print "
ClientMac: $ClientMac"; my $dateRange=param('dateRange'); #print $dateRange; my $startDate; my $endDate; my $image_path='../../Charts'; my $web_image_path='/Charts'; my $stats_path='../../Stats'; my $stats_file="2gwlan_".$ClientMac."_".$ApName.".rrd"; my $random_number=time(); my $AreaColor = '54EC48'; my $LineColor = '24BC14'; my @DEF; my $counter = 0; if ($dateRange=~/^$/) { & create_def; & daily; & weekly; & monthly; & yearly; } else { if ($dateRange=~/(\d\d)\-(\d\d)\-(\d\d\d\d)\s\-\s(\d\d)\-(\d\d)\-(\d\d\d\d)/) { $startDate = "$3$1$2"; $endDate = "$6$4$5"; } elsif ($dateRange=~/^(\d\d)\-(\d\d)\-(\d\d\d\d)$/) { $endDate = "$3$1$2"; my $year = $3; my $month = $1; my $day = $2; use Date::Calc qw(Add_Delta_Days); ($year, $month, $day) = Add_Delta_Days($year, $month, $day, -1); $month = "0$month" if $month < 10; $day = "0$day" if $day < 10; $startDate = "$year$month$day"; #print "SD:$startDate"; } & create_def; & custom; } ############## create_def ################ sub create_def { my $query; if ($GraphType=~/Record/) { #Get Single Record & save_def; } else { if ($GraphType=~/Client/) { #Get top 6 most recent client records $query = "SELECT * FROM ClientDetails WHERE ClientMac LIKE '%$ClientMac%' ORDER BY modified DESC"; } elsif ($GraphType=~/AP/) { #Get top 6 most recent AP records $query = "SELECT * FROM ClientDetails WHERE ApName LIKE '%$ApName%' ORDER BY modified DESC"; } my($find_record_db) = new Win32::ODBC('DB') || die "Error connecting:" .Win32::ODBC::Error(); $find_record_db->Sql("$query"); while ($find_record_db->FetchRow()) { my(%data) = $find_record_db->DataHash(); $ApName = $data{'ApName'}; $ClientMac = $data{'ClientMac'}; $stats_file="2gwlan_".$ClientMac."_".$ApName.".rrd"; & save_def; last if $counter == 7; } } } ##################################### ############## save_def ################ sub save_def { $AreaColor = "54EC48" if $counter == 0; $LineColor = "24BC14" if $counter == 0; $AreaColor = "EA644A" if $counter == 1; $LineColor = "CC3118" if $counter == 1; $AreaColor = "DE48EC" if $counter == 2; $LineColor = "B415C7" if $counter == 2; $AreaColor = "7648EC" if $counter == 3; $LineColor = "4D18E4" if $counter == 3; $AreaColor = "ECD748" if $counter == 4; $LineColor = "C9B215" if $counter == 4; $AreaColor = "48C4EC" if $counter == 5; $LineColor = "1598C3" if $counter == 5; $AreaColor = "EC9D48" if $counter == 6; $LineColor = "CC7016" if $counter == 6; push (@DEF,"DEF:DS$counter=$stats_path/$stats_file:snr:AVERAGE:step=300"); push (@DEF,"AREA:DS$counter#$AreaColor:") if $GraphType!~/AP/; push (@DEF,"LINE2:DS$counter#$LineColor:$ApName $ClientMac \\t"); push (@DEF,"GPRINT:DS$counter:LAST:Last\\: %1.lf"); push (@DEF,"GPRINT:DS$counter:MIN:Min\\: %1.lf"); push (@DEF,"GPRINT:DS$counter:MAX:Max\\: %1.lf"); push (@DEF,"GPRINT:DS$counter:AVERAGE:Avg\\: %1.lf\\n"); $counter++; } ##################################### ############## daily ################ sub daily { $graphlength="-24 hours"; RRDs::graph ("$image_path/my_2gwlan_stats_daily_graph.png", "-s $graphlength", "-t 24 Hour Wireless Stats", "-v SNR", "--height=250", "--width=800", "--slope-mode", @DEF, ); if ($ERROR = RRDs::error) {print "$0: unable to generate graph: $ERROR\n";} print "
"; } ################################################# ############## weekly ################ sub weekly { $graphlength="-168 hours"; RRDs::graph ("$image_path/my_2gwlan_stats_weekly_graph.png", "-s $graphlength", "-t Weekly Wireless Stats", "-v SNR", "--height=250", "--width=800", "--slope-mode", @DEF, ); if ($ERROR = RRDs::error) {print "$0: unable to generate graph: $ERROR\n";} print "
"; } ################################################# ############## monthly ################ sub monthly { $graphlength="-720 hours"; RRDs::graph ("$image_path/my_2gwlan_stats_monthly_graph.png", "-s $graphlength", "-t Monthly Wireless Stats", "-v SNR", "--height=250", "--width=800", "--slope-mode", @DEF, ); if ($ERROR = RRDs::error) {print "$0: unable to generate graph: $ERROR\n";} print "
"; } ################################################# ############## yearly ################ sub yearly { $graphlength="-8760 hours"; RRDs::graph ("$image_path/my_2gwlan_stats_yearly_graph.png", "-s $graphlength", "-t Yearly Wireless Stats", "-v SNR", "--height=250", "--width=800", "--slope-mode", @DEF, ); if ($ERROR = RRDs::error) {print "$0: unable to generate graph: $ERROR\n";} print "
"; } ################################################# ############## custom ################ sub custom { RRDs::graph ("$image_path/my_2gwlan_stats_custom_graph.png", #"-s 20110819", #"-e 20110822", "-s $startDate", "-e $endDate", "-t $startDate - $endDate Wireless Stats", "-v SNR", "--height=250", "--width=800", "--slope-mode", @DEF, ); if ($ERROR = RRDs::error) {print "$0: unable to generate graph: $ERROR\n";} print "
"; } #################################################

No comments:

Post a Comment