in reply to Re^7: Real time log parser
in thread Real time log parser

Thank you for all your efforts, it seems we've almost got it working. But there is one thing that bothers me now: Script works correct, but only once. It can detect one event and even handle it correctly, but if second event occurs, it doubles ( it writes a second copy of the squid.conf to the same file) squd.conf and grey.list files, and squid quits with an error. The weird thing that filehandles are open for a writing and not for appending, it means that any content should be rewritten with the new one. So I think the problem is in @cfg array, it's getting doubled somehow.
#!/usr/bin/perl # Squid reconfiguration script rev: 0.91 # use File::Tail; sub ban { open( CFG, "<", "/etc/squid/squid.conf" ); while ( <CFG> ) { push @cfg, $_; } close(CFG); #my $line = shift; #my ($proxy) = $line =~ m| - \S+/(proxy_\S+)|; #my @cutoff = grep /$proxy/, @cfg; my @cutoff = grep /proxy_/,@_; s/ROUNDROBIN_PARENT\///g for @cutoff; @cutoff = grep /@cutoff/,@cfg; open( GREY, ">>", "/etc/squid/all.grey" ); if (@cutoff) { print GREY @cutoff; print GREY "10\n"; } close (GREY); print "Banned parrent: @cutoff\n"; print " Strings with parrent in conf: @cutoff\n"; open( EXC, ">", "/etc/squid/squid.conf" ); my %dels = map { $_ => 1 } @cutoff; @cfg = grep !$dels{$_}, @cfg; print EXC @cfg; close (EXC); @args = ("/etc/init.d/squid", "reload"); system(@args) == 0 or die "system @args failed: $?" ; } my $name = "/var/log/squid/access.log"; my $ref=tie *FH,"File::Tail",(name=>$name, maxinterval=>1); while (<FH>) { m|/sorry/| && ban (split ' ',$_); }

Replies are listed 'Best First'.
Re^9: Real time log parser
by Eliya (Vicar) on Jan 03, 2012 at 10:51 UTC

    You need to clear @cfg before pushing items onto it (i.e., simply use a lexical variable):

    sub ban { open( CFG, "<", "/etc/squid/squid.conf" ); my @cfg; # <-- while ( <CFG> ) { push @cfg, $_; } ...