From owner-portmaster-users  Mon Jan  1 17:02:12 1996
Date: Mon, 1 Jan 96 20:02:09 EST
From: jh@metheny.brainiac.com (Joe Hartley)
Message-Id: <9601020102.AA24655@metheny>
To: portmaster-users@livingston.com
Subject: User activity log from RADIUS detail
Sender: owner-portmaster-users@livingston.com
Precedence: bulk
Reply-To: jh@metheny.brainiac.com (Joe Hartley)

We had a requirement to be able to show the detail of a user's activity from
the RADIUS files, so I modified Dave Andersen's "Lineparser" script and
came up with this.  It occured to me that it might be useful to others, so
I'll post it here.

Thanks go to Dave Andersen for making the script available in the first place!

==========================================================================
         Joe Hartley - jh@brainiac.com - brainiac services, inc
  PO Box 5069 : Greene, RI : 02827 - vox 401.539.9050 : fax 401.539.2070
Without deviation from the norm, "progress" is not possible. - Frank Zappa

------------------ cut here -----------------------
#!/usr/local/bin/perl
##
# userlog - this program prints a log of a user's activity.
#
# Usage: userlog username detailfile
#   where username = the login of the user in question
#       detailfile = the name of a RADIUS detail file  
#
#   Copyright (C) 1995
#   -Dave Andersen <angio@aros.net>
#
#   Modified from Dave's "Lineparser" to work with 1 user
#   1/1/96 - Joe Hartley <jh@brainiac.com>
##
# set the user to look for from the command line
$testuser = sprintf("%-8s", $ARGV[0]); 

# Open the file specified on the command line
open(IN, $ARGV[1]) ||
        die "Could not open file $ARGV[1]\n";

$begin_record = 1;
$end_record = 0;

# Variables
# $date - 09/11/75 format  
# $daytime - hh:mm:ss format of _logout_ time    
# $username      
# $time - time online

print("Activity log for user $testuser\n");
print("  Date    Logout   Username   Minutes online\n");
print("--------------------------------------------\n");

while (<IN>) {
        chop;
        if (!length($_)) {
                if ($end_record) {
                    if ($username =~ $testuser) {
                        printf("%-8.8s %-8.8s  %-8.8s       %-7.7s\n",
                                $date, $daytime, $username, $time);
                    }
                }
                $end_record = 0;
                $begin_record = 1;
               next;
        }
        if ($begin_record && /^[a-zA-Z]/) {
                ($wday, $month, $mday, $daytime, $year) = split;
                $month = &convert_month($month);
                $year =~ s/19//;
                $date = sprintf("%2.2d/%2.2d/%2.2d",
                        $month, $mday, $year);
                $begin_record = 0;
                $end_record = 1;
                next;
        }
        if ($begin_record) {
                next;
        }
        if (/User-Name/) { 
                s/[^\"]*"([^\"]*).*/$1/;
                s/\s+//g;
                $username = sprintf("%-8s", $_);
                next;
        }
        if (/Acct-Status-Type/) {
                if (!/Stop/) {
                        $begin_record = $end_record = 0;
                        next;
                }
        }

        if (/Acct-Session-Time/) {
                s/Acct-Session-Time = //;
                s/\s+//g;
                $time = $_ / 60;
                next;
        }
}

sub convert_month {
        local($_) = $_[0];
        if ($_ eq "Jan") { "01"; }
        elsif ($_ eq "Feb") { "02"; }
        elsif ($_ eq "Mar") { "03"; }
        elsif ($_ eq "Apr") { "04"; }
        elsif ($_ eq "May") { "05"; }
        elsif ($_ eq "Jun") { "06"; }
        elsif ($_ eq "Jul") { "07"; }
        elsif ($_ eq "Aug") { "08"; }
        elsif ($_ eq "Sep") { "09"; }
        elsif ($_ eq "Oct") { "10"; }
        elsif ($_ eq "Nov") { "11"; }
        elsif ($_ eq "Dec") { "12"; }
        else { "-1"; }
}

