#!/usr/bin/perl
# $Id: ck_xferlog,v 1.2 1997/03/17 21:34:41 grimaldo Rel $
# AUTHOR: D. Emilio Grimaldo Tunon  (grimaldo@panama.IAEhv.nl)
# USAGE : ck_xferlog -{ lf | lh | f file | F FullFilePath | h hostname } 
#		     [-L logPath] [-m]
# DESCR.:
#	Produces various summaries of FTP transactions using as
#	input the ftp xferlog file ($LOG).
#
#	-lf	Lists files accessed (and count accesses)
#	-lh	Lists hostnames that accessed ftp (and count)
#	-f file	Give a summary of accesses to <file>, partial match
#	-F file	Give a summary of accesses to <fullyQualifiedfile>, exact match
#	-h host	Give a summary of accesses by <host>
#	-L LOG	Use LOG instead of the default logname in script
#	-m WHO	Mail report to WHO instead of reporting to stdout
#
require "getopts.pl";

$LOG = "/var/log/xferlog";		# Location of FTP log file
$Tmp = "$ENV{'HOME'}/.xferlog.mail";	# Temporary file for mailing

%direc = ( 'i' , 'IN ',
	   'o' , 'OUT' );
%type =  ( 'a' , 'ASCII',
	   'b' , 'BIN  ' );

sub GetInfo {
    local($st) = @_;

    $Date = substr($st,0,24);
    $st = substr($st,25,length($st));
    ($Duration,$Host,$Size,$File,$Type,$Action,$InOut,$AnonReal,$User,
     $Service, $Authentication,$AuUid) = split(/\s+/,$st,12);
}

sub ConvertToHMS {
    local($seconds) = @_;
    local($h,$m,$s);
    
    $h = 0; $m = 0; $s = 0;
    $h = int($seconds / 3600);
    $seconds -= $h * 3600;
    $m = int($seconds / 60);
    $seconds -= $m * 60;
    $s = $seconds;
    return pack("iii",$h,$m,$s);
}

sub ListHosts {
    local($hostname,%hosts);
 
    print MAIL "Count Hostname\n";
    while (<XFERLOG>) {
    	chop;
	do GetInfo($_);
	$hosts{$Host} += 1;
    }
    foreach $hostname (keys(%hosts)) {
	printf MAIL "%5d %s\n",$hosts{$hostname},$hostname;
    }
}

sub ListFiles {
    local($filename,%files);
 
    print MAIL "Count File name\n";
    while (<XFERLOG>) {
    	chop;
	do GetInfo($_);
	$files{$File} += 1;
    }
    foreach $filename (keys(%files)) {
	printf MAIL "%5d %s\n",$files{$filename},$filename;
    }
}

sub FilesByHost {
    local($hour,$mins,$secs);
    local($timeTaken,@timeTaken);
 
    while (<XFERLOG>) {
    	chop;
	do GetInfo($_);
	if ($Host eq $opt_h) {
	    printf MAIL "%s  %s   %s   %s\n", $direc{$InOut}, $type{$Type}, 
					      $User, $File;
    	    $timeTaken = &ConvertToHMS($Duration);
    	    @timeTaken = unpack("iii",$timeTaken);
	    $hour += @timeTaken[0];
	    $mins += @timeTaken[1];
	    $secs += @timeTaken[2];
	}
    }
    printf MAIL "----\nTotal time: %02d:%02d:%02d\n",$hour,$mins,$secs;
}

sub AccessesToFile {
    local($hour,$mins,$secs);
    local($timeTaken,@timeTaken,$filesize);
 
    while (<XFERLOG>) {
    	chop;
	do GetInfo($_);
	if (( defined($opt_F) && $File eq $opt_F ) || 
	    ( defined($opt_f) && (index($File,$opt_f) > -1))) {
  	    $filesize = $Size;
	    $sFile = "";			# Used for partial searches
	    $sFile = $File if defined $opt_f;
	    printf MAIL "%s  %s   %s   %s  %s\n",$direc{$InOut},$type{$Type}, 
					    $User, $Host, $sFile;
    	    $timeTaken = &ConvertToHMS($Duration);
    	    @timeTaken = unpack("iii",$timeTaken);
	    $hour += @timeTaken[0];
	    $mins += @timeTaken[1];
	    $secs += @timeTaken[2];
	}
    }
    printf MAIL "----\nTotal time: %02d:%02d:%02d\nSize: %d\n",
	   $hour,$mins,$secs,$filesize;
}

sub Header {
    $version = '$Revision: 1.2 $';
    $version =~ /Revision: (\d+)\.(\d+)/;
    if (defined($opt_m)) {
	print MAIL "X-ChkLogs: ck_xferlog\n";
	print MAIL "Subject: FTP log summary\n";
    }

    print MAIL '-'x38, "\n**** FTP Summary Report\n";
    print MAIL "**** ChkLogs plug-out ck_xferlog v$1.$2\n";
    print MAIL '-'x38, "\n\n";
}

die "No arguments given!" if (scalar(@ARGV) == 0);
&Getopts('h:f:F:l:L:m:');
$LOG = $opt_L if defined $opt_L;
open(XFERLOG,$LOG) || die "Could not open $LOG";

# Mail or Stdout ?
$OutFile = '-';		# stdout
$OutFile = $Tmp if defined $opt_m;
open(MAIL,">$OutFile") or die "could not create $OutFile\n";

&Header;

if (defined($opt_h)) { 
    print MAIL "Files accessed by host: $opt_h\n\n"; 
    &FilesByHost; 
}
if (defined($opt_f) || defined($opt_F)) { 
    print MAIL "Accesses to file: $opt_f$opt_F\n\n"; 
    &AccessesToFile; 
}
if (defined($opt_l)) { 
    if ($opt_l eq "f") { &ListFiles; }
    if ($opt_l eq "h") { &ListHosts; }
}
close(XFERLOG);    
close(MAIL);

if (defined($opt_m)) {
    system("cat $Tmp | /usr/sbin/sendmail -ep -i $opt_m");
    unlink $Tmp;
}
