Anti-flood measures
This commit is contained in:
parent
2ad3612709
commit
355c54f326
|
@ -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!");
|
||||
|
|
Loading…
Reference in New Issue