2019-06-24 10:30:01 +02:00
#
2020-01-06 15:19:23 +01:00
# Copyright 2020 Centreon (http://www.centreon.com/)
2019-06-24 10:30:01 +02:00
#
# 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 network::juniper::common::junos::mode::stack ;
use base qw( centreon::plugins::templates::counter ) ;
use strict ;
use warnings ;
use Digest::MD5 qw( md5_hex ) ;
2019-10-04 14:46:46 +02:00
use centreon::plugins::templates::catalog_functions qw( catalog_status_threshold catalog_status_calc ) ;
2019-06-24 10:30:01 +02:00
2019-10-04 14:46:46 +02:00
sub custom_member_status_output {
2019-06-24 10:30:01 +02:00
my ( $ self , % options ) = @ _ ;
2019-10-04 14:46:46 +02:00
my $ msg = sprintf (
'role: %s' ,
$ self - > { result_values } - > { role }
) ;
2019-06-24 10:30:01 +02:00
return $ msg ;
}
2019-10-04 14:46:46 +02:00
sub custom_member_status_calc {
2019-06-24 10:30:01 +02:00
my ( $ self , % options ) = @ _ ;
$ self - > { result_values } - > { roleLast } = $ options { old_datas } - > { $ self - > { instance } . '_role' } ;
$ self - > { result_values } - > { role } = $ options { new_datas } - > { $ self - > { instance } . '_role' } ;
if ( ! defined ( $ options { old_datas } - > { $ self - > { instance } . '_role' } ) ) {
$ self - > { error_msg } = "buffer creation" ;
return - 2 ;
}
return 0 ;
}
2019-10-04 14:46:46 +02:00
sub custom_port_status_output {
my ( $ self , % options ) = @ _ ;
my $ msg = sprintf (
'operational status: %s [admin status: %s]' ,
$ self - > { result_values } - > { oper_status } ,
$ self - > { result_values } - > { admin_status }
) ;
return $ msg ;
}
2019-06-24 10:30:01 +02:00
sub set_counters {
my ( $ self , % options ) = @ _ ;
$ self - > { maps_counters_type } = [
2019-10-04 14:46:46 +02:00
{ name = > 'member' , type = > 3 , cb_prefix_output = > 'prefix_member_output' , cb_long_output = > 'member_long_output' , indent_long_output = > ' ' , message_multiple = > 'All stack members are ok' ,
group = > [
{ name = > 'global' , type = > 0 , skipped_code = > { - 10 = > 1 } } ,
{ name = > 'port' , display_long = > 1 , cb_prefix_output = > 'prefix_port_output' , message_multiple = > 'All ports are ok' , type = > 1 , skipped_code = > { - 10 = > 1 } } ,
]
}
2019-06-24 10:30:01 +02:00
] ;
2019-10-10 15:50:06 +02:00
$ self - > { maps_counters } - > { global } = [
2019-10-04 14:46:46 +02:00
{ label = > 'member-status' , threshold = > 0 , set = > {
2019-06-24 10:30:01 +02:00
key_values = > [ { name = > 'role' } , { name = > 'display' } ] ,
2019-10-04 14:46:46 +02:00
closure_custom_calc = > $ self - > can ( 'custom_member_status_calc' ) ,
closure_custom_output = > $ self - > can ( 'custom_member_status_output' ) ,
closure_custom_perfdata = > sub { return 0 ; } ,
closure_custom_threshold_check = > \ & catalog_status_threshold ,
}
} ,
] ;
$ self - > { maps_counters } - > { port } = [
{ label = > 'port-status' , threshold = > 0 , set = > {
key_values = > [ { name = > 'oper_status' } , { name = > 'admin_status' } , { name = > 'display' } ] ,
closure_custom_calc = > \ & catalog_status_calc ,
closure_custom_output = > $ self - > can ( 'custom_port_status_output' ) ,
2019-06-24 10:30:01 +02:00
closure_custom_perfdata = > sub { return 0 ; } ,
closure_custom_threshold_check = > \ & catalog_status_threshold ,
}
} ,
] ;
}
2019-10-04 14:46:46 +02:00
sub member_long_output {
my ( $ self , % options ) = @ _ ;
return "checking stack member '" . $ options { instance_value } - > { display } . "'" ;
}
sub prefix_member_output {
2019-06-24 10:30:01 +02:00
my ( $ self , % options ) = @ _ ;
return "Stack member '" . $ options { instance_value } - > { display } . "' " ;
}
2019-10-04 14:46:46 +02:00
sub prefix_port_output {
my ( $ self , % options ) = @ _ ;
return "port '" . $ options { instance_value } - > { display } . "' " ;
}
2019-06-24 10:30:01 +02:00
sub new {
my ( $ class , % options ) = @ _ ;
my $ self = $ class - > SUPER:: new ( package = > __PACKAGE__ , % options , statefile = > 1 , force_new_perfdata = > 1 ) ;
bless $ self , $ class ;
$ options { options } - > add_options ( arguments = > {
2019-10-04 14:46:46 +02:00
'unknown-member-status:s' = > { name = > 'unknown_member_status' , default = > '' } ,
'warning-member-status:s' = > { name = > 'warning_member_status' , default = > '' } ,
'critical-member-status:s' = > { name = > 'critical_member_status' , default = > '%{role} ne %{roleLast}' } ,
'unknown-port-status:s' = > { name = > 'unknown_port_status' , default = > '' } ,
'warning-port-status:s' = > { name = > 'warning_port_status' , default = > '' } ,
'critical-port-status:s' = > { name = > 'critical_port_status' , default = > '%{admin_status} eq "up" and %{oper_status} ne "up"' } ,
2019-06-24 10:30:01 +02:00
} ) ;
return $ self ;
}
sub check_options {
my ( $ self , % options ) = @ _ ;
$ self - > SUPER:: check_options ( % options ) ;
2019-10-04 14:46:46 +02:00
$ self - > change_macros (
macros = > [
'unknown_member_status' , 'warning_member_status' , 'critical_member_status' ,
'unknown_port_status' , 'warning_port_status' , 'critical_port_status'
]
) ;
2019-06-24 10:30:01 +02:00
}
2019-10-04 14:46:46 +02:00
my $ map_role = { 1 = > 'master' , 2 = > 'backup' , 3 = > 'linecard' } ;
my $ map_status = { 1 = > 'up' , 2 = > 'down' , 3 = > 'unknown' } ;
2019-06-24 10:30:01 +02:00
my $ mapping = {
jnxVirtualChassisMemberSerialnumber = > { oid = > '.1.3.6.1.4.1.2636.3.40.1.4.1.1.1.2' } ,
2019-10-04 14:46:46 +02:00
jnxVirtualChassisMemberRole = > { oid = > '.1.3.6.1.4.1.2636.3.40.1.4.1.1.1.3' , map = > $ map_role } ,
} ;
my $ mapping2 = {
jnxVirtualChassisPortAdminStatus = > { oid = > '.1.3.6.1.4.1.2636.3.40.1.4.1.2.1.3' , map = > $ map_status } ,
jnxVirtualChassisPortOperStatus = > { oid = > '.1.3.6.1.4.1.2636.3.40.1.4.1.2.1.4' , map = > $ map_status } ,
2019-06-24 10:30:01 +02:00
} ;
my $ oid_jnxVirtualChassisMemberEntry = '.1.3.6.1.4.1.2636.3.40.1.4.1.1.1' ;
2019-10-04 14:46:46 +02:00
my $ oid_jnxVirtualChassisPortEntry = '.1.3.6.1.4.1.2636.3.40.1.4.1.2.1' ;
2019-06-24 10:30:01 +02:00
sub manage_selection {
my ( $ self , % options ) = @ _ ;
2019-10-04 14:46:46 +02:00
$ self - > { member } = { } ;
my $ snmp_result = $ options { snmp } - > get_multiple_table (
oids = > [
{ oid = > $ oid_jnxVirtualChassisMemberEntry , start = > $ mapping - > { jnxVirtualChassisMemberSerialnumber } - > { oid } , end = > $ mapping - > { jnxVirtualChassisMemberRole } - > { oid } } ,
{ oid = > $ oid_jnxVirtualChassisPortEntry , start = > $ mapping2 - > { jnxVirtualChassisPortAdminStatus } - > { oid } , end = > $ mapping2 - > { jnxVirtualChassisPortOperStatus } - > { oid } } ,
] ,
2019-06-24 10:30:01 +02:00
nothing_quit = > 1
) ;
2019-10-04 14:46:46 +02:00
foreach my $ oid ( keys % { $ snmp_result - > { $ oid_jnxVirtualChassisMemberEntry } } ) {
2019-06-24 10:30:01 +02:00
next if ( $ oid !~ /^$mapping->{jnxVirtualChassisMemberRole}->{oid}\.(.*)$/ ) ;
2019-10-04 14:46:46 +02:00
my $ chassis_id = $ 1 ;
my $ result = $ options { snmp } - > map_instance ( mapping = > $ mapping , results = > $ snmp_result - > { $ oid_jnxVirtualChassisMemberEntry } , instance = > $ chassis_id ) ;
2019-06-24 10:30:01 +02:00
2019-10-04 14:46:46 +02:00
$ self - > { member } - > { $ result - > { jnxVirtualChassisMemberSerialnumber } } = {
2019-06-24 10:30:01 +02:00
display = > $ result - > { jnxVirtualChassisMemberSerialnumber } ,
2019-10-04 14:46:46 +02:00
global = > {
display = > $ result - > { jnxVirtualChassisMemberSerialnumber } ,
role = > $ result - > { jnxVirtualChassisMemberRole } ,
} ,
port = > { } ,
2019-06-24 10:30:01 +02:00
} ;
2019-10-04 14:46:46 +02:00
foreach ( keys % { $ snmp_result - > { $ oid_jnxVirtualChassisPortEntry } } ) {
next if ( ! /^$mapping2->{jnxVirtualChassisPortAdminStatus}->{oid}\.$chassis_id\.(.*?)\.(.*)$/ ) ;
my $ port_name = $ 2 ;
my $ result2 = $ options { snmp } - > map_instance ( mapping = > $ mapping2 , results = > $ snmp_result - > { $ oid_jnxVirtualChassisPortEntry } , instance = > $ chassis_id . '.' . $ 1 . '.' . $ port_name ) ;
$ port_name = $ self - > { output } - > to_utf8 ( join ( '' , map ( chr ( $ _ ) , split ( /\./ , $ port_name ) ) ) ) ;
$ self - > { member } - > { $ result - > { jnxVirtualChassisMemberSerialnumber } } - > { port } - > { $ port_name } = {
display = > $ port_name ,
admin_status = > $ result2 - > { jnxVirtualChassisPortAdminStatus } ,
oper_status = > $ result2 - > { jnxVirtualChassisPortOperStatus } ,
} ;
}
2019-06-24 10:30:01 +02:00
}
$ self - > { cache_name } = "juniper_junos_" . $ self - > { mode } . '_' . $ options { snmp } - > get_hostname ( ) . '_' . $ options { snmp } - > get_port ( ) . '_' .
( defined ( $ self - > { option_results } - > { filter_counters } ) ? md5_hex ( $ self - > { option_results } - > { filter_counters } ) : md5_hex ( 'all' ) ) ;
}
1 ;
__END__
= head1 MODE
Check stack members .
= over 8
2019-10-04 14:46:46 +02:00
= item B <--unknown-member-status>
2019-06-24 10:30:01 +02:00
Set warning threshold for status ( Default: '' ) .
Can used special variables like: % { role } , % { roleLast }
2019-10-04 14:46:46 +02:00
= item B <--warning-member-status>
2019-06-24 10:30:01 +02:00
Set warning threshold for status ( Default: '' ) .
Can used special variables like: % { role } , % { roleLast }
2019-10-04 14:46:46 +02:00
= item B <--critical-member-status>
2019-06-24 10:30:01 +02:00
Set critical threshold for status ( Default: '%{role} ne %{roleLast}' ) .
Can used special variables like: % { role } , % { roleLast }
2019-10-04 14:46:46 +02:00
= item B <--unknown-port-status>
Set warning threshold for status ( Default: '' ) .
Can used special variables like: % { admin_status } , % { oper_status } , % { display }
= item B <--warning-port-status>
Set warning threshold for status ( Default: '' ) .
Can used special variables like: % { admin_status } , % { oper_status } , % { display }
= item B <--critical-port-status>
Set critical threshold for status ( Default: '%{admin_status} eq "up" and %{oper_status} ne "up"' ) .
Can used special variables like: % { admin_status } , % { oper_status } , % { display }
2019-06-24 10:30:01 +02:00
= back
= cut