From 2f2eb1cb12a57d8a85801086b6fbfce19e9c7a1b Mon Sep 17 00:00:00 2001 From: Micah Anderson Date: Sun, 26 Dec 2010 17:27:55 -0500 Subject: Update check_mysql_health plugin, changes: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit . fixed a division by zero bug in index-usage (Thanks Wiltmut Gerdes) . fixed a severe bug when loading dynamic extensions (Thanks Ralph Schneider) . added mode table-fragmentation . fixed a bug in table-lock-contention (thanks mayukmok00) . mode sql can now have a non-numerical output which is compared to a string/regexp . new parameter –dbthresholds . new mode report can be used to output only the bad news (short,long,html) . added modes threads-created, threads-running, threads-cached . added connects-aborted, clients-aborted --- files/plugins/check_mysql_health | 411 ++++++++++++++++++++++++++++++++------- 1 file changed, 345 insertions(+), 66 deletions(-) (limited to 'files') diff --git a/files/plugins/check_mysql_health b/files/plugins/check_mysql_health index f0599f2..402af55 100755 --- a/files/plugins/check_mysql_health +++ b/files/plugins/check_mysql_health @@ -123,6 +123,15 @@ sub init { $self->{log_waits_rate} = $self->{delta_log_waits} / $self->{delta_timestamp}; } + } elsif ($params{mode} =~ /server::instance::innodb::needoptimize/) { +#fragmentation=$(($datafree * 100 / $datalength)) + +#http://www.electrictoolbox.com/optimize-tables-mysql-php/ + my @result = $self->{handle}->fetchall_array(q{ +SHOW TABLE STATUS WHERE Data_free / Data_length > 0.1 AND Data_free > 102400 +}); +printf "%s\n", Data::Dumper::Dumper(\@result); + } } @@ -468,6 +477,35 @@ sub init { ($dummy, $self->{threads_connected}) = $self->{handle}->fetchrow_array(q{ SHOW /*!50000 global */ STATUS LIKE 'Threads_connected' }); + } elsif ($params{mode} =~ /server::instance::createdthreads/) { + ($dummy, $self->{threads_created}) = $self->{handle}->fetchrow_array(q{ + SHOW /*!50000 global */ STATUS LIKE 'Threads_created' + }); + $self->valdiff(\%params, qw(threads_created)); + $self->{threads_created_per_sec} = $self->{delta_threads_created} / + $self->{delta_timestamp}; + } elsif ($params{mode} =~ /server::instance::runningthreads/) { + ($dummy, $self->{threads_running}) = $self->{handle}->fetchrow_array(q{ + SHOW /*!50000 global */ STATUS LIKE 'Threads_running' + }); + } elsif ($params{mode} =~ /server::instance::cachedthreads/) { + ($dummy, $self->{threads_cached}) = $self->{handle}->fetchrow_array(q{ + SHOW /*!50000 global */ STATUS LIKE 'Threads_cached' + }); + } elsif ($params{mode} =~ /server::instance::abortedconnects/) { + ($dummy, $self->{connects_aborted}) = $self->{handle}->fetchrow_array(q{ + SHOW /*!50000 global */ STATUS LIKE 'Aborted_connects' + }); + $self->valdiff(\%params, qw(connects_aborted)); + $self->{connects_aborted_per_sec} = $self->{delta_connects_aborted} / + $self->{delta_timestamp}; + } elsif ($params{mode} =~ /server::instance::abortedclients/) { + ($dummy, $self->{clients_aborted}) = $self->{handle}->fetchrow_array(q{ + SHOW /*!50000 global */ STATUS LIKE 'Aborted_clients' + }); + $self->valdiff(\%params, qw(clients_aborted)); + $self->{clients_aborted_per_sec} = $self->{delta_clients_aborted} / + $self->{delta_timestamp}; } elsif ($params{mode} =~ /server::instance::threadcachehitrate/) { ($dummy, $self->{threads_created}) = $self->{handle}->fetchrow_array(q{ SHOW /*!50000 global */ STATUS LIKE 'Threads_created' @@ -629,22 +667,26 @@ sub init { $self->valdiff(\%params, qw(handler_read_first handler_read_key handler_read_next handler_read_prev handler_read_rnd handler_read_rnd_next)); - $self->{index_usage_now} = 100 - (100.0 * ($self->{delta_handler_read_rnd} + - $self->{delta_handler_read_rnd_next}) / - ($self->{delta_handler_read_first} + - $self->{delta_handler_read_key} + + my $delta_reads = $self->{delta_handler_read_first} + + $self->{delta_handler_read_key} + $self->{delta_handler_read_next} + - $self->{delta_handler_read_prev} + - $self->{delta_handler_read_rnd} + - $self->{delta_handler_read_rnd_next})); - $self->{index_usage} = 100 - (100.0 * ($self->{handler_read_rnd} + - $self->{handler_read_rnd_next}) / - ($self->{handler_read_first} + - $self->{handler_read_key} + + $self->{delta_handler_read_prev} + + $self->{delta_handler_read_rnd} + + $self->{delta_handler_read_rnd_next}; + my $reads = $self->{handler_read_first} + + $self->{handler_read_key} + $self->{handler_read_next} + - $self->{handler_read_prev} + - $self->{handler_read_rnd} + - $self->{handler_read_rnd_next})); + $self->{handler_read_prev} + + $self->{handler_read_rnd} + + $self->{handler_read_rnd_next}; + $self->{index_usage_now} = ($delta_reads == 0) ? 0 : + 100 - (100.0 * ($self->{delta_handler_read_rnd} + + $self->{delta_handler_read_rnd_next}) / + $delta_reads); + $self->{index_usage} = ($reads == 0) ? 0 : + 100 - (100.0 * ($self->{handler_read_rnd} + + $self->{handler_read_rnd_next}) / + $reads); } elsif ($params{mode} =~ /server::instance::tabletmpondisk/) { ($dummy, $self->{created_tmp_tables}) = $self->{handle}->fetchrow_array(q{ SHOW /*!50000 global */ STATUS LIKE 'Created_tmp_tables' @@ -667,6 +709,20 @@ sub init { SHOW /*!50000 global */ STATUS LIKE 'Open_files' }); $self->{pct_open_files} = 100 * $self->{open_files} / $self->{open_files_limit}; + } elsif ($params{mode} =~ /server::instance::needoptimize/) { + $self->{fragmented} = []; + #http://www.electrictoolbox.com/optimize-tables-mysql-php/ + my @result = $self->{handle}->fetchall_array(q{ + SHOW TABLE STATUS + }); + foreach (@result) { + my ($name, $engine, $data_length, $data_free) = + ($_->[0], $_->[1], $_->[6 ], $_->[9]); + next if ($params{name} && $params{name} ne $name); + my $fragmentation = $data_length ? $data_free * 100 / $data_length : 0; + push(@{$self->{fragmented}}, + [$name, $fragmentation, $data_length, $data_free]); + } } elsif ($params{mode} =~ /server::instance::myisam/) { $self->{engine_myisam} = DBD::MySQL::Server::Instance::MyISAM->new( %params @@ -693,6 +749,41 @@ sub nagios { $self->add_perfdata(sprintf "threads_connected=%d;%d;%d", $self->{threads_connected}, $self->{warningrange}, $self->{criticalrange}); + } elsif ($params{mode} =~ /server::instance::createdthreads/) { + $self->add_nagios( + $self->check_thresholds($self->{threads_created_per_sec}, 10, 20), + sprintf "%.2f threads created/sec", $self->{threads_created_per_sec}); + $self->add_perfdata(sprintf "threads_created_per_sec=%.2f;%.2f;%.2f", + $self->{threads_created_per_sec}, + $self->{warningrange}, $self->{criticalrange}); + } elsif ($params{mode} =~ /server::instance::runningthreads/) { + $self->add_nagios( + $self->check_thresholds($self->{threads_running}, 10, 20), + sprintf "%d running threads", $self->{threads_running}); + $self->add_perfdata(sprintf "threads_running=%d;%d;%d", + $self->{threads_running}, + $self->{warningrange}, $self->{criticalrange}); + } elsif ($params{mode} =~ /server::instance::cachedthreads/) { + $self->add_nagios( + $self->check_thresholds($self->{threads_cached}, 10, 20), + sprintf "%d cached threads", $self->{threads_cached}); + $self->add_perfdata(sprintf "threads_cached=%d;%d;%d", + $self->{threads_cached}, + $self->{warningrange}, $self->{criticalrange}); + } elsif ($params{mode} =~ /server::instance::abortedconnects/) { + $self->add_nagios( + $self->check_thresholds($self->{connects_aborted_per_sec}, 1, 5), + sprintf "%.2f aborted connections/sec", $self->{connects_aborted_per_sec}); + $self->add_perfdata(sprintf "connects_aborted_per_sec=%.2f;%.2f;%.2f", + $self->{connects_aborted_per_sec}, + $self->{warningrange}, $self->{criticalrange}); + } elsif ($params{mode} =~ /server::instance::abortedclients/) { + $self->add_nagios( + $self->check_thresholds($self->{clients_aborted_per_sec}, 1, 5), + sprintf "%.2f aborted (client died) connections/sec", $self->{clients_aborted_per_sec}); + $self->add_perfdata(sprintf "clients_aborted_per_sec=%.2f;%.2f;%.2f", + $self->{clients_aborted_per_sec}, + $self->{warningrange}, $self->{criticalrange}); } elsif ($params{mode} =~ /server::instance::threadcachehitrate/) { my $refkey = 'threadcache_hitrate'.($params{lookback} ? '_now' : ''); $self->add_nagios( @@ -776,7 +867,7 @@ sub nagios { $self->check_thresholds($self->{$refkey}, "1", "2"); $self->add_nagios_ok( sprintf "table lock contention %.2f%% (uptime < 10800)", - $self->{refkey}); + $self->{$refkey}); } $self->add_perfdata(sprintf "tablelock_contention=%.2f%%;%s;%s", $self->{table_lock_contention}, @@ -818,6 +909,16 @@ sub nagios { $self->{open_files}, $self->{open_files_limit} * $self->{warningrange} / 100, $self->{open_files_limit} * $self->{criticalrange} / 100); + } elsif ($params{mode} =~ /server::instance::needoptimize/) { + foreach (@{$self->{fragmented}}) { + $self->add_nagios( + $self->check_thresholds($_->[1], 10, 25), + sprintf "table %s is %.2f%% fragmented", $_->[0], $_->[1]); + if ($params{name}) { + $self->add_perfdata(sprintf "'%s_frag'=%.2f%%;%d;%d", + $_->[0], $_->[1], $self->{warningrange}, $self->{criticalrange}); + } + } } elsif ($params{mode} =~ /server::instance::myisam/) { $self->{engine_myisam}->nagios(%params); $self->merge_nagios($self->{engine_myisam}); @@ -879,6 +980,8 @@ sub new { timeout => $params{timeout}, warningrange => $params{warningrange}, criticalrange => $params{criticalrange}, + verbose => $params{verbose}, + report => $params{report}, version => 'unknown', instance => undef, handle => undef, @@ -905,17 +1008,30 @@ sub init { my %params = @_; $params{handle} = $self->{handle}; $params{uptime} = $self->{uptime}; + $self->set_global_db_thresholds(\%params); if ($params{mode} =~ /^server::instance/) { $self->{instance} = DBD::MySQL::Server::Instance->new(%params); } elsif ($params{mode} =~ /^server::sql/) { - $self->{genericsql} = $self->{handle}->fetchrow_array($params{selectname}); - if ($self->{genericsql} =~ /^\s*\d+\s*$/) { - $self->{genericsql} = sprintf "%d", $self->{genericsql}; - } elsif ($self->{genericsql} =~ /^\s*\d*\.\d+\s*$/) { - $self->{genericsql} = sprintf "%.2f", $self->{genericsql}; + $self->set_local_db_thresholds(%params); + if ($params{name2} && $params{name2} ne $params{name}) { + $self->{genericsql} = + $self->{handle}->fetchrow_array($params{selectname}); + if (! defined $self->{genericsql}) { + $self->add_nagios_unknown(sprintf "got no valid response for %s", + $params{selectname}); + } } else { - $self->add_nagios_unknown(sprintf "got no valid response for %s", - $params{selectname}); + @{$self->{genericsql}} = + $self->{handle}->fetchrow_array($params{selectname}); + if (! (defined $self->{genericsql} && + (scalar(grep { /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/ } @{$self->{genericsql}})) == + scalar(@{$self->{genericsql}}))) { + $self->add_nagios_unknown(sprintf "got no valid response for %s", + $params{selectname}); + } else { + # name2 in array + # units in array + } } } elsif ($params{mode} =~ /^server::uptime/) { # already set with the connection. but use minutes here @@ -1001,17 +1117,52 @@ sub nagios { $self->{connection_time}, $self->{warningrange}, $self->{criticalrange}); } elsif ($params{mode} =~ /^server::sql/) { - $self->add_nagios( - $self->check_thresholds($self->{genericsql}, 1, 5), - sprintf "%s: %s%s", - $params{name2} ? lc $params{name2} : lc $params{selectname}, - $self->{genericsql}, - $params{units} ? $params{units} : ""); - $self->add_perfdata(sprintf "\'%s\'=%s%s;%s;%s", - $params{name2} ? lc $params{name2} : lc $params{selectname}, - $self->{genericsql}, - $params{units} ? $params{units} : "", - $self->{warningrange}, $self->{criticalrange}); + if ($params{name2} && $params{name2} ne $params{name}) { + if ($params{regexp}) { + if ($self->{genericsql} =~ /$params{name2}/) { + $self->add_nagios_ok( + sprintf "output %s matches pattern %s", + $self->{genericsql}, $params{name2}); + } else { + $self->add_nagios_critical( + sprintf "output %s does not match pattern %s", + $self->{genericsql}, $params{name2}); + } + } else { + if ($self->{genericsql} eq $params{name2}) { + $self->add_nagios_ok( + sprintf "output %s found", $self->{genericsql}); + } else { + $self->add_nagios_critical( + sprintf "output %s not found", $self->{genericsql}); + } + } + } else { + $self->add_nagios( + # the first item in the list will trigger the threshold values + $self->check_thresholds($self->{genericsql}[0], 1, 5), + sprintf "%s: %s%s", + $params{name2} ? lc $params{name2} : lc $params{selectname}, + # float as float, integers as integers + join(" ", map { + (sprintf("%d", $_) eq $_) ? $_ : sprintf("%f", $_) + } @{$self->{genericsql}}), + $params{units} ? $params{units} : ""); + my $i = 0; + # workaround... getting the column names from the database would be nicer + my @names2_arr = split(/\s+/, $params{name2}); + foreach my $t (@{$self->{genericsql}}) { + $self->add_perfdata(sprintf "\'%s\'=%s%s;%s;%s", + $names2_arr[$i] ? lc $names2_arr[$i] : lc $params{selectname}, + # float as float, integers as integers + (sprintf("%d", $t) eq $t) ? $t : sprintf("%f", $t), + $params{units} ? $params{units} : "", + ($i == 0) ? $self->{warningrange} : "", + ($i == 0) ? $self->{criticalrange} : "" + ); + $i++; + } + } } elsif ($params{mode} =~ /^my::([^:.]+)/) { $self->{my}->nagios(%params); $self->merge_nagios($self->{my}); @@ -1134,34 +1285,134 @@ sub merge_nagios { push(@{$self->{nagios}->{perfdata}}, @{$child->{nagios}->{perfdata}}); } - sub calculate_result { my $self = shift; - if ($ENV{NRPE_MULTILINESUPPORT} && + my $multiline = 0; + map { + $self->{nagios_level} = $ERRORS{$_} if + (scalar(@{$self->{nagios}->{messages}->{$ERRORS{$_}}})); + } ("OK", "UNKNOWN", "WARNING", "CRITICAL"); + if ($ENV{NRPE_MULTILINESUPPORT} && length join(" ", @{$self->{nagios}->{perfdata}}) > 200) { - foreach my $level ("CRITICAL", "WARNING", "UNKNOWN", "OK") { - # first the bad news - if (scalar(@{$self->{nagios}->{messages}->{$ERRORS{$level}}})) { - $self->{nagios_message} .= - "\n".join("\n", @{$self->{nagios}->{messages}->{$ERRORS{$level}}}); + $multiline = 1; + } + my $all_messages = join(($multiline ? "\n" : ", "), map { + join(($multiline ? "\n" : ", "), @{$self->{nagios}->{messages}->{$ERRORS{$_}}}) + } grep { + scalar(@{$self->{nagios}->{messages}->{$ERRORS{$_}}}) + } ("CRITICAL", "WARNING", "UNKNOWN", "OK")); + my $bad_messages = join(($multiline ? "\n" : ", "), map { + join(($multiline ? "\n" : ", "), @{$self->{nagios}->{messages}->{$ERRORS{$_}}}) + } grep { + scalar(@{$self->{nagios}->{messages}->{$ERRORS{$_}}}) + } ("CRITICAL", "WARNING", "UNKNOWN")); + my $all_messages_short = $bad_messages ? $bad_messages : 'no problems'; + my $all_messages_html = "". + join("", map { + my $level = $_; + join("", map { + sprintf "", + $level, $_; + } @{$self->{nagios}->{messages}->{$ERRORS{$_}}}); + } grep { + scalar(@{$self->{nagios}->{messages}->{$ERRORS{$_}}}) + } ("CRITICAL", "WARNING", "UNKNOWN", "OK")). + "
%s
"; + if (exists $self->{identstring}) { + $self->{nagios_message} .= $self->{identstring}; + } + if ($self->{report} eq "long") { + $self->{nagios_message} .= $all_messages; + } elsif ($self->{report} eq "short") { + $self->{nagios_message} .= $all_messages_short; + } elsif ($self->{report} eq "html") { + $self->{nagios_message} .= $all_messages_short."\n".$all_messages_html; + } + $self->{perfdata} = join(" ", @{$self->{nagios}->{perfdata}}); +} + +sub set_global_db_thresholds { + my $self = shift; + my $params = shift; + my $warning = undef; + my $critical = undef; + return unless defined $params->{dbthresholds}; + $params->{name0} = $params->{dbthresholds}; + # :pluginmode :name :warning :critical + # mode empty + # + eval { + if ($self->{handle}->fetchrow_array(q{ + SELECT table_name + FROM information_schema.tables + WHERE table_schema = ? + AND table_name = 'CHECK_MYSQL_HEALTH_THRESHOLDS'; + }, $self->{database})) { # either --database... or information_schema + my @dbthresholds = $self->{handle}->fetchall_array(q{ + SELECT * FROM check_mysql_health_thresholds + }); + $params->{dbthresholds} = \@dbthresholds; + foreach (@dbthresholds) { + if (($_->[0] eq $params->{cmdlinemode}) && + (! defined $_->[1] || ! $_->[1])) { + ($warning, $critical) = ($_->[2], $_->[3]); + } } } - $self->{nagios_message} =~ s/^\n//g; - $self->{perfdata} = join("\n", @{$self->{nagios}->{perfdata}}); - } else { - foreach my $level ("CRITICAL", "WARNING", "UNKNOWN", "OK") { - # first the bad news - if (scalar(@{$self->{nagios}->{messages}->{$ERRORS{$level}}})) { - $self->{nagios_message} .= - join(", ", @{$self->{nagios}->{messages}->{$ERRORS{$level}}}).", "; - } + }; + if (! $@) { + if ($warning) { + $params->{warningrange} = $warning; + $self->trace("read warningthreshold %s from database", $warning); + } + if ($critical) { + $params->{criticalrange} = $critical; + $self->trace("read criticalthreshold %s from database", $critical); } - $self->{nagios_message} =~ s/, $//g; - $self->{perfdata} = join(" ", @{$self->{nagios}->{perfdata}}); } - foreach my $level ("OK", "UNKNOWN", "WARNING", "CRITICAL") { - if (scalar(@{$self->{nagios}->{messages}->{$ERRORS{$level}}})) { - $self->{nagios_level} = $ERRORS{$level}; +} + +sub set_local_db_thresholds { + my $self = shift; + my %params = @_; + my $warning = undef; + my $critical = undef; + # :pluginmode :name :warning :critical + # mode name0 + # mode name2 + # mode name + # + # first: argument of --dbthresholds, it it exists + # second: --name2 + # third: --name + if (ref($params{dbthresholds}) eq 'ARRAY') { + my $marker; + foreach (@{$params{dbthresholds}}) { + if ($_->[0] eq $params{cmdlinemode}) { + if (defined $_->[1] && $params{name0} && $_->[1] eq $params{name0}) { + ($warning, $critical) = ($_->[2], $_->[3]); + $marker = $params{name0}; + last; + } elsif (defined $_->[1] && $params{name2} && $_->[1] eq $params{name2}) { + ($warning, $critical) = ($_->[2], $_->[3]); + $marker = $params{name2}; + last; + } elsif (defined $_->[1] && $params{name} && $_->[1] eq $params{name}) { + ($warning, $critical) = ($_->[2], $_->[3]); + $marker = $params{name}; + last; + } + } + } + if ($warning) { + $self->{warningrange} = $warning; + $self->trace("read warningthreshold %s for %s from database", + $marker, $warning); + } + if ($critical) { + $self->{criticalrange} = $critical; + $self->trace("read criticalthreshold %s for %s from database", + $marker, $critical); } } } @@ -2871,7 +3122,7 @@ use lib dirname($0); use vars qw ($PROGNAME $REVISION $CONTACT $TIMEOUT $STATEFILESDIR $needs_restart %commandline); $PROGNAME = "check_mysql_health"; -$REVISION = '$Revision: 2.1.3 $'; +$REVISION = '$Revision: 2.1.5 $'; $CONTACT = 'gerhard.lausser@consol.de'; $TIMEOUT = 60; $STATEFILESDIR = '/var/run'; @@ -2890,6 +3141,21 @@ my @modes = ( ['server::instance::threadcachehitrate', 'threadcache-hitrate', undef, 'Hit rate of the thread-cache' ], + ['server::instance::createdthreads', + 'threads-created', undef, + 'Number of threads created per sec' ], + ['server::instance::runningthreads', + 'threads-running', undef, + 'Number of currently running threads' ], + ['server::instance::cachedthreads', + 'threads-cached', undef, + 'Number of currently cached threads' ], + ['server::instance::abortedconnects', + 'connects-aborted', undef, + 'Number of aborted connections per sec' ], + ['server::instance::abortedclients', + 'clients-aborted', undef, + 'Number of aborted connections (because the client died) per sec' ], ['server::instance::replication::slavelag', 'slave-lag', ['replication-slave-lag'], 'Seconds behind master' ], @@ -2929,6 +3195,9 @@ my @modes = ( ['server::instance::tabletmpondisk', 'tmp-disk-tables', undef, 'Percent of temp tables created on disk' ], + ['server::instance::needoptimize', + 'table-fragmentation', undef, + 'Show tables which should be optimized' ], ['server::instance::openfiles', 'open-files', undef, 'Percent of opened files' ], @@ -3076,6 +3345,7 @@ my @params = ( "perfdata", "warning=s", "critical=s", + "dbthresholds:s", "absolute|a", "environment|e=s%", "method=s", @@ -3088,6 +3358,7 @@ my @params = ( "lookback=i", "3", "with-mymodules-dyn-dir=s", + "report=s", "extra-opts:s"); if (! GetOptions(\%commandline, @params)) { @@ -3151,11 +3422,16 @@ if (exists $commandline{method}) { $commandline{method} = "dbi"; } +if (exists $commandline{report}) { + # short, long, html +} else { + $commandline{report} = "long"; +} + if (exists $commandline{'with-mymodules-dyn-dir'}) { - $DBD::MYSQL::Server::my_modules_dyn_dir = $commandline{'with-mymodules-dyn-dir -'}; + $DBD::MySQL::Server::my_modules_dyn_dir = $commandline{'with-mymodules-dyn-dir'}; } else { - $DBD::MYSQL::Server::my_modules_dyn_dir = '/usr/local/nagios/libexec'; + $DBD::MySQL::Server::my_modules_dyn_dir = '/usr/local/nagios/libexec'; } if (exists $commandline{environment}) { @@ -3267,16 +3543,16 @@ if ($commandline{mode} =~ /^my-([^\-.]+)/) { exit 3; } -$commandline{mode} = ( - map { $_->[0] } - grep { - ($commandline{mode} eq $_->[1]) || - ( defined $_->[2] && grep { $commandline{mode} eq $_ } @{$_->[2]}) - } @modes -)[0]; my %params = ( timeout => $TIMEOUT, - mode => $commandline{mode}, + mode => ( + map { $_->[0] } + grep { + ($commandline{mode} eq $_->[1]) || + ( defined $_->[2] && grep { $commandline{mode} eq $_ } @{$_->[2]}) + } @modes + )[0], + cmdlinemode => $commandline{mode}, method => $commandline{method} || $ENV{NAGIOS__SERVICEMYSQL_METH} || $ENV{NAGIOS__HOSTMYSQL_METH} || 'dbi', @@ -3300,6 +3576,7 @@ my %params = ( $ENV{NAGIOS__HOSTMYSQL_PASS}, warningrange => $commandline{warning}, criticalrange => $commandline{critical}, + dbthresholds => $commandline{dbthresholds}, absolute => $commandline{absolute}, lookback => $commandline{lookback}, selectname => $commandline{name} || $commandline{tablespace} || $commandline{datafile}, @@ -3310,6 +3587,8 @@ my %params = ( lookback => $commandline{lookback} || 0, eyecandy => $commandline{eyecandy}, statefilesdir => $STATEFILESDIR, + verbose => $commandline{verbose}, + report => $commandline{report}, ); my $server = undef; -- cgit v1.2.3 From 4827958dda15705ac1eeb5eacc7e694a92bb7a5d Mon Sep 17 00:00:00 2001 From: Micah Anderson Date: Thu, 28 Apr 2011 17:43:49 -0400 Subject: add configuration variable to irc bot to enable IRC notice type messages which can be turned on by the puppet variable $nagios_nsa_usenotices --- files/irc_bot/riseup-nagios-server.pl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 7880dde..b69ecab 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -101,7 +101,11 @@ sub socket_has_data { my $self = shift; $self->{socket}->recv(my $data, 1024); - $self->{conn}->privmsg($CFG::Nsa{'channel'}, $data); + if ($CFG::Nsa{'usenotices'} { + $self->{conn}->notice($CFG::Nsa{'channel'}, $data); + } else { + $self->{conn}->privmsg($CFG::Nsa{'channel'}, $data); + } } sub irc_on_connect { -- cgit v1.2.3 From b046f0126308d2fd6efe8a03345b4985af91bff6 Mon Sep 17 00:00:00 2001 From: Micah Anderson Date: Thu, 28 Apr 2011 19:30:05 -0400 Subject: fix syntax error from previous commit --- files/irc_bot/riseup-nagios-server.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index b69ecab..7180758 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -101,7 +101,7 @@ sub socket_has_data { my $self = shift; $self->{socket}->recv(my $data, 1024); - if ($CFG::Nsa{'usenotices'} { + if ($CFG::Nsa{'usenotices'}) { $self->{conn}->notice($CFG::Nsa{'channel'}, $data); } else { $self->{conn}->privmsg($CFG::Nsa{'channel'}, $data); -- cgit v1.2.3 From c0c1cb62d39b2353b338499098a26cd02424a9f3 Mon Sep 17 00:00:00 2001 From: Micah Anderson Date: Thu, 8 Dec 2011 16:39:10 -0500 Subject: update check_mysql_health plugin to newer version --- files/plugins/check_mysql_health | 229 +++++++++++++++++++++++++++++++++------ 1 file changed, 194 insertions(+), 35 deletions(-) (limited to 'files') diff --git a/files/plugins/check_mysql_health b/files/plugins/check_mysql_health index 402af55..9292ae0 100755 --- a/files/plugins/check_mysql_health +++ b/files/plugins/check_mysql_health @@ -61,6 +61,7 @@ sub new { bufferpool_hitrate => undef, wait_free => undef, log_waits => undef, + have_innodb => undef, warningrange => $params{warningrange}, criticalrange => $params{criticalrange}, }; @@ -76,7 +77,15 @@ sub init { my $dummy; $self->debug("enter init"); $self->init_nagios(); - if ($params{mode} =~ /server::instance::innodb::bufferpool::hitrate/) { + ($dummy, $self->{have_innodb}) + = $self->{handle}->fetchrow_array(q{ + SHOW VARIABLES LIKE 'have_innodb' + }); + if ($self->{have_innodb} eq "NO") { + $self->add_nagios_critical("the innodb engine has a problem (have_innodb=no)"); + } elsif ($self->{have_innodb} eq "DISABLED") { + # add_nagios_ok later + } elsif ($params{mode} =~ /server::instance::innodb::bufferpool::hitrate/) { ($dummy, $self->{bufferpool_reads}) = $self->{handle}->fetchrow_array(q{ SHOW /*!50000 global */ STATUS LIKE 'Innodb_buffer_pool_reads' @@ -139,7 +148,9 @@ sub nagios { my $self = shift; my %params = @_; my $now = $params{lookback} ? '_now' : ''; - if (! $self->{nagios_level}) { + if ($self->{have_innodb} eq "DISABLED") { + $self->add_nagios_ok("the innodb engine has been disabled"); + } elsif (! $self->{nagios_level}) { if ($params{mode} =~ /server::instance::innodb::bufferpool::hitrate/) { my $refkey = 'bufferpool_hitrate'.($params{lookback} ? '_now' : ''); $self->add_nagios( @@ -982,6 +993,7 @@ sub new { criticalrange => $params{criticalrange}, verbose => $params{verbose}, report => $params{report}, + labelformat => $params{labelformat}, version => 'unknown', instance => undef, handle => undef, @@ -1013,18 +1025,24 @@ sub init { $self->{instance} = DBD::MySQL::Server::Instance->new(%params); } elsif ($params{mode} =~ /^server::sql/) { $self->set_local_db_thresholds(%params); - if ($params{name2} && $params{name2} ne $params{name}) { - $self->{genericsql} = - $self->{handle}->fetchrow_array($params{selectname}); - if (! defined $self->{genericsql}) { - $self->add_nagios_unknown(sprintf "got no valid response for %s", - $params{selectname}); + if ($params{regexp}) { + # sql output is treated as text + if ($params{name2} eq $params{name}) { + $self->add_nagios_unknown(sprintf "where's the regexp????"); + } else { + $self->{genericsql} = + $self->{handle}->fetchrow_array($params{selectname}); + if (! defined $self->{genericsql}) { + $self->add_nagios_unknown(sprintf "got no valid response for %s", + $params{selectname}); + } } } else { + # sql output must be a number (or array of numbers) @{$self->{genericsql}} = $self->{handle}->fetchrow_array($params{selectname}); if (! (defined $self->{genericsql} && - (scalar(grep { /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/ } @{$self->{genericsql}})) == + (scalar(grep { /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/ } @{$self->{genericsql}})) == scalar(@{$self->{genericsql}}))) { $self->add_nagios_unknown(sprintf "got no valid response for %s", $params{selectname}); @@ -1117,24 +1135,27 @@ sub nagios { $self->{connection_time}, $self->{warningrange}, $self->{criticalrange}); } elsif ($params{mode} =~ /^server::sql/) { - if ($params{name2} && $params{name2} ne $params{name}) { - if ($params{regexp}) { - if ($self->{genericsql} =~ /$params{name2}/) { + if ($params{regexp}) { + if (substr($params{name2}, 0, 1) eq '!') { + $params{name2} =~ s/^!//; + if ($self->{genericsql} !~ /$params{name2}/) { $self->add_nagios_ok( - sprintf "output %s matches pattern %s", + sprintf "output %s does not match pattern %s", $self->{genericsql}, $params{name2}); } else { $self->add_nagios_critical( - sprintf "output %s does not match pattern %s", + sprintf "output %s matches pattern %s", $self->{genericsql}, $params{name2}); } } else { - if ($self->{genericsql} eq $params{name2}) { + if ($self->{genericsql} =~ /$params{name2}/) { $self->add_nagios_ok( - sprintf "output %s found", $self->{genericsql}); + sprintf "output %s matches pattern %s", + $self->{genericsql}, $params{name2}); } else { $self->add_nagios_critical( - sprintf "output %s not found", $self->{genericsql}); + sprintf "output %s does not match pattern %s", + $self->{genericsql}, $params{name2}); } } } else { @@ -1287,6 +1308,7 @@ sub merge_nagios { sub calculate_result { my $self = shift; + my $labels = shift || {}; my $multiline = 0; map { $self->{nagios_level} = $ERRORS{$_} if @@ -1328,7 +1350,25 @@ sub calculate_result { } elsif ($self->{report} eq "html") { $self->{nagios_message} .= $all_messages_short."\n".$all_messages_html; } - $self->{perfdata} = join(" ", @{$self->{nagios}->{perfdata}}); + if ($self->{labelformat} eq "pnp4nagios") { + $self->{perfdata} = join(" ", @{$self->{nagios}->{perfdata}}); + } else { + $self->{perfdata} = join(" ", map { + my $perfdata = $_; + if ($perfdata =~ /^(.*?)=(.*)/) { + my $label = $1; + my $data = $2; + if (exists $labels->{$label} && + exists $labels->{$label}->{$self->{labelformat}}) { + $labels->{$label}->{$self->{labelformat}}."=".$data; + } else { + $perfdata; + } + } else { + $perfdata; + } + } @{$self->{nagios}->{perfdata}}); + } } sub set_global_db_thresholds { @@ -1497,9 +1537,30 @@ sub save_state { my $self = shift; my %params = @_; my $extension = ""; - mkdir $params{statefilesdir} unless -d $params{statefilesdir}; - my $statefile = sprintf "%s/%s_%s", - $params{statefilesdir}, $params{hostname}, $params{mode}; + my $mode = $params{mode}; + if ($params{connect} && $params{connect} =~ /(\w+)\/(\w+)@(\w+)/) { + $params{connect} = $3; + } elsif ($params{connect}) { + # just to be sure + $params{connect} =~ s/\//_/g; + } + if ($^O =~ /MSWin/) { + $mode =~ s/::/_/g; + $params{statefilesdir} = $self->system_vartmpdir(); + } + if (! -d $params{statefilesdir}) { + eval { + use File::Path; + mkpath $params{statefilesdir}; + }; + } + if ($@ || ! -w $params{statefilesdir}) { + $self->add_nagios($ERRORS{CRITICAL}, + sprintf "statefilesdir %s does not exist or is not writable\n", + $params{statefilesdir}); + return; + } + my $statefile = sprintf "%s_%s", $params{hostname}, $mode; $extension .= $params{differenciator} ? "_".$params{differenciator} : ""; $extension .= $params{socket} ? "_".$params{socket} : ""; $extension .= $params{port} ? "_".$params{port} : ""; @@ -1514,12 +1575,17 @@ sub save_state { $extension =~ s/\s/_/g; $statefile .= $extension; $statefile = lc $statefile; - open(STATE, ">$statefile"); - if ((ref($params{save}) eq "HASH") && exists $params{save}->{timestamp}) { - $params{save}->{localtime} = scalar localtime $params{save}->{timestamp}; + $statefile = sprintf "%s/%s", $params{statefilesdir}, $statefile; + if (open(STATE, ">$statefile")) { + if ((ref($params{save}) eq "HASH") && exists $params{save}->{timestamp}) { + $params{save}->{localtime} = scalar localtime $params{save}->{timestamp}; + } + printf STATE Data::Dumper::Dumper($params{save}); + close STATE; + } else { + $self->add_nagios($ERRORS{CRITICAL}, + sprintf "statefile %s is not writable", $statefile); } - printf STATE Data::Dumper::Dumper($params{save}); - close STATE; $self->debug(sprintf "saved %s to %s", Data::Dumper::Dumper($params{save}), $statefile); } @@ -1528,8 +1594,18 @@ sub load_state { my $self = shift; my %params = @_; my $extension = ""; - my $statefile = sprintf "%s/%s_%s", - $params{statefilesdir}, $params{hostname}, $params{mode}; + my $mode = $params{mode}; + if ($params{connect} && $params{connect} =~ /(\w+)\/(\w+)@(\w+)/) { + $params{connect} = $3; + } elsif ($params{connect}) { + # just to be sure + $params{connect} =~ s/\//_/g; + } + if ($^O =~ /MSWin/) { + $mode =~ s/::/_/g; + $params{statefilesdir} = $self->system_vartmpdir(); + } + my $statefile = sprintf "%s_%s", $params{hostname}, $mode; $extension .= $params{differenciator} ? "_".$params{differenciator} : ""; $extension .= $params{socket} ? "_".$params{socket} : ""; $extension .= $params{port} ? "_".$params{port} : ""; @@ -1544,13 +1620,15 @@ sub load_state { $extension =~ s/\s/_/g; $statefile .= $extension; $statefile = lc $statefile; + $statefile = sprintf "%s/%s", $params{statefilesdir}, $statefile; if ( -f $statefile) { our $VAR1; eval { require $statefile; }; if($@) { -printf "rumms\n"; + $self->add_nagios($ERRORS{CRITICAL}, + sprintf "statefile %s is corrupt", $statefile); } $self->debug(sprintf "load %s", Data::Dumper::Dumper($VAR1)); return $VAR1; @@ -3076,7 +3154,7 @@ sub init { foreach my $line (split(/\n/, $data)) { if ($line =~ /\[(.*)\]/) { $in_section = $1; - } elsif ($line =~ /(.*)=(.*)/) { + } elsif ($line =~ /(.*?)\s*=\s*(.*)/) { $self->{config}->{$in_section}->{$1} = $2; } } @@ -3122,10 +3200,10 @@ use lib dirname($0); use vars qw ($PROGNAME $REVISION $CONTACT $TIMEOUT $STATEFILESDIR $needs_restart %commandline); $PROGNAME = "check_mysql_health"; -$REVISION = '$Revision: 2.1.5 $'; +$REVISION = '$Revision: 2.1.7 $'; $CONTACT = 'gerhard.lausser@consol.de'; $TIMEOUT = 60; -$STATEFILESDIR = '/var/run'; +$STATEFILESDIR = '/var/tmp/check_mysql_health'; $needs_restart = 0; my @modes = ( @@ -3215,6 +3293,67 @@ my @modes = ( 'any sql command returning a single number' ], ); +# rrd data store names are limited to 19 characters +my %labels = ( + bufferpool_hitrate => { + groundwork => 'bp_hitrate', + }, + bufferpool_hitrate_now => { + groundwork => 'bp_hitrate_now', + }, + bufferpool_free_waits_rate => { + groundwork => 'bp_freewaits', + }, + innodb_log_waits_rate => { + groundwork => 'inno_log_waits', + }, + keycache_hitrate => { + groundwork => 'kc_hitrate', + }, + keycache_hitrate_now => { + groundwork => 'kc_hitrate_now', + }, + threads_created_per_sec => { + groundwork => 'thrds_creat_per_s', + }, + connects_aborted_per_sec => { + groundwork => 'conn_abrt_per_s', + }, + clients_aborted_per_sec => { + groundwork => 'clnt_abrt_per_s', + }, + thread_cache_hitrate => { + groundwork => 'tc_hitrate', + }, + thread_cache_hitrate_now => { + groundwork => 'tc_hitrate_now', + }, + qcache_lowmem_prunes_rate => { + groundwork => 'qc_lowm_prnsrate', + }, + slow_queries_rate => { + groundwork => 'slow_q_rate', + }, + tablecache_hitrate => { + groundwork => 'tac_hitrate', + }, + tablecache_fillrate => { + groundwork => 'tac_fillrate', + }, + tablelock_contention => { + groundwork => 'tl_contention', + }, + tablelock_contention_now => { + groundwork => 'tl_contention_now', + }, + pct_tmp_table_on_disk => { + groundwork => 'tmptab_on_disk', + }, + pct_tmp_table_on_disk_now => { + groundwork => 'tmptab_on_disk_now', + }, +); + sub print_usage () { print < $commandline{units}, lookback => $commandline{lookback} || 0, eyecandy => $commandline{eyecandy}, - statefilesdir => $STATEFILESDIR, + statefilesdir => $commandline{statefilesdir}, verbose => $commandline{verbose}, report => $commandline{report}, + labelformat => $commandline{labelformat}, ); my $server = undef; @@ -3597,14 +3756,14 @@ my $cluster = undef; if ($params{mode} =~ /^(server|my)/) { $server = DBD::MySQL::Server->new(%params); $server->nagios(%params); - $server->calculate_result(); + $server->calculate_result(\%labels); $nagios_message = $server->{nagios_message}; $nagios_level = $server->{nagios_level}; $perfdata = $server->{perfdata}; } elsif ($params{mode} =~ /^cluster/) { $cluster = DBD::MySQL::Cluster->new(%params); $cluster->nagios(%params); - $cluster->calculate_result(); + $cluster->calculate_result(\%labels); $nagios_message = $cluster->{nagios_message}; $nagios_level = $cluster->{nagios_level}; $perfdata = $cluster->{perfdata}; -- cgit v1.2.3 From ceb6233f66f90cd90e4d26afaca180dfb183e77a Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 27 Feb 2012 01:28:19 -0500 Subject: add ack functionality --- files/irc_bot/riseup-nagios-server.pl | 70 ++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 7180758..89a4c35 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -56,7 +56,8 @@ sub new { my $self = { socket => undef, irc => undef, - conn => undef + conn => undef, + commandfile => undef, }; return bless($self, __PACKAGE__); @@ -115,6 +116,70 @@ sub irc_on_connect { $self->join($CFG::Nsa{'channel'}); } +sub irc_on_msg { + my ($self, $event) = @_; + my $data = join(' ', $event->args); + #my $nick = quotemeta($nicks[$nick]); + my $to = $event->to; + #my $channel = &toToChannel($self, @$to); + #my $cmdChar = $commandChar{default}; # FIXME: should look up for CURRENT channel first! + #if ( exists $commandChar{$channel} ) { $cmdChar = $commandChar{$channel}; } + my $msg = parse_msg($event); + if (defined($msg)) { + $self->privmsg($event->nick, "alright, sending this message to nagios, hope it figures it out: $msg"); + } else { + $self->privmsg($event->nick, "can't parse $data, you want 'ack host service comment'\n"); + } +} + +sub irc_on_public { + my ($self, $event) = @_; + my $data = join(' ', $event->args); + my $to = $event->to; + if ($data =~ s/([^:]*):\s+//) { + if ($1 eq $CFG::Nsa{'nickname'}) { + my $msg = parse_msg($event); + if (defined($msg)) { + $self->privmsg($event->to, "alright, sending this message to nagios, hope it figures it out: $msg"); + } else { + $self->privmsg($event->to, "can't parse $data, you want 'ack host service comment'\n"); + } + } else { + #print STDERR "ignoring message $data, not for me (me being $1)\n"; + } + } else { + #print STDERR "ignoring message $data\n"; + } +} + +sub parse_msg { + my $event= shift; + my $data = join(' ', $event->args); + my $msg; + if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+(\w+)(?:\s+(\w+))?)?/) { + print STDERR "writing to nagios scoket ". $CFG::Nsa{'nagios_socket'} . "\n"; + open(my $cmdfile, ">", $CFG::Nsa{'nagios_socket'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'nagios_socket'}!\n"; + my $host = $2; + my ($service, $comment) = (undef, ""); + if ($4) { + $service = $3; + $comment = $4; + } elsif ($3) { + $service = $3; + } + my $user = $event->nick; + $msg = '[' . time() . '] '; + if (defined($service)) { + $msg .= "ACKNOWLEDGE_SVC_PROBLEM;$host;$service;1;1;1;$user;$comment\n"; + } else { + $msg .= "ACKNOWLEDGE_HOST_PROBLEM;$host;1;1;1;$user;$comment\n"; + } + print {$cmdfile} $msg; + close($cmdfile); + } + return $msg; +} + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - my $bot = &new; @@ -145,6 +210,9 @@ $bot->{conn} = $bot->{irc}->newconn ( $bot->{conn}->add_global_handler(376, \&irc_on_connect); $bot->{conn}->add_global_handler('nomotd', \&irc_on_connect); +$bot->{conn}->add_global_handler('msg', \&irc_on_msg); +$bot->{conn}->add_global_handler('public', \&irc_on_public); +#$bot->{conn}->add_global_handler('notice', \&irc_on_msg); $bot->{irc}->addfh($bot->{socket}, \&socket_has_data, 'r', $bot); while ($running) { -- cgit v1.2.3 From f56b96b55ce609df4a950f203bf2635906741ed8 Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 27 Feb 2012 01:29:12 -0500 Subject: note that this bot needs to be ported to the new framework --- files/irc_bot/riseup-nagios-server.pl | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 89a4c35..9fbc8c5 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -4,6 +4,14 @@ # a simple IRC bot which dispatches messages received via local domain sockets # ############################################################################## + +###### +## THIS NEEDS TO BE PORTED TO THE NEW FRAMEWORKS! +## +## STICKY POINTS: the addfh() function doesn't exist in BasicBot or POE::Component::IRC +## +## people suggested we use Anyevent::IRC and POE::Kernel ->select_read and POE::Wheel namespace + use strict; use File::Basename; -- cgit v1.2.3 From cf6462a91be41d325711d5ebdb910ff95202dac7 Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 27 Feb 2012 01:37:14 -0500 Subject: add commandfile path to configuration Conflicts: templates/irc_bot/nsa.cfg.erb --- files/irc_bot/riseup-nagios-server.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 9fbc8c5..04e3054 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -165,8 +165,8 @@ sub parse_msg { my $data = join(' ', $event->args); my $msg; if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+(\w+)(?:\s+(\w+))?)?/) { - print STDERR "writing to nagios scoket ". $CFG::Nsa{'nagios_socket'} . "\n"; - open(my $cmdfile, ">", $CFG::Nsa{'nagios_socket'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'nagios_socket'}!\n"; + print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; + open(my $cmdfile, ">", $CFG::Nsa{'commandfile'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'commandfile'}!\n"; my $host = $2; my ($service, $comment) = (undef, ""); if ($4) { -- cgit v1.2.3 From 974fc1015a39a618352317933de14c36c3fe3a41 Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 27 Feb 2012 01:49:24 -0500 Subject: add reference for good material i found --- files/irc_bot/riseup-nagios-server.pl | 2 ++ 1 file changed, 2 insertions(+) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 04e3054..4ccec47 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -11,6 +11,8 @@ ## STICKY POINTS: the addfh() function doesn't exist in BasicBot or POE::Component::IRC ## ## people suggested we use Anyevent::IRC and POE::Kernel ->select_read and POE::Wheel namespace +## +## in the meantime, inspiration for extensions can be found here: http://svn.foswiki.org/trunk/WikiBot/mozbot.pl use strict; use File::Basename; -- cgit v1.2.3 From 7610f67b70f1ae78f6e7bcf73769de4615d61d15 Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 27 Feb 2012 11:13:11 -0500 Subject: always add a comment, allow spaces in comments --- files/irc_bot/riseup-nagios-server.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 4ccec47..92d0114 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -166,11 +166,11 @@ sub parse_msg { my $event= shift; my $data = join(' ', $event->args); my $msg; - if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+(\w+)(?:\s+(\w+))?)?/) { + if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+(\w+)(?:\s+([\w\s]+))?)?/) { print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; open(my $cmdfile, ">", $CFG::Nsa{'commandfile'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'commandfile'}!\n"; my $host = $2; - my ($service, $comment) = (undef, ""); + my ($service, $comment) = (undef, "no comment"); if ($4) { $service = $3; $comment = $4; -- cgit v1.2.3 From 967e9dd3a09697afc7a2fb84f193d5c89bf6c1fe Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 27 Feb 2012 11:13:37 -0500 Subject: remove debugging message --- files/irc_bot/riseup-nagios-server.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 92d0114..c1a1e0d 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -167,7 +167,7 @@ sub parse_msg { my $data = join(' ', $event->args); my $msg; if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+(\w+)(?:\s+([\w\s]+))?)?/) { - print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; + #print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; open(my $cmdfile, ">", $CFG::Nsa{'commandfile'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'commandfile'}!\n"; my $host = $2; my ($service, $comment) = (undef, "no comment"); -- cgit v1.2.3 From 2e732d4a7f7288c2c89f79621391ddf43311028d Mon Sep 17 00:00:00 2001 From: root Date: Mon, 27 Feb 2012 17:16:12 -0500 Subject: accept dots in services --- files/irc_bot/riseup-nagios-server.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index c1a1e0d..faa0eee 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -166,7 +166,7 @@ sub parse_msg { my $event= shift; my $data = join(' ', $event->args); my $msg; - if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+(\w+)(?:\s+([\w\s]+))?)?/) { + if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+([\w\.]+)(?:\s+([\w\s]+))?)?/) { #print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; open(my $cmdfile, ">", $CFG::Nsa{'commandfile'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'commandfile'}!\n"; my $host = $2; -- cgit v1.2.3 From 4211e9f9a994f1b19b76eeb9d7037204f7dfc996 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 27 Feb 2012 17:16:35 -0500 Subject: be silent when we send stuff to nagios, it will answer back --- files/irc_bot/riseup-nagios-server.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index faa0eee..2bf5130 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -136,7 +136,7 @@ sub irc_on_msg { #if ( exists $commandChar{$channel} ) { $cmdChar = $commandChar{$channel}; } my $msg = parse_msg($event); if (defined($msg)) { - $self->privmsg($event->nick, "alright, sending this message to nagios, hope it figures it out: $msg"); + #$self->privmsg($event->nick, "alright, sending this message to nagios, hope it figures it out: $msg"); } else { $self->privmsg($event->nick, "can't parse $data, you want 'ack host service comment'\n"); } @@ -150,7 +150,7 @@ sub irc_on_public { if ($1 eq $CFG::Nsa{'nickname'}) { my $msg = parse_msg($event); if (defined($msg)) { - $self->privmsg($event->to, "alright, sending this message to nagios, hope it figures it out: $msg"); + #$self->privmsg($event->to, "alright, sending this message to nagios, hope it figures it out: $msg"); } else { $self->privmsg($event->to, "can't parse $data, you want 'ack host service comment'\n"); } -- cgit v1.2.3 From 16e168b9a670b117c4093558603bf5dc63ca42ba Mon Sep 17 00:00:00 2001 From: root Date: Mon, 27 Feb 2012 17:17:13 -0500 Subject: make default comment mention irc --- files/irc_bot/riseup-nagios-server.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index 2bf5130..a7bad28 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -170,7 +170,7 @@ sub parse_msg { #print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; open(my $cmdfile, ">", $CFG::Nsa{'commandfile'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'commandfile'}!\n"; my $host = $2; - my ($service, $comment) = (undef, "no comment"); + my ($service, $comment) = (undef, "no comment (from irc)"); if ($4) { $service = $3; $comment = $4; -- cgit v1.2.3 From e00811faa08243267fbefc5d0133facbe5f0086f Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Mon, 5 Mar 2012 11:56:25 -0500 Subject: allow dashes in service names --- files/irc_bot/riseup-nagios-server.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'files') diff --git a/files/irc_bot/riseup-nagios-server.pl b/files/irc_bot/riseup-nagios-server.pl index a7bad28..5d65e6d 100644 --- a/files/irc_bot/riseup-nagios-server.pl +++ b/files/irc_bot/riseup-nagios-server.pl @@ -166,7 +166,7 @@ sub parse_msg { my $event= shift; my $data = join(' ', $event->args); my $msg; - if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+([\w\.]+)(?:\s+([\w\s]+))?)?/) { + if ($data =~ m/([^:]*:)?\s*ack(?:knowledge)?\s+([a-zA-Z0-9\-\.]+)(?:\s+([-\w\.]+)(?:\s+([\w\s]+))?)?/) { #print STDERR "writing to nagios scoket ". $CFG::Nsa{'commandfile'} . "\n"; open(my $cmdfile, ">", $CFG::Nsa{'commandfile'}) || die "Can't open Nagios commandfile: $CFG::Nsa{'commandfile'}!\n"; my $host = $2; -- cgit v1.2.3