Anti-flood measures

This commit is contained in:
root 2018-08-08 16:43:49 +02:00
parent 2ad3612709
commit 355c54f326
1 changed files with 68 additions and 8 deletions

View File

@ -25,6 +25,7 @@ use Net::IRC;
use POSIX "sys_wait_h";
use Term::ANSIColor qw/ :constants /;
use Data::Dumper;
use Time::HiRes qw(usleep nanosleep);
#
# Create the IRC and Connection objects
@ -51,6 +52,9 @@ my %ignore = ();
my $ACKCT = 0;
my @ACKS;
my $FLOOD_MAX = 5;
my $USLEEP_TIME = 1000000;
print "Creating connection to IRC server...\n";
my $conn;
@ -59,9 +63,9 @@ while (!$conn) {
$conn = $irc->newconn(Server => 'irc.freenode.net',
Port => 6667,
SSL => 0,
Nick => 'vivivi',
Nick => 'vivivivi',
Ircname => 'April Nagios alerts',
Username => 'vivivi')
Username => 'vivivivi')
or print "Redialing...\n";
sleep 1;
}
@ -260,12 +264,59 @@ sub on_public {
}
$conn->privmsg([ @to ], sprintf ( $msg, ( scalar @ACKS )) );
my $id = 0;
foreach ( @ACKS )
if ( scalar @ACKS > $FLOOD_MAX )
{
my ( $host, $svc, $state, $content ) = @$_;
my $msg = sprintf ( "[%02d] %s:%s is %s: %s",
($id++), $host, $svc, $state, $content );
$conn->privmsg([ @to ], $msg);
my %resume;
foreach ( @ACKS )
{
my ( $host, $svc, $state, $content ) = @$_;
$resume { "$svc|$state" } = '' if ! $resume { "$svc|$state" };
$resume { "$svc|$state" } .= ",$host";
}
print Dumper %resume;
if ( scalar keys %resume <= $FLOOD_MAX )
{
foreach ( keys %resume )
{
/(.*)\|(.*)/;
my $svc = $1;
my $state = $2;
my $msg = $resume { $_ };
$msg =~ s/^,//;
my $msg = sprintf ( "[%02d] %s: %s %s %s",
($id++), $svc, $msg,
( index( $msg, ',' ) > -1 ? 'are' : 'is' ),
$state );
usleep ( $USLEEP_TIME );
$conn->privmsg([ @to ], $msg);
}
}
else
{
my @megaresume;
foreach ( keys %resume )
{
/(.*)\|(.*)/;
my $svc = $1;
my $state = $2;
my @count = $resume { $_ } =~ /,/g;
push @megaresume, sprintf ( "%s (%d)", $svc, scalar ( @count ) );
}
my $msg = join ", ", @megaresume;
usleep ( $USLEEP_TIME );
$conn->privmsg([ @to ], $msg);
}
}
else
{
foreach ( @ACKS )
{
my ( $host, $svc, $state, $content ) = @$_;
my $msg = sprintf ( "[%02d] %s:%s is %s: %s",
($id++), $host, $svc, $state, $content );
usleep ( $USLEEP_TIME );
$conn->privmsg([ @to ], $msg);
}
}
} elsif ($arg =~ /^(?:$mynick[,: ]|!)\s*refresh\s*$/) {
&refresh ();
@ -316,7 +367,16 @@ sub on_public {
printf CMDPIPE "[%lu] SCHEDULE_FORCED_SVC_CHECK;%s;%s;%lu\n",time(),$host,$svc,time();
printf "[%lu] SCHEDULE_FORCED_SVC_CHECK;%s;%s;%lu\n",time(),$host,$svc,time();
close CMDPIPE;
$conn->privmsg([ @to ], sprintf ( "Recheck forcé pour ack : %s du host %s: %s", $i, $host, $svc ) );
if ( scalar @ACKS <= $FLOOD_MAX )
{
usleep ( $USLEEP_TIME );
$conn->privmsg([ @to ], sprintf ( "Recheck forcé pour ack : %s du host %s: %s", $i, $host, $svc ) );
}
}
if ( scalar @ACKS > $FLOOD_MAX )
{
usleep ( $USLEEP_TIME );
$conn->privmsg([ @to ], sprintf ( "%d rechecks forcés", scalar @ACKS ) );
}
} else {
$self->privmsg([ @to ], "Yo!");