lvs --select lv_attr =~ ^t will only return thin volumes, so there is no need to filter out needed volumes in the plugin.
102 lines
2.4 KiB
Perl
Executable file
102 lines
2.4 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
use strict;
|
|
use warnings;
|
|
use Getopt::Long;
|
|
|
|
my $warn = 92.0;
|
|
my $crit = 96.0;
|
|
|
|
sub get_thinpools {
|
|
$ENV{'LC_ALL'} = 'C'; # Set locale for lvs call
|
|
my @lvsoutput = `lvs --noheadings --separator : --select 'lv_attr =~ ^t' -o lv_attr,lv_name,data_percent,metadata_percent`;
|
|
my @thinpools;
|
|
|
|
for my $lvsline (@lvsoutput) {
|
|
if ($lvsline =~ m#^(?:\s+)?(.*):(.*):(.*):(.*)#x) {
|
|
my $lv = {
|
|
'lv_attr' => $1,
|
|
'lv_name' => $2,
|
|
'data_percent' => $3,
|
|
'metadata_percent' => $4,
|
|
};
|
|
|
|
push @thinpools, $lv;
|
|
}
|
|
}
|
|
|
|
return @thinpools;
|
|
}
|
|
|
|
sub check_thinpools {
|
|
for my $thinpool (get_thinpools()) {
|
|
# Check metadata usage
|
|
if ($thinpool->{metadata_percent} > $crit) {
|
|
add_error(2, "CRITICAL: Meta% of $thinpool->{lv_name} is $thinpool->{metadata_percent}")
|
|
} elsif ($thinpool->{metadata_percent} > $warn) {
|
|
add_error(1, "WARNING: Meta% of $thinpool->{lv_name} is $thinpool->{metadata_percent}")
|
|
}
|
|
|
|
# Check data usage
|
|
if ($thinpool->{data_percent} > $crit) {
|
|
add_error(2, "CRITICAL: Data% of $thinpool->{lv_name} is $thinpool->{data_percent}")
|
|
} elsif ($thinpool->{data_percent} > $warn) {
|
|
add_error(1, "WARNING: Data% of $thinpool->{lv_name} is $thinpool->{data_percent}")
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
my @errors;
|
|
|
|
sub add_error {
|
|
my ($exit_code, $message) = @_;
|
|
|
|
push @errors, {
|
|
'exit_code' => $exit_code,
|
|
'message' => $message,
|
|
};
|
|
|
|
return;
|
|
}
|
|
|
|
sub aggregate_errors {
|
|
# Sort errors, highest exit code first
|
|
my @sorted_errors = sort { $b->{exit_code} cmp $a->{exit_code} } @errors;
|
|
if (scalar @sorted_errors != 0) {
|
|
for my $error (@sorted_errors) {
|
|
print $error->{message}, "\n";
|
|
}
|
|
exit $sorted_errors[0]->{exit_code};
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
my $no_thinpools_ok = 0;
|
|
Getopt::Long::Configure('bundling');
|
|
GetOptions
|
|
("no-thinpools-ok" => \$no_thinpools_ok,
|
|
"w=f" => \$warn, "warning=f" => \$warn,
|
|
"c=f" => \$crit, "critical=f" => \$crit)
|
|
or die("Error in command line arguments\n");
|
|
|
|
my @thinpools = get_thinpools();
|
|
|
|
# No thinpool found?
|
|
if (scalar @thinpools == 0) {
|
|
if ($no_thinpools_ok == 1) {
|
|
print "OK: No thinpools found.\n";
|
|
exit 0;
|
|
} else {
|
|
print "UNKNOWN: No thinpools found.\n";
|
|
exit 3;
|
|
}
|
|
} else {
|
|
check_thinpools();
|
|
aggregate_errors();
|
|
}
|
|
|
|
print "OK - All thinpools OK\n";
|
|
exit 0;
|