2013-12-22 20:27:20 +01:00
################################################################################
# Copyright 2005-2013 MERETHIS
# 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
# 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
# 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
# this program; if not, see <http://www.gnu.org/licenses>.
#
# 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 executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable 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
# 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
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package snmp_standard::mode::inodes ;
use base qw( centreon::plugins::mode ) ;
use strict ;
use warnings ;
use centreon::plugins::statefile ;
my $ oid_dskPath = '.1.3.6.1.4.1.2021.9.1.2' ;
my $ oid_dskPercentNode = '.1.3.6.1.4.1.2021.9.1.10' ;
sub new {
my ( $ class , % options ) = @ _ ;
my $ self = $ class - > SUPER:: new ( package = > __PACKAGE__ , % options ) ;
bless $ self , $ class ;
$ self - > { version } = '1.0' ;
$ options { options } - > add_options ( arguments = >
{
"warning:s" = > { name = > 'warning' } ,
"critical:s" = > { name = > 'critical' } ,
2014-04-30 16:25:57 +02:00
"reload-cache-time:s" = > { name = > 'reload_cache_time' , default = > 180 } ,
2013-12-22 20:27:20 +01:00
"name" = > { name = > 'use_name' } ,
"diskpath:s" = > { name = > 'diskpath' } ,
"regexp" = > { name = > 'use_regexp' } ,
"regexp-isensitive" = > { name = > 'use_regexpi' } ,
"display-transform-src:s" = > { name = > 'display_transform_src' } ,
"display-transform-dst:s" = > { name = > 'display_transform_dst' } ,
"show-cache" = > { name = > 'show_cache' } ,
} ) ;
$ self - > { diskpath_id_selected } = [] ;
$ self - > { statefile_cache } = centreon::plugins::statefile - > new ( % options ) ;
return $ self ;
}
sub check_options {
my ( $ self , % options ) = @ _ ;
$ self - > SUPER:: init ( % options ) ;
if ( ( $ self - > { perfdata } - > threshold_validate ( label = > 'warning' , value = > $ self - > { option_results } - > { warning } ) ) == 0 ) {
$ self - > { output } - > add_option_msg ( short_msg = > "Wrong warning threshold '" . $ self - > { option_results } - > { warning } . "'." ) ;
$ self - > { output } - > option_exit ( ) ;
}
if ( ( $ self - > { perfdata } - > threshold_validate ( label = > 'critical' , value = > $ self - > { option_results } - > { critical } ) ) == 0 ) {
$ self - > { output } - > add_option_msg ( short_msg = > "Wrong critical threshold '" . $ self - > { option_results } - > { critical } . "'." ) ;
$ self - > { output } - > option_exit ( ) ;
}
$ self - > { statefile_cache } - > check_options ( % options ) ;
}
sub run {
my ( $ self , % options ) = @ _ ;
# $options{snmp} = snmp object
$ self - > { snmp } = $ options { snmp } ;
$ self - > { hostname } = $ self - > { snmp } - > get_hostname ( ) ;
$ self - > { snmp_port } = $ self - > { snmp } - > get_port ( ) ;
$ self - > manage_selection ( ) ;
$ self - > { snmp } - > load ( oids = > [ $ oid_dskPercentNode ] , instances = > $ self - > { diskpath_id_selected } ) ;
my $ result = $ self - > { snmp } - > get_leef ( nothing_quit = > 1 ) ;
if ( ! defined ( $ self - > { option_results } - > { diskpath } ) || defined ( $ self - > { option_results } - > { use_regexp } ) ) {
$ self - > { output } - > output_add ( severity = > 'OK' ,
2014-03-20 14:25:53 +01:00
short_msg = > 'All inode partitions are ok.' ) ;
2013-12-22 20:27:20 +01:00
}
foreach ( sort @ { $ self - > { diskpath_id_selected } } ) {
my $ name_diskpath = $ self - > get_display_value ( id = > $ _ ) ;
my $ prct_used = $ result - > { $ oid_dskPercentNode . '.' . $ _ } ;
my $ prct_free = 100 - $ prct_used ;
my $ exit = $ self - > { perfdata } - > threshold_check ( value = > $ prct_used , threshold = > [ { label = > 'critical' , 'exit_litteral' = > 'critical' } , { label = > 'warning' , exit_litteral = > 'warning' } ] ) ;
$ self - > { output } - > output_add ( long_msg = > sprintf ( "Inodes partition '%s' Used: %s %% Free: %s %%" ,
$ name_diskpath , $ prct_used , $ prct_free ) ) ;
if ( ! $ self - > { output } - > is_status ( value = > $ exit , compare = > 'ok' , litteral = > 1 ) || ( defined ( $ self - > { option_results } - > { diskpath } ) && ! defined ( $ self - > { option_results } - > { use_regexp } ) ) ) {
$ self - > { output } - > output_add ( severity = > $ exit ,
short_msg = > sprintf ( "Inodes partition '%s' Used: %s %% Free: %s %%" ,
$ name_diskpath , $ prct_used , $ prct_free ) ) ;
}
my $ label = 'used' ;
my $ extra_label = '' ;
$ extra_label = '_' . $ name_diskpath if ( ! defined ( $ self - > { option_results } - > { diskpath } ) || defined ( $ self - > { option_results } - > { use_regexp } ) ) ;
$ self - > { output } - > perfdata_add ( label = > $ label . $ extra_label , unit = > '%' ,
value = > $ prct_used ,
warning = > $ self - > { perfdata } - > get_perfdata_for_output ( label = > 'warning' ) ,
critical = > $ self - > { perfdata } - > get_perfdata_for_output ( label = > 'critical' ) ,
min = > 0 , max = > 100 ) ;
}
$ self - > { output } - > display ( ) ;
$ self - > { output } - > exit ( ) ;
}
sub reload_cache {
my ( $ self ) = @ _ ;
my $ datas = { } ;
my $ result = $ self - > { snmp } - > get_table ( oid = > $ oid_dskPath ) ;
2014-04-30 16:25:57 +02:00
$ datas - > { last_timestamp } = time ( ) ;
2014-01-24 10:54:47 +01:00
$ datas - > { all_ids } = [] ;
2013-12-22 20:27:20 +01:00
foreach my $ key ( $ self - > { snmp } - > oid_lex_sort ( keys %$ result ) ) {
next if ( $ key !~ /\.([0-9]+)$/ ) ;
2014-01-24 10:54:47 +01:00
push @ { $ datas - > { all_ids } } , $ 1 ;
2013-12-22 20:27:20 +01:00
$ datas - > { 'dskPath_' . $ 1 } = $ self - > { output } - > to_utf8 ( $ result - > { $ key } ) ;
}
2014-03-22 19:16:37 +01:00
if ( scalar ( @ { $ datas - > { all_ids } } ) <= 0 ) {
2013-12-22 20:27:20 +01:00
$ self - > { output } - > add_option_msg ( short_msg = > "Can't construct cache..." ) ;
$ self - > { output } - > option_exit ( ) ;
}
$ self - > { statefile_cache } - > write ( data = > $ datas ) ;
}
sub manage_selection {
my ( $ self , % options ) = @ _ ;
# init cache file
my $ has_cache_file = $ self - > { statefile_cache } - > read ( statefile = > 'cache_snmpstandard_' . $ self - > { hostname } . '_' . $ self - > { snmp_port } . '_' . $ self - > { mode } ) ;
if ( defined ( $ self - > { option_results } - > { show_cache } ) ) {
$ self - > { output } - > add_option_msg ( long_msg = > $ self - > { statefile_cache } - > get_string_content ( ) ) ;
$ self - > { output } - > option_exit ( ) ;
}
my $ timestamp_cache = $ self - > { statefile_cache } - > get ( name = > 'last_timestamp' ) ;
2014-04-30 16:25:57 +02:00
if ( $ has_cache_file == 0 || ! defined ( $ timestamp_cache ) ||
( ( time ( ) - $ timestamp_cache ) > ( ( $ self - > { option_results } - > { reload_cache_time } ) * 60 ) ) ) {
2013-12-22 20:27:20 +01:00
$ self - > reload_cache ( ) ;
$ self - > { statefile_cache } - > read ( ) ;
}
2014-01-24 10:54:47 +01:00
my $ all_ids = $ self - > { statefile_cache } - > get ( name = > 'all_ids' ) ;
2013-12-22 20:27:20 +01:00
if ( ! defined ( $ self - > { option_results } - > { use_name } ) && defined ( $ self - > { option_results } - > { diskpath } ) ) {
# get by ID
push @ { $ self - > { diskpath_id_selected } } , $ self - > { option_results } - > { diskpath } ;
my $ name = $ self - > { statefile_cache } - > get ( name = > 'dskPath_' . $ self - > { option_results } - > { diskpath } ) ;
if ( ! defined ( $ name ) ) {
$ self - > { output } - > add_option_msg ( short_msg = > "No disk path found for id '" . $ self - > { option_results } - > { diskpath } . "'." ) ;
$ self - > { output } - > option_exit ( ) ;
}
} else {
2014-01-24 10:54:47 +01:00
foreach my $ i ( @ { $ all_ids } ) {
2013-12-22 20:27:20 +01:00
my $ filter_name = $ self - > { statefile_cache } - > get ( name = > 'dskPath_' . $ i ) ;
next if ( ! defined ( $ filter_name ) ) ;
if ( ! defined ( $ self - > { option_results } - > { diskpath } ) ) {
push @ { $ self - > { diskpath_id_selected } } , $ i ;
next ;
}
if ( defined ( $ self - > { option_results } - > { use_regexp } ) && defined ( $ self - > { option_results } - > { use_regexpi } ) && $ filter_name =~ /$self->{option_results}->{diskpath}/i ) {
push @ { $ self - > { diskpath_id_selected } } , $ i ;
}
if ( defined ( $ self - > { option_results } - > { use_regexp } ) && ! defined ( $ self - > { option_results } - > { use_regexpi } ) && $ filter_name =~ /$self->{option_results}->{diskpath}/ ) {
push @ { $ self - > { diskpath_id_selected } } , $ i ;
}
if ( ! defined ( $ self - > { option_results } - > { use_regexp } ) && ! defined ( $ self - > { option_results } - > { use_regexpi } ) && $ filter_name eq $ self - > { option_results } - > { diskpath } ) {
push @ { $ self - > { diskpath_id_selected } } , $ i ;
}
}
if ( scalar ( @ { $ self - > { diskpath_id_selected } } ) <= 0 ) {
if ( defined ( $ self - > { option_results } - > { diskpath } ) ) {
$ self - > { output } - > add_option_msg ( short_msg = > "No disk path found for name '" . $ self - > { option_results } - > { diskpath } . "' (maybe you should reload cache file)." ) ;
} else {
$ self - > { output } - > add_option_msg ( short_msg = > "No disk path found (maybe you should reload cache file)." ) ;
}
$ self - > { output } - > option_exit ( ) ;
}
}
}
sub get_display_value {
my ( $ self , % options ) = @ _ ;
my $ value = $ self - > { statefile_cache } - > get ( name = > 'dskPath_' . $ options { id } ) ;
if ( defined ( $ self - > { option_results } - > { display_transform_src } ) ) {
$ self - > { option_results } - > { display_transform_dst } = '' if ( ! defined ( $ self - > { option_results } - > { display_transform_dst } ) ) ;
eval "\$value =~ s{$self->{option_results}->{display_transform_src}}{$self->{option_results}->{display_transform_dst}}" ;
}
return $ value ;
}
1 ;
__END__
= head1 MODE
Check Inodes space usage on partitions .
2014-03-30 21:06:55 +02:00
Need to enable "includeAllDisks 10%" on snmpd . conf .
2013-12-22 20:27:20 +01:00
= over 8
= item B <--warning>
Threshold warning in percent .
= item B <--critical>
Threshold critical in percent .
= item B <--diskpath>
Set the disk path ( number expected ) ex: 1 , 2 , ... ( empty means 'check all disks path' ) .
= item B <--name>
Allows to use disk path name with option - - diskpath instead of disk path oid index .
= item B <--regexp>
Allows to use regexp to filter diskpath ( with option - - name ) .
= item B <--regexp-isensitive>
Allows to use regexp non case - sensitive ( with - - regexp ) .
= item B <--reload-cache-time>
Time in seconds before reloading cache file ( default: 180 ) .
= item B <--display-transform-src>
Regexp src to transform display value . ( security risk ! ! ! )
= item B <--display-transform-dst>
Regexp dst to transform display value . ( security risk ! ! ! )
= item B <--show-cache>
Display cache storage datas .
= back
= cut