#!/usr/bin/perl
use strict;
use Tie::File;
use Fcntl 'O_RDONLY';

# Process apache logs

$ENV{PATH} = '';

my $userlist = '/etc/users';
my $baselogdir = '/afs/athena.mit.edu/user/j/b/jbarnold/web_logs';
my $maxlength = 10;

my @user;
reload_user_list();

# collect an entire log entry before processing it
while(<>) {
	if($_ =~ /\[\w\w\w\s\w\w\w\s\s?\w\w?\s\d\d:\d\d:\d\d\s\d\d\d\d\]/) {
		if(-e '/tmp/new_user_flag') {
			`/bin/rm /tmp/new_user_flag`;
			reload_user_list();
		}
		$_ = substr($_, 0, 1000);
		process_entry($_);
	}
}

sub process_entry {
	my ($entry) = @_;

	my $match = ".no.match";

	for(my $i = 0; $i <= $#user; $i++) {
		if($entry =~ $user[$i]) {
			if($match eq ".no.match") {
				$match = $user[$i];
			}
			else {
				last;
			}
		}	
	}

	my @file;
	tie @file, 'Tie::File', "$baselogdir/$match/apache.err";
	shift @file if($#file >= $maxlength);
	push @file, $entry;
	untie @file;
}

sub reload_user_list {
	my @file;
	tie @file, 'Tie::File', $userlist, mode => O_RDONLY;
	while($#user < $#file) {
		push @user, $file[$#user+1]
			if ($file[$#user+1] =~ /^[\w_-]+$/);
	}
	untie @file;
}
