From 3b5adcd21c9e0e8df25d94fe568030118ce4e30f Mon Sep 17 00:00:00 2001 From: Shini31 Date: Mon, 14 Sep 2015 11:32:51 +0200 Subject: [PATCH 1/3] fix #152 - Add disco-show and disco-format options --- cloud/docker/mode/listcontainers.pm | 49 +++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/cloud/docker/mode/listcontainers.pm b/cloud/docker/mode/listcontainers.pm index 2505a976f..0c2935e7e 100644 --- a/cloud/docker/mode/listcontainers.pm +++ b/cloud/docker/mode/listcontainers.pm @@ -32,7 +32,7 @@ sub new { my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - $self->{version} = '1.0'; + $self->{version} = '1.1'; $options{options}->add_options(arguments => { "hostname:s" => { name => 'hostname' }, @@ -50,6 +50,7 @@ sub new { }); $self->{http} = centreon::plugins::http->new(output => $self->{output}); + $self->{container_infos} = (); return $self; } @@ -64,7 +65,7 @@ sub check_options { $self->{http}->set_options(%{$self->{option_results}}) } -sub run { +sub api_request { my ($self, %options) = @_; my $jsoncontent = $self->{http}->request(); @@ -85,8 +86,8 @@ sub run { foreach my $val (@$webcontent) { my $containername = $val->{Names}->[0]; $containername =~ s/^\///; - my $containerid = $val->{Id}; - my $containerimage = $val->{Image}; + $self->{container_infos}->{$containername}->{id} = $val->{Id}; + $self->{container_infos}->{$containername}->{image} = $val->{Image}; my $containerstate; if (($val->{Status} =~ m/^Up/) && ($val->{Status} =~ m/^(?:(?!Paused).)*$/)) { $containerstate = 'Running'; @@ -95,9 +96,45 @@ sub run { } elsif ($val->{Status} =~ m/\(Paused\)$/) { $containerstate = 'Paused'; } - $self->{output}->output_add(long_msg => sprintf("%s [id = %s , image = %s, state = %s]", - $containername, $containerid, $containerimage, $containerstate)); + $self->{container_infos}->{$containername}->{state} = $containerstate; + } +} + +sub disco_format { + my ($self, %options) = @_; + + my $names = ['name', 'id', 'image', 'state']; + $self->{output}->add_disco_format(elements => $names); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->api_request(); + + foreach my $containername (keys %{$self->{container_infos}}) { + $self->{output}->add_disco_entry(name => $containername, + id => $self->{container_infos}->{$containername}->{id}, + image => $self->{container_infos}->{$containername}->{image}, + state => $self->{container_infos}->{$containername}->{state}, + ); + } +} + +sub run { + my ($self, %options) = @_; + + $self->api_request(); + + foreach my $containername (keys %{$self->{container_infos}}) { + $self->{output}->output_add(long_msg => sprintf("%s [id = %s , image = %s, state = %s]", + $containername, + $self->{container_infos}->{$containername}->{id}, + $self->{container_infos}->{$containername}->{image}, + $self->{container_infos}->{$containername}->{state})); + } + $self->{output}->output_add(severity => 'OK', short_msg => 'List containers:'); From cfb9a2d085984fd9371007cb21bdd499a2be39ce Mon Sep 17 00:00:00 2001 From: Shini31 Date: Mon, 14 Sep 2015 11:36:03 +0200 Subject: [PATCH 2/3] fix bad ident --- cloud/docker/mode/listcontainers.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloud/docker/mode/listcontainers.pm b/cloud/docker/mode/listcontainers.pm index 0c2935e7e..f1985d6fe 100644 --- a/cloud/docker/mode/listcontainers.pm +++ b/cloud/docker/mode/listcontainers.pm @@ -129,10 +129,10 @@ sub run { foreach my $containername (keys %{$self->{container_infos}}) { $self->{output}->output_add(long_msg => sprintf("%s [id = %s , image = %s, state = %s]", - $containername, - $self->{container_infos}->{$containername}->{id}, - $self->{container_infos}->{$containername}->{image}, - $self->{container_infos}->{$containername}->{state})); + $containername, + $self->{container_infos}->{$containername}->{id}, + $self->{container_infos}->{$containername}->{image}, + $self->{container_infos}->{$containername}->{state})); } $self->{output}->output_add(severity => 'OK', From a26b87b0d4d89d759cea59436e77a090e26ed28d Mon Sep 17 00:00:00 2001 From: Shini31 Date: Mon, 14 Sep 2015 16:59:39 +0200 Subject: [PATCH 3/3] Fix #153 - Add exclude option for container state --- cloud/docker/mode/listcontainers.pm | 59 +++++++++++++++++++---------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/cloud/docker/mode/listcontainers.pm b/cloud/docker/mode/listcontainers.pm index f1985d6fe..2db673617 100644 --- a/cloud/docker/mode/listcontainers.pm +++ b/cloud/docker/mode/listcontainers.pm @@ -35,18 +35,19 @@ sub new { $self->{version} = '1.1'; $options{options}->add_options(arguments => { - "hostname:s" => { name => 'hostname' }, - "port:s" => { name => 'port', default => '2376'}, - "proto:s" => { name => 'proto', default => 'https' }, - "urlpath:s" => { name => 'url_path', default => '/' }, - "credentials" => { name => 'credentials' }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, - "ssl:s" => { name => 'ssl', }, - "cert-file:s" => { name => 'cert_file' }, - "key-file:s" => { name => 'key_file' }, - "cacert-file:s" => { name => 'cacert_file' }, - "timeout:s" => { name => 'timeout' }, + "hostname:s" => { name => 'hostname' }, + "port:s" => { name => 'port', default => '2376'}, + "proto:s" => { name => 'proto', default => 'https' }, + "urlpath:s" => { name => 'url_path', default => '/' }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, + "ssl:s" => { name => 'ssl', }, + "cert-file:s" => { name => 'cert_file' }, + "key-file:s" => { name => 'key_file' }, + "cacert-file:s" => { name => 'cacert_file' }, + "exclude:s" => { name => 'exclude' }, + "timeout:s" => { name => 'timeout' }, }); $self->{http} = centreon::plugins::http->new(output => $self->{output}); @@ -65,6 +66,16 @@ sub check_options { $self->{http}->set_options(%{$self->{option_results}}) } +sub check_exclude { + my ($self, %options) = @_; + + if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{status}}(\s|,|$)/) { + $self->{output}->output_add(long_msg => sprintf("Skipping ${options{status}} container.")); + return 1; + } +return 0; +} + sub api_request { my ($self, %options) = @_; @@ -84,20 +95,22 @@ sub api_request { } foreach my $val (@$webcontent) { + my $containerstate; + if (($val->{Status} =~ m/^Up/) && ($val->{Status} =~ m/^(?:(?!Paused).)*$/)) { + return if ($self->check_exclude(status => 'Running')); + $containerstate = 'Running'; + } elsif ($val->{Status} =~ m/^Exited/) { + return if ($self->check_exclude(status => 'Exited')); + $containerstate = 'Exited'; + } elsif ($val->{Status} =~ m/\(Paused\)$/) { + return if ($self->check_exclude(status => 'Paused')); + $containerstate = 'Paused'; + } my $containername = $val->{Names}->[0]; $containername =~ s/^\///; $self->{container_infos}->{$containername}->{id} = $val->{Id}; $self->{container_infos}->{$containername}->{image} = $val->{Image}; - my $containerstate; - if (($val->{Status} =~ m/^Up/) && ($val->{Status} =~ m/^(?:(?!Paused).)*$/)) { - $containerstate = 'Running'; - } elsif ($val->{Status} =~ m/^Exited/) { - $containerstate = 'Exited'; - } elsif ($val->{Status} =~ m/\(Paused\)$/) { - $containerstate = 'Paused'; - } $self->{container_infos}->{$containername}->{state} = $containerstate; - } } @@ -197,6 +210,10 @@ Specify key to send to the webserver Specify root certificate to send to the webserver +=item B<--exlude> + +Exclude specific container's state (comma seperated list) (Example: --exclude=Paused,Running) + =item B<--timeout> Threshold for HTTP timeout (Default: 3)