From ce6dde2dd45b44eacb0f7a247fcd351c8a0db534 Mon Sep 17 00:00:00 2001 From: Mathieu Cinquin Date: Fri, 27 Mar 2015 11:28:44 +0100 Subject: [PATCH] Refs #6202 - Add possibility to send a certificate --- apps/protocols/http/mode/responsetime.pm | 72 ++++++++++++++-------- centreon/plugins/httplib.pm | 77 ++++++++++++++---------- 2 files changed, 91 insertions(+), 58 deletions(-) diff --git a/apps/protocols/http/mode/responsetime.pm b/apps/protocols/http/mode/responsetime.pm index 8193506e7..e8d56f2c2 100644 --- a/apps/protocols/http/mode/responsetime.pm +++ b/apps/protocols/http/mode/responsetime.pm @@ -1,35 +1,36 @@ ############################################################################### -# Copyright 2005-2013 MERETHIS +# Copyright 2005-2015 CENTREON # 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 +# +# 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 +# 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 +# +# 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 +# +# 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 timeelapsedutable, -# regardless of the license terms of these independent modules, and to copy and -# distribute the resulting timeelapsedutable 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 +# +# As a special exception, the copyright holders of this program give CENTREON +# permission to link this program with independent modules to produce an timeelapsedutable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting timeelapsedutable under terms of CENTREON choice, provided that +# CENTREON 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 -# Author : Simon BOMM +# Authors : Simon BOMM +# Mathieu Cinquin # # Based on De Bodt Lieven plugin #################################################################################### @@ -48,7 +49,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' }, @@ -64,6 +65,9 @@ sub new { "critical:s" => { name => 'critical' }, "timeout:s" => { name => 'timeout', default => '3' }, "ssl:s" => { name => 'ssl', }, + "cert-file:s" => { name => 'cert_file' }, + "cert-pwd:s" => { name => 'cert_pwd' }, + "cert-pkcs12" => { name => 'cert_pkcs12' }, }); return $self; } @@ -94,6 +98,10 @@ sub check_options { $self->{output}->add_option_msg(short_msg => "You need to set --username= and --password= options when --credentials is used"); $self->{output}->option_exit(); } + if ((defined($self->{option_results}->{pkcs12})) && (!defined($self->{option_results}->{cert_file}) && !defined($self->{option_results}->{cert_pwd}))) { + $self->{output}->add_option_msg(short_msg => "You need to set --cert-file= and --cert-pwd= options when --pkcs12 is used"); + $self->{output}->option_exit(); + } } sub run { @@ -102,15 +110,15 @@ sub run { if (!defined($self->{option_results}->{port})) { $self->{option_results}->{port} = centreon::plugins::httplib::get_port($self); } - + my $timing0 = [gettimeofday]; - - my $webcontent = centreon::plugins::httplib::connect($self, connection_exit => 'critical'); + + my $webcontent = centreon::plugins::httplib::connect($self, connection_exit => 'critical'); my $timeelapsed = tv_interval ($timing0, [gettimeofday]); $self->{output}->output_add(long_msg => $webcontent); - + my $exit = $self->{perfdata}->threshold_check(value => $timeelapsed, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); $self->{output}->output_add(severity => $exit, @@ -186,6 +194,18 @@ Threshold warning in seconds (Webpage response time) Threshold critical in seconds (Webpage response time) +=item B<--cert-file> + +Specify certificate to send to the webserver + +=item B<--cert-pwd> + +Specify certificate's password + +=item B<--cert-pkcs12> + +Specify type of certificate (PKCS12) + =back =cut diff --git a/centreon/plugins/httplib.pm b/centreon/plugins/httplib.pm index d93e2afdc..46e91d4de 100644 --- a/centreon/plugins/httplib.pm +++ b/centreon/plugins/httplib.pm @@ -1,35 +1,36 @@ ############################################################################### -# Copyright 2005-2013 MERETHIS +# Copyright 2005-2015 CENTREON # 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 +# +# 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 +# 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 +# +# 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 +# +# 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 timeelapsedutable, -# regardless of the license terms of these independent modules, and to copy and -# distribute the resulting timeelapsedutable 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 +# +# As a special exception, the copyright holders of this program give CENTREON +# permission to link this program with independent modules to produce an timeelapsedutable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting timeelapsedutable under terms of CENTREON choice, provided that +# CENTREON 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 -# Author : Simon BOMM +# Authors : Simon BOMM +# Mathieu Cinquin # # Based on De Bodt Lieven plugin #################################################################################### @@ -38,13 +39,14 @@ package centreon::plugins::httplib; use strict; use warnings; + use LWP::UserAgent; use HTTP::Cookies; use URI; sub get_port { my ($self, %options) = @_; - + my $cache_port = ''; if (defined($self->{option_results}->{port}) && $self->{option_results}->{port} ne '') { $cache_port = $self->{option_results}->{port}; @@ -52,7 +54,7 @@ sub get_port { $cache_port = 80 if ($self->{option_results}->{proto} eq 'http'); $cache_port = 443 if ($self->{option_results}->{proto} eq 'https'); } - + return $cache_port; } @@ -60,14 +62,14 @@ sub connect { my ($self, %options) = @_; my $method = defined($options{method}) ? $options{method} : 'GET'; my $connection_exit = defined($options{connection_exit}) ? $options{connection_exit} : 'unknown'; - + my $ua = LWP::UserAgent->new(keep_alive => 1, protocols_allowed => ['http', 'https'], timeout => $self->{option_results}->{timeout}, requests_redirectable => [ 'GET', 'HEAD', 'POST' ]); if (defined($options{cookies_file})) { $ua->cookie_jar(HTTP::Cookies->new(file => $options{cookies_file}, autosave => 1)); } - + my ($response, $content); my ($req, $url); if (defined($self->{option_results}->{port}) && $self->{option_results}->{port} =~ /^[0-9]+$/) { @@ -92,7 +94,7 @@ sub connect { } } } - + if ($method eq 'POST') { if (defined($content_type_forced)) { $req->content_type($content_type_forced); @@ -105,14 +107,14 @@ sub connect { $req->content_type('application/x-www-form-urlencoded'); $req->content($uri_post->query); } - } - + } + if (defined($self->{option_results}->{credentials}) && defined($self->{option_results}->{ntlm})) { $ua->credentials($self->{option_results}->{hostname} . ':' . $self->{option_results}->{port}, '', $self->{option_results}->{username}, $self->{option_results}->{password}); } elsif (defined($self->{option_results}->{credentials})) { $req->authorization_basic($self->{option_results}->{username}, $self->{option_results}->{password}); } - + if (defined($self->{option_results}->{proxyurl})) { $ua->proxy(['http', 'https'], $self->{option_results}->{proxyurl}); } @@ -124,16 +126,27 @@ sub connect { ); IO::Socket::SSL::set_default_context($context); } - + + if (defined($self->{option_results}->{cert_pkcs12}) && $self->{option_results}->{cert_file} ne '' && $self->{option_results}->{cert_pwd} ne '') { + use Net::SSL; + $ENV{HTTPS_PKCS12_FILE} = $self->{option_results}->{cert_file}; + $ENV{HTTPS_PKCS12_PASSWORD} = $self->{option_results}->{cert_pwd}; + } + + if (defined($self->{option_results}->{cert_file}) && !defined($self->{option_results}->{cert_pkcs12})) { + use Net::SSL; + $ENV{HTTPS_CERT_FILE} = $self->{option_results}->{cert_file}; + } + $response = $ua->request($req); if ($response->is_success) { $content = $response->content; return $content; } - + $self->{output}->output_add(severity => $connection_exit, - short_msg => $response->status_line); + short_msg => $response->status_line); $self->{output}->display(); $self->{output}->exit(); }