New version of userlog script

Joe Hartley (jh@metheny.brainiac.com)
Fri, 4 Apr 97 15:42:07 EST

I updated the "userlog" script last week to include the number of the port
the user attached to. When a user complans that he keeps getting kicked off,
we can use this to see if there's a specific port that seems problematic.

Since other folks on the list seem to use this script, I figured I'd
post the update.

#!/usr/local/bin/perl
##
# userlog - this program prints a log of a user's activity.
#
# Usage: userlog username [mm.yy]
# where username = the login of the user in question
# mm.yy = the numeric month and year of a previous period
#
# 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>
#
# Modified to allow specification of a single portmaster
# 10/29/96 - Joe Hartley <jh@brainiac.com>
#
# Modified to include the port attached to
# 3/26/97 - Joe Hartley <jh@brainiac.com>
##
# set the user to look for from the command line
if ($ARGV[0]) {
$testuser = sprintf("%-8s", $ARGV[0]);
}
else {
die("Usage: userlog username PMname|all [mm.yy]\n");
}

# Set the server list - modify this to list all your PMs
if ($ARGV[1] =~ "all") {
@servlist = ("pm1","pm2");
}
else {
@servlist = ($ARGV[1]);
}

# Set the period variable, if any
if ($ARGV[2]) {
$period = $ARGV[2];
}
else {
$period = '';
}

# Test for current month specified on command line - this keeps the program
# from failing if the current month is asked for!

chop($thismonth = `/bin/date +%m`);
$thisyear = `/bin/date +%y`;
chop($reqmonth = "$thismonth.$thisyear");

if ($reqmonth == $period) {
$period = '';
}

$servno = 0;
# Open the file for first PM
$server = $servlist[$servno];
$servno += 1;
while ($server) {
open(IN, "/usr/adm/radacct/$server.brainiac.com/detail$period") ||
die "Could not open file $server.brainiac.com/detail$period\n";

$begin_record = 1;
$end_record = 0;

# Variables
# $date - 09/11/75 format
# $thismonth - the current month in MM format
# $daytime - hh:mm:ss format of _logout_ time
# $username
# $time - time online
# $port - port they logged in on

print("\nActivity log for user $testuser on $server\n");
print(" Date Logout Username Port Minutes online TOTAL Hours Online\n");
print("------------------------------------------------------------------------\n");

while (<IN>) {
chop;
if (!length($_)) {
if ($end_record) {
if ($username =~ $testuser) {
$totaltime += $time / 60;
printf("%-8.8s %-8.8s %-8.8s %-4.4s %-7.7s %-7.7s\n",
$date, $daytime, $username, $port, $time, $totaltime);
}
}
$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 (/Client-Port-Id/) {
s/Client-Port-Id = //;
s/\s+//g;
$port = $_;
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;
}
}
$server = $servlist[$servno];
$servno += 1;
}

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"; }
}