Blame mlogc/mlogc-batch-load.pl.in

Packit Service 384592
#!@PERL@
Packit Service 384592
#
Packit Service 384592
# ModSecurity for Apache 2.x, http://www.modsecurity.org/
Packit Service 384592
# Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
Packit Service 384592
#
Packit Service 384592
# You may not use this file except in compliance with
Packit Service 384592
# the License.  You may obtain a copy of the License at
Packit Service 384592
#
Packit Service 384592
#     http://www.apache.org/licenses/LICENSE-2.0
Packit Service 384592
#
Packit Service 384592
# If any of the files related to licensing are missing or if you have any
Packit Service 384592
# other questions related to licensing please contact Trustwave Holdings, Inc.
Packit Service 384592
# directly using the email address security@modsecurity.org.
Packit Service 384592
Packit Service 384592
use strict;
Packit Service 384592
use File::Find qw(find);
Packit Service 384592
use File::Spec::Functions qw(catfile);
Packit Service 384592
use Sys::Hostname qw(hostname);
Packit Service 384592
use Digest::MD5 qw(md5_hex);
Packit Service 384592
Packit Service 384592
my $ROOTDIR = $ARGV[0] || '';
Packit Service 384592
my $MLOGC = $ARGV[1] || '';
Packit Service 384592
my $MLOGCCONF = $ARGV[2] || '';
Packit Service 384592
my @AUDIT = ();
Packit Service 384592
Packit Service 384592
if ($ROOTDIR eq '' or ! -e $MLOGC or ! -e $MLOGCCONF) {
Packit Service 384592
	printf STDERR "\nUsage: $0 <rootdir> </path/to/mlogc> <mlogc_config>\n\n";
Packit Service 384592
	exit 1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
open(MLOGC, "|$MLOGC -f $MLOGCCONF") or die "ERROR: could not open '$MLOGC' - $!\n";
Packit Service 384592
Packit Service 384592
find(
Packit Service 384592
	{
Packit Service 384592
		wanted => sub {
Packit Service 384592
			my($fn,$dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size);
Packit Service 384592
Packit Service 384592
			(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = stat($_)) &&
Packit Service 384592
			-f _ &&
Packit Service 384592
####        MODSEC-204 /^\d{8}-\d+-\w{24}$/s
Packit Service 384592
            /^\d{8}-\d+-.{24,}$/s
Packit Service 384592
			&& (($fn = $File::Find::name) =~ s/^\Q$ROOTDIR\E//)
Packit Service 384592
			&& push(@AUDIT, [$fn, $size]);
Packit Service 384592
		},
Packit Service 384592
		follow => 1,
Packit Service 384592
	},
Packit Service 384592
	$ROOTDIR
Packit Service 384592
);
Packit Service 384592
Packit Service 384592
for my $audit (@AUDIT) {
Packit Service 384592
	my $fn = $audit->[0];
Packit Service 384592
	my $line = "";
Packit Service 384592
	my $err = 0;
Packit Service 384592
	my $ln = 0;
Packit Service 384592
	my $sln = 0;
Packit Service 384592
	my $sect = "";
Packit Service 384592
	my $data = "";
Packit Service 384592
	my %data = (
Packit Service 384592
		hostname => hostname(),
Packit Service 384592
		remote_addr => "-",
Packit Service 384592
		remote_user => "-",
Packit Service 384592
		local_user  => "-",
Packit Service 384592
		logtime => "-",
Packit Service 384592
		request => "-",
Packit Service 384592
		response_status => "-",
Packit Service 384592
		bytes_sent => "-",
Packit Service 384592
		referer => "-",
Packit Service 384592
		user_agent => "-",
Packit Service 384592
		uniqueid => "-",
Packit Service 384592
		sessionid => "-",
Packit Service 384592
		audit_file => $fn,
Packit Service 384592
		extra => "0",
Packit Service 384592
		audit_size => $audit->[1],
Packit Service 384592
		md5 => "-",
Packit Service 384592
	);
Packit Service 384592
Packit Service 384592
	### Parse the audit file in an attempt to recreate the original log line
Packit Service 384592
	open (AUDIT, "<".catfile($ROOTDIR,$fn)) or $err = 1;
Packit Service 384592
	if ($err == 1) {
Packit Service 384592
		print STDERR "ERROR: could not open '$fn' - $!\n";
Packit Service 384592
		next;
Packit Service 384592
	}
Packit Service 384592
Packit Service 384592
	while($line = <AUDIT>) {
Packit Service 384592
		$data .= $line;
Packit Service 384592
		chop $line;
Packit Service 384592
		$ln++;
Packit Service 384592
		$sln++;
Packit Service 384592
		if ($line =~ m%^--[0-9A-Fa-f]{8}-([A-Z])--$%) {
Packit Service 384592
			$sect = $1;
Packit Service 384592
			$sln = 0;
Packit Service 384592
			next;
Packit Service 384592
		};
Packit Service 384592
		if ($sect eq 'A') {
Packit Service 384592
            if ($line =~ m%^(\[[^:]+:\d+:\d+:\d+ [^\]]+\]) (\S+) (\S+) (\d+) (\S+) (\d+)%) {
Packit Service 384592
				$data{logtime} = $1;
Packit Service 384592
				$data{uniqueid} = $2;
Packit Service 384592
				$data{remote_addr} = $3;
Packit Service 384592
			}
Packit Service 384592
			next;
Packit Service 384592
		}
Packit Service 384592
		elsif ($sect eq 'B') {
Packit Service 384592
			if ($sln == 1) {
Packit Service 384592
				$data{request} = $line;
Packit Service 384592
			}
Packit Service 384592
			elsif ($line =~ m%^User=Agent: (.*)%i) {
Packit Service 384592
				$data{user_agent} = $1;
Packit Service 384592
			}
Packit Service 384592
			elsif ($line =~ m%^Referer: (.*)%i) {
Packit Service 384592
				$data{referer} = $1;
Packit Service 384592
			}
Packit Service 384592
			next;
Packit Service 384592
		}
Packit Service 384592
		elsif ($sect eq 'F') {
Packit Service 384592
			if ($sln == 1 and $line =~ m%^\S+ (\d{3})\D?.*%) {
Packit Service 384592
				$data{response_status} = $1;
Packit Service 384592
			}
Packit Service 384592
			elsif ($line =~ m%^Content-Length: (\d+)%i) {
Packit Service 384592
				$data{bytes_sent} = $1;
Packit Service 384592
			}
Packit Service 384592
			next;
Packit Service 384592
		}
Packit Service 384592
	}
Packit Service 384592
	$data{md5} = md5_hex($data);
Packit Service 384592
Packit Service 384592
	printf MLOGC (
Packit Service 384592
		"%s %s %s %s %s \"%s\" %s %s \"%s\" \"%s\" %s \"%s\" %s %s %s md5:%s\n",
Packit Service 384592
		$data{hostname},
Packit Service 384592
		$data{remote_addr},
Packit Service 384592
		$data{remote_user},
Packit Service 384592
		$data{local_user},
Packit Service 384592
		$data{logtime},
Packit Service 384592
		$data{request},
Packit Service 384592
		$data{response_status},
Packit Service 384592
		$data{bytes_sent},
Packit Service 384592
		$data{referer},
Packit Service 384592
		$data{user_agent},
Packit Service 384592
		$data{uniqueid},
Packit Service 384592
		$data{sessionid},
Packit Service 384592
		$data{audit_file},
Packit Service 384592
		$data{extra},
Packit Service 384592
		$data{audit_size},
Packit Service 384592
		$data{md5},
Packit Service 384592
	);
Packit Service 384592
       
Packit Service 384592
}
Packit Service 384592