#!/usr/bin/perl -w
use strict;
use RRDs;

my $rrd = '/var/lib/rrd';
my $img = '/var/www/localhost/htdocs/rrdtool/wireless';

# process data for each interface (add/delete as required)
&ProcessInterface("ath0", "atheros wireless");

sub ShowErr
{
	if (my $err = RRDs::error) {
		print "$0: failed to create rrd: $err\n";
	}
}

sub ProcessInterface
{
	my ($name, $desc) = @_;

	my $in = `iwconfig $name`;
	my ($snr) = ($in =~ /Link Quality=(\d+)\/\d+/);
	my ($signal) = ($in =~ /Signal level=(-?\d+) dBm/);
	my ($noise) = ($in =~ /Noise level=(-?\d+) dBm/);
	my ($rate, $rateunit) = ($in =~ /Bit Rate:(\d+)\s+(k|M)b\/s/);
	if ($rateunit eq 'k') {
		$rate *= 1000;
	}
	elsif ($rateunit eq 'M') {
		$rate *= 1000000;
	}

	print "$name link stats: snr: $snr dB, signal: $signal dBm, noise: $noise dBm, rate: $rate bits/s\n";

	if (! -e "$rrd/w$name.rrd")
	{
	print "creating rrd database for $name interface...\n";
	RRDs::create "$rrd/w$name.rrd",
		"-s 300",
		"DS:snr:GAUGE:600:0:60",
		"DS:signal:GAUGE:600:-256:0",
		"DS:noise:GAUGE:600:-256:0",
		"DS:rate:GAUGE:600:0:100",
		"RRA:AVERAGE:0.5:1:576",
		"RRA:AVERAGE:0.5:6:672",
		"RRA:AVERAGE:0.5:24:732",
		"RRA:AVERAGE:0.5:144:1460";
	&ShowErr();
	}

	RRDs::update "$rrd/w$name.rrd",
		"-t", "snr:signal:noise:rate",
		"N:$snr:$signal:$noise:$rate";
	&ShowErr();

	my @intervals = ('day', 'week', 'month', 'year');
	foreach my $time (@intervals) {
	&CreateGraphs($name, $time, $desc);
	}
}

sub CreateGraphs
{
	my ($name, $interval, $desc) = @_;

	RRDs::graph "$img/$interval/$name-snr.png",
		"-s -1$interval",
		"-t", "SNR :: $name $desc",
		"-h", "80", "-w", "600",
		"-a", "PNG",
		"-y", "1:2",
		"-v", "dB",
		"-l", "0",
		"DEF:snr=$rrd/w$name.rrd:snr:AVERAGE",
		"LINE2:snr#0000FF:SNR",
		"GPRINT:snr:MIN:     Min\\: %2.lf",
		"GPRINT:snr:MAX: Max\\: %2.lf",
		"GPRINT:snr:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:snr:LAST: Current\\: %2.lf dB\\n";
	&ShowErr();

	RRDs::graph "$img/$interval/$name-sig.png",
		"-s -1$interval",
		"-t", "Signal & Noise :: $name $desc",
		"-h", "80", "-w", "600",
		"-a", "PNG",
		"-y", "2:2",
		"-v", "dBm",
		"DEF:signal=$rrd/w$name.rrd:signal:AVERAGE",
		"DEF:noise=$rrd/w$name.rrd:noise:AVERAGE",
		"LINE2:signal#11EE11:Signal",
		"GPRINT:signal:MIN:  Min\\: %4.lf",
		"GPRINT:signal:MAX: Max\\: %4.lf",
		"GPRINT:signal:AVERAGE: Avg\\: %6.1lf",
		"GPRINT:signal:LAST: Current\\: %4.lf dBm\\n",
		"LINE2:noise#FF0000:Noise",
		"GPRINT:noise:MIN:   Min\\: %4.lf",
		"GPRINT:noise:MAX: Max\\: %4.lf",
		"GPRINT:noise:AVERAGE: Avg\\: %6.1lf",
		"GPRINT:noise:LAST: Current\\: %4.lf dBm\\n";
	&ShowErr();

	RRDs::graph "$img/$interval/$name-rate.png",
		"-s -1$interval",
		"-t", "Link Rate :: $name $desc",
		"-h", "80", "-w", "600",
		"-a", "PNG",
		"-y", "2:1",
		"-l", "0", "-u", "12", "--rigid",
		"-v", "bits/s",
		"DEF:rate=$rrd/w$name.rrd:rate:AVERAGE",
		"LINE2:rate#0000FF:Link Rate",
		"GPRINT:rate:MIN:  Min\\: %4.1lf",
		"GPRINT:rate:MAX: Max\\: %4.1lf",
		"GPRINT:rate:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:rate:LAST: Current\\: %4.1lf bits/s\\n";
	&ShowErr();
}
