#!/usr/local/bin/perl

# ppp.pl Version 1.2  July 9, 1997
# This script it historical, and is not supported, mostly because I don't
# use it any more, and can't remember how it works. However, feel free to
# use if if you like it.

# This is the second version made available, and was modified by a now
# unknown person. It addes reporting in seconds, and possibly some bug
# fixes.

# 7/9/1997 Fix for situation where there is no login record, only log-out.
# Fix submitted by Steve MacLeod <smacleod@sparc.uccb.ns.ca>

# 1/11/2000
# Fixed 2 syntax errors that caused it to not compile. Wow -- this version
# up here hasn't worked in a LONG time.  I don't even use Annex 3 servers
# any more, so I will have to reiterate -- THIS PROGRAM IS NOT SUPPORTED !

# Check for the newest version at http://www.westnet.com/providers/


#    Compute SLIP/PPP log times
#     Arguments    -a   Process entire file with totals
#                  -t   Process only totals
#                  -f   File to be processed if not current
#                  -d   processing start date (default is entire file)
#                  -l   to return all totals for dayuse
#                  -w   name of tmp work file for dayuse
#                  user names

#require "/usr/lib/perl/time.pl";
require "time.pl";

$space='        ';

unless (@ARGV[0]) {
       print "Missing Arguments\n";
       print    "-a - entire file\n";
       print    "-t - totals only\n";
       print    "-f - file name to be processed\n";
       print    "-d - processing start date (yymmdd)\n";
       print    "-l - return totals for dayuse\n";
       print    "-w - tmp work file for dayuse\n";
       print    "-s - give output in seconds instead of HH:MM:SS\n";
       print    "-L - give output in format suitable for storing (logfile compression)\n";
       exit;
}     # end if test for missing arguments

($t_sec, $t_min, $t_hour, $t_mday, $t_mon, $t_year) = localtime(time); 
if (length($t_mon) == 1) { $t_mon = "0$t_mon"; }

$infile = "./acp_logfile";
$tmpfile = "/tmp/ppp";
$n = $#ARGV;
$start_yymmdd = "";

for ($i = 0; $i <= $n; $i++) {
    if ($ARGV[$i] eq "-a") {
             $allflag = "true";
        }
       elsif ($ARGV[$i] eq "-t") {
                      $totalflag = "true";
             }
       elsif ($ARGV[$i] eq "-f") {
        $i++;
          $infile = $ARGV[$i];
             }
        elsif ($ARGV[$i] eq "-d") {
          $i++;
          $start_yymmdd = $ARGV[$i];
          }   #end start yymmdd
        elsif ($ARGV[$i] eq "-l") {
           $logflag = "true";
           $totalflag = "true";
         }  #  end log 
       elsif ($ARGV[$i] eq "-s") {
			$out_secs = "true";
		}
       elsif ($ARGV[$i] eq "-L") {
			$out_log = "true";
		}
       elsif ($ARGV[$i] eq "-w") {
        $i++;
          $tmpfile = $ARGV[$i];
             } #  end tmp file 
        else    {
            ($arg_user,$arg_yymmdd) = split (/:/, $ARGV[$i]);
                 $ip_user_date {$arg_user} = $ARGV[$i];
             $userflag = "true";
                }   # end else
 } # end for 1 = 1 to n

open (IN,$infile)
        || die "Can't open acp_logfile";

NEXTUSER: while (<IN>) {	
	chop;
	($add,$ether,$port,$date,$time,$type,$action,$user) = split(/:/);

        if ($logflag) {
          $start_yymmdd = '';
          if ($ip_user_date{$user}) {
             ($ip_user, $start_yymmdd) = 
                      split (/:/, $ip_user_date{$user});
           }  # end get date
        }   #  end log flag
        if ($start_yymmdd) {
           if ($date < $start_yymmdd) {
               next NEXTUSER;
           }  #end date compare
        }  #end if date
        if ($userflag){
          if (!$ip_user_date{$user}) {
               next NEXTUSER;
          }  #  end user test
        }  #   end by user or all
        if (($totalflag) || ($allflag) || ($ip_user_date{$user})) {
	 if (($type eq 'ppp') || ($type eq 'slip'))  {

	    if ($action eq 'login') {
			$login{$user} = "$time:$date:$port";

		}
                  elsif ($action eq 'logout' ) {
                     if (!$login{$user}) {
                          $login{$user} = "000001:$date";
                      } #end pad user if carry over
			($stime,$sdate,$sport) = split(':',$login{$user});
			$start = &annex2sec($stime);
			$end = &annex2sec($time);
                        
			#If we went through midnight, add a day;
			if ($end < $start) {$end += 86400;}
			$timeon = $end - $start;
			# this patch resolves holes in the log
			# customers will not pay for log errors
			if ($port eq $sport) {
			$elapsed{$user} += $timeon;
			}
			
                      if (!$totalflag) {
		        print (&fmt_user($user),
                              '  ', &fmt_date($sdate), '  In: ', 
				&fmt_time($stime),'  Out: ',
				&fmt_time($time),
                       '  Elapsed: ', &fmt_sec($timeon), "\n");
                      }  # end total test
		}  #end elsif action
	}  #  type = ppp of slip
    }  #  check arguments
} 
close IN;

if ($logflag) {
    open (TMPPPP, ">$tmpfile")
               || die "Can't open ppp tmp file";
    foreach $user (sort(keys(%elapsed))) {
        $log_time = &fmt_sec($elapsed{$user});
	$tmp = join (':',
                    $user, 
                    $log_time);
        print (TMPPPP "$tmp\n");
    }
    close (TMPPPP);
}
    else {

        foreach $user (sort(keys(%elapsed))) {
		if ($out_secs eq "true") {
        print "\n\nTotal Time On For Period:\n";
        print     "-------------------------\n";
	   print (&fmt_user($user), "  ",$elapsed{$user}, "\n");
		} elsif ($out_log eq "true")  {
	   printf("%s:%s\n", $user,$elapsed{$user});
		} else {
        print "\n\nTotal Time On For Period:\n";
        print     "-------------------------\n";
	   print (&fmt_user($user), "  ",&fmt_sec($elapsed{$user}), "\n");
		}
        }
    }
exit(0);

#-------------------------------------------------------
#--------------- Subroutines Start Here ----------------
#-------------------------------------------------------

sub annex2sec {
	local($time) = @_;
	return( &time2sec( &break_annex($time) ) );
}

sub fmt_date {
	local($date) = @_;

	return( substr($date,2,2).'/'.substr($date,4,2).'/'.substr($date,0,2) );
}

sub fmt_time {
	local($time) = @_;
	local($s,$m,$h) = &break_annex($time);
	return ("$h:$m:$s");
}


sub break_annex {
	local($time) = @_;
	local($h,$m,$s);

	$h=substr($time,0,2);
	$m=substr($time,2,2);
	$s=substr($time,4,2);

	return ($s,$m,$h);
}	

sub fmt_sec {
	local(@t) = &sec2time(@_);
	@t[2] += (@t[3]*24);

	foreach $a (@t) {
		if ($a < 10) {$a = "0$a";}
	}

	return ("@t[2]:@t[1]:@t[0]");
}

sub fmt_user {
	local($user) = @_;
	return( $user.substr($space,0,8 - length($user) ).'  ' );
}

