#!/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 # 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 () { 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) ).' ' ); }