centreon-plugins/apps/centreon/local/mode/downtimetrap.pm

280 lines
12 KiB
Perl

#
# Copyright 2020 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 apps::centreon::local::mode::downtimetrap;
use base qw(centreon::plugins::mode);
my $use_module_snmp;
my $use_module_netsnmp;
BEGIN {
eval {
require SNMP;
SNMP->import();
};
if ($@) {
$use_module_snmp = 0;
eval {
require Net::SNMP;
Net::SNMP->import();
};
if ($@) {
$use_module_netsnmp = 0;
} else {
$use_module_netsnmp = 1;
}
} else {
$use_module_snmp = 1;
}
}
use strict;
use warnings;
use Sys::Hostname;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$options{options}->add_options(arguments =>
{
"oid-trap:s" => { name => 'oid_trap', default => '.1.3.6.1.4.1.50000.1.1' },
"oid-hostname:s" => { name => 'oid_hostname', default => '.1.3.6.1.4.1.50000.2.1' },
"oid-start:s" => { name => 'oid_start', default => '.1.3.6.1.4.1.50000.2.2' },
"oid-end:s" => { name => 'oid_end', default => '.1.3.6.1.4.1.50000.2.4' },
"oid-author:s" => { name => 'oid_author', default => '.1.3.6.1.4.1.50000.2.5' },
"oid-comment:s" => { name => 'oid_comment', default => '.1.3.6.1.4.1.50000.2.6' },
"oid-duration:s" => { name => 'oid_duration', default => '.1.3.6.1.4.1.50000.2.7' },
"centreon-server:s" => { name => 'centreon_server' },
"author:s" => { name => 'author', default => 'system reboot' },
"comment:s" => { name => 'comment', default => 'the system reboots.' },
"duration:s" => { name => 'duration', default => 300 },
"wait:s" => { name => 'wait' },
"snmptrap-command:s" => { name => 'snmptrap_command', default => 'snmptrap' },
"display-options" => { name => 'display_options' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{centreon_server}) || $self->{option_results}->{centreon_server} eq '') {
$self->{output}->add_option_msg(short_msg => "Please set centreon-server option.");
$self->{output}->option_exit();
}
}
sub snmp_build_args {
my ($self, %options) = @_;
$self->{snmp_args} = { hostname => {}, duration => {} };
if ($self->{option_results}->{oid_hostname} =~ /^(.*)\.(\d+)$/) {
$self->{snmp_args}->{hostname} = { oid => $1, instance => $2, val => hostname(), type => 'OCTETSTR', type_cmd => 's' };
}
if ($self->{option_results}->{oid_start} =~ /^(.*)\.(\d+)$/) {
$self->{snmp_args}->{start} = { oid => $1, instance => $2, val => time(), type => 'INTEGER', type_cmd => 'i' };
}
if ($self->{option_results}->{oid_end} =~ /^(.*)\.(\d+)$/) {
$self->{snmp_args}->{end} = { oid => $1, instance => $2, val => time() + $self->{option_results}->{duration}, type => 'INTEGER', type_cmd => 'i' };
}
if ($self->{option_results}->{oid_author} =~ /^(.*)\.(\d+)$/) {
$self->{snmp_args}->{author} = { oid => $1, instance => $2, val => $self->{option_results}->{author}, type => 'OCTETSTR', type_cmd => 's' };
}
if ($self->{option_results}->{oid_comment} =~ /^(.*)\.(\d+)$/) {
$self->{snmp_args}->{comment} = { oid => $1, instance => $2, val => $self->{option_results}->{comment}, type => 'OCTETSTR', type_cmd => 's' };
}
if ($self->{option_results}->{oid_duration} =~ /^(.*)\.(\d+)$/) {
$self->{snmp_args}->{duration} = { oid => $1, instance => $2, val => $self->{snmp_args}->{end}->{val} - $self->{snmp_args}->{start}->{val}, type => 'INTEGER', type_cmd => 'i' };
}
}
sub send_trap_snmp {
my ($self, %options) = @_;
$SNMP::auto_init_mib = 0;
$self->snmp_build_args();
my $varlist = new SNMP::VarList(
new SNMP::Varbind([$self->{snmp_args}->{hostname}->{oid}, $self->{snmp_args}->{hostname}->{instance}, $self->{snmp_args}->{hostname}->{val}, $self->{snmp_args}->{hostname}->{type}]),
new SNMP::Varbind([$self->{snmp_args}->{start}->{oid}, $self->{snmp_args}->{start}->{instance}, $self->{snmp_args}->{start}->{val}, $self->{snmp_args}->{start}->{type}]),
new SNMP::Varbind([$self->{snmp_args}->{end}->{oid}, $self->{snmp_args}->{end}->{instance}, $self->{snmp_args}->{end}->{val}, $self->{snmp_args}->{end}->{type}]),
new SNMP::Varbind([$self->{snmp_args}->{author}->{oid}, $self->{snmp_args}->{author}->{instance}, $self->{snmp_args}->{author}->{val}, $self->{snmp_args}->{author}->{type}]),
new SNMP::Varbind([$self->{snmp_args}->{comment}->{oid}, $self->{snmp_args}->{comment}->{instance}, $self->{snmp_args}->{comment}->{val}, $self->{snmp_args}->{comment}->{type}]),
new SNMP::Varbind([$self->{snmp_args}->{duration}->{oid}, $self->{snmp_args}->{duration}->{instance}, $self->{snmp_args}->{duration}->{val}, $self->{snmp_args}->{duration}->{type}]),
);
my $trapsess = new SNMP::TrapSession(DestHost => $self->{option_results}->{centreon_server}, RemotePort => 162,
UseNumeric => 1, Version => '2c', Community => 'public');
$trapsess->trap(oid => $self->{option_results}->{oid_trap},
uptime => time(),
$varlist);
}
sub send_trap_netsnmp {
my ($self, %options) = @_;
$self->snmp_build_args();
my ($snmp_session, $error) = Net::SNMP->session(-hostname => $self->{option_results}->{centreon_server},
-community => "public",
-port => 162,
-version => "snmpv2c",
-translate => [-all => 0]);
if (!defined($snmp_session)) {
$self->{output}->add_option_msg(short_msg => "SNMP Session : $error");
$self->{output}->option_exit();
}
my $args = [];
push @$args, ('1.3.6.1.2.1.1.3.0', eval "Net::SNMP::TIMETICKS", time());
push @$args, ('1.3.6.1.6.3.1.1.4.1.0', eval "Net::SNMP::OBJECT_IDENTIFIER", $self->{option_results}->{oid_trap});
foreach (('hostname', 'start', 'end', 'author', 'comment', 'duration')) {
my $type = $self->{snmp_args}->{$_}->{type};
$type = 'OCTET_STRING' if ($type eq 'OCTETSTR');
my $result;
my $ltmp = "\$result = Net::SNMP::$type;";
eval $ltmp;
push @$args, ($self->{snmp_args}->{$_}->{oid} . '.' . $self->{snmp_args}->{$_}->{instance}, $result, $self->{snmp_args}->{$_}->{val});
}
$snmp_session->snmpv2_trap(-varbindlist => $args);
$snmp_session->close();
}
sub send_trap_cmd {
my ($self, %options) = @_;
$self->snmp_build_args();
my $options = '-v 2c -c public ' . $self->{option_results}->{centreon_server} . ' ' . time() . ' ' . $self->{option_results}->{oid_trap};
$options .= ' ' . $self->{snmp_args}->{hostname}->{oid} . '.' . $self->{snmp_args}->{hostname}->{instance} . ' ' . $self->{snmp_args}->{hostname}->{type_cmd} . ' "' . $self->{snmp_args}->{hostname}->{val} . '"';
$options .= ' ' . $self->{snmp_args}->{start}->{oid} . '.' . $self->{snmp_args}->{start}->{instance} . ' ' . $self->{snmp_args}->{start}->{type_cmd} . ' "' . $self->{snmp_args}->{start}->{val} . '"';
$options .= ' ' . $self->{snmp_args}->{end}->{oid} . '.' . $self->{snmp_args}->{end}->{instance} . ' ' . $self->{snmp_args}->{end}->{type_cmd} . ' "' . $self->{snmp_args}->{end}->{val} . '"';
$options .= ' ' . $self->{snmp_args}->{author}->{oid} . '.' . $self->{snmp_args}->{author}->{instance} . ' ' . $self->{snmp_args}->{author}->{type_cmd} . ' "' . $self->{snmp_args}->{author}->{val} . '"';
$options .= ' ' . $self->{snmp_args}->{comment}->{oid} . '.' . $self->{snmp_args}->{comment}->{instance} . ' ' . $self->{snmp_args}->{comment}->{type_cmd} . ' "' . $self->{snmp_args}->{comment}->{val} . '"';
$options .= ' ' . $self->{snmp_args}->{duration}->{oid} . '.' . $self->{snmp_args}->{duration}->{instance} . ' ' . $self->{snmp_args}->{duration}->{type_cmd} . ' "' . $self->{snmp_args}->{duration}->{val} . '"';
if (defined($self->{option_results}->{display_options})) {
$self->{output}->output_add(severity => 'OK',
short_msg => $options);
$self->{output}->display(force_ignore_perfdata => 1, nolabel => 1);
$self->{output}->exit();
}
$self->{option_results}->{timeout} = 10;
centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
command => $self->{option_results}->{snmptrap_command},
command_options => $options);
}
sub run {
my ($self, %options) = @_;
if ($use_module_snmp == 1 && !defined($self->{option_results}->{display_options})) {
$self->send_trap_snmp();
} elsif ($use_module_netsnmp == 1 && !defined($self->{option_results}->{display_options})) {
$self->send_trap_netsnmp();
} else {
$self->send_trap_cmd();
}
if (defined($self->{option_results}->{wait}) && $self->{option_results}->{wait} =~ /\d+/) {
sleep($self->{option_results}->{wait});
}
$self->{output}->output_add(severity => 'OK',
short_msg => 'SNMP trap sent.');
$self->{output}->display(force_ignore_perfdata => 1);
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Send a SNMP trap to set a downtime.
=over 8
=item B<--oid-trap>
Specify OID trap (Default: '.1.3.6.1.4.1.50000.1.1')
=item B<--oid-hostname>
Specify OID for hostname (Default: '.1.3.6.1.4.1.50000.2.1')
=item B<--oid-start>
Specify OID for downtime start time (Default: '.1.3.6.1.4.1.50000.2.2')
=item B<--oid-end>
Specify OID for downtime end time (Default: '.1.3.6.1.4.1.50000.2.3')
=item B<--oid-author>
Specify OID for downtime author (Default: '.1.3.6.1.4.1.50000.2.4')
=item B<--oid-comment>
Specify OID for downtime comment (Default: '.1.3.6.1.4.1.50000.2.5')
=item B<--oid-duration>
Specify OID for downtime duration (Default: '.1.3.6.1.4.1.50000.2.6')
=item B<--centreon-server>
Address of centreon server to send the trap (Required)
=item B<--author>
Set the downtime author (Default: 'system reboot').
=item B<--comment>
Set the downtime comment (Default: 'the system reboots.').
=item B<--duration>
Set the downtime duration in seconds (Default: 300)
=item B<--wait>
Time in seconds to wait
=item B<--snmptrap-command>
snmptrap command used (Default: 'snmptrap').
Use if the SNMP perl module is not installed.
=item B<--display-options>
Only display snmptrap command options.
=back
=cut