# # Copyright 2015 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 cloud::aws::mode::list; use base qw(centreon::plugins::mode); use strict; use warnings; use centreon::plugins::misc; use Data::Dumper; use JSON; my $AWSServices = 'EC2,S3,RDS'; my @Disco_service_tab = ('EC2', 'RDS'); my @EC2_instance_states = [ 'running', 'stopped' ]; my $awsapi; sub new { my ( $class, %options ) = @_; my $self = $class->SUPER::new( package => __PACKAGE__, %options ); bless $self, $class; $self->{version} = '0.1'; $options{options}->add_options( arguments => { "service:s" => { name => 'service', default => $AWSServices }, "exclude:s" => { name => 'exclude' }, } ); $self->{result} = {}; return $self; } sub check_options { my ($self, %options) = @_; $self->SUPER::init(%options); } sub api_request { my ($self, %options) = @_; @{$self->{option_results}->{servicetab}} = split( /,/, $self->{option_results}->{service} ); foreach my $service (@{$self->{option_results}->{servicetab}}) { $self->{result}->{count}->{$service} = 0; if ($service eq 'EC2') { $self->EC2(%options); } elsif ($service eq 'S3') { $self->S3(%options); } elsif ($service eq 'RDS') { $self->RDS(%options); } else { $self->{output}->add_option_msg(short_msg => "Service $service doesn't exists" ); $self->{output}->option_exit(); } } } sub EC2 { my ( $self, %options ) = @_; my $apiRequest = { 'command' => 'ec2', 'subcommand' => 'describe-instances', }; # Building JSON $apiRequest->{json} = { 'DryRun' => JSON::false, 'Filters' => [ { 'Name' => 'instance-state-name', 'Values' => @EC2_instance_states, } ], }; # Requesting API $awsapi = $options{custom}; $self->{command_return} = $awsapi->execReq($apiRequest); # Compute data foreach my $instance (@{$self->{command_return}->{Reservations}}) { foreach my $tags (@{$instance->{Instances}[0]->{Tags}}) { if ($tags->{Key} eq 'Name') { $instance->{Instances}[0]->{Name} = $tags->{Value}; } } $self->{result}->{'EC2'}->{$instance->{Instances}[0]->{InstanceId}} = { State => $instance->{Instances}[0]->{State}->{Name}, Name => $instance->{Instances}[0]->{Name} }; $self->{result}->{count}->{'EC2'}++; } } sub S3 { my ( $self, %options ) = @_; my ( @buckets, @return ) = (); my $apiRequest = { 'command' => 's3', 'subcommand' => 'ls', 'output' => 'text' }; # Requesting API $awsapi = $options{custom}; $self->{command_return} = $awsapi->execReq($apiRequest); # Exec command foreach my $line (@{$self->{command_return}}) { my ($date, $time, $name) = split / /, $line; my $creationdate = $date . " " . $time; push(@buckets, { Name => $name, CreationDate => $creationdate }); } # Compute data foreach my $bucket (@buckets) { $self->{result}->{'S3'}->{ $bucket->{Name} } = { 'Creation date' => $bucket->{CreationDate} }; $self->{result}->{count}->{'S3'}++; } } sub RDS { my ( $self, %options ) = @_; my $apiRequest = { 'command' => 'rds', 'subcommand' => 'describe-db-instances', }; # Requesting API $awsapi = $options{custom}; $self->{command_return} = $awsapi->execReq($apiRequest); # Compute data foreach my $dbinstance (@{$self->{command_return}->{DBInstances}}) { $self->{result}->{'RDS'}->{$dbinstance->{DBInstanceIdentifier}} = { State => $dbinstance->{DBInstanceStatus}, Name => $dbinstance->{DBInstanceIdentifier} }; $self->{result}->{count}->{RDS}++; } } sub disco_format { my ($self, %options) = @_; my $names = [ 'name', 'id', 'state', 'service' ]; $self->{output}->add_disco_format( elements => $names ); } sub disco_show { my ( $self, %options ) = @_; $self->api_request(%options); foreach my $service (@Disco_service_tab) { foreach my $device (keys %{$self->{result}->{$service}}) { $self->{output}->add_disco_entry( name => $self->{result}->{$service}->{$device}->{Name}, id => $device, state => $self->{result}->{$service}->{$device}->{State}, service => $service, ); } } } sub run { my ( $self, %options ) = @_; $self->api_request(%options); # Send formated data to Centreon foreach my $service (@{$self->{option_results}->{servicetab}}) { $self->{output}->output_add(long_msg => sprintf("AWS service: %s", $service)); foreach my $device (keys %{$self->{result}->{$service}}) { my $output = $device . " ["; foreach my $value (sort(keys %{$self->{result}->{$service}->{$device}})) { $output = $output . $value . " = " . $self->{result}->{$service}->{$device}->{$value} . ", "; } $output =~ s/, $//; $output = $output . "]"; $self->{output}->output_add( long_msg => $output ); } $self->{output}->output_add( short_msg => sprintf( "%s: %s", $service, $self->{result}->{count}->{$service} ) ); } $self->{output}->display( nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1 ); $self->{output}->exit(); } 1; __END__ =head1 MODE List your EC2, RDS instance and S3 buckets =over 8 =item B<--service> (optional) List one particular service. =item B<--exclude> (optional) Service to exclude from the scan. =back =cut