diff --git a/network/stonesoft/mode/clusterload.pm b/network/stonesoft/mode/clusterload.pm new file mode 100644 index 000000000..95702bc33 --- /dev/null +++ b/network/stonesoft/mode/clusterload.pm @@ -0,0 +1,111 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::clusterload; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + my $oid_nodeCPULoad = '.1.3.6.1.4.1.1369.6.1.1.4.0'; + my $result = $self->{snmp}->get_leef(oids => [$oid_nodeCPULoad], nothing_quit => 1); + + my $cpuLoad = $result->{$oid_nodeCPULoad}; + + my $exit = $self->{perfdata}->threshold_check(value => $cpuLoad, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Node CPU Load %d %%", + $cpuLoad)); + + $self->{output}->perfdata_add(label => 'cpuload', unit => '%', + value => sprintf("%d", $cpuLoad), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + min => 0, max => 100); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check load of cluster in percent. + +=over 8 + +=back + +=cut + diff --git a/network/stonesoft/mode/clusterstate.pm b/network/stonesoft/mode/clusterstate.pm new file mode 100644 index 000000000..b19d83593 --- /dev/null +++ b/network/stonesoft/mode/clusterstate.pm @@ -0,0 +1,106 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::clusterstate; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %oper_state = ( + 0 => ['unknown', 'UNKNOWN'], + 1 => ['online', 'OK'], + 2 => ['goingOnline', 'WARNING'], + 3 => ['lockedOnline', 'WARNING'], + 4 => ['goingLockedOnline', 'WARNING'], + 5 => ['offline', 'CRITICAL'], + 6 => ['goingOffline', 'CRITICAL'], + 7 => ['lockedOffline', 'CRITICAL'], + 8 => ['goingLockedOffline', 'CRITICAL'], + 9 => ['standby', 'CRITICAL'], + 10 => ['goingStandby', 'CRITICAL'], +); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + my $oid_nodeMemberId = '.1.3.6.1.4.1.1369.6.1.1.2.0'; + my $oid_nodeOperState = '.1.3.6.1.4.1.1369.6.1.1.3.0'; + my $result = $self->{snmp}->get_leef(oids => [$oid_nodeMemberId, $oid_nodeOperState], nothing_quit => 1); + + $self->{output}->output_add(severity => ${$oper_state{$result->{$oid_nodeOperState}}}[1], + short_msg => sprintf("Node status is '%s' [Member id : %s]", + ${$oper_state{$result->{$oid_nodeOperState}}}[0], + $result->{$oid_nodeMemberId})); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check status of clustered node. + +=over 8 + +=back + +=cut + diff --git a/network/stonesoft/mode/cpu.pm b/network/stonesoft/mode/cpu.pm new file mode 100644 index 000000000..ae2e8a24e --- /dev/null +++ b/network/stonesoft/mode/cpu.pm @@ -0,0 +1,130 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::cpu; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning', }, + "critical:s" => { name => 'critical', }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + my $oid_cputable = '.1.3.6.1.4.1.1369.5.2.1.11.1.1.3'; + my $result = $self->{snmp}->get_table(oid => $oid_cputable, nothing_quit => 1); + + my $cpu = 0; + my $i = 0; + foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { + $key =~ /\.([0-9]+)$/; + my $cpu_num = $1; + + $cpu += $result->{$key}; + + $self->{output}->output_add(long_msg => sprintf("CPU $i Usage is %.2f%%", $result->{$key})); + $self->{output}->perfdata_add(label => 'cpu' . $i, unit => '%', + value => sprintf("%.2f", $result->{$key}), + min => 0, max => 100); + $i++; + } + + my $avg_cpu = $cpu / $i; + my $exit_code = $self->{perfdata}->threshold_check(value => $avg_cpu, + threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit_code, + short_msg => sprintf("CPU(s) average usage is: %.2f%%", $avg_cpu)); + $self->{output}->perfdata_add(label => 'total_cpu_avg', unit => '%', + value => sprintf("%.2f", $avg_cpu), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + min => 0, max => 100); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check firewall CPUs + +=over 8 + +=item B<--warning> + +Threshold warning in percent. + +=item B<--critical> + +Threshold critical in percent. + +=back + +=cut diff --git a/network/stonesoft/mode/droppedpackets.pm b/network/stonesoft/mode/droppedpackets.pm new file mode 100644 index 000000000..4376a7e8b --- /dev/null +++ b/network/stonesoft/mode/droppedpackets.pm @@ -0,0 +1,160 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::droppedpackets; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::statefile; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + $self->{statefile_value} = centreon::plugins::statefile->new(%options); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } + + $self->{statefile_value}->check_options(%options); +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + $self->{hostname} = $self->{snmp}->get_hostname(); + $self->{snmp_port} = $self->{snmp}->get_port(); + + if ($self->{snmp}->is_snmpv1()) { + $self->{output}->add_option_msg(short_msg => "Can't check SNMP 64 bits counters with SNMPv1."); + $self->{output}->option_exit(); + } + + my $new_datas = {}; + $self->{statefile_value}->read(statefile => "stonesoft_" . $self->{hostname} . '_' . $self->{snmp_port} . '_' . $self->{mode}); + + my $oid_fwDropped = '.1.3.6.1.4.1.1369.5.2.1.6.0'; + my $result = $self->{snmp}->get_leef(oids => [$oid_fwDropped], nothing_quit => 1); + + my $dropped_packets = $result->{$oid_fwDropped}; + $new_datas->{dropped_packets} = $dropped_packets; + $new_datas->{last_timestamp} = time(); + + my $old_datas = {}; + $old_datas->{old_timestamp} = $self->{statefile_value}->get(name => 'last_timestamp'); + $old_datas->{old_dropped_packets} = $self->{statefile_value}->get(name => 'dropped_packets'); + if (!defined($old_datas->{old_dropped_packets}) || $new_datas->{dropped_packets} < $old_datas->{old_dropped_packets}) { + # We set 0. Has reboot. + $old_datas->{old_dropped_packets} = 0; + } + + if (defined($old_datas->{old_timestamp})) { + my $time_delta = $new_datas->{last_timestamp} - $old_datas->{old_timestamp}; + if ($time_delta <= 0) { + $time_delta = 1; + } + + my $dropped_absolute = $new_datas->{dropped_packets} - $old_datas->{old_dropped_packets}; + my $dropped_absolute_per_sec = $dropped_absolute / $time_delta; + + my $exit = $self->{perfdata}->threshold_check(value => $dropped_absolute_per_sec, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Packets Dropped : %.2f /s [%i packets]", + $dropped_absolute_per_sec, $dropped_absolute)); + + $self->{output}->perfdata_add(label => 'dropped_packets_per_sec', + value => sprintf("%.2f", $dropped_absolute_per_sec), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + min => 0); + + } else { + $self->{output}->output_add(severity => 'OK', + short_msg => "Buffer creation..."); + } + + $self->{statefile_value}->write(data => $new_datas); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check dropped packets per second by firewall. + +=over 8 + +=item B<--warning> + +Threshold warning for dropped packets per second. + +=item B<--critical> + +Threshold critical for dropped packets per second. + +=back + +=cut + diff --git a/network/stonesoft/mode/memory.pm b/network/stonesoft/mode/memory.pm new file mode 100644 index 000000000..9f1f4cdb9 --- /dev/null +++ b/network/stonesoft/mode/memory.pm @@ -0,0 +1,218 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::memory; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use Data::Dumper; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + "swap" => { name => 'check_swap' }, + "warning-swap:s" => { name => 'warning_swap' }, + "critical-swap:s" => { name => 'critical_swap' }, + "no-swap:s" => { name => 'no_swap' }, + }); + $self->{no_swap} = 'critical'; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } + if (defined($self->{option_results}->{check_swap})) { + if (($self->{perfdata}->threshold_validate(label => 'warning-swap', value => $self->{option_results}->{warning_swap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-swap threshold '" . $self->{option_results}->{warning_swap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical-swap', value => $self->{option_results}->{critical_swap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-swap threshold '" . $self->{option_results}->{critical_swap} . "'."); + $self->{output}->option_exit(); + } + if (defined($self->{option_results}->{no_swap}) && $self->{option_results}->{no_swap} ne '') { + if ($self->{output}->is_litteral_status(status => $self->{option_results}->{no_swap}) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong --no-swap status '" . $self->{option_results}->{no_swap} . "'."); + $self->{output}->option_exit(); + } + $self->{no_swap} = $self->{option_results}->{no_swap}; + } + } +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + my $oid_fwMemBytesTotal = '.1.3.6.1.4.1.1369.5.2.1.11.2.4.0'; + my $oid_fwMemBytesUsed = '.1.3.6.1.4.1.1369.5.2.1.11.2.5.0'; + my $oid_fwMemBytesUnused = '.1.3.6.1.4.1.1369.5.2.1.11.2.6.0'; + my $oid_fwMemBytesBuffers = '.1.3.6.1.4.1.1369.5.2.1.11.2.7.0'; + my $oid_fwMemBytesCached = '.1.3.6.1.4.1.1369.5.2.1.11.2.8.0'; + my $oid_fwSwapBytesTotal = '.1.3.6.1.4.1.1369.5.2.1.11.2.1.0'; + my $oid_fwSwapBytesUsed = '.1.3.6.1.4.1.1369.5.2.1.11.2.2.0'; + my $oid_fwSwapBytesUnused = '.1.3.6.1.4.1.1369.5.2.1.11.2.3.0'; + + my $oids = [$oid_fwMemBytesTotal, $oid_fwMemBytesUsed, $oid_fwMemBytesUnused, $oid_fwMemBytesBuffers, $oid_fwMemBytesCached]; + + if (defined($self->{option_results}->{check_swap})) { + push @$oids, ($oid_fwSwapBytesTotal, $oid_fwSwapBytesUnused, $oid_fwSwapBytesUsed); + } + + my $result = $self->{snmp}->get_leef(oids => $oids, + nothing_quit => 1); + my $cached_used = $result->{$oid_fwMemBytesCached}; + my $buffer_used = $result->{$oid_fwMemBytesBuffers}; + my $physical_used = $result->{$oid_fwMemBytesUsed}; + my $nobuf_used = $physical_used - $buffer_used - $cached_used; + my $total_size = $result->{$oid_fwMemBytesTotal}; + + my $prct_used = $nobuf_used * 100 / $total_size; + my $exit = $self->{perfdata}->threshold_check(value => $prct_used, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + my ($nobuf_value, $nobuf_unit) = $self->{perfdata}->change_bytes(value => $nobuf_used); + my ($buffer_value, $buffer_unit) = $self->{perfdata}->change_bytes(value => $buffer_used); + my ($cached_value, $cached_unit) = $self->{perfdata}->change_bytes(value => $cached_used); + + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Ram used (-buffers/cache) %s (%.2f%%), Buffer: %s, Cached: %s", + $nobuf_value . " " . $nobuf_unit, $prct_used, + $buffer_value . " " . $buffer_unit, + $cached_value . " " . $cached_unit)); + + $self->{output}->perfdata_add(label => "cached", + value => $cached_used, + min => 0); + $self->{output}->perfdata_add(label => "buffer", + value => $buffer_used, + min => 0); + $self->{output}->perfdata_add(label => "used", + value => $nobuf_used, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', total => $total_size, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', total => $total_size, cast_int => 1), + min => 0, max => $total_size); + + if (defined($self->{option_results}->{check_swap})) { + if ($result->{$oid_fwSwapBytesTotal} == 0) { + $self->{output}->output_add(severity => $self->{no_swap}, + short_msg => 'No active swap.'); + $self->{output}->display(); + $self->{output}->exit(); + } + + $total_size = $result->{$oid_fwSwapBytesTotal}; + my $swap_used = $result->{$oid_fwSwapBytesUsed}; + + $prct_used = $swap_used * 100 / $total_size; + $exit = $self->{perfdata}->threshold_check(value => $prct_used, threshold => [ { label => 'critical-swap', 'exit_litteral' => 'critical' }, { label => 'warning-swap', exit_litteral => 'warning' } ]); + + my ($total_value, $total_unit) = $self->{perfdata}->change_bytes(value => $total_size); + my ($swap_used_value, $swap_used_unit) = $self->{perfdata}->change_bytes(value => $swap_used); + my ($swap_free_value, $swap_free_unit) = $self->{perfdata}->change_bytes(value => ($total_size - $swap_used)); + + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Swap Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $total_value . " " . $total_unit, + $swap_used_value . " " . $swap_used_unit, $prct_used, + $swap_free_value . " " . $swap_free_unit, (100 - $prct_used))); + + $self->{output}->perfdata_add(label => "swap", + value => $swap_used, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-swap', total => $total_size, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-swap', total => $total_size, cast_int => 1), + min => 0, max => $total_size); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check stonesoftFirewall memory usage (STONESOFT-FIREWALL-MIB). + +=over 8 + +=item B<--warning> + +Threshold warning in percent. + +=item B<--critical> + +Threshold critical in percent. + +=item B<-swap> + +Check swap also. + +=item B<--warning-swap> + +Threshold warning in percent. + +=item B<--critical-swap> + +Threshold critical in percent. + +=item B<--no-swap> + +Threshold if no active swap (default: 'critical'). + +=back + +=cut diff --git a/network/stonesoft/mode/rejectedpackets.pm b/network/stonesoft/mode/rejectedpackets.pm new file mode 100644 index 000000000..1aac66784 --- /dev/null +++ b/network/stonesoft/mode/rejectedpackets.pm @@ -0,0 +1,160 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::rejectedpackets; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::statefile; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + $self->{statefile_value} = centreon::plugins::statefile->new(%options); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } + + $self->{statefile_value}->check_options(%options); +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + $self->{hostname} = $self->{snmp}->get_hostname(); + $self->{snmp_port} = $self->{snmp}->get_port(); + + if ($self->{snmp}->is_snmpv1()) { + $self->{output}->add_option_msg(short_msg => "Can't check SNMP 64 bits counters with SNMPv1."); + $self->{output}->option_exit(); + } + + my $new_datas = {}; + $self->{statefile_value}->read(statefile => "stonesoft_" . $self->{hostname} . '_' . $self->{snmp_port} . '_' . $self->{mode}); + + my $oid_fwRejected = '.1.3.6.1.4.1.1369.5.2.1.9.0'; + my $result = $self->{snmp}->get_leef(oids => [$oid_fwRejected], nothing_quit => 1); + + my $rejected_packets = $result->{$oid_fwRejected}; + $new_datas->{rejected_packets} = $rejected_packets; + $new_datas->{last_timestamp} = time(); + + my $old_datas = {}; + $old_datas->{old_timestamp} = $self->{statefile_value}->get(name => 'last_timestamp'); + $old_datas->{old_rejected_packets} = $self->{statefile_value}->get(name => 'rejected_packets'); + if (!defined($old_datas->{old_rejected_packets}) || $new_datas->{rejected_packets} < $old_datas->{old_rejected_packets}) { + # We set 0. Has reboot. + $old_datas->{old_rejected_packets} = 0; + } + + if (defined($old_datas->{old_timestamp})) { + my $time_delta = $new_datas->{last_timestamp} - $old_datas->{old_timestamp}; + if ($time_delta <= 0) { + $time_delta = 1; + } + + my $rejected_absolute = $new_datas->{rejected_packets} - $old_datas->{old_rejected_packets}; + my $rejected_absolute_per_sec = $rejected_absolute / $time_delta; + + my $exit = $self->{perfdata}->threshold_check(value => $rejected_absolute_per_sec, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Packets Rejected : %.2f /s [%i packets]", + $rejected_absolute_per_sec, $rejected_absolute)); + + $self->{output}->perfdata_add(label => 'rejected_packets_per_sec', + value => sprintf("%.2f", $rejected_absolute_per_sec), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + min => 0); + + } else { + $self->{output}->output_add(severity => 'OK', + short_msg => "Buffer creation..."); + } + + $self->{statefile_value}->write(data => $new_datas); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check rejected packets per second by firewall. + +=over 8 + +=item B<--warning> + +Threshold warning for blocked packets per second. + +=item B<--critical> + +Threshold critical for blocked packets per second. + +=back + +=cut + diff --git a/network/stonesoft/mode/storage.pm b/network/stonesoft/mode/storage.pm new file mode 100644 index 000000000..f1a882d9e --- /dev/null +++ b/network/stonesoft/mode/storage.pm @@ -0,0 +1,248 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::mode::storage; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::statefile; + +my $oid_fwMountPointName = '.1.3.6.1.4.1.1369.5.2.1.11.3.1.3'; +my $oid_fwPartitionSize = '.1.3.6.1.4.1.1369.5.2.1.11.3.1.4'; # in kB +my $oid_fwPartitionUsed = '.1.3.6.1.4.1.1369.5.2.1.11.3.1.5'; # in kB + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + "units:s" => { name => 'units', default => '%' }, + "free" => { name => 'free' }, + "storage:s" => { name => 'storage' }, + "regexp" => { name => 'use_regexp' }, + "regexp-isensitive" => { name => 'use_regexpi' }, + }); + + $self->{storage_id_selected} = []; + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + # $options{snmp} = snmp object + $self->{snmp} = $options{snmp}; + + $self->manage_selection(); + $self->{snmp}->load(oids => [$oid_fwPartitionSize, $oid_fwPartitionUsed], + instances => $self->{storage_id_selected}); + my $result = $self->{snmp}->get_leef(nothing_quit => 1); + + my $num_disk_check = 0; + foreach (sort @{$self->{storage_id_selected}}) { + my $name_storage = $self->get_display_value(id => $_); + my $total_size = ($result->{$oid_fwPartitionSize . "." . $_}) * 1024; + if ($total_size == 0) { + $self->{output}->output_add(long_msg => sprintf("Skipping partition '%s' (total size is 0)", $name_storage)); + next; + } + + $num_disk_check++; + my $total_used = ($result->{$oid_fwPartitionUsed . "." . $_}) * 1024; + my $total_free = $total_size - $total_used; + my $prct_used = $total_used * 100 / $total_size; + my $prct_free = 100 - $prct_used; + + my ($exit, $threshold_value); + + $threshold_value = $total_used; + $threshold_value = $total_free if (defined($self->{option_results}->{free})); + if ($self->{option_results}->{units} eq '%') { + $threshold_value = $prct_used; + $threshold_value = $prct_free if (defined($self->{option_results}->{free})); + } + $exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $total_size); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $total_used); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => ($total_size - $total_used)); + + $self->{output}->output_add(long_msg => sprintf("Partition '%s' Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $name_storage, + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $prct_used, + $total_free_value . " " . $total_free_unit, $prct_free)); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1) || (defined($self->{option_results}->{storage}) && !defined($self->{option_results}->{use_regexp}))) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Partition '%s' Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $name_storage, + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $prct_used, + $total_free_value . " " . $total_free_unit, $prct_free)); + } + + my $label = 'used'; + my $value_perf = $total_used; + if (defined($self->{option_results}->{free})) { + $label = 'free'; + $value_perf = $total_free; + } + my $extra_label = ''; + $extra_label = '_' . $name_storage if (!defined($self->{option_results}->{storage}) || defined($self->{option_results}->{use_regexp})); + my %total_options = (); + if ($self->{option_results}->{units} eq '%') { + $total_options{total} = $total_size; + $total_options{cast_int} = 1; + } + $self->{output}->perfdata_add(label => $label . $extra_label, unit => 'B', + value => $value_perf, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', %total_options), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', %total_options), + min => 0, max => $total_size); + } + + if (!defined($self->{option_results}->{storage}) || defined($self->{option_results}->{use_regexp})) { + $self->{output}->output_add(severity => 'OK', + short_msg => 'All partitions are ok.'); + } elsif ($num_disk_check == 0) { + $self->{output}->output_add(severity => 'OK', + short_msg => 'No usage for partition.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{result_names} = $self->{snmp}->get_table(oid => $oid_fwMountPointName); + foreach my $key ($self->{snmp}->oid_lex_sort(keys %{$self->{result_names}})) { + $key =~ /\.([0-9]+)$/; + my $instance = $1; + my $filter_name = $self->{output}->to_utf8($self->{result_names}->{$key}); + next if (!defined($filter_name)); + if (!defined($self->{option_results}->{storage})) { + push @{$self->{storage_id_selected}}, $instance; + next; + } + if (defined($self->{option_results}->{use_regexp}) && defined($self->{option_results}->{use_regexpi}) && $filter_name =~ /$self->{option_results}->{storage}/i) { + push @{$self->{storage_id_selected}}, $instance; + } + if (defined($self->{option_results}->{use_regexp}) && !defined($self->{option_results}->{use_regexpi}) && $filter_name =~ /$self->{option_results}->{storage}/) { + push @{$self->{storage_id_selected}}, $instance; + } + if (!defined($self->{option_results}->{use_regexp}) && !defined($self->{option_results}->{use_regexpi}) && $filter_name eq $self->{option_results}->{storage}) { + push @{$self->{storage_id_selected}}, $instance; + } + } + + if (scalar(@{$self->{storage_id_selected}}) <= 0) { + if (defined($self->{option_results}->{storage})) { + $self->{output}->add_option_msg(short_msg => "No storage found for name '" . $self->{option_results}->{storage} . "'."); + } else { + $self->{output}->add_option_msg(short_msg => "No storage found."); + } + $self->{output}->option_exit(); + } +} + +sub get_display_value { + my ($self, %options) = @_; + my $value = $self->{result_names}->{$oid_fwMountPointName . '.' . $options{id}}; + + return $value; +} + +1; + +__END__ + +=head1 MODE + +Check usage on partitions. + +=over 8 + +=item B<--warning> + +Threshold warning. + +=item B<--critical> + +Threshold critical. + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'B'). + +=item B<--free> + +Thresholds are on free space left. + +=item B<--storage> + +Set the storage name (empty means 'check all storage'). + +=item B<--regexp> + +Allows to use regexp to filter storage (with option --name). + +=item B<--regexp-isensitive> + +Allows to use regexp non case-sensitive (with --regexp). + +=back + +=cut diff --git a/network/stonesoft/plugin.pm b/network/stonesoft/plugin.pm new file mode 100644 index 000000000..5c50b1731 --- /dev/null +++ b/network/stonesoft/plugin.pm @@ -0,0 +1,72 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package network::stonesoft::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + # $options->{options} = options object + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'memory' => 'network::stonesoft::mode::memory', + 'cpu' => 'network::stonesoft::mode::cpu', + 'storage' => 'network::stonesoft::mode::storage', + 'cluster-state' => 'network::stonesoft::mode::clusterstate', + 'cluster-load' => 'network::stonesoft::mode::clusterload', + 'rejected-packets' => 'network::stonesoft::mode::rejectedpackets', + 'dropped-packets' => 'network::stonesoft::mode::droppedpackets', + 'traffic' => 'snmp_standard::mode::traffic', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Stonesoft firewall in SNMP. + +=cut