From 629c7d5ad6412b3fcf86a700bcf8452f84de71de Mon Sep 17 00:00:00 2001 From: qgarnier Date: Wed, 9 Feb 2022 15:17:32 +0100 Subject: [PATCH] (core) catch connect croack error for database plugin (#3477) --- centreon-plugins/centreon/plugins/dbi.pm | 29 ++++++++++++++++-------- centreon-plugins/database/db2/dbi.pm | 17 ++++++++++++-- centreon-plugins/database/oracle/dbi.pm | 19 +++++++++++++--- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/centreon-plugins/centreon/plugins/dbi.pm b/centreon-plugins/centreon/plugins/dbi.pm index 474cb0b26..e1cf2f735 100644 --- a/centreon-plugins/centreon/plugins/dbi.pm +++ b/centreon-plugins/centreon/plugins/dbi.pm @@ -224,18 +224,29 @@ sub connect { } $self->set_signal_handlers(); - alarm($self->{timeout}) if (defined($self->{timeout})); - $self->{instance} = DBI->connect( - "DBI:". $self->{data_source}, - $self->{username}, - $self->{password}, - { RaiseError => 0, PrintError => 0, AutoCommit => 1, %{$self->{connect_options_hash}} } - ); - alarm(0) if (defined($self->{timeout})); + my $connect_error; + eval { + alarm($self->{timeout}) if (defined($self->{timeout})); + $self->{instance} = DBI->connect( + "DBI:". $self->{data_source}, + $self->{username}, + $self->{password}, + { RaiseError => 0, PrintError => 0, AutoCommit => 1, %{$self->{connect_options_hash}} } + ); + alarm(0) if (defined($self->{timeout})); + }; + if ($@) { + $connect_error = $@; + } + $self->prepare_destroy(); if (!defined($self->{instance})) { - my $err_msg = sprintf('Cannot connect: %s', defined($DBI::errstr) ? $DBI::errstr : '(no error string)'); + my $err_msg = sprintf( + 'Cannot connect: %s', + defined($DBI::errstr) ? $DBI::errstr : + (defined($connect_error) ? $connect_error : '(no error string)') + ); if ($dontquit == 0) { $self->{output}->add_option_msg(short_msg => $err_msg); $self->{output}->option_exit(exit_litteral => $self->{sql_errors_exit}); diff --git a/centreon-plugins/database/db2/dbi.pm b/centreon-plugins/database/db2/dbi.pm index 26a6d1bb9..21eaaf2da 100644 --- a/centreon-plugins/database/db2/dbi.pm +++ b/centreon-plugins/database/db2/dbi.pm @@ -55,6 +55,7 @@ sub connect { } } + my $connect_error; if (defined($self->{timeout})) { my $mask = POSIX::SigSet->new(SIGALRM); my $action = POSIX::SigAction->new( @@ -69,14 +70,26 @@ sub connect { $self->connect_db2(); }; alarm(0); + if ($@) { + $connect_error = $@; + } }; sigaction(SIGALRM, $oldaction); } else { - $self->connect_db2(); + eval { + $self->connect_db2(); + }; + if ($@) { + $connect_error = $@; + } } if (!defined($self->{instance})) { - my $err_msg = sprintf('Cannot connect: %s', defined($DBI::errstr) ? $DBI::errstr : '(no error string)'); + my $err_msg = sprintf( + 'Cannot connect: %s', + defined($DBI::errstr) ? $DBI::errstr : + (defined($connect_error) ? $connect_error : '(no error string)') + ); if ($dontquit == 0) { $self->{output}->add_option_msg(short_msg => $err_msg); $self->{output}->option_exit(exit_litteral => $self->{sql_errors_exit}); diff --git a/centreon-plugins/database/oracle/dbi.pm b/centreon-plugins/database/oracle/dbi.pm index e2ff5dd51..81d41f10f 100644 --- a/centreon-plugins/database/oracle/dbi.pm +++ b/centreon-plugins/database/oracle/dbi.pm @@ -28,7 +28,7 @@ use POSIX qw(:signal_h); sub connect_oracle { my ($self, %options) = @_; - + $self->{instance} = DBI->connect( 'DBI:' . $self->{data_source}, $self->{username}, @@ -55,6 +55,7 @@ sub connect { } } + my $connect_error; if (defined($self->{timeout})) { my $mask = POSIX::SigSet->new(SIGALRM); my $action = POSIX::SigAction->new( @@ -69,14 +70,26 @@ sub connect { $self->connect_oracle(); }; alarm(0); + if ($@) { + $connect_error = $@; + } }; sigaction(SIGALRM, $oldaction); } else { - $self->connect_oracle(); + eval { + $self->connect_oracle(); + }; + if ($@) { + $connect_error = $@; + } } if (!defined($self->{instance})) { - my $err_msg = sprintf('Cannot connect: %s', defined($DBI::errstr) ? $DBI::errstr : '(no error string)'); + my $err_msg = sprintf( + 'Cannot connect: %s', + defined($DBI::errstr) ? $DBI::errstr : + (defined($connect_error) ? $connect_error : '(no error string)') + ); if ($dontquit == 0) { $self->{output}->add_option_msg(short_msg => $err_msg); $self->{output}->option_exit(exit_litteral => $self->{sql_errors_exit});