diff --git a/apps/kaspersky/snmp/mode/deployment.pm b/apps/kaspersky/snmp/mode/deployment.pm new file mode 100644 index 000000000..2717a16ee --- /dev/null +++ b/apps/kaspersky/snmp/mode/deployment.pm @@ -0,0 +1,340 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::mode::deployment; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Deployment status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_deploymentStatus'}; + return 0; +} + +sub custom_progress_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => 'progress', + value => $self->{result_values}->{installed}, + min => 0, max => $self->{result_values}->{total}); +} + +sub custom_progress_threshold { + my ($self, %options) = @_; + + my ($exit, $threshold_value); + $threshold_value = defined($instance_mode->{option_results}->{percent}) ? $self->{result_values}->{prct_installed} : $self->{result_values}->{installed} ; + $exit = $self->{perfdata}->threshold_check(value => $threshold_value, + threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, + { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_progress_output { + my ($self, %options) = @_; + + my $msg = sprintf("Deployment progress: %d/%d (%.2f%%)", + $self->{result_values}->{installed}, $self->{result_values}->{total}, $self->{result_values}->{prct_installed}); + return $msg; +} + +sub custom_progress_calc { + my ($self, %options) = @_; + + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_hostsInGroups'}; + $self->{result_values}->{installed} = $options{new_datas}->{$self->{instance} . '_hostsWithAntivirus'}; + $self->{result_values}->{prct_installed} = $self->{result_values}->{installed} * 100 / $self->{result_values}->{total}; + + return 0; +} + +sub custom_expiring_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => 'expiring', + value => $self->{result_values}->{expiring}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}), + min => 0); +} + +sub custom_expiring_threshold { + my ($self, %options) = @_; + + my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{expiring}, + threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, + { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_expiring_output { + my ($self, %options) = @_; + + my $msg = sprintf("%d host(s) with expiring licence", $self->{result_values}->{expiring}); + $msg .= sprintf(" [serial: %s] [days: %d]", $self->{result_values}->{serial}, $self->{result_values}->{days}) if ($self->{result_values}->{serial} ne ''); + return $msg; +} + +sub custom_expiring_calc { + my ($self, %options) = @_; + + $self->{result_values}->{serial} = $options{new_datas}->{$self->{instance} . '_licenceExpiringSerial'}; + $self->{result_values}->{days} = $options{new_datas}->{$self->{instance} . '_licenceExpiringDays'}; + $self->{result_values}->{expiring} = $options{new_datas}->{$self->{instance} . '_hostsLicenceExpiring'}; + + return 0; +} + +sub custom_expired_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => 'expired', + value => $self->{result_values}->{expired}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}), + min => 0); +} + +sub custom_expired_threshold { + my ($self, %options) = @_; + + my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{expired}, + threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, + { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_expired_output { + my ($self, %options) = @_; + + my $msg = sprintf("%d host(s) with expired licence", $self->{result_values}->{expired}); + $msg .= sprintf(" [serial: %s]", $self->{result_values}->{serial}) if ($self->{result_values}->{serial} ne ''); + return $msg; +} + +sub custom_expired_calc { + my ($self, %options) = @_; + + $self->{result_values}->{serial} = $options{new_datas}->{$self->{instance} . '_licenceExpiredSerial'}; + $self->{result_values}->{expired} = $options{new_datas}->{$self->{instance} . '_hostsLicenceExpired'}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', set => { + key_values => [ { name => 'deploymentStatus' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'progress', set => { + key_values => [ { name => 'hostsInGroups' }, { name => 'hostsWithAntivirus' } ], + closure_custom_calc => $self->can('custom_progress_calc'), + closure_custom_output => $self->can('custom_progress_output'), + closure_custom_threshold_check => $self->can('custom_progress_threshold'), + closure_custom_perfdata => $self->can('custom_progress_perfdata'), + } + }, + { label => 'failed', set => { + key_values => [ { name => 'hostsRemoteInstallFailed' } ], + output_template => '%d failed remote installation(s)', + perfdatas => [ + { label => 'failed', value => 'hostsRemoteInstallFailed_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'expiring', set => { + key_values => [ { name => 'licenceExpiringSerial' }, { name => 'licenceExpiringDays' }, { name => 'hostsLicenceExpiring' } ], + closure_custom_calc => $self->can('custom_expiring_calc'), + closure_custom_output => $self->can('custom_expiring_output'), + closure_custom_threshold_check => $self->can('custom_expiring_threshold'), + closure_custom_perfdata => $self->can('custom_expiring_perfdata'), + } + }, + { label => 'expired', set => { + key_values => [ { name => 'licenceExpiredSerial' }, { name => 'hostsLicenceExpired' } ], + closure_custom_calc => $self->can('custom_expired_calc'), + closure_custom_output => $self->can('custom_expired_output'), + closure_custom_threshold_check => $self->can('custom_expired_threshold'), + closure_custom_perfdata => $self->can('custom_expired_perfdata'), + } + }, + ]; +} + +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-status:s" => { name => 'warning_status', default => '%{status} =~ /Warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Critical/i' }, + "percent" => { name => 'percent' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach ('warning_status', 'critical_status') { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +my %map_status = ( + 0 => 'OK', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Critical', +); + +my $oid_deploymentStatus = '.1.3.6.1.4.1.23668.1093.1.1.1'; +my $oid_hostsInGroups = '.1.3.6.1.4.1.23668.1093.1.1.3'; +my $oid_hostsWithAntivirus = '.1.3.6.1.4.1.23668.1093.1.1.4'; +my $oid_hostsRemoteInstallFailed = '.1.3.6.1.4.1.23668.1093.1.1.5'; +my $oid_licenceExpiringSerial = '.1.3.6.1.4.1.23668.1093.1.1.6'; +my $oid_licenceExpiredSerial = '.1.3.6.1.4.1.23668.1093.1.1.7'; +my $oid_licenceExpiringDays = '.1.3.6.1.4.1.23668.1093.1.1.8'; +my $oid_hostsLicenceExpiring = '.1.3.6.1.4.1.23668.1093.1.1.9'; +my $oid_hostsLicenceExpired = '.1.3.6.1.4.1.23668.1093.1.1.10'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_deploymentStatus, $oid_hostsInGroups, + $oid_hostsWithAntivirus, $oid_hostsRemoteInstallFailed, + $oid_licenceExpiringSerial, $oid_licenceExpiredSerial, + $oid_licenceExpiringDays, $oid_hostsLicenceExpiring, + $oid_hostsLicenceExpired ], + nothing_quit => 1); + + $self->{global} = {}; + + $self->{global} = { + deploymentStatus => $map_status{$snmp_result->{$oid_deploymentStatus}}, + hostsInGroups => $snmp_result->{$oid_hostsInGroups}, + hostsWithAntivirus => $snmp_result->{$oid_hostsWithAntivirus}, + hostsRemoteInstallFailed => $snmp_result->{$oid_hostsRemoteInstallFailed}, + licenceExpiringSerial => $snmp_result->{$oid_licenceExpiringSerial}, + licenceExpiredSerial => $snmp_result->{$oid_licenceExpiredSerial}, + licenceExpiringDays => $snmp_result->{$oid_licenceExpiringDays}, + hostsLicenceExpiring => $snmp_result->{$oid_hostsLicenceExpiring}, + hostsLicenceExpired => $snmp_result->{$oid_hostsLicenceExpired}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check antivirus software deployment status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{status} =~ /Warning/i'). +Can use special variables like: %{status} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{status} =~ /Critical/i'). +Can use special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'progress' (counter or %), 'failed', 'expiring', 'expired'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'progress' (counter or %), 'failed', 'expiring', 'expired'. + +=item B<--percent> + +Set this option if you want to use percent on progress thresholds. + +=back + +=cut diff --git a/apps/kaspersky/snmp/mode/events.pm b/apps/kaspersky/snmp/mode/events.pm new file mode 100644 index 000000000..633dbf6e9 --- /dev/null +++ b/apps/kaspersky/snmp/mode/events.pm @@ -0,0 +1,183 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::mode::events; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Events status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_eventsStatus'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', set => { + key_values => [ { name => 'eventsStatus' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'events', set => { + key_values => [ { name => 'criticalEventsCount' } ], + output_template => '%d critical event(s)', + perfdatas => [ + { label => 'events', value => 'criticalEventsCount_absolute', template => '%d', min => 0 }, + ], + } + }, + ]; +} + +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-status:s" => { name => 'warning_status', default => '%{status} =~ /Warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Critical/i' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach ('warning_status', 'critical_status') { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +my %map_status = ( + 0 => 'OK', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Critical', +); + +my $oid_eventsStatus = '.1.3.6.1.4.1.23668.1093.1.6.1'; +my $oid_criticalEventsCount = '.1.3.6.1.4.1.23668.1093.1.6.3'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_eventsStatus, $oid_criticalEventsCount ], + nothing_quit => 1); + + $self->{global} = {}; + + $self->{global} = { + eventsStatus => $map_status{$snmp_result->{$oid_eventsStatus}}, + criticalEventsCount => $snmp_result->{$oid_criticalEventsCount}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check events status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{status} =~ /Warning/i'). +Can use special variables like: %{status} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{status} =~ /Critical/i'). +Can use special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'events'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'events'. + +=back + +=cut diff --git a/apps/kaspersky/snmp/mode/fullscan.pm b/apps/kaspersky/snmp/mode/fullscan.pm new file mode 100644 index 000000000..ef92015a4 --- /dev/null +++ b/apps/kaspersky/snmp/mode/fullscan.pm @@ -0,0 +1,183 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::mode::fullscan; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Full scan status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_fullscanStatus'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', set => { + key_values => [ { name => 'fullscanStatus' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'not-scanned', set => { + key_values => [ { name => 'hostsNotScannedLately' } ], + output_template => '%d hosts(s) has not been scanned lately', + perfdatas => [ + { label => 'not_scanned', value => 'hostsNotScannedLately_absolute', template => '%d', min => 0 }, + ], + } + }, + ]; +} + +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-status:s" => { name => 'warning_status', default => '%{status} =~ /Warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Critical/i' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach ('warning_status', 'critical_status') { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +my %map_status = ( + 0 => 'OK', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Critical', +); + +my $oid_fullscanStatus = '.1.3.6.1.4.1.23668.1093.1.4.1'; +my $oid_hostsNotScannedLately = '.1.3.6.1.4.1.23668.1093.1.4.3'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_fullscanStatus, $oid_hostsNotScannedLately ], + nothing_quit => 1); + + $self->{global} = {}; + + $self->{global} = { + fullscanStatus => $map_status{$snmp_result->{$oid_fullscanStatus}}, + hostsNotScannedLately => $snmp_result->{$oid_hostsNotScannedLately}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check full scan status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{status} =~ /Warning/i'). +Can use special variables like: %{status} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{status} =~ /Critical/i'). +Can use special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'not-scanned'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'not-scanned'. + +=back + +=cut diff --git a/apps/kaspersky/snmp/mode/logicalnetwork.pm b/apps/kaspersky/snmp/mode/logicalnetwork.pm new file mode 100644 index 000000000..77ff358d0 --- /dev/null +++ b/apps/kaspersky/snmp/mode/logicalnetwork.pm @@ -0,0 +1,215 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::mode::logicalnetwork; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Logical network status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_logicalNetworkStatus'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', set => { + key_values => [ { name => 'logicalNetworkStatus' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'new-hosts', set => { + key_values => [ { name => 'hostsFound' } ], + output_template => '%d new host(s) found', + perfdatas => [ + { label => 'new_hosts', value => 'hostsFound_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'groups', set => { + key_values => [ { name => 'groupsCount' } ], + output_template => '%d group(s) on the server', + perfdatas => [ + { label => 'groups', value => 'groupsCount_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'not-connected-long-time', set => { + key_values => [ { name => 'hostsNotConnectedLongTime' } ], + output_template => '%d host(s) has not connected for a long time', + perfdatas => [ + { label => 'not_connected_long_time', value => 'hostsNotConnectedLongTime_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'not-controlled', set => { + key_values => [ { name => 'hostsControlLost' } ], + output_template => '%d host(s) are not controlled', + perfdatas => [ + { label => 'not_controlled', value => 'hostsControlLost_absolute', template => '%d', min => 0 }, + ], + } + }, + ]; +} + +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-status:s" => { name => 'warning_status', default => '%{status} =~ /Warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Critical/i' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach ('warning_status', 'critical_status') { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +my %map_status = ( + 0 => 'OK', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Critical', +); + +my $oid_logicalNetworkStatus = '.1.3.6.1.4.1.23668.1093.1.5.1'; +my $oid_hostsFound = '.1.3.6.1.4.1.23668.1093.1.5.3'; +my $oid_groupsCount = '.1.3.6.1.4.1.23668.1093.1.5.4'; +my $oid_hostsNotConnectedLongTime = '.1.3.6.1.4.1.23668.1093.1.5.5'; +my $oid_hostsControlLost = '.1.3.6.1.4.1.23668.1093.1.5.6'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_logicalNetworkStatus, $oid_hostsFound, + $oid_groupsCount, $oid_hostsNotConnectedLongTime, + $oid_hostsControlLost ], + nothing_quit => 1); + + $self->{global} = {}; + + $self->{global} = { + logicalNetworkStatus => $map_status{$snmp_result->{$oid_logicalNetworkStatus}}, + hostsFound => $snmp_result->{$oid_hostsFound}, + groupsCount => $snmp_result->{$oid_groupsCount}, + hostsNotConnectedLongTime => $snmp_result->{$oid_hostsNotConnectedLongTime}, + hostsControlLost => $snmp_result->{$oid_hostsControlLost}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check logical network status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{status} =~ /Warning/i'). +Can use special variables like: %{status} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{status} =~ /Critical/i'). +Can use special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'new-hosts', 'groups', 'not-connected-long-time', 'not-controlled'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'new-hosts', 'groups', 'not-connected-long-time', 'not-controlled'. + +=back + +=cut diff --git a/apps/kaspersky/snmp/mode/protection.pm b/apps/kaspersky/snmp/mode/protection.pm new file mode 100644 index 000000000..835541852 --- /dev/null +++ b/apps/kaspersky/snmp/mode/protection.pm @@ -0,0 +1,227 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::mode::protection; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Protection status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_protectionStatus'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', set => { + key_values => [ { name => 'protectionStatus' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'no-antivirus', set => { + key_values => [ { name => 'hostsAntivirusNotRunning' } ], + output_template => '%d host(s) without running antivirus', + perfdatas => [ + { label => 'no_antivirus', value => 'hostsAntivirusNotRunning_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'no-real-time', set => { + key_values => [ { name => 'hostsRealtimeNotRunning' } ], + output_template => '%d hosts(s) without running real time protection', + perfdatas => [ + { label => 'no_real_time', value => 'hostsRealtimeNotRunning_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'not-acceptable-level', set => { + key_values => [ { name => 'hostsRealtimeLevelChanged' } ], + output_template => '%d host(s) with not acceptable level of real time protection', + perfdatas => [ + { label => 'not_acceptable_level', value => 'hostsRealtimeLevelChanged_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'not-cured-objects', set => { + key_values => [ { name => 'hostsNotCuredObject' } ], + output_template => '%d host(s) with not cured objects', + perfdatas => [ + { label => 'not_cured_objects', value => 'hostsNotCuredObject_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'too-many-threats', set => { + key_values => [ { name => 'hostsTooManyThreats' } ], + output_template => '%d host(s) with too many threats', + perfdatas => [ + { label => 'too_many_threats', value => 'hostsTooManyThreats_absolute', template => '%d', min => 0 }, + ], + } + }, + ]; +} + +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-status:s" => { name => 'warning_status', default => '%{status} =~ /Warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Critical/i' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach ('warning_status', 'critical_status') { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +my %map_status = ( + 0 => 'OK', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Critical', +); + +my $oid_protectionStatus = '.1.3.6.1.4.1.23668.1093.1.3.1'; +my $oid_hostsAntivirusNotRunning = '.1.3.6.1.4.1.23668.1093.1.3.3'; +my $oid_hostsRealtimeNotRunning = '.1.3.6.1.4.1.23668.1093.1.3.4'; +my $oid_hostsRealtimeLevelChanged = '.1.3.6.1.4.1.23668.1093.1.3.5'; +my $oid_hostsNotCuredObject = '.1.3.6.1.4.1.23668.1093.1.3.6'; +my $oid_hostsTooManyThreats = '.1.3.6.1.4.1.23668.1093.1.3.7'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_protectionStatus, $oid_hostsAntivirusNotRunning, + $oid_hostsRealtimeNotRunning, $oid_hostsRealtimeLevelChanged, + $oid_hostsNotCuredObject, $oid_hostsTooManyThreats ], + nothing_quit => 1); + + $self->{global} = {}; + + $self->{global} = { + protectionStatus => $map_status{$snmp_result->{$oid_protectionStatus}}, + hostsAntivirusNotRunning => $snmp_result->{$oid_hostsAntivirusNotRunning}, + hostsRealtimeNotRunning => $snmp_result->{$oid_hostsRealtimeNotRunning}, + hostsRealtimeLevelChanged => $snmp_result->{$oid_hostsRealtimeLevelChanged}, + hostsNotCuredObject => $snmp_result->{$oid_hostsNotCuredObject}, + hostsTooManyThreats => $snmp_result->{$oid_hostsTooManyThreats}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check protection status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{status} =~ /Warning/i'). +Can use special variables like: %{status} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{status} =~ /Critical/i'). +Can use special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'no-antivirus', 'no-real-time', 'not-acceptable-level', +'not-cured-objects', 'too-many-threats'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'no-antivirus', 'no-real-time', 'not-acceptable-level', +'not-cured-objects', 'too-many-threats'. + +=back + +=cut diff --git a/apps/kaspersky/snmp/mode/updates.pm b/apps/kaspersky/snmp/mode/updates.pm new file mode 100644 index 000000000..cf83f35e5 --- /dev/null +++ b/apps/kaspersky/snmp/mode/updates.pm @@ -0,0 +1,247 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::mode::updates; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use DateTime; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Updates status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_updatesStatus'}; + return 0; +} + +sub custom_last_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => 'last_server_update', + value => $self->{result_values}->{diff}, + unit => 's', + min => 0); +} + +sub custom_last_threshold { + my ($self, %options) = @_; + + my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{diff}, + threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, + { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_last_output { + my ($self, %options) = @_; + + my $msg = sprintf("Last server update: %s [%s]", centreon::plugins::misc::change_seconds(value => $self->{result_values}->{diff}), $self->{result_values}->{date_time}); + return $msg; +} + +sub custom_last_calc { + my ($self, %options) = @_; + + my $time = $options{new_datas}->{$self->{instance} . '_lastServerUpdateTime'}; + #2018-3-30,7:43:58.0 + if ($time =~ /^\s*(\d+)-(\d+)-(\d+),(\d+):(\d+):(\d+)\.(\d+)/) { + my $dt = DateTime->new( + year => $1, + month => $2, + day => $3, + hour => $4, + minute => $5, + second => $6, + time_zone => $instance_mode->{option_results}->{timezone}, + ); + $self->{result_values}->{diff} = time() - $dt->epoch; + $self->{result_values}->{date_time} = $dt->datetime(); + } + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', set => { + key_values => [ { name => 'updatesStatus' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'last-server-update', set => { + key_values => [ { name => 'lastServerUpdateTime' } ], + closure_custom_calc => $self->can('custom_last_calc'), + closure_custom_output => $self->can('custom_last_output'), + closure_custom_threshold_check => $self->can('custom_last_threshold'), + closure_custom_perfdata => $self->can('custom_last_perfdata'), + } + }, + { label => 'not-updated', set => { + key_values => [ { name => 'hostsNotUpdated' } ], + output_template => '%d host(s) not up to date', + perfdatas => [ + { label => 'not_updated', value => 'hostsNotUpdated_absolute', template => '%d', min => 0 }, + ], + } + }, + ]; +} + +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-status:s" => { name => 'warning_status', default => '%{status} =~ /Warning/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Critical/i' }, + "timezone:s" => { name => 'timezone', default => 'GMT' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach ('warning_status', 'critical_status') { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +my %map_status = ( + 0 => 'OK', + 1 => 'Info', + 2 => 'Warning', + 3 => 'Critical', +); + +my $oid_updatesStatus = '.1.3.6.1.4.1.23668.1093.1.2.1'; +my $oid_lastServerUpdateTime = '.1.3.6.1.4.1.23668.1093.1.2.3'; +my $oid_hostsNotUpdated = '.1.3.6.1.4.1.23668.1093.1.2.4'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_leef(oids => [ $oid_updatesStatus, $oid_lastServerUpdateTime, + $oid_hostsNotUpdated ], + nothing_quit => 1); + + $self->{global} = {}; + + $self->{global} = { + updatesStatus => $map_status{$snmp_result->{$oid_updatesStatus}}, + lastServerUpdateTime => $snmp_result->{$oid_lastServerUpdateTime}, + hostsNotUpdated => $snmp_result->{$oid_hostsNotUpdated}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check updates status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. (Default: '%{status} =~ /Warning/i'). +Can use special variables like: %{status} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{status} =~ /Critical/i'). +Can use special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'last-server-update', 'not-updated'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'last-server-update', 'not-updated'. + +=item B<--timezone> + +Timezone options. Default is 'GMT'. + +=back + +=cut diff --git a/apps/kaspersky/snmp/plugin.pm b/apps/kaspersky/snmp/plugin.pm new file mode 100644 index 000000000..14d6bfa0a --- /dev/null +++ b/apps/kaspersky/snmp/plugin.pm @@ -0,0 +1,54 @@ +# +# Copyright 2018 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kaspersky::snmp::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; + + $self->{version} = '0.1'; + %{$self->{modes}} = ( + 'deployment' => 'apps::kaspersky::snmp::mode::deployment', + 'events' => 'apps::kaspersky::snmp::mode::events', + 'full-scan' => 'apps::kaspersky::snmp::mode::fullscan', + 'logical-network' => 'apps::kaspersky::snmp::mode::logicalnetwork', + 'protection' => 'apps::kaspersky::snmp::mode::protection', + 'updates' => 'apps::kaspersky::snmp::mode::updates', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Kaspersky Security Center through SNMP + +=cut