#!/usr/bin/perl
#
# Script to process portmaster syslog records
#
# Written: 29 JUNE 1992
#      By: James T. McDuffie, III
#          Manager, Release Engineering/SQA
#          Kubota Pacific Computer, Inc.
#
# Modification History
# 94/04/18 cdr@livingston.com	now reports network users as well as login users
#
#   Usage: usage [ -h ] [ -f <find only file> ] <logfile ...>
#
#   Where:	-h	Show elapsed time in hours only
#   		-f <f>	Report ONLY on those User ID's found in this file.
#   		logfile	TERMLOG files to be reported aginst.
#

require "date.pl";

    $Selective = 0;

$months = 'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec';
$midnite = 86400;				# Seconds in a whole day

while (<>) {
    chop;
    next unless /portmaster:/ || /dialnet:/;
    next if /Dialback requested/;

    ($mon, $day, $hr, $min, $sec, $stuff) = /^($months)\s+(\d+)\s(\d\d):(\d\d):(\d\d)\s+(.*):\s+/;
    $dat = &jday(&monthnum($mon), $day);
    $tim = ((($hr * 60) + $min) * 60) + $sec;	# Seconds since midnight
    $_ = $';

    if ( /(Login|connection) succeeded/ ) {
	($p, $dummya, $dummyb, $u) = /port\s+(\w+)\s+(Login|connection) succeeded (for|dest)\s+(\S+)$/;
	next unless ((! $Selective) || $only{$u});
	$current{$u,$p} = join('@', $dat, $tim, $p, $u);
    } elsif ( /session disconnected (user|dest)/ ) {
	($p, $dummya, $u) = /port\s+(\w+)\s+session disconnected (user|dest)\s+(\S+)$/;
	next unless ((! $Selective) || $only{$u});
	if ( defined($current{$u,$p}) ) {
	    ($dat2, $tim2, $p2, $u2) = split(/@/, $current{$u,$p});
	    $elapsed = $tim + ($midnite - $tim2);
	    $elapsed += (($dat - $dat2) - 1) * $midnite;
	    $master{$u} .= '^' if defined($master{$u});
	    $master{$u} .= $dat2 . '@' . $elapsed;
	} else {
	    ($me, $de, $ye, $we) = &jdate($dat);
	    $dt = sprintf("%02d/%02d/%04d", $me, $de, $ye);
	    warn "$u on $p @ $dt - missing matching Login record.\n";
	}
	undef $current{$u,$p};
    }
}

#foreach $what ( keys %current ) {
#    ($dat, $tim, $p, $u) = split(/@/, $current{$what});
#    ($me, $de, $ye, $we) = &jdate($dat);
#    $dt = sprintf("%02d/%02d/%04d", $me, $de, $ye);
#    warn "$u on $p @ $dt - missing matching disconnect record.\n";
#}

$^ = 'HDR';
$~ = ($opt_h) ? 'DTLh' : 'DTL';

$grand_total = 0;

foreach $user ( sort keys %master ) {
    @lst = split(/\^/, $master{$user});
    $u = $user;
    $usr_total = 0; $detail_cnt = 0;
    foreach $event ( sort @lst ) {
	($dat, $tim) = split(/@/, $event);
	$usr_total += $tim;
	($m, $d, $y) = &jdate($dat);
	$dt = sprintf("%02d/%02d", $m, $d);
	if ( (!$opt_h) && $tim > $midnite ) {
	    $d = int($tim / $midnite);
	    $d = sprintf("%02d d", $d);
	    $tim %= $midnite;
	} else {
	    $d = '';
	}
	$h = int($tim / 3600); $tim %= 3600;
	$m = int($tim / 60);   $tim %= 60;
	$s = $tim;
	$tim = sprintf("%4d:%02d:%02d", $h, $m, $s);
	write; $detail_cnt++;
	$u = '';
    }
    if ( $detail_cnt > 1 ) {
	$~ = 'BRK';
	$sum = '';
	if ( (!$opt_h) && $usr_total > $midnite ) {
	    $d = int($usr_total / $midnite);
	    $t = $usr_total % $midnite;
	    $sum = sprintf("%02d d ", $d);
	} else {
	    $t = $usr_total;
	}
	$h = int($t / 3600); $t %= 3600;
	$m = int($t / 60);   $t %= 60;
	$sum .= sprintf("%4d:%02d:%02d", $h, $m, $t);
	write;
    } else {
	$~ = 'BLK';
	write;
    }
    $~ = ($opt_h) ? 'DTLh' : 'DTL';
    $grand_total += $usr_total;
}

$~ = 'GTL';
$sum = '';
if ( (!$opt_h) && $grand_total > $midnite ) {
    $d = int($grand_total / $midnite);
    $t = $grand_total % $midnite;
    $sum = sprintf("%02d d ", $d);
} else {
    $t = $grand_total;
}
$h = int($t / 3600); $t %= 3600;
$m = int($t / 60);   $t %= 60;
$sum .= sprintf("%5d:%02d:%02d", $h, $m, $t);
write;


format HDR =

      Usage Report

   User ID     Date Logged In  Time Logged In
=============  ==============  ===============
.

format DTL =
@<<<<<<<<<<<<    @<<<<<<<<     @<<< @>>>>>>>>>
$u,              $dt,          $d,  $tim
.

format DTLh =
@<<<<<<<<<<<<    @<<<<<<<<     @>>>>>>>>>>>>>>
$u,              $dt,          $tim
.

format BLK =

.

format BRK =
                               ---------------
       Total for @<<<<<<<<<<<< @>>>>>>>>>>>>>>
		 $user,        $sum

.

format GTL =

			       ================
 Grand Total Time - All Users: @>>>>>>>>>>>>>>>
                               $sum
.

sub DoUsage {

    ($name) = ($0 =~ m#([^/]+)$#);
    print STDERR "Usage: $name [ -h ] [ -f <find only file> ] <logfile ...>\n";
    print STDERR "\n\nWhere:\t-h\tShow elapsed time in hours only\n";
    print STDERR "\t-f <f>\tReport ONLY on those User ID's found in this file.\n";
    print STDERR "\tlogfile\tTERMLOG files to be reported aginst.\n";
    print STDERR "\n";

    exit(1);

}
