From 5971bc54be3396a78f49ca550a3116a6e9d6f556 Mon Sep 17 00:00:00 2001 From: Quentin Garnier Date: Fri, 9 Jan 2015 16:36:00 +0100 Subject: [PATCH] Fix #7789 --- .../src/centreon/esxd/cmdalarmdatacenter.pm | 129 ++++++++++++++++++ .../src/centreon/script/centreonesxd.pm | 1 + 2 files changed, 130 insertions(+) create mode 100644 connectors/vmware/src/centreon/esxd/cmdalarmdatacenter.pm diff --git a/connectors/vmware/src/centreon/esxd/cmdalarmdatacenter.pm b/connectors/vmware/src/centreon/esxd/cmdalarmdatacenter.pm new file mode 100644 index 000000000..fafbeaa9a --- /dev/null +++ b/connectors/vmware/src/centreon/esxd/cmdalarmdatacenter.pm @@ -0,0 +1,129 @@ + +package centreon::esxd::cmdalarmdatacenter; + +use strict; +use warnings; +use centreon::esxd::common; + +sub new { + my $class = shift; + my $self = {}; + $self->{logger} = shift; + $self->{commandName} = 'alarmdatacenter'; + + bless $self, $class; + return $self; +} + +sub getCommandName { + my $self = shift; + return $self->{commandName}; +} + +sub checkArgs { + my ($self, %options) = @_; + + if (defined($options{arguments}->{datacenter}) && $options{arguments}->{datacenter} eq "") { + $options{manager}->{output}->output_add(severity => 'UNKNOWN', + short_msg => "Argument error: datacenter cannot be null"); + return 1; + } + return 0; +} + +sub initArgs { + my ($self, %options) = @_; + + foreach (keys %{$options{arguments}}) { + $self->{$_} = $options{arguments}->{$_}; + } + $self->{manager} = centreon::esxd::common::init_response(); + $self->{manager}->{output}->{plugin} = $options{arguments}->{identity}; + $self->{manager}->{perfdata}->threshold_validate(label => 'warning', value => $options{arguments}->{warning}); + $self->{manager}->{perfdata}->threshold_validate(label => 'critical', value => $options{arguments}->{critical}); +} + +sub set_connector { + my ($self, %options) = @_; + + $self->{obj_esxd} = $options{connector}; +} + +sub run { + my $self = shift; + + my %filters = (); + + if (defined($self->{filter_time}) && $self->{filter_time} ne '' && $self->{obj_esxd}->{module_date_parse_loaded} == 0) { + $self->{manager}->{output}->output_add(severity => 'UNKNOWN', + short_msg => "Need to install Date::Parse CPAN Module"); + return ; + } + + if (defined($self->{datacenter}) && !defined($self->{filter})) { + $filters{name} = qr/^\Q$self->{datacenter}\E$/; + } elsif (!defined($self->{datacenter})) { + $filters{name} = qr/.*/; + } else { + $filters{name} = qr/$self->{datacenter}/; + } + + my @properties = ('name', 'triggeredAlarmState'); + my $result = centreon::esxd::common::get_entities_host($self->{obj_esxd}, 'Datacenter', \%filters, \@properties); + return if (!defined($result)); + + $self->{manager}->{output}->output_add(severity => 'OK', + short_msg => sprintf("No current alarms on datacenter(s)")); + + my $alarmMgr = centreon::esxd::common::get_view($self->{obj_esxd}, $self->{obj_esxd}->{session1}->get_service_content()->alarmManager, undef); + my $total_alarms = { red => 0, yellow => 0 }; + my $dc_alarms = {}; + foreach my $datacenter_view (@$result) { + $dc_alarms->{$datacenter_view->name} = { red => 0, yellow => 0, alarms => {} }; + next if (!defined($datacenter_view->triggeredAlarmState)); + foreach(@{$datacenter_view->triggeredAlarmState}) { + next if ($_->overallStatus->val !~ /(red|yellow)/i); + if (defined($self->{filter_time}) && $self->{filter_time} ne '') { + my $time_sec = Date::Parse::str2time($_->time); + next if (time() - $time_sec > $self->{filter_time}); + } + my $entity = centreon::esxd::common::get_view($self->{obj_esxd}, $_->entity, ['name']); + my $alarm = centreon::esxd::common::get_view($self->{obj_esxd}, $_->alarm, ['info']); + + $dc_alarms->{$datacenter_view->name}->{alarms}->{$_->key} = { type => $_->entity->type, name => $entity->name, + time => $_->time, name => $alarm->info->name, + description => $alarm->info->description, + status => $_->overallStatus->val}; + $dc_alarms->{$datacenter_view->name}->{$_->overallStatus->val}++; + } + } + + my $exit = $self->{manager}->{perfdata}->threshold_check(value => $total_alarms->{yellow}, + threshold => [ { label => 'warning', exit_litteral => 'warning' } ]); + if (!$self->{manager}->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{manager}->{output}->output_add(severity => $exit, + short_msg => sprintf("%s alarm(s) found(s)", $total_alarms->{yellow})); + } + $exit = $self->{manager}->{perfdata}->threshold_check(value => $total_alarms->{red}, threshold => [ { label => 'critical', exit_litteral => 'critical' } ]); + if (!$self->{manager}->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{manager}->{output}->output_add(severity => $exit, + short_msg => sprintf("%s alarm(s) found(s)", $total_alarms->{red})); + } + + foreach my $dc_name (keys %{$dc_alarms}) { + $self->{manager}->{output}->output_add(long_msg => sprintf("Checking datacenter %s", $dc_name)); + $self->{manager}->{output}->output_add(long_msg => sprintf(" %s warn alarm(s) found(s) - %s critical alarm(s) found(s)", + $dc_alarms->{$dc_name}->{yellow}, $dc_alarms->{$dc_name}->{red})); + foreach my $alert (keys %{$dc_alarms->{$dc_name}->{alarms}}) { + $self->{manager}->{output}->output_add(long_msg => sprintf(" [%s] [%s] [%s] [%s] %s", + $dc_alarms->{$dc_name}->{alarms}->{$alert}->{status}, + $dc_alarms->{$dc_name}->{alarms}->{$alert}->{name}, + $dc_alarms->{$dc_name}->{alarms}->{$alert}->{time}, + $dc_alarms->{$dc_name}->{alarms}->{$alert}->{type}, + $dc_alarms->{$dc_name}->{alarms}->{$alert}->{description} + )); + } + } +} + +1; diff --git a/connectors/vmware/src/centreon/script/centreonesxd.pm b/connectors/vmware/src/centreon/script/centreonesxd.pm index f6eec20f8..9e19fcd94 100644 --- a/connectors/vmware/src/centreon/script/centreonesxd.pm +++ b/connectors/vmware/src/centreon/script/centreonesxd.pm @@ -29,6 +29,7 @@ my $VERSION = "1.6.0"; my %handlers = (TERM => {}, HUP => {}, CHLD => {}); my @load_modules = ( + 'centreon::esxd::cmdalarmdatacenter', 'centreon::esxd::cmdcountvmhost', 'centreon::esxd::cmdcpuhost', 'centreon::esxd::cmdcpuvm',