RE: Log Parser

Joe Hartley (jh@brainiac.com)
Sat, 26 Jul 1997 17:14:46 -0400 (EDT)

On 26-Jul-97 Alex wrote:
>I used to have a file to parse the log file and it was called ulog. It
>showed the users date and time on and then at the end it added the time to
>show total time. Anyone have a good script for something like this?

Attached below is the latest version of my userlog script, which was based on
Dave Andersen's lineparser script.

It assumes that the detail files are rolled over at the end of the month
to a file named detailmm.yy, where mm is the 2-digit month (e.g. 02 for
February) and yy is the 2 digit year.

Note that my mail tool automatically wraps lines over 78 characters; some
editing to join split lines may be required on your system.

You can either specify a specific PM's log to look at, or use "all" to search
them all.

========================================================================
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. - FZappa

#!/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
if ($ARGV[1] =~ "all") {
@servlist = ("pm1","pm2","pm3");
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, "/var/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"; }
}