#!/usr/local/bin/perl
# raport - create a quick port-by-port summary of RADIUS Accounting detail files
#
# 94/12/04	Author: Carl Rigney; cdr@livingston.com
# 96/09/27	Updated to work with RADIUS 2.0
#
# input files = /usr/adm/radacct/*/detail
#
# output:
# 158.222.1.9      0       361     147:36:27
# PortMaster, Port, number of accesses, total elapsed time used

$/ = '';	# read paragraph at a time

while (<>) {
	next if /Acct-Session-Id = "00000000"/;
	if (/Acct-Status-Type = Stop/) {
		if (/Acct-Session-Id = "([^"]+)"/) {
			$id = $1;
			if (/NAS-IP-Address = (\S+)/ ||
			    /Client-Id = (\S+)/) {
				$nas = $1;
				$id .= '@'.$nas;
				if ($seen{$id}++) {
					$dup++;
					next;
				}
			}
		} else {
			$err{'No ID'}++;
			next;
		}
		if (/NAS-IP-Address = (\S+)/ ||
		    /Client-Id = (\S+)/) {
			$nas = $1;
			if (/NAS-Port = (\d+)/ ||
			    /Client-Port-Id = (\d+)/) {
				$port = $1;
				$user = sprintf("%s\t%2d",$nas,$port);
				if (/Acct-Session-Time = (\d+)/) {
					$elapsed = $1;
					if ($elapsed > 0) {
						$uses{$user}++;
						$used{$user} += $elapsed;
					}
				}
			}
		}
	}
}

print "# $dup duplicates\n" if $dup;
print "# $err{'No ID'} stop records without Acct-Session-ID\n" if $err{'No Id'};

for $user (sort keys %used) {
	printf "%-16s\t%4d\t%s\n",$user,$uses{$user},&hms($used{$user});
}

sub hms {
	local($h,$m);
	local ($s) = shift(@_);
	$m = int($s / 60);
	$s = $s % 60; 
	$h = int($m / 60);
	$m = $m % 60;
	sprintf("%4d:%02d:%02d",$h,$m,$s);
}
