(plugin) hardware::devices:📷:optelecom::snmp - new (#4629)

This commit is contained in:
qgarnier 2023-09-11 09:43:04 +02:00 committed by GitHub
parent f6068be83a
commit 3ff6b3f79d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1170 additions and 0 deletions

View File

@ -0,0 +1,5 @@
{
"dependencies": [
"libsnmp-perl"
]
}

View File

@ -0,0 +1,14 @@
{
"pkg_name": "centreon-plugin-Hardware-Devices-Camera-Optelecom-Snmp",
"pkg_summary": "Centreon Plugin to monitor Optelecom camera using SNMP",
"plugin_name": "centreon_camera_optelecom_snmp.pl",
"files": [
"centreon/plugins/script_snmp.pm",
"centreon/plugins/snmp.pm",
"snmp_standard/mode/interfaces.pm",
"snmp_standard/mode/listinterfaces.pm",
"snmp_standard/mode/resources/",
"snmp_standard/mode/uptime.pm",
"hardware/devices/camera/optelecom/snmp/"
]
}

View File

@ -0,0 +1,5 @@
{
"dependencies": [
"perl(SNMP)"
]
}

View File

@ -0,0 +1,417 @@
#
# Copyright 2023 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 hardware::devices::camera::optelecom::snmp::mode::alarms;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng);
sub custom_alarm_output {
my ($self, %options) = @_;
return sprintf(
"alarm: %s",
$self->{result_values}->{alarm}
);
}
sub device_long_output {
my ($self, %options) = @_;
return sprintf(
"checking device '%s'",
$options{instance_value}->{deviceName}
);
}
sub prefix_device_output {
my ($self, %options) = @_;
return sprintf(
"device '%s' ",
$options{instance_value}->{deviceName}
);
}
sub custom_alarm_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
nlabel => 'alarm.enabled.count',
instances => [$self->{result_values}->{deviceName}, $self->{result_values}->{alarmName}],
value => sprintf('%s', $self->{result_values}->{alarmValue})
);
}
sub prefix_alarm_output {
my ($self, %options) = @_;
return "alarm '" . $options{instance_value}->{alarmName} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'devices', type => 3, cb_prefix_output => 'prefix_device_output', cb_long_output => 'device_long_output',
indent_long_output => ' ', message_multiple => 'All devices are ok',
group => [
{ name => 'alarms', type => 1, cb_prefix_output => 'prefix_alarm_output', message_multiple => 'all alarms are ok', skipped_code => { -10 => 1 } }
]
}
];
$self->{maps_counters}->{alarms} = [
{
label => 'alarm-status',
type => 2,
critical_default => '%{alarm} eq "enabled"',
set => {
key_values => [
{ name => 'alarm' }, { name => 'alarmValue' }, { name => 'alarmName' }, { name => 'deviceName' }
],
closure_custom_output => $self->can('custom_alarm_output'),
closure_custom_threshold_check => \&catalog_status_threshold_ng,
closure_custom_perfdata => $self->can('custom_alarm_perfdata')
}
}
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
$options{options}->add_options(arguments => {
'filter-device-name:s' => { name => 'filter_device_name' }
});
return $self;
}
my $mapping_device = {
serial => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.6' }, # optcSerialNumber
userLabel1 => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.8' }, # optcUserLabel1
userLabel2 => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.9' } # optcUserLabel2
};
my $mapping_stream = {
streamDesc => { oid => '.1.3.6.1.4.1.17534.2.2.2.2.1.5' }, # optcStreamDescription
streamDownAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.2.2.1.10' } # optcStreamDownAlarm
};
my $mapping_input = {
inputDesc => { oid => '.1.3.6.1.4.1.17534.2.2.2.3.1.4' }, # optcInputDescription
signalLostAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.2.3.1.7' }, # optcSignalLostAlarm
formatAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.2.3.1.8' } # optcFormatAlarm
};
my $mapping_image_quality = {
badContrastAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.3.1.1.5' }, # optcBadContrastAlarm
badExposureAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.3.1.1.6' }, # optcBadExposureAlarm
lowDetailAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.3.1.1.7' }, # optcLowDetailAlarm
lowSnrAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.3.1.1.8' } # optcLowSnrAlarm
};
my $mapping_tampering = {
noMatchAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.3.2.1.3' }, # optcNoMatchAlarm
positionChangedAlarm => { oid => '.1.3.6.1.4.1.17534.2.2.3.2.1.4' } # optcPositionChangedAlarm
};
sub add_stream_alarm {
my ($self, %options) = @_;
my $oid_streamTable = '.1.3.6.1.4.1.17534.2.2.2.2.1'; # optcStreamEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_streamTable,
start => $mapping_stream->{streamDesc}->{oid}
);
foreach (keys %$snmp_result) {
next if (! /\.(\d+)\.(\d+)$/);
my ($deviceIndex, $streamIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $result = $options{snmp}->map_instance(mapping => $mapping_stream, results => $snmp_result, instance => $deviceIndex . '.' . $streamIndex);
my $name = 'streamDown ' . $result->{streamDesc};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{streamDownAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{streamDownAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
sub add_input_alarm {
my ($self, %options) = @_;
my $oid_inputTable = '.1.3.6.1.4.1.17534.2.2.2.3.1'; # optcInputEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_inputTable,
start => $mapping_stream->{inputDesc}->{oid}
);
$self->{inputs} = {};
foreach (keys %$snmp_result) {
next if (! /\.(\d+)\.(\d+)$/);
my ($deviceIndex, $inputIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $result = $options{snmp}->map_instance(mapping => $mapping_input, results => $snmp_result, instance => $deviceIndex . '.' . $inputIndex);
$self->{inputs}->{$deviceIndex . $inputIndex} = $result->{inputDesc};
my $name = 'signalLost ' . $result->{inputDesc};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{signalLostAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{signalLostAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
$name = 'format ' . $result->{inputDesc};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{formatAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{formatAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
sub add_image_quality_alarm {
my ($self, %options) = @_;
my $oid_imageQualityTable = '.1.3.6.1.4.1.17534.2.2.3.1.1'; # optcImageQualityEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_imageQualityTable,
start => $mapping_image_quality->{badContrastAlarm}->{oid}
);
foreach (keys %$snmp_result) {
next if (! /\.(\d+)\.(\d+)$/);
my ($deviceIndex, $inputIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $result = $options{snmp}->map_instance(mapping => $mapping_image_quality, results => $snmp_result, instance => $deviceIndex . '.' . $inputIndex);
my $name = 'badContrast ' . $self->{inputs}->{$deviceIndex . $inputIndex};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{badContrastAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{badContrastAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
$name = 'badExposure ' . $self->{inputs}->{$deviceIndex . $inputIndex};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{badExposureAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{badExposureAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
$name = 'lowDetail ' . $self->{inputs}->{$deviceIndex . $inputIndex};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{lowDetailAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{lowDetailAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
$name = 'lowSnr ' . $self->{inputs}->{$deviceIndex . $inputIndex};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{lowSnrAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{lowSnrAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
sub add_tampering_alarm {
my ($self, %options) = @_;
my $oid_tamperingTable = '.1.3.6.1.4.1.17534.2.2.3.2.1'; # optcTamperingEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_tamperingTable,
start => $mapping_tampering->{noMatchAlarm}->{oid}
);
foreach (keys %$snmp_result) {
next if (! /\.(\d+)\.(\d+)$/);
my ($deviceIndex, $inputIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $result = $options{snmp}->map_instance(mapping => $mapping_tampering, results => $snmp_result, instance => $deviceIndex . '.' . $inputIndex);
my $name = 'noMatchoptcNoMatchAlarm ' . $self->{inputs}->{$deviceIndex . $inputIndex};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{noMatchAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{noMatchAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
$name = 'positionChanged ' . $self->{inputs}->{$deviceIndex . $inputIndex};
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $result->{positionChangedAlarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{positionChangedAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
sub add_network_alarm {
my ($self, %options) = @_;
my $oid_networkOverloadAlarm = '.1.3.6.1.4.1.17534.2.2.2.4.1.2';
my $snmp_result = $options{snmp}->get_table(
oid => $oid_networkOverloadAlarm
);
foreach (keys %$snmp_result) {
/\.(\d+)$/;
my $deviceIndex = $1;
next if (!defined($self->{devices}->{$deviceIndex}));
my $name = 'networkOverload';
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $snmp_result->{$_} =~ /1|true/i ? 1 : 0,
alarm => $snmp_result->{$_} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
sub add_psu_alarm {
my ($self, %options) = @_;
# it's not linked to a device... weird..
my $oid_powerSupplyAlarm = '.1.3.6.1.4.1.17534.2.2.1.3.3.0';
my $snmp_result = $options{snmp}->get_leef(
oids => [$oid_powerSupplyAlarm]
);
if (defined($snmp_result->{$oid_powerSupplyAlarm})) {
foreach (keys %{$self->{devices}}) {
my $name = 'powersupply';
$self->{devices}->{$_}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$_}->{deviceName},
alarmName => $name,
alarmValue => $snmp_result->{$oid_powerSupplyAlarm} =~ /1|true/i ? 1 : 0,
alarm => $snmp_result->{$oid_powerSupplyAlarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $oid_deviceTable = '.1.3.6.1.4.1.17534.2.2.1.1.1'; # optcSysInfoEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_deviceTable,
start => $mapping_device->{serial}->{oid},
end => $mapping_device->{userLabel2}->{oid},
nothing_quit => 1
);
$self->{devices} = {};
foreach (keys %$snmp_result) {
next if (! /^$mapping_device->{serial}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping_device, results => $snmp_result, instance => $instance);
my $name = defined($result->{userLabel1}) && $result->{userLabel1} ne '' ? $result->{userLabel1} : $result->{serial};
next if (defined($self->{option_results}->{filter_device_name}) && $self->{option_results}->{filter_device_name} ne '' &&
$name !~ /$self->{option_results}->{filter_device_name}/);
$self->{devices}->{$instance} = { deviceName => $name, alarms => {} };
}
my $oid_temperatureAlarm = '.1.3.6.1.4.1.17534.2.2.1.3.1.1.5'; # optcTemperatureAlarm
$snmp_result = $options{snmp}->get_table(oid => $oid_temperatureAlarm);
foreach (keys %$snmp_result) {
next if (! /\.(\d+).(\d+)$/);
my ($deviceIndex, $probeIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $name = 'temperature ' . $probeIndex;
$self->{devices}->{$deviceIndex}->{alarms}->{$name} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
alarmName => $name,
alarmValue => $snmp_result->{$_} =~ /1|true/i ? 1 : 0,
alarm => $snmp_result->{$_} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
$self->add_stream_alarm(snmp => $options{snmp});
$self->add_input_alarm(snmp => $options{snmp});
$self->add_image_quality_alarm(snmp => $options{snmp});
$self->add_tampering_alarm(snmp => $options{snmp});
$self->add_network_alarm(snmp => $options{snmp});
$self->add_psu_alarm(snmp => $options{snmp});
}
1;
__END__
=head1 MODE
Check alarms.
=over 8
=item B<--filter-device-name>
Filter devices by name (can be a regexp).
=item B<--unknown-alarm-status>
Define the conditions to match for the status to be UNKNOWN.
You can use the following variables: %{alarm}, %{alarmName}, %{deviceName}
=item B<--warning-alarm-status>
Define the conditions to match for the status to be WARNING.
You can use the following variables: %{alarm}, %{alarmName}, %{deviceName}
=item B<--critical-alarm-status>
Define the conditions to match for the status to be CRITICAL (default: '%{alarm} eq "enabled"').
You can use the following variables: %{alarm}, %{alarmName}, %{deviceName}
=back
=cut

View File

@ -0,0 +1,180 @@
#
# Copyright 2023 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 hardware::devices::camera::optelecom::snmp::mode::interfaces;
use base qw(snmp_standard::mode::interfaces);
use strict;
use warnings;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
return $self;
}
1;
__END__
=head1 MODE
Check interfaces.
=over 8
=item B<--add-global>
Check global port statistics (By default if no --add-* option is set).
=item B<--add-status>
Check interface status.
=item B<--add-duplex-status>
Check duplex status (with --warning-status and --critical-status).
=item B<--add-traffic>
Check interface traffic.
=item B<--add-errors>
Check interface errors.
=item B<--add-cast>
Check interface cast.
=item B<--add-speed>
Check interface speed.
=item B<--add-volume>
Check interface data volume between two checks (not supposed to be graphed, useful for BI reporting).
=item B<--check-metrics>
If the expression is true, metrics are checked (Default: '%{opstatus} eq "up"').
=item B<--warning-status>
Define the conditions to match for the status to be WARNING.
You can use the following variables: %{admstatus}, %{opstatus}, %{duplexstatus}, %{display}
=item B<--critical-status>
Define the conditions to match for the status to be CRITICAL (Default: '%{admstatus} eq "up" and %{opstatus} ne "up"').
You can use the following variables: %{admstatus}, %{opstatus}, %{duplexstatus}, %{display}
=item B<--warning-*> B<--critical-*>
Thresholds.
Can be: 'total-port', 'total-admin-up', 'total-admin-down', 'total-oper-up', 'total-oper-down',
'in-traffic', 'out-traffic', 'in-error', 'in-discard', 'out-error', 'out-discard',
'in-ucast', 'in-bcast', 'in-mcast', 'out-ucast', 'out-bcast', 'out-mcast',
'speed' (b/s).
=item B<--units-traffic>
Units of thresholds for the traffic (Default: 'percent_delta') ('percent_delta', 'bps', 'counter').
=item B<--units-errors>
Units of thresholds for errors/discards (Default: 'percent_delta') ('percent_delta', 'percent', 'delta', 'deltaps', 'counter').
=item B<--units-cast>
Units of thresholds for communication types (Default: 'percent_delta') ('percent_delta', 'percent', 'delta', 'deltaps', 'counter').
=item B<--nagvis-perfdata>
Display traffic perfdata to be compatible with nagvis widget.
=item B<--interface>
Set the interface (number expected) ex: 1,2,... (empty means 'check all interfaces').
=item B<--name>
Allows you to define the interface (in option --interface) by name instead of OID index. The name matching mode supports regular expressions.
=item B<--speed>
Set interface speed for incoming/outgoing traffic (in Mb).
=item B<--speed-in>
Set interface speed for incoming traffic (in Mb).
=item B<--speed-out>
Set interface speed for outgoing traffic (in Mb).
=item B<--map-speed-dsl>
Get interface speed configuration for interface type 'adsl' and 'vdsl2'.
Syntax: --map-speed-dsl=interface-src-name,interface-dsl-name
E.g: --map-speed-dsl=Et0.835,Et0-vdsl2
=item B<--force-counters64>
Force to use 64 bits counters only. Can be used to improve performance.
=item B<--force-counters32>
Force to use 32 bits counters (even in snmp v2c and v3). Should be used when 64 bits counters are buggy.
=item B<--reload-cache-time>
Time in minutes before reloading cache file (default: 180).
=item B<--oid-filter>
Define the OID to be used to filter interfaces (default: ifName) (values: ifDesc, ifAlias, ifName, IpAddr).
=item B<--oid-display>
Define the OID that will be used to name the interfaces (default: ifName) (values: ifDesc, ifAlias, ifName, IpAddr).
=item B<--oid-extra-display>
Add an OID to display.
=item B<--display-transform-src> B<--display-transform-dst>
Modify the interface name displayed by using a regular expression.
Eg: adding --display-transform-src='eth' --display-transform-dst='ens' will replace all occurrences of 'eth' with 'ens'
=item B<--show-cache>
Display cache interface datas.
=back
=cut

View File

@ -0,0 +1,201 @@
#
# Copyright 2023 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 hardware::devices::camera::optelecom::snmp::mode::networks;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub device_long_output {
my ($self, %options) = @_;
return sprintf(
"checking device '%s'",
$options{instance_value}->{deviceName}
);
}
sub prefix_device_output {
my ($self, %options) = @_;
return sprintf(
"device '%s' ",
$options{instance_value}->{deviceName}
);
}
sub prefix_network_output {
my ($self, %options) = @_;
return sprintf(
"network '%s' ",
$options{instance_value}->{ipAddress}
);
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'devices', type => 3, cb_prefix_output => 'prefix_device_output', cb_long_output => 'device_long_output',
indent_long_output => ' ', message_multiple => 'All devices are ok',
group => [
{ name => 'networks', type => 1, cb_prefix_output => 'prefix_network_output', message_multiple => 'all networks are ok', skipped_code => { -10 => 1 } }
]
}
];
$self->{maps_counters}->{networks} = [
{ label => 'traffic-in', nlabel => 'network.traffic.in.bitspersecond', set => {
key_values => [ { name => 'trafficIn' }, { name => 'deviceName' }, { name => 'ipAddress' } ],
output_template => 'in: %s %s/s',
output_change_bytes => 2,
closure_custom_perfdata => sub {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
nlabel => $self->{nlabel},
unit => 'b/s',
instances => [$self->{result_values}->{deviceName}, $self->{result_values}->{ipAddress}],
value => $self->{result_values}->{trafficIn},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}),
min => 0
);
}
}
},
{ label => 'traffic-out', nlabel => 'network.traffic.out.bitspersecond', set => {
key_values => [ { name => 'trafficOut' }, { name => 'deviceName' }, { name => 'ipAddress' } ],
output_template => 'out: %s %s/s',
output_change_bytes => 2,
closure_custom_perfdata => sub {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
nlabel => $self->{nlabel},
unit => 'b/s',
instances => [$self->{result_values}->{deviceName}, $self->{result_values}->{ipAddress}],
value => $self->{result_values}->{trafficOut},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel}),
min => 0
);
}
}
}
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
$options{options}->add_options(arguments => {
'filter-device-name:s' => { name => 'filter_device_name' }
});
return $self;
}
my $mapping_device = {
serial => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.6' }, # optcSerialNumber
userLabel1 => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.8' }, # optcUserLabel1
userLabel2 => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.9' } # optcUserLabel2
};
my $mapping_network = {
ipAddress => { oid => '.1.3.6.1.4.1.17534.2.2.1.4.1.4' }, # optcIPAddress
trafficOut => { oid => '.1.3.6.1.4.1.17534.2.2.1.5.1.1' }, # optcTotalTxBitrate
trafficIn => { oid => '.1.3.6.1.4.1.17534.2.2.1.5.1.2' } # optcTotalRxBitrate
};
sub manage_selection {
my ($self, %options) = @_;
my $oid_deviceTable = '.1.3.6.1.4.1.17534.2.2.1.1.1'; # optcSysInfoEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_deviceTable,
start => $mapping_device->{serial}->{oid},
end => $mapping_device->{userLabel2}->{oid},
nothing_quit => 1
);
$self->{devices} = {};
foreach (keys %$snmp_result) {
next if (! /^$mapping_device->{serial}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping_device, results => $snmp_result, instance => $instance);
my $name = defined($result->{userLabel1}) && $result->{userLabel1} ne '' ? $result->{userLabel1} : $result->{serial};
next if (defined($self->{option_results}->{filter_device_name}) && $self->{option_results}->{filter_device_name} ne '' &&
$name !~ /$self->{option_results}->{filter_device_name}/);
$self->{devices}->{$instance} = { deviceName => $name, networks => {} };
}
my $oid_networkTable = '.1.3.6.1.4.1.17534.2.2.1.4.1'; # optcNetworkSettingsEntry
my $oid_networkStatsTable = '.1.3.6.1.4.1.17534.2.2.1.5.1'; # optcNetworkStatisticsEntry
$snmp_result = $options{snmp}->get_multiple_table(
oids => [ { oid => $oid_networkTable }, { oid => $oid_networkStatsTable } ],
return_type => 1
);
foreach (keys %$snmp_result) {
next if (! /^$mapping_network->{ipAddress}->{oid}\.(\d+).(\d+)$/);
my ($deviceIndex, $netIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $result = $options{snmp}->map_instance(mapping => $mapping_network, results => $snmp_result, instance => $deviceIndex . '.' . $netIndex);
$self->{devices}->{$deviceIndex}->{networks}->{$netIndex} = {
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
ipAddress => $result->{ipAddress},
trafficIn => $result->{trafficIn} * 1000,
trafficOut => $result->{trafficOut} * 1000
};
}
}
1;
__END__
=head1 MODE
Check networks traffic.
=over 8
=item B<--filter-device-name>
Filter devices by name (can be a regexp).
=item B<--warning-*> B<--critical-*>
Thresholds.
Can be: 'traffic-in', 'traffic-out'.
=back
=cut

View File

@ -0,0 +1,219 @@
#
# Copyright 2023 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 hardware::devices::camera::optelecom::snmp::mode::temperatures;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng);
sub custom_alarm_output {
my ($self, %options) = @_;
return sprintf(
"alarm: %s",
$self->{result_values}->{alarm}
);
}
sub device_long_output {
my ($self, %options) = @_;
return sprintf(
"checking device '%s'",
$options{instance_value}->{deviceName}
);
}
sub prefix_device_output {
my ($self, %options) = @_;
return sprintf(
"device '%s' ",
$options{instance_value}->{deviceName}
);
}
sub prefix_temperature_output {
my ($self, %options) = @_;
return "temperature probe '" . $options{instance_value}->{probeIndex} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'devices', type => 3, cb_prefix_output => 'prefix_device_output', cb_long_output => 'device_long_output',
indent_long_output => ' ', message_multiple => 'All devices are ok',
group => [
{ name => 'temperatures', type => 1, cb_prefix_output => 'prefix_temperature_output', message_multiple => 'all temperatures are ok', skipped_code => { -10 => 1 } }
]
}
];
$self->{maps_counters}->{temperatures} = [
{ label => 'probe-temperature', nlabel => 'probe.temperature.celsius', set => {
key_values => [ { name => 'actual' }, { name => 'probeIndex' }, { name => 'deviceName' } ],
output_template => 'temperature: %.2f C',
closure_custom_perfdata => sub {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
nlabel => $self->{nlabel},
unit => 'C',
instances => [$self->{result_values}->{deviceName}, $self->{result_values}->{probeIndex}],
value => sprintf('%.2f', $self->{result_values}->{actual}),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{thlabel}),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{thlabel})
);
}
}
},
{
label => 'alarm-status',
type => 2,
critical_default => '%{alarm} eq "enabled"',
set => {
key_values => [
{ name => 'alarm' }, { name => 'alarmValue' }, { name => 'probeIndex' }, { name => 'deviceName' }
],
closure_custom_output => $self->can('custom_alarm_output'),
closure_custom_threshold_check => \&catalog_status_threshold_ng,
closure_custom_perfdata => sub {
my ($self, %options) = @_;
$self->{output}->perfdata_add(
nlabel => 'probe.temperature.alarm.enabled.count',
instances => [$self->{result_values}->{deviceName}, $self->{result_values}->{probeIndex}],
value => sprintf('%s', $self->{result_values}->{alarmValue})
);
}
}
}
];
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
$options{options}->add_options(arguments => {
'filter-device-name:s' => { name => 'filter_device_name' }
});
return $self;
}
my $mapping_device = {
serial => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.6' }, # optcSerialNumber
userLabel1 => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.8' }, # optcUserLabel1
userLabel2 => { oid => '.1.3.6.1.4.1.17534.2.2.1.1.1.9' } # optcUserLabel2
};
my $mapping_temperature = {
actual => { oid => '.1.3.6.1.4.1.17534.2.2.1.3.1.1.2' }, # optcActualTemperature
alarm => { oid => '.1.3.6.1.4.1.17534.2.2.1.3.1.1.5' }, # optcTemperatureAlarm
};
sub manage_selection {
my ($self, %options) = @_;
my $oid_deviceTable = '.1.3.6.1.4.1.17534.2.2.1.1.1'; # optcSysInfoEntry
my $snmp_result = $options{snmp}->get_table(
oid => $oid_deviceTable,
start => $mapping_device->{serial}->{oid},
end => $mapping_device->{userLabel2}->{oid},
nothing_quit => 1
);
$self->{devices} = {};
foreach (keys %$snmp_result) {
next if (! /^$mapping_device->{serial}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping_device, results => $snmp_result, instance => $instance);
my $name = defined($result->{userLabel1}) && $result->{userLabel1} ne '' ? $result->{userLabel1} : $result->{serial};
next if (defined($self->{option_results}->{filter_device_name}) && $self->{option_results}->{filter_device_name} ne '' &&
$name !~ /$self->{option_results}->{filter_device_name}/);
$self->{devices}->{$instance} = { deviceName => $name, temperatures => {} };
}
my $oid_temperatureTable = '.1.3.6.1.4.1.17534.2.2.1.3.1.1'; # optcTemperatureEntry
$snmp_result = $options{snmp}->get_table(oid => $oid_temperatureTable);
foreach (keys %$snmp_result) {
next if (! /^$mapping_temperature->{actual}->{oid}\.(\d+).(\d+)$/);
my ($deviceIndex, $probeIndex) = ($1, $2);
next if (!defined($self->{devices}->{$deviceIndex}));
my $result = $options{snmp}->map_instance(mapping => $mapping_temperature, results => $snmp_result, instance => $deviceIndex . '.' . $probeIndex);
$self->{devices}->{$deviceIndex}->{temperatures}->{$probeIndex} = {
probeIndex => $probeIndex,
deviceName => $self->{devices}->{$deviceIndex}->{deviceName},
actual => $result->{actual},
alarmValue => $result->{alarm} =~ /1|true/i ? 1 : 0,
alarm => $result->{alarm} =~ /1|true/i ? 'enabled' : 'disabled'
};
}
}
1;
__END__
=head1 MODE
Check temperatures.
=over 8
=item B<--filter-device-name>
Filter devices by name (can be a regexp).
=item B<--unknown-alarm-status>
Define the conditions to match for the status to be UNKNOWN.
You can use the following variables: %{alarm}, %{probeIndex}, %{deviceName}
=item B<--warning-alarm-status>
Define the conditions to match for the status to be WARNING.
You can use the following variables: %{alarm}, %{probeIndex}, %{deviceName}
=item B<--critical-alarm-status>
Define the conditions to match for the status to be CRITICAL (default: '%{alarm} eq "enabled"').
You can use the following variables: %{alarm}, %{probeIndex}, %{deviceName}
=item B<--warning-*> B<--critical-*>
Thresholds.
Can be: 'probe-temperature'.
=back
=cut

View File

@ -0,0 +1,77 @@
#
# Copyright 2023 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 hardware::devices::camera::optelecom::snmp::mode::uptime;
use base qw(snmp_standard::mode::uptime);
use strict;
use warnings;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1);
bless $self, $class;
return $self;
}
1;
__END__
=head1 MODE
Check system uptime.
=over 8
=item B<--warning-uptime>
Warning threshold.
=item B<--critical-uptime>
Critical threshold.
=item B<--add-sysdesc>
Display system description.
=item B<--force-oid>
Can choose your oid (numeric format only).
=item B<--check-overload>
Uptime counter limit is 4294967296 and overflow.
With that option, we manage the counter going back. But there is a few chance we can miss a reboot.
=item B<--reboot-window>
To be used with check-overload option. Time in milliseconds (Default: 5000)
You increase the chance of not missing a reboot if you decrease that value.
=item B<--unit>
Select the unit for performance data and thresholds. May be 's' for seconds, 'm' for minutes,
'h' for hours, 'd' for days, 'w' for weeks. Default is seconds
=back

View File

@ -0,0 +1,52 @@
#
# Copyright 2023 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 hardware::devices::camera::optelecom::snmp::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_snmp);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{modes} = {
'alarms' => 'hardware::devices::camera::optelecom::snmp::mode::alarms',
'interfaces' => 'hardware::devices::camera::optelecom::snmp::mode::interfaces',
'list-interfaces' => 'snmp_standard::mode::listinterfaces',
'networks' => 'hardware::devices::camera::optelecom::snmp::mode::networks',
'temperatures' => 'hardware::devices::camera::optelecom::snmp::mode::temperatures',
'uptime' => 'hardware::devices::camera::optelecom::snmp::mode::uptime'
};
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Optelecom camera (TKH Group siqura) in SNMP.
=cut