#!/usr/bin/perl use strict; use warnings; use FileHandle; my $infile=shift; my $ftp_file = "ifwprod-ftp.log"; my $dns_file = "ifwprod-dns.log"; my $web_file = "ifwprod-web.log"; my $mail_file = "ifwprod-mail.log"; my $other_file = "ifwprod-other.log"; my $ftp = new FileHandle "> $ftp_file"; my $dns = new FileHandle "> $dns_file"; my $web = new FileHandle "> $web_file"; my $mail = new FileHandle "> $mail_file"; my $other = new FileHandle "> $other_file"; my $fh = new FileHandle($infile,'r'); die "ERROR Open $infile ($!)\n" unless(defined($fh)); my $data=""; my $line; my $buff; my $count; while(!$fh->eof()) { $line=''; # Daten einlesen solange kein "\n" oder "\r" kommt # overflow couter my $oc = 0; while(index($data,"\x0A") < 0 && index($data,"\x0D") < 0 ) { $fh->read($buff,1024); # anpassen wenn es zu langsam ist... $data.=$buff; $oc++; if ( $oc gt 1000 ) { print "Overflow detected at line $count:\n"; print $data."\n"; print $buff."\n"; exit(1); } } # erste Zeile Heraussplitten ("\n" und "\r") gehen verloren # das läuft solange wie $data noch Newlines enthalten # das "split" ist recht langsam, mit "index" und "substr" währe es schneller ($line,$data)=split(/[\x0A\x0D]+/,$data,2); #print $line."\n\n"; working($line); $count++; if ( ! ( $count % 10000 ) ) { print "$count lines done\n"; } } # jetzt noch den Rest verarbeiten... working($_) for(split(/[\x0A\x0D]+/,$data)); close($fh); close $ftp; close $dns; close $web; close $mail; close $other; exit(0); ######################################### # Verarbeiten ########################### ######################################### sub working { $_ = shift; # arbeite damit ... # FTP if ( /dstport: 21 / || /dstport: 20 / || /srcport: 21 / || /srcport: 20 / || /dstport=21,/ || /dstport=20,/ || /srcport=21,/ || /srcport=20,/ ) { print $ftp $_ or die $!; } # DNS elsif ( /dstport: 53 / || /srcport: 53 / || /dstport=53,/ || /srcport=53,/ ) { print $dns $_ or die $!; } # WEB elsif ( (/srcip: 10\.1\.1\.1[0-9]?/ && ( /dstport: 80 / || /dstport: 53 / || /dstport: 443 / )) || (/srcip=10\.1\.1\.1[0-9]?,/ && ( /dstport=80,/ || /dstport=53,/ || /dstport=443,/ )) ) { print $web $_ or die $!; } # MAIL elsif ( /dstport: 25 / || /srcport: 25 / || /dstport=25,/ || /srcport=25,/ ) { print $mail $_ or die $!; } else { print $other $_ or die $!; } }