Rob Dixon am Freitag, 4. August 2006 16:54:
> Tim Wolak wrote:
> > I have modified the code however its still not writting to the file....
> > Not sure what is going on, I have tried different ideas to get it to
> > pint to the file but so far no go.  Does anyone have any ideas?
> >
> > #!/usr/bin/perl -w
> >
> > use strict;
> > use warnings;
> > my $logfile = '/var/log/messages';
> > my $secv = '/var/log/secv';
> > my $hosts = '/etc/hosts.deny';
> > my $cody = '/etc/hosts.txt';
> > my @boxes;
> > my $box;
> >
> > open(LOG, $logfile) || die "Cannot open logfile for reading: $!";
> > open(SEC, '>$secv') || die "Can't open file!: $!";
> > open(HOST, $hosts) || die "Can't open file!: $!";
> > open(DENY, '>>$cody') || die "Can't open file!: $!";
> >
> >         foreach (<HOST>) {
> >                 push @boxes, $1 if /(\d+\.\d+\.\d+\.\d+)/;
> >                 }
> >         close HOST or die $!;
> >
> >         while (<LOG>){
> >            next unless /Failed password for invalid/;
> >            print SEC "Invalied user logon attempt!:$_\n";
> >                 next unless /(\d+\.\d+\.\d+\.\d+)/;
> >                 my $tim = $1;
> >                 foreach $box (@boxes) {
> >                         if ($box eq /$tim/){
> >                           next;
> >                         } else {
> >                          print DENY "$tim\n";
> >                         }
> >                 }
> >         }
> > close SEC or die $!;
> > close DENY or die $!;
> > close LOG or die $!;
>
> I think you want:
>
>    foreach my $box (@boxes) {
>
>      if ($box eq $tim){
>        print DENY "$tim\n";
>        last;
>      }
>    }

Hello Tim,

The "last;" statement improves the performance by omitting unneccessary tests 
with further @boxes. I overlooked this; even more performant (and shorter) 
would be to use a lookup hash:

# [...]

my %hosts; # instead of @hosts

foreach (<HOST>) {
  $hosts{$1}=1 if /(\d+\.\d+\.\d+\.\d+)/;
}

# [...]

# after the "next unless /(\d+\.\d+\.\d+\.\d+)/;" line:

print DENY "$tim\n" if exists $hosts{$1};
} # while (<LOG>)

# [...]


Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to