#!/usr/bin/perl
#
# Script to check RADIUS accounting logs for Connect-Info and
# Calling-Statius-Id and correlate the data.
#
# Reads logs from standard in and writes info to standard out.
#
# by Chris Adams <cmadams@hiwaay.net>
# 27 Sep 1997
# http://ro.com/~cadams/files/rad-info.pl
#
# You can modify this at will, but please send me any improvements you
# make.

$number = "unknown";
$rate = 0;
while (<>)  {
    if (($_ =~ /^$/) || ($_ =~ /^[^\t]/))   {
        if ($rate != 0) {
            $area{$number}{cnt} = 0 if (!$area{$number}{cnt});
            $area{$number}{avg} = 0 if (!$area{$number}{avg});
            $area{$number}{rate}{$rate} = 0 if (!$area{$number}{rate}{$rate});
            $area{$number}{avg} += $rate;
            $area{$number}{cnt}++;
            $area{$number}{rate}{$rate}++;
        }
        $number = "unknown";
        $rate = 0;
    }

    if (/Connect-Info = \"(\d+)[ \"]/)  {
        $rate = $1;
        $rate = ($rate - 1) * 1000 if ($rate < 100);
        $cnt{$rate} = 0 if (! $cnt{$rate});
        $cnt{$rate} ++;
        $total ++;
    }
    if (/Calling-Station-Id = \"(\d{3})(\d{3}).*\"/)    {
        $number = "$1-$2";
    }
}

$sum = 0;
print "\nConnect Rate summary (rate - % cons - # cons - total % >= rate)\n";
foreach $rate (sort {$b <=> $a} keys %cnt)  {
	$sum += (100 * $cnt{$rate} / $total);
    printf "%5s  %6.2f%%  %12d/%-12d  %6.2f%%\n", $rate,
			100 * $cnt{$rate} / $total, $cnt{$rate}, $total, $sum;
}

print "\nArea code/exchange summary (area-exchange - avg rate - # cons)\n";
foreach $num (sort keys %area)  {
    printf "%7s  %5d  %d\n", $num, $area{$num}{avg} / $area{$num}{cnt},
            $area{$num}{cnt};
}

print "\nDetailed area code/exchange vs. connect rate\n";
foreach $num (sort keys %area)  {
    print "\nArea code-exchange $num\n";
    %rates = %{$area{$num}{rate}};
	$sum = 0;
    foreach $rate (sort {$b <=> $a} keys %rates)    {
		$sum += (100 * $rates{$rate} / $area{$num}{cnt});
        printf "%5s  %6.2f%%  %12d/%-12d  %6.2f%%\n", $rate,
				100 * $rates{$rate} / $area{$num}{cnt}, $rates{$rate},
				$area{$num}{cnt}, $sum;
    }
}
